aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Edmundson <davidedmundson@kde.org>2020-04-19 15:14:02 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-08-26 16:52:06 +0000
commit8fdc4307d303ac6588141b16530008b31c00211e (patch)
treeedea98dc0ff84030d5489425b1d4b537beb7a139
parent31be20a6fe1bb4b01158f80602109e9d32239745 (diff)
Follow layoutMirroring in Layout margins
If a layout is laid out left to right using the layoutDirection property, we want left Margins on the left, and rightMargin still on the right However, if a layout is mirrored, not only should the layout direction change but also the left margin should now be on the right and vice versa. Task-number: QTBUG-62989 Change-Id: Iaae4bc436fd1eb7f1947869563ac325f3d6b79bb Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io> (cherry picked from commit 16613f3741af013f7e380c98df6889d73512d0ad) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/imports/layouts/qquickgridlayoutengine_p.h2
-rw-r--r--src/imports/layouts/qquicklayout.cpp5
-rw-r--r--src/imports/layouts/qquicklayout_p.h9
-rw-r--r--tests/auto/quick/qquicklayouts/data/tst_gridlayout.qml41
4 files changed, 56 insertions, 1 deletions
diff --git a/src/imports/layouts/qquickgridlayoutengine_p.h b/src/imports/layouts/qquickgridlayoutengine_p.h
index 5529d1049c..ff42fa4d43 100644
--- a/src/imports/layouts/qquickgridlayoutengine_p.h
+++ b/src/imports/layouts/qquickgridlayoutengine_p.h
@@ -107,7 +107,7 @@ public:
void setGeometry(const QRectF &rect) override
{
QQuickLayoutAttached *info = attachedLayoutObject(m_item, false);
- const QRectF r = info ? rect.marginsRemoved(info->qMargins()) : rect;
+ const QRectF r = info ? rect.marginsRemoved(info->effectiveQMargins()) : rect;
const QSizeF oldSize(m_item->width(), m_item->height());
const QSizeF newSize = r.size();
m_item->setPosition(r.topLeft());
diff --git a/src/imports/layouts/qquicklayout.cpp b/src/imports/layouts/qquicklayout.cpp
index a34b77ca11..e66b00e96f 100644
--- a/src/imports/layouts/qquicklayout.cpp
+++ b/src/imports/layouts/qquicklayout.cpp
@@ -936,6 +936,11 @@ bool QQuickLayout::invalidatedArrangement() const
return d_func()->m_dirtyArrangement;
}
+bool QQuickLayout::isMirrored() const
+{
+ return d_func()->isMirrored();
+}
+
void QQuickLayout::itemSiblingOrderChanged(QQuickItem *item)
{
Q_UNUSED(item);
diff --git a/src/imports/layouts/qquicklayout_p.h b/src/imports/layouts/qquicklayout_p.h
index fb3b39d65d..8a6ad0397c 100644
--- a/src/imports/layouts/qquicklayout_p.h
+++ b/src/imports/layouts/qquicklayout_p.h
@@ -99,6 +99,7 @@ public:
bool invalidated() const;
bool invalidatedArrangement() const;
+ bool isMirrored() const;
/* QQuickItemChangeListener */
void itemSiblingOrderChanged(QQuickItem *item) override;
@@ -256,6 +257,14 @@ public:
return QMarginsF(leftMargin(), topMargin(), rightMargin(), bottomMargin());
}
+ QMarginsF effectiveQMargins() const {
+ bool mirrored = parentLayout() && parentLayout()->isMirrored();
+ if (mirrored)
+ return QMarginsF(rightMargin(), topMargin(), leftMargin(), bottomMargin());
+ else
+ return qMargins();
+ }
+
bool setChangesNotificationEnabled(bool enabled)
{
const bool old = m_changesNotificationEnabled;
diff --git a/tests/auto/quick/qquicklayouts/data/tst_gridlayout.qml b/tests/auto/quick/qquicklayouts/data/tst_gridlayout.qml
index 0fa84a1617..46d18a4384 100644
--- a/tests/auto/quick/qquicklayouts/data/tst_gridlayout.qml
+++ b/tests/auto/quick/qquicklayouts/data/tst_gridlayout.qml
@@ -991,6 +991,47 @@ Item {
}
Component {
+
+ id: layout_RTL_Component
+ GridLayout {
+ LayoutMirroring.enabled: true
+ columns: 2
+ rowSpacing: 0
+ columnSpacing: 0
+ Rectangle {
+ color: "red"
+ Layout.preferredWidth: 20
+ Layout.preferredHeight: 20
+ Layout.leftMargin: 2
+ Layout.rightMargin: 1
+ }
+ Rectangle {
+ color: "blue"
+ Layout.preferredWidth: 20
+ Layout.preferredHeight: 20
+ Layout.leftMargin: 3
+ Layout.rightMargin: 4
+ }
+ }
+ }
+
+ function test_Rtl()
+ {
+ var layout = layout_RTL_Component.createObject(container)
+
+ compare(layout.implicitWidth, 3 + 20 + 4 + 2 + 20 + 1 )
+ layout.width = layout.implicitWidth
+
+ waitForRendering(layout)
+
+ var c0 = layout.children[0]
+ var c1 = layout.children[1]
+
+ compare(c1.x, 4) // c1 is first, with the right margin on the left
+ compare(c0.x, 20 + 3 + 4 + 1)
+ }
+
+ Component {
id: layout_invalidateWhileRearranging_Component
GridLayout {