aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/graphicsitems/qdeclarativeanchors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/graphicsitems/qdeclarativeanchors.cpp')
-rw-r--r--src/declarative/graphicsitems/qdeclarativeanchors.cpp1165
1 files changed, 0 insertions, 1165 deletions
diff --git a/src/declarative/graphicsitems/qdeclarativeanchors.cpp b/src/declarative/graphicsitems/qdeclarativeanchors.cpp
deleted file mode 100644
index c15384e632..0000000000
--- a/src/declarative/graphicsitems/qdeclarativeanchors.cpp
+++ /dev/null
@@ -1,1165 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "private/qdeclarativeanchors_p_p.h"
-
-#include "qdeclarativeitem.h"
-#include "private/qdeclarativeitem_p.h"
-
-#include <qdeclarativeinfo.h>
-
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-//TODO: should we cache relationships, so we don't have to check each time (parent-child or sibling)?
-//TODO: support non-parent, non-sibling (need to find lowest common ancestor)
-
-static qreal hcenter(QGraphicsItem *i)
-{
- QGraphicsItemPrivate *item = QGraphicsItemPrivate::get(i);
-
- qreal width = item->width();
- int iw = width;
- if (iw % 2)
- return (width + 1) / 2;
- else
- return width / 2;
-}
-
-static qreal vcenter(QGraphicsItem *i)
-{
- QGraphicsItemPrivate *item = QGraphicsItemPrivate::get(i);
-
- qreal height = item->height();
- int ih = height;
- if (ih % 2)
- return (height + 1) / 2;
- else
- return height / 2;
-}
-
-//### const item?
-//local position
-static qreal position(QGraphicsObject *item, QDeclarativeAnchorLine::AnchorLine anchorLine)
-{
- qreal ret = 0.0;
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(item);
- switch(anchorLine) {
- case QDeclarativeAnchorLine::Left:
- ret = item->x();
- break;
- case QDeclarativeAnchorLine::Right:
- ret = item->x() + d->width();
- break;
- case QDeclarativeAnchorLine::Top:
- ret = item->y();
- break;
- case QDeclarativeAnchorLine::Bottom:
- ret = item->y() + d->height();
- break;
- case QDeclarativeAnchorLine::HCenter:
- ret = item->x() + hcenter(item);
- break;
- case QDeclarativeAnchorLine::VCenter:
- ret = item->y() + vcenter(item);
- break;
- case QDeclarativeAnchorLine::Baseline:
- if (d->isDeclarativeItem)
- ret = item->y() + static_cast<QDeclarativeItem*>(item)->baselineOffset();
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-//position when origin is 0,0
-static qreal adjustedPosition(QGraphicsObject *item, QDeclarativeAnchorLine::AnchorLine anchorLine)
-{
- qreal ret = 0.0;
- QGraphicsItemPrivate *d = QGraphicsItemPrivate::get(item);
- switch(anchorLine) {
- case QDeclarativeAnchorLine::Left:
- ret = 0.0;
- break;
- case QDeclarativeAnchorLine::Right:
- ret = d->width();
- break;
- case QDeclarativeAnchorLine::Top:
- ret = 0.0;
- break;
- case QDeclarativeAnchorLine::Bottom:
- ret = d->height();
- break;
- case QDeclarativeAnchorLine::HCenter:
- ret = hcenter(item);
- break;
- case QDeclarativeAnchorLine::VCenter:
- ret = vcenter(item);
- break;
- case QDeclarativeAnchorLine::Baseline:
- if (d->isDeclarativeItem)
- ret = static_cast<QDeclarativeItem*>(item)->baselineOffset();
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-QDeclarativeAnchors::QDeclarativeAnchors(QObject *parent)
- : QObject(*new QDeclarativeAnchorsPrivate(0), parent)
-{
- qFatal("QDeclarativeAnchors::QDeclarativeAnchors(QObject*) called");
-}
-
-QDeclarativeAnchors::QDeclarativeAnchors(QGraphicsObject *item, QObject *parent)
- : QObject(*new QDeclarativeAnchorsPrivate(item), parent)
-{
-}
-
-QDeclarativeAnchors::~QDeclarativeAnchors()
-{
- Q_D(QDeclarativeAnchors);
- d->remDepend(d->fill);
- d->remDepend(d->centerIn);
- d->remDepend(d->left.item);
- d->remDepend(d->right.item);
- d->remDepend(d->top.item);
- d->remDepend(d->bottom.item);
- d->remDepend(d->vCenter.item);
- d->remDepend(d->hCenter.item);
- d->remDepend(d->baseline.item);
-}
-
-void QDeclarativeAnchorsPrivate::fillChanged()
-{
- Q_Q(QDeclarativeAnchors);
- if (!fill || !isItemComplete())
- return;
-
- if (updatingFill < 2) {
- ++updatingFill;
-
- qreal horizontalMargin = q->mirrored() ? rightMargin : leftMargin;
-
- if (fill == item->parentItem()) { //child-parent
- setItemPos(QPointF(horizontalMargin, topMargin));
- } else if (fill->parentItem() == item->parentItem()) { //siblings
- setItemPos(QPointF(fill->x()+horizontalMargin, fill->y()+topMargin));
- }
- QGraphicsItemPrivate *fillPrivate = QGraphicsItemPrivate::get(fill);
- setItemSize(QSizeF(fillPrivate->width()-leftMargin-rightMargin, fillPrivate->height()-topMargin-bottomMargin));
-
- --updatingFill;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on fill.");
- }
-
-}
-
-void QDeclarativeAnchorsPrivate::centerInChanged()
-{
- Q_Q(QDeclarativeAnchors);
- if (!centerIn || fill || !isItemComplete())
- return;
-
- if (updatingCenterIn < 2) {
- ++updatingCenterIn;
-
- qreal effectiveHCenterOffset = q->mirrored() ? -hCenterOffset : hCenterOffset;
- if (centerIn == item->parentItem()) {
- QPointF p(hcenter(item->parentItem()) - hcenter(item) + effectiveHCenterOffset,
- vcenter(item->parentItem()) - vcenter(item) + vCenterOffset);
- setItemPos(p);
-
- } else if (centerIn->parentItem() == item->parentItem()) {
- QPointF p(centerIn->x() + hcenter(centerIn) - hcenter(item) + effectiveHCenterOffset,
- centerIn->y() + vcenter(centerIn) - vcenter(item) + vCenterOffset);
- setItemPos(p);
- }
-
- --updatingCenterIn;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on centerIn.");
- }
-}
-
-void QDeclarativeAnchorsPrivate::clearItem(QGraphicsObject *item)
-{
- if (!item)
- return;
- if (fill == item)
- fill = 0;
- if (centerIn == item)
- centerIn = 0;
- if (left.item == item) {
- left.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::LeftAnchor;
- }
- if (right.item == item) {
- right.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::RightAnchor;
- }
- if (top.item == item) {
- top.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::TopAnchor;
- }
- if (bottom.item == item) {
- bottom.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::BottomAnchor;
- }
- if (vCenter.item == item) {
- vCenter.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::VCenterAnchor;
- }
- if (hCenter.item == item) {
- hCenter.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::HCenterAnchor;
- }
- if (baseline.item == item) {
- baseline.item = 0;
- usedAnchors &= ~QDeclarativeAnchors::BaselineAnchor;
- }
-}
-
-void QDeclarativeAnchorsPrivate::addDepend(QGraphicsObject *item)
-{
- if (!item)
- return;
- QGraphicsItemPrivate * itemPrivate = QGraphicsItemPrivate::get(item);
- if (itemPrivate->isDeclarativeItem) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(QGraphicsItemPrivate::get(item));
- p->addItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- } else if(itemPrivate->isWidget) {
- Q_Q(QDeclarativeAnchors);
- QGraphicsWidget *widget = static_cast<QGraphicsWidget *>(item);
- QObject::connect(widget, SIGNAL(destroyed(QObject*)), q, SLOT(_q_widgetDestroyed(QObject*)));
- QObject::connect(widget, SIGNAL(geometryChanged()), q, SLOT(_q_widgetGeometryChanged()));
- }
-}
-
-void QDeclarativeAnchorsPrivate::remDepend(QGraphicsObject *item)
-{
- if (!item)
- return;
- QGraphicsItemPrivate * itemPrivate = QGraphicsItemPrivate::get(item);
- if (itemPrivate->isDeclarativeItem) {
- QDeclarativeItemPrivate *p =
- static_cast<QDeclarativeItemPrivate *>(itemPrivate);
- p->removeItemChangeListener(this, QDeclarativeItemPrivate::Geometry);
- } else if(itemPrivate->isWidget) {
- Q_Q(QDeclarativeAnchors);
- QGraphicsWidget *widget = static_cast<QGraphicsWidget *>(item);
- QObject::disconnect(widget, SIGNAL(destroyed(QObject*)), q, SLOT(_q_widgetDestroyed(QObject*)));
- QObject::disconnect(widget, SIGNAL(geometryChanged()), q, SLOT(_q_widgetGeometryChanged()));
- }
-}
-
-bool QDeclarativeAnchorsPrivate::isItemComplete() const
-{
- return componentComplete;
-}
-
-void QDeclarativeAnchors::classBegin()
-{
- Q_D(QDeclarativeAnchors);
- d->componentComplete = false;
-}
-
-void QDeclarativeAnchors::componentComplete()
-{
- Q_D(QDeclarativeAnchors);
- d->componentComplete = true;
-}
-
-bool QDeclarativeAnchors::mirrored()
-{
- Q_D(QDeclarativeAnchors);
- QGraphicsItemPrivate * itemPrivate = QGraphicsItemPrivate::get(d->item);
- return itemPrivate->isDeclarativeItem ? static_cast<QDeclarativeItemPrivate *>(itemPrivate)->effectiveLayoutMirror : false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemHeight(qreal v)
-{
- updatingMe = true;
- QGraphicsItemPrivate::get(item)->setHeight(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemWidth(qreal v)
-{
- updatingMe = true;
- QGraphicsItemPrivate::get(item)->setWidth(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemX(qreal v)
-{
- updatingMe = true;
- item->setX(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemY(qreal v)
-{
- updatingMe = true;
- item->setY(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemPos(const QPointF &v)
-{
- updatingMe = true;
- item->setPos(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::setItemSize(const QSizeF &v)
-{
- updatingMe = true;
- if(QGraphicsItemPrivate::get(item)->isWidget)
- static_cast<QGraphicsWidget *>(item)->resize(v);
- else if (QGraphicsItemPrivate::get(item)->isDeclarativeItem)
- static_cast<QDeclarativeItem *>(item)->setSize(v);
- updatingMe = false;
-}
-
-void QDeclarativeAnchorsPrivate::updateMe()
-{
- if (updatingMe) {
- updatingMe = false;
- return;
- }
-
- fillChanged();
- centerInChanged();
- updateHorizontalAnchors();
- updateVerticalAnchors();
-}
-
-void QDeclarativeAnchorsPrivate::updateOnComplete()
-{
- fillChanged();
- centerInChanged();
- updateHorizontalAnchors();
- updateVerticalAnchors();
-}
-
-void QDeclarativeAnchorsPrivate::_q_widgetDestroyed(QObject *obj)
-{
- clearItem(qobject_cast<QGraphicsObject*>(obj));
-}
-
-void QDeclarativeAnchorsPrivate::_q_widgetGeometryChanged()
-{
- fillChanged();
- centerInChanged();
- updateHorizontalAnchors();
- updateVerticalAnchors();
-}
-
-void QDeclarativeAnchorsPrivate::itemGeometryChanged(QDeclarativeItem *, const QRectF &newG, const QRectF &oldG)
-{
- fillChanged();
- centerInChanged();
- if (newG.x() != oldG.x() || newG.width() != oldG.width())
- updateHorizontalAnchors();
- if (newG.y() != oldG.y() || newG.height() != oldG.height())
- updateVerticalAnchors();
-}
-
-QGraphicsObject *QDeclarativeAnchors::fill() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->fill;
-}
-
-void QDeclarativeAnchors::setFill(QGraphicsObject *f)
-{
- Q_D(QDeclarativeAnchors);
- if (d->fill == f)
- return;
-
- if (!f) {
- d->remDepend(d->fill);
- d->fill = f;
- emit fillChanged();
- return;
- }
- if (f != d->item->parentItem() && f->parentItem() != d->item->parentItem()){
- qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
- return;
- }
- d->remDepend(d->fill);
- d->fill = f;
- d->addDepend(d->fill);
- emit fillChanged();
- d->fillChanged();
-}
-
-void QDeclarativeAnchors::resetFill()
-{
- setFill(0);
-}
-
-QGraphicsObject *QDeclarativeAnchors::centerIn() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->centerIn;
-}
-
-void QDeclarativeAnchors::setCenterIn(QGraphicsObject* c)
-{
- Q_D(QDeclarativeAnchors);
- if (d->centerIn == c)
- return;
-
- if (!c) {
- d->remDepend(d->centerIn);
- d->centerIn = c;
- emit centerInChanged();
- return;
- }
- if (c != d->item->parentItem() && c->parentItem() != d->item->parentItem()){
- qmlInfo(d->item) << tr("Cannot anchor to an item that isn't a parent or sibling.");
- return;
- }
-
- d->remDepend(d->centerIn);
- d->centerIn = c;
- d->addDepend(d->centerIn);
- emit centerInChanged();
- d->centerInChanged();
-}
-
-void QDeclarativeAnchors::resetCenterIn()
-{
- setCenterIn(0);
-}
-
-bool QDeclarativeAnchorsPrivate::calcStretch(const QDeclarativeAnchorLine &edge1,
- const QDeclarativeAnchorLine &edge2,
- qreal offset1,
- qreal offset2,
- QDeclarativeAnchorLine::AnchorLine line,
- qreal &stretch)
-{
- bool edge1IsParent = (edge1.item == item->parentItem());
- bool edge2IsParent = (edge2.item == item->parentItem());
- bool edge1IsSibling = (edge1.item->parentItem() == item->parentItem());
- bool edge2IsSibling = (edge2.item->parentItem() == item->parentItem());
-
- bool invalid = false;
- if ((edge2IsParent && edge1IsParent) || (edge2IsSibling && edge1IsSibling)) {
- stretch = (position(edge2.item, edge2.anchorLine) + offset2)
- - (position(edge1.item, edge1.anchorLine) + offset1);
- } else if (edge2IsParent && edge1IsSibling) {
- stretch = (position(edge2.item, edge2.anchorLine) + offset2)
- - (position(item->parentObject(), line)
- + position(edge1.item, edge1.anchorLine) + offset1);
- } else if (edge2IsSibling && edge1IsParent) {
- stretch = (position(item->parentObject(), line) + position(edge2.item, edge2.anchorLine) + offset2)
- - (position(edge1.item, edge1.anchorLine) + offset1);
- } else
- invalid = true;
-
- return invalid;
-}
-
-void QDeclarativeAnchorsPrivate::updateVerticalAnchors()
-{
- if (fill || centerIn || !isItemComplete())
- return;
-
- if (updatingVerticalAnchor < 2) {
- ++updatingVerticalAnchor;
- QGraphicsItemPrivate *itemPrivate = QGraphicsItemPrivate::get(item);
- if (usedAnchors & QDeclarativeAnchors::TopAnchor) {
- //Handle stretching
- bool invalid = true;
- qreal height = 0.0;
- if (usedAnchors & QDeclarativeAnchors::BottomAnchor) {
- invalid = calcStretch(top, bottom, topMargin, -bottomMargin, QDeclarativeAnchorLine::Top, height);
- } else if (usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- invalid = calcStretch(top, vCenter, topMargin, vCenterOffset, QDeclarativeAnchorLine::Top, height);
- height *= 2;
- }
- if (!invalid)
- setItemHeight(height);
-
- //Handle top
- if (top.item == item->parentItem()) {
- setItemY(adjustedPosition(top.item, top.anchorLine) + topMargin);
- } else if (top.item->parentItem() == item->parentItem()) {
- setItemY(position(top.item, top.anchorLine) + topMargin);
- }
- } else if (usedAnchors & QDeclarativeAnchors::BottomAnchor) {
- //Handle stretching (top + bottom case is handled above)
- if (usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- qreal height = 0.0;
- bool invalid = calcStretch(vCenter, bottom, vCenterOffset, -bottomMargin,
- QDeclarativeAnchorLine::Top, height);
- if (!invalid)
- setItemHeight(height*2);
- }
-
- //Handle bottom
- if (bottom.item == item->parentItem()) {
- setItemY(adjustedPosition(bottom.item, bottom.anchorLine) - itemPrivate->height() - bottomMargin);
- } else if (bottom.item->parentItem() == item->parentItem()) {
- setItemY(position(bottom.item, bottom.anchorLine) - itemPrivate->height() - bottomMargin);
- }
- } else if (usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- //(stetching handled above)
-
- //Handle vCenter
- if (vCenter.item == item->parentItem()) {
- setItemY(adjustedPosition(vCenter.item, vCenter.anchorLine)
- - vcenter(item) + vCenterOffset);
- } else if (vCenter.item->parentItem() == item->parentItem()) {
- setItemY(position(vCenter.item, vCenter.anchorLine) - vcenter(item) + vCenterOffset);
- }
- } else if (usedAnchors & QDeclarativeAnchors::BaselineAnchor) {
- //Handle baseline
- if (baseline.item == item->parentItem()) {
- if (itemPrivate->isDeclarativeItem)
- setItemY(adjustedPosition(baseline.item, baseline.anchorLine)
- - static_cast<QDeclarativeItem *>(item)->baselineOffset() + baselineOffset);
- } else if (baseline.item->parentItem() == item->parentItem()) {
- if (itemPrivate->isDeclarativeItem)
- setItemY(position(baseline.item, baseline.anchorLine)
- - static_cast<QDeclarativeItem *>(item)->baselineOffset() + baselineOffset);
- }
- }
- --updatingVerticalAnchor;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on vertical anchor.");
- }
-}
-
-inline QDeclarativeAnchorLine::AnchorLine reverseAnchorLine(QDeclarativeAnchorLine::AnchorLine anchorLine) {
- if (anchorLine == QDeclarativeAnchorLine::Left) {
- return QDeclarativeAnchorLine::Right;
- } else if (anchorLine == QDeclarativeAnchorLine::Right) {
- return QDeclarativeAnchorLine::Left;
- } else {
- return anchorLine;
- }
-}
-
-void QDeclarativeAnchorsPrivate::updateHorizontalAnchors()
-{
- Q_Q(QDeclarativeAnchors);
- if (fill || centerIn || !isItemComplete())
- return;
-
- if (updatingHorizontalAnchor < 3) {
- ++updatingHorizontalAnchor;
- qreal effectiveRightMargin, effectiveLeftMargin, effectiveHorizontalCenterOffset;
- QDeclarativeAnchorLine effectiveLeft, effectiveRight, effectiveHorizontalCenter;
- QDeclarativeAnchors::Anchor effectiveLeftAnchor, effectiveRightAnchor;
- if (q->mirrored()) {
- effectiveLeftAnchor = QDeclarativeAnchors::RightAnchor;
- effectiveRightAnchor = QDeclarativeAnchors::LeftAnchor;
- effectiveLeft.item = right.item;
- effectiveLeft.anchorLine = reverseAnchorLine(right.anchorLine);
- effectiveRight.item = left.item;
- effectiveRight.anchorLine = reverseAnchorLine(left.anchorLine);
- effectiveHorizontalCenter.item = hCenter.item;
- effectiveHorizontalCenter.anchorLine = reverseAnchorLine(hCenter.anchorLine);
- effectiveLeftMargin = rightMargin;
- effectiveRightMargin = leftMargin;
- effectiveHorizontalCenterOffset = -hCenterOffset;
- } else {
- effectiveLeftAnchor = QDeclarativeAnchors::LeftAnchor;
- effectiveRightAnchor = QDeclarativeAnchors::RightAnchor;
- effectiveLeft = left;
- effectiveRight = right;
- effectiveHorizontalCenter = hCenter;
- effectiveLeftMargin = leftMargin;
- effectiveRightMargin = rightMargin;
- effectiveHorizontalCenterOffset = hCenterOffset;
- }
-
- QGraphicsItemPrivate *itemPrivate = QGraphicsItemPrivate::get(item);
- if (usedAnchors & effectiveLeftAnchor) {
- //Handle stretching
- bool invalid = true;
- qreal width = 0.0;
- if (usedAnchors & effectiveRightAnchor) {
- invalid = calcStretch(effectiveLeft, effectiveRight, effectiveLeftMargin, -effectiveRightMargin, QDeclarativeAnchorLine::Left, width);
- } else if (usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- invalid = calcStretch(effectiveLeft, effectiveHorizontalCenter, effectiveLeftMargin, effectiveHorizontalCenterOffset, QDeclarativeAnchorLine::Left, width);
- width *= 2;
- }
- if (!invalid)
- setItemWidth(width);
-
- //Handle left
- if (effectiveLeft.item == item->parentItem()) {
- setItemX(adjustedPosition(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
- } else if (effectiveLeft.item->parentItem() == item->parentItem()) {
- setItemX(position(effectiveLeft.item, effectiveLeft.anchorLine) + effectiveLeftMargin);
- }
- } else if (usedAnchors & effectiveRightAnchor) {
- //Handle stretching (left + right case is handled in updateLeftAnchor)
- if (usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- qreal width = 0.0;
- bool invalid = calcStretch(effectiveHorizontalCenter, effectiveRight, effectiveHorizontalCenterOffset, -effectiveRightMargin,
- QDeclarativeAnchorLine::Left, width);
- if (!invalid)
- setItemWidth(width*2);
- }
-
- //Handle right
- if (effectiveRight.item == item->parentItem()) {
- setItemX(adjustedPosition(effectiveRight.item, effectiveRight.anchorLine) - itemPrivate->width() - effectiveRightMargin);
- } else if (effectiveRight.item->parentItem() == item->parentItem()) {
- setItemX(position(effectiveRight.item, effectiveRight.anchorLine) - itemPrivate->width() - effectiveRightMargin);
- }
- } else if (usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- //Handle hCenter
- if (effectiveHorizontalCenter.item == item->parentItem()) {
- setItemX(adjustedPosition(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
- } else if (effectiveHorizontalCenter.item->parentItem() == item->parentItem()) {
- setItemX(position(effectiveHorizontalCenter.item, effectiveHorizontalCenter.anchorLine) - hcenter(item) + effectiveHorizontalCenterOffset);
- }
- }
- --updatingHorizontalAnchor;
- } else {
- // ### Make this certain :)
- qmlInfo(item) << QDeclarativeAnchors::tr("Possible anchor loop detected on horizontal anchor.");
- }
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::top() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->top;
-}
-
-void QDeclarativeAnchors::setTop(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->top == edge)
- return;
-
- d->usedAnchors |= TopAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~TopAnchor;
- return;
- }
-
- d->remDepend(d->top.item);
- d->top = edge;
- d->addDepend(d->top.item);
- emit topChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetTop()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~TopAnchor;
- d->remDepend(d->top.item);
- d->top = QDeclarativeAnchorLine();
- emit topChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::bottom() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->bottom;
-}
-
-void QDeclarativeAnchors::setBottom(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->bottom == edge)
- return;
-
- d->usedAnchors |= BottomAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~BottomAnchor;
- return;
- }
-
- d->remDepend(d->bottom.item);
- d->bottom = edge;
- d->addDepend(d->bottom.item);
- emit bottomChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetBottom()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~BottomAnchor;
- d->remDepend(d->bottom.item);
- d->bottom = QDeclarativeAnchorLine();
- emit bottomChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::verticalCenter() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->vCenter;
-}
-
-void QDeclarativeAnchors::setVerticalCenter(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->vCenter == edge)
- return;
-
- d->usedAnchors |= VCenterAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~VCenterAnchor;
- return;
- }
-
- d->remDepend(d->vCenter.item);
- d->vCenter = edge;
- d->addDepend(d->vCenter.item);
- emit verticalCenterChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetVerticalCenter()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~VCenterAnchor;
- d->remDepend(d->vCenter.item);
- d->vCenter = QDeclarativeAnchorLine();
- emit verticalCenterChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::baseline() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->baseline;
-}
-
-void QDeclarativeAnchors::setBaseline(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkVAnchorValid(edge) || d->baseline == edge)
- return;
-
- d->usedAnchors |= BaselineAnchor;
-
- if (!d->checkVValid()) {
- d->usedAnchors &= ~BaselineAnchor;
- return;
- }
-
- d->remDepend(d->baseline.item);
- d->baseline = edge;
- d->addDepend(d->baseline.item);
- emit baselineChanged();
- d->updateVerticalAnchors();
-}
-
-void QDeclarativeAnchors::resetBaseline()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~BaselineAnchor;
- d->remDepend(d->baseline.item);
- d->baseline = QDeclarativeAnchorLine();
- emit baselineChanged();
- d->updateVerticalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::left() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->left;
-}
-
-void QDeclarativeAnchors::setLeft(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkHAnchorValid(edge) || d->left == edge)
- return;
-
- d->usedAnchors |= LeftAnchor;
-
- if (!d->checkHValid()) {
- d->usedAnchors &= ~LeftAnchor;
- return;
- }
-
- d->remDepend(d->left.item);
- d->left = edge;
- d->addDepend(d->left.item);
- emit leftChanged();
- d->updateHorizontalAnchors();
-}
-
-void QDeclarativeAnchors::resetLeft()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~LeftAnchor;
- d->remDepend(d->left.item);
- d->left = QDeclarativeAnchorLine();
- emit leftChanged();
- d->updateHorizontalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::right() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->right;
-}
-
-void QDeclarativeAnchors::setRight(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkHAnchorValid(edge) || d->right == edge)
- return;
-
- d->usedAnchors |= RightAnchor;
-
- if (!d->checkHValid()) {
- d->usedAnchors &= ~RightAnchor;
- return;
- }
-
- d->remDepend(d->right.item);
- d->right = edge;
- d->addDepend(d->right.item);
- emit rightChanged();
- d->updateHorizontalAnchors();
-}
-
-void QDeclarativeAnchors::resetRight()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~RightAnchor;
- d->remDepend(d->right.item);
- d->right = QDeclarativeAnchorLine();
- emit rightChanged();
- d->updateHorizontalAnchors();
-}
-
-QDeclarativeAnchorLine QDeclarativeAnchors::horizontalCenter() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->hCenter;
-}
-
-void QDeclarativeAnchors::setHorizontalCenter(const QDeclarativeAnchorLine &edge)
-{
- Q_D(QDeclarativeAnchors);
- if (!d->checkHAnchorValid(edge) || d->hCenter == edge)
- return;
-
- d->usedAnchors |= HCenterAnchor;
-
- if (!d->checkHValid()) {
- d->usedAnchors &= ~HCenterAnchor;
- return;
- }
-
- d->remDepend(d->hCenter.item);
- d->hCenter = edge;
- d->addDepend(d->hCenter.item);
- emit horizontalCenterChanged();
- d->updateHorizontalAnchors();
-}
-
-void QDeclarativeAnchors::resetHorizontalCenter()
-{
- Q_D(QDeclarativeAnchors);
- d->usedAnchors &= ~HCenterAnchor;
- d->remDepend(d->hCenter.item);
- d->hCenter = QDeclarativeAnchorLine();
- emit horizontalCenterChanged();
- d->updateHorizontalAnchors();
-}
-
-qreal QDeclarativeAnchors::leftMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->leftMargin;
-}
-
-void QDeclarativeAnchors::setLeftMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->leftMargin == offset)
- return;
- d->leftMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateHorizontalAnchors();
- emit leftMarginChanged();
-}
-
-qreal QDeclarativeAnchors::rightMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->rightMargin;
-}
-
-void QDeclarativeAnchors::setRightMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->rightMargin == offset)
- return;
- d->rightMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateHorizontalAnchors();
- emit rightMarginChanged();
-}
-
-qreal QDeclarativeAnchors::margins() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->margins;
-}
-
-void QDeclarativeAnchors::setMargins(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->margins == offset)
- return;
- //###Is it significantly faster to set them directly so we can call fillChanged only once?
- if(!d->rightMargin || d->rightMargin == d->margins)
- setRightMargin(offset);
- if(!d->leftMargin || d->leftMargin == d->margins)
- setLeftMargin(offset);
- if(!d->topMargin || d->topMargin == d->margins)
- setTopMargin(offset);
- if(!d->bottomMargin || d->bottomMargin == d->margins)
- setBottomMargin(offset);
- d->margins = offset;
- emit marginsChanged();
-
-}
-
-qreal QDeclarativeAnchors::horizontalCenterOffset() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->hCenterOffset;
-}
-
-void QDeclarativeAnchors::setHorizontalCenterOffset(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->hCenterOffset == offset)
- return;
- d->hCenterOffset = offset;
- if(d->centerIn)
- d->centerInChanged();
- else
- d->updateHorizontalAnchors();
- emit horizontalCenterOffsetChanged();
-}
-
-qreal QDeclarativeAnchors::topMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->topMargin;
-}
-
-void QDeclarativeAnchors::setTopMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->topMargin == offset)
- return;
- d->topMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateVerticalAnchors();
- emit topMarginChanged();
-}
-
-qreal QDeclarativeAnchors::bottomMargin() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->bottomMargin;
-}
-
-void QDeclarativeAnchors::setBottomMargin(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->bottomMargin == offset)
- return;
- d->bottomMargin = offset;
- if(d->fill)
- d->fillChanged();
- else
- d->updateVerticalAnchors();
- emit bottomMarginChanged();
-}
-
-qreal QDeclarativeAnchors::verticalCenterOffset() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->vCenterOffset;
-}
-
-void QDeclarativeAnchors::setVerticalCenterOffset(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->vCenterOffset == offset)
- return;
- d->vCenterOffset = offset;
- if(d->centerIn)
- d->centerInChanged();
- else
- d->updateVerticalAnchors();
- emit verticalCenterOffsetChanged();
-}
-
-qreal QDeclarativeAnchors::baselineOffset() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->baselineOffset;
-}
-
-void QDeclarativeAnchors::setBaselineOffset(qreal offset)
-{
- Q_D(QDeclarativeAnchors);
- if (d->baselineOffset == offset)
- return;
- d->baselineOffset = offset;
- d->updateVerticalAnchors();
- emit baselineOffsetChanged();
-}
-
-QDeclarativeAnchors::Anchors QDeclarativeAnchors::usedAnchors() const
-{
- Q_D(const QDeclarativeAnchors);
- return d->usedAnchors;
-}
-
-bool QDeclarativeAnchorsPrivate::checkHValid() const
-{
- if (usedAnchors & QDeclarativeAnchors::LeftAnchor &&
- usedAnchors & QDeclarativeAnchors::RightAnchor &&
- usedAnchors & QDeclarativeAnchors::HCenterAnchor) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot specify left, right, and hcenter anchors.");
- return false;
- }
-
- return true;
-}
-
-bool QDeclarativeAnchorsPrivate::checkHAnchorValid(QDeclarativeAnchorLine anchor) const
-{
- if (!anchor.item) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to a null item.");
- return false;
- } else if (anchor.anchorLine & QDeclarativeAnchorLine::Vertical_Mask) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor a horizontal edge to a vertical edge.");
- return false;
- } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
- return false;
- } else if (anchor.item == item) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor item to self.");
- return false;
- }
-
- return true;
-}
-
-bool QDeclarativeAnchorsPrivate::checkVValid() const
-{
- if (usedAnchors & QDeclarativeAnchors::TopAnchor &&
- usedAnchors & QDeclarativeAnchors::BottomAnchor &&
- usedAnchors & QDeclarativeAnchors::VCenterAnchor) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot specify top, bottom, and vcenter anchors.");
- return false;
- } else if (usedAnchors & QDeclarativeAnchors::BaselineAnchor &&
- (usedAnchors & QDeclarativeAnchors::TopAnchor ||
- usedAnchors & QDeclarativeAnchors::BottomAnchor ||
- usedAnchors & QDeclarativeAnchors::VCenterAnchor)) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors.");
- return false;
- }
-
- return true;
-}
-
-bool QDeclarativeAnchorsPrivate::checkVAnchorValid(QDeclarativeAnchorLine anchor) const
-{
- if (!anchor.item) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to a null item.");
- return false;
- } else if (anchor.anchorLine & QDeclarativeAnchorLine::Horizontal_Mask) {
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor a vertical edge to a horizontal edge.");
- return false;
- } else if (anchor.item != item->parentItem() && anchor.item->parentItem() != item->parentItem()){
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor to an item that isn't a parent or sibling.");
- return false;
- } else if (anchor.item == item){
- qmlInfo(item) << QDeclarativeAnchors::tr("Cannot anchor item to self.");
- return false;
- }
-
- return true;
-}
-
-QT_END_NAMESPACE
-
-#include <moc_qdeclarativeanchors_p.cpp>
-