aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2018-12-04 13:44:11 +0100
committerMitch Curtis <mitch.curtis@qt.io>2018-12-05 10:58:58 +0000
commitc98f8abe34c526bbf66000567b8e1084a788b26b (patch)
treebfe628b0d943d325f62db81b8b4cadc5b5d26e77
parent64c44f392b3912849e5eb81a98eae60d11c6dddb (diff)
SplitView: react to changes in implicit size of split items
Change-Id: Id81aac71f26ec9cbf643fdc480d76841d1e3be47 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
-rw-r--r--src/quicktemplates2/qquicksplitview.cpp19
-rw-r--r--src/quicktemplates2/qquicksplitview_p_p.h2
-rw-r--r--tests/auto/controls/data/tst_splitview.qml54
3 files changed, 75 insertions, 0 deletions
diff --git a/src/quicktemplates2/qquicksplitview.cpp b/src/quicktemplates2/qquicksplitview.cpp
index 287ec45e..ed86daed 100644
--- a/src/quicktemplates2/qquicksplitview.cpp
+++ b/src/quicktemplates2/qquicksplitview.cpp
@@ -1003,6 +1003,16 @@ void QQuickSplitViewPrivate::itemVisibilityChanged(QQuickItem *item)
layout();
}
+void QQuickSplitViewPrivate::itemImplicitWidthChanged(QQuickItem *)
+{
+ layout();
+}
+
+void QQuickSplitViewPrivate::itemImplicitHeightChanged(QQuickItem *)
+{
+ layout();
+}
+
QQuickSplitViewPrivate *QQuickSplitViewPrivate::get(QQuickSplitView *splitView)
{
return splitView->d_func();
@@ -1028,6 +1038,11 @@ QQuickSplitView::QQuickSplitView(QQuickSplitViewPrivate &dd, QQuickItem *parent)
QQuickSplitView::~QQuickSplitView()
{
+ Q_D(QQuickSplitView);
+ for (int i = 0; i < d->contentModel->count(); ++i) {
+ QQuickItem *item = qobject_cast<QQuickItem*>(d->contentModel->object(i));
+ d->removeImplicitSizeListener(item);
+ }
}
/*!
@@ -1358,6 +1373,8 @@ void QQuickSplitView::itemAdded(int index, QQuickItem *item)
d->createHandleItem(index < count - 1 ? index : index - 1);
}
+ d->addImplicitSizeListener(item);
+
d->updateHandleVisibilities();
d->updateFillIndex();
d->layout();
@@ -1408,6 +1425,8 @@ void QQuickSplitView::itemRemoved(int index, QQuickItem *item)
if (attached)
QQuickSplitViewAttachedPrivate::get(attached)->setView(this);
+ d->removeImplicitSizeListener(item);
+
d->removeExcessHandles();
d->updateHandleVisibilities();
d->updateFillIndex();
diff --git a/src/quicktemplates2/qquicksplitview_p_p.h b/src/quicktemplates2/qquicksplitview_p_p.h
index 65fbd900..1e0368d5 100644
--- a/src/quicktemplates2/qquicksplitview_p_p.h
+++ b/src/quicktemplates2/qquicksplitview_p_p.h
@@ -98,6 +98,8 @@ public:
void handleRelease(const QPointF &point) override;
void itemVisibilityChanged(QQuickItem *item) override;
+ void itemImplicitWidthChanged(QQuickItem *item) override;
+ void itemImplicitHeightChanged(QQuickItem *item) override;
static QQuickSplitViewPrivate *get(QQuickSplitView *splitView);
diff --git a/tests/auto/controls/data/tst_splitview.qml b/tests/auto/controls/data/tst_splitview.qml
index 9fd5b855..8879c849 100644
--- a/tests/auto/controls/data/tst_splitview.qml
+++ b/tests/auto/controls/data/tst_splitview.qml
@@ -1179,6 +1179,60 @@ TestCase {
compareSizes(control, data.expectedGeometries)
}
+ function test_splitItemImplicitSizeChanges_data() {
+ var defaultSplitViewWidth = testCase.width
+ var defaultSplitViewHeight = testCase.height
+
+ var data = [
+ {
+ tag: "growImplicitWidth",
+ orientation: Qt.Horizontal,
+ splitItemImplicitWidth: 50,
+ expectedGeometries: [
+ { x: 0, y: 0, width: 50, height: defaultSplitViewHeight },
+ { x: 50, y: 0, width: defaultHorizontalHandleWidth, height: defaultSplitViewHeight },
+ { x: 50 + defaultHorizontalHandleWidth, y: 0, width: 100, height: defaultSplitViewHeight },
+ { x: 50 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
+ height: defaultSplitViewHeight },
+ { x: 50 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
+ width: defaultSplitViewWidth - 50 - 100 - defaultHorizontalHandleWidth * 2, height: defaultSplitViewHeight }
+ ]
+ },
+ {
+ tag: "growImplicitHeight",
+ orientation: Qt.Vertical,
+ splitItemImplicitHeight: 50,
+ expectedGeometries: [
+ { x: 0, y: 0, width: defaultSplitViewWidth, height: 50 },
+ { x: 0, y: 50, width: defaultSplitViewWidth, height: defaultVerticalHandleHeight },
+ { x: 0, y: 50 + defaultVerticalHandleHeight, width: defaultSplitViewWidth, height: 100 },
+ { x: 0, y: 50 + 100 + defaultVerticalHandleHeight, width: defaultSplitViewWidth,
+ height: defaultVerticalHandleHeight },
+ { x: 0, y: 50 + 100 + defaultVerticalHandleHeight * 2, width: defaultSplitViewWidth,
+ height: defaultSplitViewHeight - 50 - 100 - defaultVerticalHandleHeight * 2 }
+ ]
+ }
+ ]
+ return data
+ }
+
+ // Tests that implicitWidth/Height changes in items are noticed by SplitView.
+ function test_splitItemImplicitSizeChanges(data) {
+ var control = createTemporaryObject(threeSizedItemsComponent, testCase,
+ { "handle": handleComponent, "orientation": data.orientation })
+ verify(control)
+
+ var firstItem = control.itemAt(0)
+
+ if (data.hasOwnProperty("splitItemImplicitWidth"))
+ firstItem.implicitWidth = data.splitItemImplicitWidth
+
+ if (data.hasOwnProperty("splitItemImplicitHeight"))
+ firstItem.implicitHeight = data.splitItemImplicitHeight
+
+ compareSizes(control, data.expectedGeometries)
+ }
+
Component {
id: largerHandle
Rectangle {