diff options
-rw-r--r-- | src/imports/layouts/qquickgridlayoutengine_p.h | 2 | ||||
-rw-r--r-- | src/imports/layouts/qquicklayout.cpp | 5 | ||||
-rw-r--r-- | src/imports/layouts/qquicklayout_p.h | 9 | ||||
-rw-r--r-- | tests/auto/quick/qquicklayouts/data/tst_gridlayout.qml | 41 |
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 { |