diff options
author | Jan Arve Saether <jan-arve.saether@digia.com> | 2013-09-27 15:39:21 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-10-01 13:32:12 +0200 |
commit | 056e2670dcaf447dbcd0a577483bcdcd22c2d333 (patch) | |
tree | 833ce47a33ad6a76c069e9a4c364ee5df26e7b6e | |
parent | 66fb8dd12189232a41164f0f6681699900ef2f3a (diff) | |
download | qtquickcontrols-056e2670dcaf447dbcd0a577483bcdcd22c2d333.tar.gz |
Update the internal alignment when an item *changes* its alignment
Previously it only respected the initial alignment.
Task-number: QTBUG-33773
Change-Id: I1d24209b866babd4bacabaec569f2f7dcc913c02
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
-rw-r--r-- | src/layouts/qquickgridlayoutengine.cpp | 16 | ||||
-rw-r--r-- | src/layouts/qquickgridlayoutengine_p.h | 4 | ||||
-rw-r--r-- | src/layouts/qquicklayout.cpp | 5 | ||||
-rw-r--r-- | src/layouts/qquicklayout_p.h | 1 | ||||
-rw-r--r-- | src/layouts/qquicklinearlayout.cpp | 6 | ||||
-rw-r--r-- | src/layouts/qquicklinearlayout_p.h | 1 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_gridlayout.qml | 20 |
7 files changed, 49 insertions, 4 deletions
diff --git a/src/layouts/qquickgridlayoutengine.cpp b/src/layouts/qquickgridlayoutengine.cpp index b6c0a244..419a81df 100644 --- a/src/layouts/qquickgridlayoutengine.cpp +++ b/src/layouts/qquickgridlayoutengine.cpp @@ -289,4 +289,20 @@ QLayoutPolicy::Policy QQuickGridLayoutItem::effectiveSizePolicy_helper(QQuickIte return fillExtent ? QLayoutPolicy::Preferred : QLayoutPolicy::Fixed; } + +void QQuickGridLayoutEngine::setAlignment(QQuickItem *quickItem, Qt::Alignment alignment) +{ + if (QQuickGridLayoutItem *item = findLayoutItem(quickItem)) { + item->setAlignment(alignment); + invalidate(); + } +} + +Qt::Alignment QQuickGridLayoutEngine::alignment(QQuickItem *quickItem) const +{ + if (QGridLayoutItem *item = findLayoutItem(quickItem)) + return item->alignment(); + return 0; +} + QT_END_NAMESPACE diff --git a/src/layouts/qquickgridlayoutengine_p.h b/src/layouts/qquickgridlayoutengine_p.h index 8842d36a..6eba922c 100644 --- a/src/layouts/qquickgridlayoutengine_p.h +++ b/src/layouts/qquickgridlayoutengine_p.h @@ -154,6 +154,10 @@ public: } return 0; } + + void setAlignment(QQuickItem *quickItem, Qt::Alignment alignment); + Qt::Alignment alignment(QQuickItem *quickItem) const; + }; diff --git a/src/layouts/qquicklayout.cpp b/src/layouts/qquicklayout.cpp index 709a88e6..0cfe61b7 100644 --- a/src/layouts/qquicklayout.cpp +++ b/src/layouts/qquicklayout.cpp @@ -426,7 +426,10 @@ void QQuickLayoutAttached::setAlignment(Qt::Alignment align) { if (align != m_alignment) { m_alignment = align; - invalidateItem(); + if (QQuickLayout *layout = parentLayout()) { + layout->setAlignment(item(), align); + invalidateItem(); + } emit alignmentChanged(); } } diff --git a/src/layouts/qquicklayout_p.h b/src/layouts/qquicklayout_p.h index ecb97c46..0d8d96ee 100644 --- a/src/layouts/qquicklayout_p.h +++ b/src/layouts/qquicklayout_p.h @@ -76,6 +76,7 @@ public: void componentComplete(); virtual QSizeF sizeHint(Qt::SizeHint whichSizeHint) const = 0; + virtual void setAlignment(QQuickItem *item, Qt::Alignment align) = 0; virtual void invalidate(QQuickItem * childItem = 0); virtual void updateLayoutItems() = 0; diff --git a/src/layouts/qquicklinearlayout.cpp b/src/layouts/qquicklinearlayout.cpp index 530241d4..fd6ffd69 100644 --- a/src/layouts/qquicklinearlayout.cpp +++ b/src/layouts/qquicklinearlayout.cpp @@ -253,6 +253,12 @@ Qt::LayoutDirection QQuickGridLayoutBase::effectiveLayoutDirection() const ? Qt::LeftToRight : Qt::RightToLeft; } +void QQuickGridLayoutBase::setAlignment(QQuickItem *item, Qt::Alignment alignment) +{ + Q_D(QQuickGridLayoutBase); + d->engine.setAlignment(item, alignment); +} + QQuickGridLayoutBase::~QQuickGridLayoutBase() { d_func()->m_isReady = false; diff --git a/src/layouts/qquicklinearlayout_p.h b/src/layouts/qquicklinearlayout_p.h index 1b5a3a18..fb1e554e 100644 --- a/src/layouts/qquicklinearlayout_p.h +++ b/src/layouts/qquicklinearlayout_p.h @@ -75,6 +75,7 @@ public: Qt::LayoutDirection layoutDirection() const; void setLayoutDirection(Qt::LayoutDirection dir); Qt::LayoutDirection effectiveLayoutDirection() const; + void setAlignment(QQuickItem *item, Qt::Alignment align) Q_DECL_OVERRIDE; protected: void updateLayoutItems() Q_DECL_OVERRIDE; diff --git a/tests/auto/controls/data/tst_gridlayout.qml b/tests/auto/controls/data/tst_gridlayout.qml index 7c31b6b6..0e4f8509 100644 --- a/tests/auto/controls/data/tst_gridlayout.qml +++ b/tests/auto/controls/data/tst_gridlayout.qml @@ -521,6 +521,23 @@ Item { compare(itemRect(layout.children[3]), [45, 40, 10, 10]); compare(itemRect(layout.children[4]), [30, 60, 30, 30]); + + layout.children[1].Layout.alignment = Qt.AlignTop + waitForRendering(layout) + compare(itemRect(layout.children[1]), [40, 0, 20, 20]); + + layout.children[2].Layout.alignment = Qt.AlignLeft + waitForRendering(layout) + compare(itemRect(layout.children[2]), [0, 40, 20, 20]); + + layout.children[3].Layout.alignment = Qt.AlignLeft|Qt.AlignVCenter + waitForRendering(layout) + compare(itemRect(layout.children[3]), [40, 45, 10, 10]); + + layout.children[4].Layout.alignment = Qt.AlignLeft + waitForRendering(layout) + compare(itemRect(layout.children[4]), [0, 60, 30, 30]); + layout.destroy(); } @@ -740,9 +757,6 @@ Item { layout.children[0].Layout.alignment = Qt.AlignBaseline layout.children[1].Layout.alignment = Qt.AlignBaseline - // Workaround, force full invalidation (QTBUG-33773) - layout.children[1].visible = false; layout.children[1].visible = true; - compare(itemRect(layout.children[0]), [ 0, 0, 10, 10]) compare(itemRect(layout.children[1]), [10, 10, 10, 10]) compare(layout.implicitWidth, 20) |