summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Arve Saether <jan-arve.saether@digia.com>2013-09-27 15:39:21 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-10-01 13:32:12 +0200
commit056e2670dcaf447dbcd0a577483bcdcd22c2d333 (patch)
tree833ce47a33ad6a76c069e9a4c364ee5df26e7b6e
parent66fb8dd12189232a41164f0f6681699900ef2f3a (diff)
downloadqtquickcontrols-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.cpp16
-rw-r--r--src/layouts/qquickgridlayoutengine_p.h4
-rw-r--r--src/layouts/qquicklayout.cpp5
-rw-r--r--src/layouts/qquicklayout_p.h1
-rw-r--r--src/layouts/qquicklinearlayout.cpp6
-rw-r--r--src/layouts/qquicklinearlayout_p.h1
-rw-r--r--tests/auto/controls/data/tst_gridlayout.qml20
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)