aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quickcontrols2/controls/data/tst_splitview.qml
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/quickcontrols2/controls/data/tst_splitview.qml')
-rw-r--r--tests/auto/quickcontrols2/controls/data/tst_splitview.qml2148
1 files changed, 0 insertions, 2148 deletions
diff --git a/tests/auto/quickcontrols2/controls/data/tst_splitview.qml b/tests/auto/quickcontrols2/controls/data/tst_splitview.qml
deleted file mode 100644
index b9ace27e..00000000
--- a/tests/auto/quickcontrols2/controls/data/tst_splitview.qml
+++ /dev/null
@@ -1,2148 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick
-import QtQuick.Controls
-import QtQuick.Window
-import QtTest
-import Qt.labs.settings
-
-TestCase {
- id: testCase
- width: 400
- height: 400
- visible: true
- when: windowShown
- name: "SplitView"
-
- function initTestCase() {
- // For the serialization tests.
- Qt.application.name = "qtquickcontrols2-splitview-auto-test"
- Qt.application.domain = "org.qt-project"
- Qt.application.organization = "QtProject"
- }
-
- function findHandles(splitView) {
- var handles = []
- for (var i = 0; i < splitView.children.length; ++i) {
- var child = splitView.children[i]
- if (child.objectName.toLowerCase().indexOf("handle") !== -1)
- handles.push(child)
- }
- return handles
- }
-
- function compareSizes(control, expectedGeometries, context) {
- if (context === undefined)
- context = ""
- else
- context = " (" + context + ")"
-
- compare(control.count, Math.floor(expectedGeometries.length / 2) + 1,
- "Mismatch in actual vs expected number of split items" + context)
-
- var handles = findHandles(control)
- compare(handles.length, Math.floor(expectedGeometries.length / 2),
- "Mismatch in actual vs expected number of handle items" + context)
-
- for (var i = 0, splitItemIndex = 0, handleItemIndex = 0; i < expectedGeometries.length; ++i) {
- var item = null
- var itemType = ""
- var typeSpecificIndex = -1
- if (i % 2 == 0) {
- item = control.itemAt(splitItemIndex)
- itemType = "split item"
- typeSpecificIndex = splitItemIndex
- ++splitItemIndex
- } else {
- item = handles[handleItemIndex]
- itemType = "handle item"
- typeSpecificIndex = handleItemIndex
- ++handleItemIndex
- }
-
- verify(item, itemType + " at index " + typeSpecificIndex + " should not be null" + context)
-
- var expectedGeometry = expectedGeometries[i]
- if (expectedGeometry.hasOwnProperty("hidden")) {
- // It's geometry doesn't matter because it's hidden.
- verify(!item.visible, itemType + " at index " + typeSpecificIndex + " should be hidden" + context)
- continue
- }
-
- // Note that the indices mentioned here account for handles; they do not
- // match the indices reported by QQuickSplitView's logging categories.
- compare(item.x, expectedGeometry.x, "Mismatch in actual vs expected x value of "
- + itemType + " at index " + typeSpecificIndex + context)
- compare(item.y, expectedGeometry.y, "Mismatch in actual vs expected y value of "
- + itemType + " at index " + typeSpecificIndex + context)
- compare(item.width, expectedGeometry.width, "Mismatch in actual vs expected width value of "
- + itemType + " at index " + typeSpecificIndex + context)
- compare(item.height, expectedGeometry.height, "Mismatch in actual vs expected height value of "
- + itemType + " at index " + typeSpecificIndex + context)
- }
- }
-
- property real defaultHorizontalHandleWidth: 10
- property real defaultVerticalHandleHeight: 10
-
-
- Component {
- id: signalSpyComponent
- SignalSpy {}
- }
-
- Component {
- id: handleComponent
- Rectangle {
- objectName: "handle"
- implicitWidth: defaultHorizontalHandleWidth
- implicitHeight: defaultVerticalHandleHeight
- color: "#444"
-
- Text {
- objectName: "handleText_" + text
- text: parent.x + "," + parent.y + " " + parent.width + "x" + parent.height
- color: "white"
- anchors.centerIn: parent
- rotation: 90
- }
- }
- }
-
- Component {
- id: splitViewComponent
-
- SplitView {
- anchors.fill: parent
- handle: handleComponent
- }
- }
-
- Component {
- id: rectangleComponent
-
- Rectangle {}
- }
-
- function test_addItemsAfterCompletion() {
- var control = createTemporaryObject(splitViewComponent, testCase)
- verify(control)
-
- var item0 = rectangleComponent.createObject(control, { implicitWidth: 25, color: "salmon" })
- verify(item0)
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- // The last item fills the width by default, and since there is only one item...
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, testCase.width)
- compare(item0.height, testCase.height)
-
- var item1 = rectangleComponent.createObject(control, { implicitWidth: 25, color: "steelblue" })
- verify(item1)
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- // Now that a second item has been added, the first item goes back to its preferred (implicit) width.
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, item0.implicitWidth)
- compare(item0.height, testCase.height)
- var handles = findHandles(control)
- var handle0 = handles[0]
- compare(handle0.x, item0.implicitWidth)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
- compare(item1.x, item0.implicitWidth + defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, testCase.width - item0.implicitWidth - defaultHorizontalHandleWidth)
- compare(item1.height, testCase.height)
- }
-
- function test_addItemsWithNoSizeAfterCompletion() {
- var control = createTemporaryObject(splitViewComponent, testCase)
- verify(control)
-
- var item0 = rectangleComponent.createObject(control, { color: "salmon" })
- verify(item0)
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, testCase.width)
- compare(item0.height, testCase.height)
-
- var item1 = rectangleComponent.createObject(control, { color: "steelblue" })
- verify(item1)
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, 0)
- compare(item0.height, testCase.height)
- var handles = findHandles(control)
- var handle0 = handles[0]
- compare(handle0.x, 0)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
- compare(item1.x, defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, testCase.width - defaultHorizontalHandleWidth)
- compare(item1.height, testCase.height)
- }
-
- Component {
- id: threeZeroSizedItemsComponent
-
- SplitView {
- anchors.fill: parent
- handle: handleComponent
-
- Rectangle {
- objectName: "salmon"
- color: objectName
- }
- Rectangle {
- objectName: "navajowhite"
- color: objectName
- }
- Rectangle {
- objectName: "steelblue"
- color: objectName
- }
- }
- }
-
- function test_changeAttachedPropertiesAfterCompletion() {
- var control = createTemporaryObject(threeZeroSizedItemsComponent, testCase)
- verify(control)
-
- var item0 = control.itemAt(0)
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, 0)
- compare(item0.height, testCase.height)
-
- var handles = findHandles(control)
- var handle0 = handles[0]
- compare(handle0.x, 0)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
-
- var item1 = control.itemAt(1)
- compare(item1.x, defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, 0)
- compare(item1.height, testCase.height)
-
- var handle1 = handles[1]
- compare(handle1.x, defaultHorizontalHandleWidth)
- compare(handle1.y, 0)
- compare(handle1.width, defaultHorizontalHandleWidth)
- compare(handle1.height, testCase.height)
-
- var item2 = control.itemAt(2)
- compare(item2.x, defaultHorizontalHandleWidth * 2)
- compare(item2.y, 0)
- compare(item2.width, testCase.width - item2.x)
- compare(item2.height, testCase.height)
-
- item0.SplitView.preferredWidth = 25
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, 25)
- compare(item0.height, testCase.height)
- compare(handle0.x, item0.width)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
- compare(item1.x, 25 + defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, 0)
- compare(item1.height, testCase.height)
- compare(handle1.x, item1.x + item1.width)
- compare(handle1.y, 0)
- compare(handle1.width, defaultHorizontalHandleWidth)
- compare(handle1.height, testCase.height)
- compare(item2.x, item1.x + item1.width + defaultHorizontalHandleWidth)
- compare(item2.y, 0)
- compare(item2.width, testCase.width - item2.x)
- compare(item2.height, testCase.height)
-
- item0.SplitView.minimumWidth = 50
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, 50)
- compare(item0.height, testCase.height)
- compare(handle0.x, item0.width)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
- compare(item1.x, 50 + defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, 0)
- compare(item1.height, testCase.height)
- compare(handle1.x, item1.x + item1.width)
- compare(handle1.y, 0)
- compare(handle1.width, defaultHorizontalHandleWidth)
- compare(handle1.height, testCase.height)
- compare(item2.x, item1.x + item1.width + defaultHorizontalHandleWidth)
- compare(item2.y, 0)
- compare(item2.width, testCase.width - item2.x)
- compare(item2.height, testCase.height)
-
- item0.SplitView.preferredWidth = 100
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, 100)
- compare(item0.height, testCase.height)
- compare(handle0.x, item0.width)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
- compare(item1.x, 100 + defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, 0)
- compare(item1.height, testCase.height)
- compare(handle1.x, item1.x + item1.width)
- compare(handle1.y, 0)
- compare(handle1.width, defaultHorizontalHandleWidth)
- compare(handle1.height, testCase.height)
- compare(item2.x, item1.x + item1.width + defaultHorizontalHandleWidth)
- compare(item2.y, 0)
- compare(item2.width, testCase.width - item2.x)
- compare(item2.height, testCase.height)
-
- item0.SplitView.maximumWidth = 75
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, 75)
- compare(item0.height, testCase.height)
- compare(handle0.x, item0.width)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
- compare(item1.x, 75 + defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, 0)
- compare(item1.height, testCase.height)
- compare(handle1.x, item1.x + item1.width)
- compare(handle1.y, 0)
- compare(handle1.width, defaultHorizontalHandleWidth)
- compare(handle1.height, testCase.height)
- compare(item2.x, item1.x + item1.width + defaultHorizontalHandleWidth)
- compare(item2.y, 0)
- compare(item2.width, testCase.width - item2.x)
- compare(item2.height, testCase.height)
-
- item1.SplitView.fillWidth = true
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, 75)
- compare(item0.height, testCase.height)
- compare(handle0.x, item0.width)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
- compare(item1.x, 75 + defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, testCase.width - 75 - defaultHorizontalHandleWidth * 2)
- compare(item1.height, testCase.height)
- compare(handle1.x, item1.x + item1.width)
- compare(handle1.y, 0)
- compare(handle1.width, defaultHorizontalHandleWidth)
- compare(handle1.height, testCase.height)
- compare(item2.x, testCase.width)
- compare(item2.y, 0)
- compare(item2.width, 0)
- compare(item2.height, testCase.height)
- }
-
- Component {
- id: itemComponent
- Item {}
- }
-
- Component {
- id: objectComponent
- QtObject {}
- }
-
- function test_useAttachedPropertiesIncorrectly_data() {
- var properties = [ "fillWidth", "fillHeight", "minimumWidth", "minimumHeight",
- "preferredWidth", "preferredHeight", "maximumWidth", "maximumHeight" ]
-
- var data = []
-
- for (var i = 0; i < properties.length; ++i) {
- var property = properties[i]
- data.push({ tag: "Item," + property, component: itemComponent, property: property,
- expectedWarning: /.*SplitView: attached properties must be accessed through a direct child of SplitView/ })
- }
-
- for (i = 0; i < properties.length; ++i) {
- property = properties[i]
- data.push({ tag: "QtObject," + property, component: objectComponent, property: property,
- expectedWarning: /.*SplitView: attached properties can only be used on Items/ })
- }
-
- return data
- }
-
- function test_useAttachedPropertiesIncorrectly(data) {
- // The object (whatever it may be) is not managed by a SplitView.
- var object = createTemporaryObject(data.component, testCase, { objectName: data.tag })
- verify(object)
-
- ignoreWarning(data.expectedWarning)
- // Should warn, but not crash.
- object.SplitView[data.property] = 1;
- }
-
- function test_sizes_data() {
- var splitViewWidth = testCase.width
- var splitViewHeight = testCase.height
- var data = [
- {
- // When the combined size of items is too large, the non-fill items should just exceed
- // the size of the SplitView, exactly as they would were they in a RowLayout, for example.
- tag: "fillItemOnLeft",
- expectedGeometries: [
- // We're the fill item, but since the combined implicitWidths
- // of the other two items take up all the space, we get none.
- { x: 0, y: 0, width: 0, height: splitViewHeight },
- // First handle.
- { x: 0, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The second item does not fill, so its width should be unchanged.
- { x: defaultHorizontalHandleWidth, y: 0, width: 200, height: splitViewHeight },
- // Second handle.
- { x: 200 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- // The third item also gets its implicitWidth.
- { x: 200 + defaultHorizontalHandleWidth * 2, y: 0, width: 200, height: splitViewHeight }
- ]
- },
- {
- // Same as above except vertical.
- tag: "fillItemOnTop",
- expectedGeometries: [
- // We're the fill item, but since the combined implicitHeights
- // of the other two items take up all the space, we get none.
- { x: 0, y: 0, width: splitViewWidth, height: 0 },
- // First handle.
- { x: 0, y: 0, width: splitViewWidth, height: defaultVerticalHandleHeight },
- // The second item does not fill, so its height should be unchanged.
- { x: 0, y: defaultVerticalHandleHeight, width: splitViewWidth, height: 200 },
- // Second handle.
- { x: 0, y: 200 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- // The third item also gets its implicitHeight.
- { x: 0, y: 200 + defaultVerticalHandleHeight * 2, width: splitViewWidth, height: 200 }
- ]
- },
- {
- tag: "fillItemInMiddle",
- expectedGeometries: [
- // Our size is fixed.
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- // First handle.
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The second item fills.
- { x: 25 + defaultHorizontalHandleWidth, y: 0,
- width: splitViewWidth - 25 - 200 - defaultHorizontalHandleWidth * 2, height: splitViewHeight },
- // Second handle.
- { x: splitViewWidth - 200 - defaultHorizontalHandleWidth, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The third item's size is also fixed.
- { x: splitViewWidth - 200, y: 0, width: 200, height: splitViewHeight }
- ]
- }
- ]
- return data
- }
-
- function test_sizes(data) {
- var component = Qt.createComponent("splitview/" + data.tag + ".qml")
- compare(component.status, Component.Ready, component.errorString());
- var control = createTemporaryObject(component, testCase, { "handle": handleComponent })
- verify(control)
-
- compareSizes(control, data.expectedGeometries)
- }
-
- Component {
- id: threeSizedItemsComponent
-
- SplitView {
- anchors.fill: parent
- handle: handleComponent
-
- Rectangle {
- objectName: "salmon"
- color: objectName
- implicitWidth: 25
- implicitHeight: 25
- }
- Rectangle {
- objectName: "navajowhite"
- color: objectName
- implicitWidth: 100
- implicitHeight: 100
- }
- Rectangle {
- objectName: "steelblue"
- color: objectName
- implicitWidth: 200
- implicitHeight: 200
- }
- }
- }
-
- function test_resetAttachedProperties_data() {
- var splitViewWidth = testCase.width
- var splitViewHeight = testCase.height
- var data = [
- {
- tag: "resetMinimumWidth",
- orientation: Qt.Horizontal,
- // Set the minimumWidth to 50. It should be used instead of implicitWidth since it's greater than 25.
- splitItemIndex: 0,
- propertyName: "minimumWidth",
- propertyValue: 50,
- expectedGeometriesBefore: [
- { x: 0, y: 0, width: 50, height: splitViewHeight },
- { x: 50, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 50 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 50 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- { x: 50 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 50 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ],
- // minimumWidth is now undefined, so implicitWidth should be used instead.
- expectedGeometriesAfter: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 25 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ]
- },
- {
- tag: "resetMinimumHeight",
- orientation: Qt.Vertical,
- // Set the minimumHeight to 50. It should be used instead of implicitHeight since it's greater than 25.
- splitItemIndex: 0,
- propertyName: "minimumHeight",
- propertyValue: 50,
- expectedGeometriesBefore: [
- { x: 0, y: 0, width: splitViewWidth, height: 50 },
- { x: 0, y: 50, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 50 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 50 + 100 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 50 + 100 + defaultVerticalHandleHeight * 2, width: splitViewWidth,
- height: splitViewHeight - 50 - 100 - defaultVerticalHandleHeight * 2 }
- ],
- // preferredHeight is now undefined, so implicitHeight should be used instead.
- expectedGeometriesAfter: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight * 2, width: splitViewWidth,
- height: splitViewHeight - 25 - 100 - defaultVerticalHandleHeight * 2 }
- ]
- },
- {
- tag: "resetPreferredWidth",
- orientation: Qt.Horizontal,
- // Set the preferredWidth to 50; it should be used instead of implicitWidth.
- splitItemIndex: 0,
- propertyName: "preferredWidth",
- propertyValue: 50,
- expectedGeometriesBefore: [
- { x: 0, y: 0, width: 50, height: splitViewHeight },
- { x: 50, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 50 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 50 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- { x: 50 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 50 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ],
- // preferredWidth is now undefined, so implicitWidth should be used instead.
- expectedGeometriesAfter: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 25 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ]
- },
- {
- tag: "resetPreferredHeight",
- orientation: Qt.Vertical,
- // Set the preferredHeight to 50; it should be used instead of implicitHeight.
- splitItemIndex: 0,
- propertyName: "preferredHeight",
- propertyValue: 50,
- expectedGeometriesBefore: [
- { x: 0, y: 0, width: splitViewWidth, height: 50 },
- { x: 0, y: 50, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 50 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 50 + 100 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 50 + 100 + defaultVerticalHandleHeight * 2, width: splitViewWidth,
- height: splitViewHeight - 50 - 100 - defaultVerticalHandleHeight * 2 }
- ],
- // preferredHeight is now undefined, so implicitHeight should be used instead.
- expectedGeometriesAfter: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight * 2, width: splitViewWidth,
- height: splitViewHeight - 25 - 100 - defaultVerticalHandleHeight * 2 }
- ]
- },
- {
- tag: "resetMaximumWidth",
- orientation: Qt.Horizontal,
- // Set the maximumWidth to 15. It should be used instead of implicitWidth since it's less than 25.
- splitItemIndex: 0,
- propertyName: "maximumWidth",
- propertyValue: 15,
- expectedGeometriesBefore: [
- { x: 0, y: 0, width: 15, height: splitViewHeight },
- { x: 15, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 15 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 15 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- { x: 15 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 15 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ],
- // maximumWidth is now undefined, so implicitWidth should be used instead.
- expectedGeometriesAfter: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 25 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ]
- },
- {
- tag: "resetMaximumHeight",
- orientation: Qt.Vertical,
- // Set the preferredHeight to 15. It should be used instead of implicitHeight if it's not undefined.
- splitItemIndex: 0,
- propertyName: "maximumHeight",
- propertyValue: 15,
- expectedGeometriesBefore: [
- { x: 0, y: 0, width: splitViewWidth, height: 15 },
- { x: 0, y: 15, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 15 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 15 + 100 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 15 + 100 + defaultVerticalHandleHeight * 2, width: splitViewWidth,
- height: splitViewHeight - 15 - 100 - defaultVerticalHandleHeight * 2 }
- ],
- // preferredHeight is now undefined, so implicitHeight should be used instead.
- expectedGeometriesAfter: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight * 2, width: splitViewWidth,
- height: splitViewHeight - 25 - 100 - defaultVerticalHandleHeight * 2 }
- ]
- },
- ]
- return data;
- }
-
- function test_resetAttachedProperties(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase,
- { "orientation": data.orientation })
- verify(control)
-
- var splitItem = control.itemAt(data.splitItemIndex)
- splitItem.SplitView[data.propertyName] = data.propertyValue
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometriesBefore, "after setting attached property")
-
- splitItem.SplitView[data.propertyName] = undefined
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometriesAfter, "after resetting attached property")
- }
-
- function test_orientation() {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase)
- verify(control)
-
- var item0 = control.itemAt(0)
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, item0.implicitWidth)
- compare(item0.height, testCase.height)
-
- var handles = findHandles(control)
- var handle0 = handles[0]
- compare(handle0.x, item0.implicitWidth)
- compare(handle0.y, 0)
- compare(handle0.width, defaultHorizontalHandleWidth)
- compare(handle0.height, testCase.height)
-
- var item1 = control.itemAt(1)
- compare(item1.x, item0.width + defaultHorizontalHandleWidth)
- compare(item1.y, 0)
- compare(item1.width, item1.implicitWidth)
- compare(item1.height, testCase.height)
-
- var handle1 = handles[1]
- compare(handle1.x, item1.x + item1.width)
- compare(handle1.y, 0)
- compare(handle1.width, defaultHorizontalHandleWidth)
- compare(handle1.height, testCase.height)
-
- var item2 = control.itemAt(2)
- compare(item2.x, item0.width + item1.width + defaultHorizontalHandleWidth * 2)
- compare(item2.y, 0)
- compare(item2.width, testCase.width - item2.x)
- compare(item2.height, testCase.height)
-
- control.orientation = Qt.Vertical
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(item0.x, 0)
- compare(item0.y, 0)
- compare(item0.width, testCase.width)
- compare(item0.height, item0.implicitHeight)
- handles = findHandles(control)
- handle0 = handles[0]
- compare(handle0.x, 0)
- compare(handle0.y, item0.implicitHeight)
- compare(handle0.width, testCase.width)
- compare(handle0.height, defaultVerticalHandleHeight)
- compare(item1.x, 0)
- compare(item1.y, item0.height + defaultVerticalHandleHeight)
- compare(item1.width, testCase.width)
- compare(item1.height, item1.implicitHeight)
- handle1 = handles[1]
- compare(handle1.x, 0)
- compare(handle1.y, item1.y + item1.height)
- compare(handle1.width, testCase.width)
- compare(handle1.height, defaultVerticalHandleHeight)
- compare(item2.x, 0)
- compare(item2.y, item0.height + item1.height + defaultVerticalHandleHeight * 2)
- compare(item2.width, testCase.width)
- compare(item2.height, testCase.height - item2.y)
- }
-
- readonly property int splitViewMargins: 50
-
- Component {
- id: threeItemsMinSizeAndFillComponent
-
- SplitView {
- anchors.fill: parent
- handle: handleComponent
-
- Rectangle {
- objectName: "salmon"
- color: objectName
- implicitWidth: 25
- implicitHeight: 25
- SplitView.minimumWidth: 25
- SplitView.minimumHeight: 25
- SplitView.fillWidth: true
- SplitView.fillHeight: true
- }
- Rectangle {
- objectName: "navajowhite"
- color: objectName
- implicitWidth: 100
- implicitHeight: 100
- }
- Rectangle {
- objectName: "steelblue"
- color: objectName
- implicitWidth: 200
- implicitHeight: 200
- }
- }
- }
-
- Component {
- id: repeaterSplitViewComponent
-
- SplitView {
- anchors.fill: parent
- handle: handleComponent
-
- property alias repeater: repeater
-
- Repeater {
- id: repeater
- model: 3
- delegate: Rectangle {
- objectName: "rectDelegate" + index
-
- SplitView.preferredWidth: 25
-
- color: "#aaff0000"
-
- Text {
- text: parent.x + "," + parent.y + " " + parent.width + "x" + parent.height
- color: "white"
- rotation: 90
- anchors.centerIn: parent
- }
- }
- }
- }
- }
-
- Component {
- id: hiddenItemSplitViewComponent
-
- SplitView {
- anchors.fill: parent
- handle: handleComponent
-
- Rectangle {
- objectName: "steelblue"
- color: objectName
-
- SplitView.minimumWidth: 50
- }
- Rectangle {
- objectName: "tomato"
- color: objectName
-
- SplitView.fillWidth: true
- SplitView.preferredWidth: 200
- }
- Rectangle {
- objectName: "navajowhite"
- color: objectName
- visible: false
-
- SplitView.minimumWidth: visible ? 100 : 0
- }
- Rectangle {
- objectName: "mediumseagreen"
- color: objectName
-
- SplitView.minimumWidth: 50
- }
- }
- }
-
- function test_dragHandle_data() {
- var splitViewWidth = testCase.width - splitViewMargins * 2
- var splitViewHeight = testCase.height - splitViewMargins * 2
- var data = [
- {
- tag: "fillThirdItemAndDragFirstHandlePastRightSide",
- component: threeSizedItemsComponent,
- orientation: Qt.Horizontal,
- // The index of the item that will fill.
- fillIndex: 2,
- // The index of the handle to be dragged.
- handleIndex: 0,
- // The position where the center of the handle will be.
- newHandlePos: Qt.point(testCase.width + 20, testCase.height / 2),
- // The expected geometry of each item managed by the SplitView before dragging the handle.
- expectedGeometriesBeforeDrag: [
- // First item.
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- // First handle.
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // Second item.
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- // Second handle.
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // Third item (fills).
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 25 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ],
- // The expected geometry of each item managed by the SplitView after dragging the handle.
- expectedGeometriesAfterDrag: [
- // The fill item is to the right of the handle at index 0, so the handle belongs
- // to the left item: us. We should consume all of the fill item's width.
- { x: 0, y: 0, width: splitViewWidth - 100 - defaultHorizontalHandleWidth * 2,
- height: splitViewHeight },
- // First handle.
- { x: splitViewWidth - defaultHorizontalHandleWidth * 2 - 100,
- y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The second item does not fill, so its width should be unchanged.
- { x: splitViewWidth - 100 - defaultHorizontalHandleWidth,
- y: 0, width: 100, height: splitViewHeight },
- // Second handle.
- { x: splitViewWidth - defaultHorizontalHandleWidth,
- y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The last item does fill, so it should lose all of its width.
- { x: splitViewWidth, y: 0, width: 0, height: splitViewHeight }
- ]
- },
- {
- tag: "fillThirdItemAndDragFirstHandlePastBottomSide",
- component: threeSizedItemsComponent,
- orientation: Qt.Vertical,
- fillIndex: 2,
- handleIndex: 0,
- newHandlePos: Qt.point(testCase.width / 2, testCase.height + 20),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight * 2,
- width: splitViewWidth, height: splitViewHeight - 25 - 100 - defaultVerticalHandleHeight * 2 }
- ],
- // The expected geometry of each item managed by the SplitView after dragging the handle.
- expectedGeometriesAfterDrag: [
- // The fill item is to the bottom of the handle at index 0, so the handle belongs
- // to the top item: us. We should consume all of the fill item's width.
- { x: 0, y: 0, width: splitViewWidth,
- height: splitViewHeight - 100 - defaultVerticalHandleHeight * 2 },
- // First handle.
- { x: 0, y: splitViewHeight - defaultVerticalHandleHeight * 2 - 100,
- width: splitViewWidth, height: defaultVerticalHandleHeight },
- // The second item does not fill, so its height should be unchanged.
- { x: 0, y: splitViewWidth - 100 - defaultVerticalHandleHeight,
- width: splitViewWidth, height: 100 },
- // Second handle.
- { x: 0, y: splitViewHeight - defaultVerticalHandleHeight,
- width: splitViewWidth, height: defaultVerticalHandleHeight },
- // The last item does fill, so it should lose all of its width.
- { x: 0, y: splitViewHeight, width: splitViewWidth, height: 0 }
- ]
- },
- {
- tag: "fillThirdItemAndDragSecondHandlePastLeftSide",
- component: threeSizedItemsComponent,
- orientation: Qt.Horizontal,
- fillIndex: 2,
- handleIndex: 1,
- newHandlePos: Qt.point(-20, testCase.height / 2),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 25 - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ],
- expectedGeometriesAfterDrag: [
- // The fill item is to the right of the handle at index 1, so the handle belongs
- // to the second item; our width should be unchanged.
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- // First handle.
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The second item is the one being resized, and since we're dragging its handle
- // to the left, its width should decrease.
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 0, height: splitViewHeight },
- // Second handle.
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: splitViewHeight },
- // The last item fills, so it should get the second item's lost width.
- { x: 25 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 25 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ]
- },
- {
- tag: "fillThirdItemAndDragSecondHandlePastTopSide",
- component: threeSizedItemsComponent,
- orientation: Qt.Vertical,
- fillIndex: 2,
- handleIndex: 1,
- newHandlePos: Qt.point(testCase.width / 2, -20),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight * 2,
- width: splitViewWidth, height: splitViewHeight - 25 - 100 - defaultVerticalHandleHeight * 2 }
- ],
- expectedGeometriesAfterDrag: [
- // The fill item is to the bottom of the handle at index 1, so the handle belongs
- // to the second item; our height should be unchanged.
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- // First handle.
- { x: 0, y: 25, width: splitViewWidth, height: defaultVerticalHandleHeight },
- // The second item is the one being resized, and since we're dragging its handle
- // to the top, its height should decrease.
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: splitViewWidth, height: 0 },
- // Second handle.
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: splitViewWidth,
- height: defaultVerticalHandleHeight },
- // The last item fills, so it should get the second item's lost height.
- { x: 0, y: 25 + defaultVerticalHandleHeight * 2,
- width: splitViewWidth, height: splitViewHeight - 25 - defaultVerticalHandleHeight * 2 }
- ]
- },
- {
- // First item should start off empty and then eventually take up all of 3rd item's space
- // as the handle is dragged past the right side.
- tag: "fillFirstItemAndDragSecondHandlePastRightSide",
- component: threeSizedItemsComponent,
- orientation: Qt.Horizontal,
- fillIndex: 0,
- handleIndex: 1,
- newHandlePos: Qt.point(testCase.width + 20, testCase.height / 2),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: 0, height: splitViewHeight },
- { x: 0, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 100 + defaultHorizontalHandleWidth * 2, y: 0, width: 200, height: splitViewHeight }
- ],
- expectedGeometriesAfterDrag: [
- // The fill item is to the left of the handle at index 1, so the handle belongs
- // to the third item. Since we're moving the handle to the right side of the
- // SplitView, our width should grow as we consume the width of the third item.
- { x: 0, y: 0, width: splitViewWidth - 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight },
- // First handle.
- { x: splitViewWidth - 100 - defaultHorizontalHandleWidth * 2, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The second item's width remains unchanged.
- { x: splitViewWidth - 100 - defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- // Second handle.
- { x: splitViewWidth - defaultHorizontalHandleWidth, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The last item loses its width.
- { x: splitViewWidth, y: 0, width: 0, height: splitViewHeight }
- ]
- },
- {
- // First item should start off empty and then eventually take up all of 3rd item's space
- // as the handle is dragged past the bottom side.
- tag: "fillFirstItemAndDragSecondHandlePastBottomSide",
- component: threeSizedItemsComponent,
- orientation: Qt.Vertical,
- fillIndex: 0,
- handleIndex: 1,
- newHandlePos: Qt.point(testCase.width / 2, testCase.height + 20),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: splitViewWidth, height: 0 },
- { x: 0, y: 0, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- { x: 0, y: 100 + defaultVerticalHandleHeight, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 100 + defaultVerticalHandleHeight * 2, width: splitViewWidth, height: 200 }
- ],
- expectedGeometriesAfterDrag: [
- // The fill item is to the top of the handle at index 1, so the handle belongs
- // to the third item. Since we're moving the handle to the bottom side of the
- // SplitView, our height should grow as we consume the height of the third item.
- { x: 0, y: 0, width: splitViewWidth, height: splitViewHeight - 100 - defaultVerticalHandleHeight * 2 },
- // First handle.
- { x: 0, y: splitViewHeight - 100 - defaultVerticalHandleHeight * 2,
- width: splitViewWidth, height: defaultVerticalHandleHeight },
- // The second item's width remains unchanged.
- { x: 0, y: splitViewHeight - 100 - defaultVerticalHandleHeight, width: splitViewWidth, height: 100 },
- // Second handle.
- { x: 0, y: splitViewHeight - defaultVerticalHandleHeight,
- width: splitViewWidth, height: defaultVerticalHandleHeight },
- // The last item loses its width.
- { x: 0, y: splitViewHeight, width: splitViewHeight, height: 0 }
- ]
- },
- {
- tag: "fillFirstItemAndDragFirstHandlePastLeftSide",
- component: threeSizedItemsComponent,
- orientation: Qt.Horizontal,
- fillIndex: 0,
- handleIndex: 0,
- newHandlePos: Qt.point(-20, testCase.height / 2),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: 0, height: splitViewHeight },
- { x: 0, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // The second item's implicitWidth is 100, and ours is 200. The available width is 300,
- // so both items get their implicit widths.
- { x: 100 + defaultHorizontalHandleWidth * 2, y: 0, width: splitViewWidth - 100, height: splitViewHeight }
- ],
- // Should be unchanged.
- expectedGeometriesAfterDrag: [
- { x: 0, y: 0, width: 0, height: splitViewHeight },
- { x: 0, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 100 + defaultHorizontalHandleWidth * 2, y: 0, width: splitViewWidth - 100, height: splitViewHeight }
- ]
- },
- {
- tag: "fillFirstItemWithMinWidthAndDragFirstHandlePastLeftSide",
- component: threeItemsMinSizeAndFillComponent,
- orientation: Qt.Horizontal,
- fillIndex: 0,
- handleIndex: 0,
- newHandlePos: Qt.point(-20, testCase.height / 2),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0, width: splitViewWidth - 100, height: splitViewHeight }
- ],
- // Should be unchanged.
- expectedGeometriesAfterDrag: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0, width: splitViewWidth - 100, height: splitViewHeight }
- ]
- },
- {
- tag: "repeater",
- component: repeaterSplitViewComponent,
- orientation: Qt.Horizontal,
- fillIndex: 2,
- handleIndex: 1,
- newHandlePos: Qt.point(200, testCase.height / 2),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 25, height: splitViewHeight },
- { x: 25 * 2 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 * 2 + defaultHorizontalHandleWidth * 2, y: 0, width: splitViewWidth - 70 , height: splitViewHeight }
- ],
- expectedGeometriesAfterDrag: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 105, height: splitViewHeight },
- { x: 140, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 150, y: 0, width: 150, height: splitViewHeight }
- ]
- },
- {
- tag: "hiddenItemSplitViewComponent",
- // [50] | [200 (fill)] | [hidden] | [50]
- component: hiddenItemSplitViewComponent,
- orientation: Qt.Horizontal,
- fillIndex: 1,
- handleIndex: 1,
- // Drag to the horizontal centre of the SplitView.
- newHandlePos: Qt.point(splitViewMargins + 150, testCase.height / 2),
- expectedGeometriesBeforeDrag: [
- { x: 0, y: 0, width: 50, height: splitViewHeight },
- { x: 50, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 50 + defaultHorizontalHandleWidth, y: 0, width: 200 - defaultHorizontalHandleWidth * 2, height: splitViewHeight },
- { x: 250 - (defaultHorizontalHandleWidth * 2) + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { hidden: true }, // Third item should be hidden.
- { hidden: true }, // Handle for third item should be hidden.
- { x: 250 - (defaultHorizontalHandleWidth * 2) + defaultHorizontalHandleWidth * 2, y: 0, width: 50, height: splitViewHeight }
- ],
- expectedGeometriesAfterDrag: [
- { x: 0, y: 0, width: 50, height: splitViewHeight },
- { x: 50, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // Width of the fill item should end up smaller.
- { x: 50 + defaultHorizontalHandleWidth, y: 0, width: 100 - defaultHorizontalHandleWidth * 2, height: splitViewHeight },
- { x: 150 - (defaultHorizontalHandleWidth * 2) + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { hidden: true }, // Third item should be hidden.
- { hidden: true }, // Handle for third item should be hidden.
- // Width of the last item should grow.
- { x: 150 - (defaultHorizontalHandleWidth * 2) + defaultHorizontalHandleWidth * 2, y: 0, width: 150, height: splitViewHeight }
- ]
- }
- ]
- return data
- }
-
- function test_dragHandle(data) {
- var control = createTemporaryObject(data.component, testCase)
- verify(control)
-
- control.orientation = data.orientation
-
- // Ensure that there is space to drag outside of the SplitView.
- control.anchors.margins = splitViewMargins
-
- var fillItem = control.itemAt(data.fillIndex)
- if (control.orientation === Qt.Horizontal)
- fillItem.SplitView.fillWidth = true
- else
- fillItem.SplitView.fillHeight = true
-
- // Check the sizes (and visibility) of the items before the drag.
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometriesBeforeDrag, "before drag")
-
- // Drag the handle.
- var handles = findHandles(control)
- var targetHandle = handles[data.handleIndex]
- verify(targetHandle.visible)
- mousePress(targetHandle)
- verify(control.resizing)
- // newHandlePos is in scene coordinates, so map it to coordinates local to the handle.
- var localPos = testCase.mapToItem(targetHandle, data.newHandlePos.x, data.newHandlePos.y)
- mouseMove(targetHandle, localPos.x - targetHandle.width / 2, localPos.y - targetHandle.height / 2)
- verify(control.resizing)
- compareSizes(control, data.expectedGeometriesAfterDrag, "after drag move")
-
- // The geometries should remain unchanged after releasing.
- mouseRelease(targetHandle, localPos.x - targetHandle.width / 2, localPos.y - targetHandle.height / 2, Qt.LeftButton)
- verify(!control.resizing)
- compareSizes(control, data.expectedGeometriesAfterDrag, "after drag release")
- }
-
- function test_splitViewGeometryChanges_data() {
- var defaultSplitViewWidth = testCase.width
- var defaultSplitViewHeight = testCase.height
-
- var data = [
- {
- tag: "growWidth",
- orientation: Qt.Horizontal,
- splitViewWidth: 800,
- expectedGeometries: [
- { x: 0, y: 0, width: 25, height: defaultSplitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: defaultSplitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: defaultSplitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: defaultSplitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: 800 - 25 - 100 - defaultHorizontalHandleWidth * 2, height: defaultSplitViewHeight }
- ]
- },
- {
- // Same as above except vertical.
- tag: "growHeight",
- orientation: Qt.Vertical,
- splitViewHeight: 800,
- expectedGeometries: [
- { x: 0, y: 0, width: defaultSplitViewWidth, height: 25 },
- { x: 0, y: 25, width: defaultSplitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: defaultSplitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight, width: defaultSplitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight * 2, width: defaultSplitViewWidth,
- height: 800 - 25 - 100 - defaultVerticalHandleHeight * 2 }
- ]
- },
- {
- tag: "shrinkWidth",
- orientation: Qt.Horizontal,
- splitViewWidth: 200,
- expectedGeometries: [
- { x: 0, y: 0, width: 25, height: defaultSplitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: defaultSplitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: defaultSplitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0, width: defaultHorizontalHandleWidth,
- height: defaultSplitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: 200 - 25 - 100 - defaultHorizontalHandleWidth * 2, height: defaultSplitViewHeight }
- ]
- },
- {
- // Same as above except vertical.
- tag: "shrinkHeight",
- orientation: Qt.Vertical,
- splitViewHeight: 200,
- expectedGeometries: [
- { x: 0, y: 0, width: defaultSplitViewWidth, height: 25 },
- { x: 0, y: 25, width: defaultSplitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight, width: defaultSplitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight, width: defaultSplitViewWidth,
- height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + 100 + defaultVerticalHandleHeight * 2, width: defaultSplitViewWidth,
- height: 200 - 25 - 100 - defaultVerticalHandleHeight * 2 }
- ]
- },
- ]
- return data
- }
-
- function test_splitViewGeometryChanges(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase,
- { "handle": handleComponent, "anchors.fill": undefined, "orientation": data.orientation })
- verify(control)
-
- if (data.hasOwnProperty("splitViewWidth"))
- control.width = data.splitViewWidth
- else
- control.width = testCase.width
-
- if (data.hasOwnProperty("splitViewHeight"))
- control.height = data.splitViewHeight
- else
- control.height = testCase.height
-
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- 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
-
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometries)
- }
-
- Component {
- id: largerHandle
- Rectangle {
- objectName: "largerHandle"
- implicitWidth: 20
- implicitHeight: 20
- color: "#444"
- }
- }
-
- Component {
- id: smallerHandle
- Rectangle {
- objectName: "smallerHandle"
- implicitWidth: 5
- implicitHeight: 5
- color: "#444"
- }
- }
-
- function test_handleChanges_data() {
- var splitViewWidth = testCase.width
- var splitViewHeight = testCase.height
-
- var data = [
- {
- tag: "growHandleWidth",
- orientation: Qt.Horizontal,
- handleComponent: largerHandle,
- expectedGeometries: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: 20, height: splitViewHeight },
- { x: 25 + 20, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + 20, y: 0, width: 20, height: splitViewHeight },
- { x: 25 + 100 + 20 * 2, y: 0, width: splitViewWidth - 25 - 100 - 20 * 2,
- height: splitViewHeight }
- ]
- },
- {
- // Same as above except vertical.
- tag: "growHandleHeight",
- orientation: Qt.Vertical,
- handleComponent: largerHandle,
- expectedGeometries: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: 20 },
- { x: 0, y: 25 + 20, width: splitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + 20, width: splitViewWidth, height: 20 },
- { x: 0, y: 25 + 100 + 20 * 2, width: splitViewWidth,
- height: splitViewHeight - 25 - 100 - 20 * 2 }
- ]
- },
- {
- tag: "shrinkHandleWidth",
- orientation: Qt.Horizontal,
- handleComponent: smallerHandle,
- expectedGeometries: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: 5, height: splitViewHeight },
- { x: 25 + 5, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + 5, y: 0, width: 5, height: splitViewHeight },
- { x: 25 + 100 + 5 * 2, y: 0, width: splitViewWidth - 25 - 100 - 5 * 2,
- height: splitViewHeight }
- ]
- },
- {
- // Same as above except vertical.
- tag: "shrinkHandleHeight",
- orientation: Qt.Vertical,
- handleComponent: smallerHandle,
- expectedGeometries: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: 5 },
- { x: 0, y: 25 + 5, width: splitViewWidth, height: 100 },
- { x: 0, y: 25 + 100 + 5, width: splitViewWidth, height: 5 },
- { x: 0, y: 25 + 100 + 5 * 2, width: splitViewWidth,
- height: splitViewHeight - 25 - 100 - 5 * 2 }
- ]
- }
- ]
- return data
- }
-
- function test_handleChanges(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase,
- { "orientation": data.orientation })
- verify(control)
-
- control.handle = data.handleComponent
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometries)
- }
-
- function test_insertRemoveItems_data() {
- var splitViewWidth = testCase.width
- var splitViewHeight = testCase.height
-
- var data = [
- {
- tag: "insertItemAtHorizontalEnd",
- orientation: Qt.Horizontal,
- insertItemAtIndex: 3,
- expectedGeometries: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 100, height: splitViewHeight },
- { x: 25 + 100 + defaultHorizontalHandleWidth, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // This was the fill item originally, but since no fill item is explicitly
- // specified, and we added an item to the right of it, it is no longer the fill item
- // because it's no longer last.
- { x: 25 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: 200, height: splitViewHeight },
- // Handle for newly added item.
- { x: 25 + 100 + 200 + defaultHorizontalHandleWidth * 2, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // Newly added item.
- { x: 25 + 100 + 200 + defaultHorizontalHandleWidth * 3, y: 0,
- width: splitViewWidth - 25 - 100 - 200 - defaultHorizontalHandleWidth * 3,
- height: splitViewHeight },
- ]
- },
- {
- tag: "insertItemAtHorizontalBeginning",
- orientation: Qt.Horizontal,
- insertItemAtIndex: 0,
- expectedGeometries: [
- // Newly added item.
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0, width: 25, height: splitViewHeight },
- { x: 25 * 2 + defaultHorizontalHandleWidth, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 * 2 + defaultHorizontalHandleWidth * 2, y: 0, width: 100, height: splitViewHeight },
- { x: 25 * 2 + 100 + defaultHorizontalHandleWidth * 2, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // Fill item doesn't change.
- { x: 25 * 2 + 100 + defaultHorizontalHandleWidth * 3, y: 0,
- width: splitViewWidth - 25 * 2 - 100 - defaultHorizontalHandleWidth * 3,
- height: splitViewHeight },
- ]
- },
- {
- tag: "removeItemFromHorizontalEnd",
- orientation: Qt.Horizontal,
- removeItemAtIndex: 2,
- expectedGeometries: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0,
- width: splitViewWidth - 25 - defaultHorizontalHandleWidth, height: splitViewHeight },
- ]
- },
- {
- tag: "removeItemFromHorizontalBeginning",
- orientation: Qt.Horizontal,
- removeItemAtIndex: 0,
- expectedGeometries: [
- { x: 0, y: 0, width: 100, height: splitViewHeight },
- { x: 100, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 100 + defaultHorizontalHandleWidth, y: 0,
- width: splitViewWidth - 100 - defaultHorizontalHandleWidth, height: splitViewHeight },
- ]
- }
- ]
- return data
- }
-
- Component {
- id: smallRectComponent
-
- Rectangle {
- objectName: "darkseagreen"
- color: objectName
- implicitWidth: 25
- implicitHeight: 25
- }
- }
-
- function test_insertRemoveItems(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase,
- { "orientation": data.orientation })
- verify(control)
-
- if (data.hasOwnProperty("removeItemAtIndex")) {
- var itemToRemove = control.itemAt(data.removeItemAtIndex)
- verify(itemToRemove)
-
- control.removeItem(itemToRemove)
- } else if (data.hasOwnProperty("insertItemAtIndex")) {
- var itemToAdd = smallRectComponent.createObject(control)
- control.insertItem(data.insertItemAtIndex, itemToAdd)
- }
-
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometries)
- }
-
- function test_removeAllItems() {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase)
- verify(control)
-
- while (control.count > 0)
- var itemToRemove = control.removeItem(control.itemAt(0))
- // Shouldn't crash.
- }
-
- function test_hideItems_data() {
- var splitViewWidth = testCase.width
- var splitViewHeight = testCase.height
-
- var data = [
- {
- tag: "hideItemAtHorizontalEnd",
- orientation: Qt.Horizontal,
- hideIndices: [2],
- expectedGeometries: [
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0,
- width: splitViewWidth - 25 - defaultHorizontalHandleWidth, height: splitViewHeight },
- { hidden: true }, // Handle for second item should be hidden.
- { hidden: true } // Last item should be hidden.
- ]
- },
- {
- tag: "hideItemAtHorizontalBeginning",
- orientation: Qt.Horizontal,
- hideIndices: [0],
- expectedGeometries: [
- { hidden: true }, // First item should be hidden.
- { hidden: true }, // Handle for first item should be hidden.
- { x: 0, y: 0, width: 100, height: splitViewHeight },
- { x: 100, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 100 + defaultHorizontalHandleWidth, y: 0,
- width: splitViewWidth - 100 - defaultHorizontalHandleWidth, height: splitViewHeight }
- ]
- },
- {
- tag: "hideItemAtVerticalEnd",
- orientation: Qt.Vertical,
- hideIndices: [2],
- expectedGeometries: [
- { x: 0, y: 0, width: splitViewWidth, height: 25 },
- { x: 0, y: 25, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 25 + defaultVerticalHandleHeight,
- width: splitViewWidth, height: splitViewHeight - 25 - defaultVerticalHandleHeight },
- { hidden: true }, // Handle for second item should be hidden.
- { hidden: true } // Last item should be hidden.
- ]
- },
- {
- tag: "hideItemAtVerticalBeginning",
- orientation: Qt.Vertical,
- hideIndices: [0],
- expectedGeometries: [
- { hidden: true }, // First item should be hidden.
- { hidden: true }, // Handle for first item should be hidden.
- { x: 0, y: 0, width: splitViewWidth, height: 100 },
- { x: 0, y: 100, width: splitViewWidth, height: defaultVerticalHandleHeight },
- { x: 0, y: 100 + defaultVerticalHandleHeight,
- width: splitViewWidth, height: splitViewHeight - 100 - defaultVerticalHandleHeight }
- ]
- },
- {
- // No handles should be visible when there's only one item.
- tag: "hideLastTwoHorizontalItems",
- orientation: Qt.Horizontal,
- hideIndices: [1, 2],
- expectedGeometries: [
- { x: 0, y: 0, width: splitViewWidth, height: splitViewHeight },
- { hidden: true }, // Handle for first item should be hidden.
- { hidden: true }, // Second item should be hidden.
- { hidden: true }, // Handle for second item should be hidden.
- { hidden: true } // Third item should be hidden.
- ]
- }
- ]
- return data
- }
-
- function test_hideItems(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase,
- { "orientation": data.orientation })
- verify(control)
-
- for (var i = 0; i < data.hideIndices.length; ++i) {
- var itemToHide = control.itemAt(data.hideIndices[i])
- verify(itemToHide)
- itemToHide.visible = false
- }
-
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometries)
- }
-
- function test_hideAndShowItems_data() {
- var splitViewWidth = testCase.width
- var splitViewHeight = testCase.height
-
- var data = [
- {
- tag: "hideLastTwoHorizontalItems",
- orientation: Qt.Horizontal,
- hideIndices: [1, 2],
- expectedGeometriesAfterHiding: [
- { x: 0, y: 0, width: splitViewWidth, height: splitViewHeight },
- { hidden: true }, // Handle for first item should be hidden.
- { hidden: true }, // Second item should be hidden.
- { hidden: true }, // Handle for second item should be hidden.
- { hidden: true } // Third item should be hidden.
- ],
- showIndices: [1],
- expectedGeometriesAfterShowing: [
- // First item should be visible with its implicit size.
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- // Handle for first item should be visible.
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // Second item should be visible and fill.
- { x: 25 + defaultHorizontalHandleWidth, y: 0,
- width: splitViewWidth - 25 - defaultHorizontalHandleWidth, height: splitViewHeight },
- { hidden: true }, // Handle for second item should be hidden.
- { hidden: true } // Third item should be hidden.
- ]
- }
- ]
- return data
- }
-
- function test_hideAndShowItems(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase,
- { "orientation": data.orientation })
- verify(control)
-
- for (var i = 0; i < data.hideIndices.length; ++i) {
- var itemToHide = control.itemAt(data.hideIndices[i])
- verify(itemToHide)
- itemToHide.visible = false
- }
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometriesAfterHiding, "after hiding")
-
- for (i = 0; i < data.showIndices.length; ++i) {
- var itemToShow = control.itemAt(data.showIndices[i])
- verify(itemToShow)
- itemToShow.visible = true
- }
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometriesAfterShowing, "after showing")
- }
-
- function test_moveHiddenItems_data() {
- var splitViewWidth = testCase.width
- var splitViewHeight = testCase.height
-
- var data = [
- {
- tag: "hideSecondItemAndMoveItToFirst",
- orientation: Qt.Horizontal,
- hideIndices: [1],
- moveFromIndex: 1,
- moveToIndex: 0,
- expectedGeometriesAfterMoving: [
- { hidden: true }, // First item (was second) should be hidden.
- { hidden: true }, // Handle for first item should be hidden.
- // Second item (was first) should get its implicit size.
- { x: 0, y: 0, width: 25, height: splitViewHeight },
- { x: 25, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 25 + defaultHorizontalHandleWidth, y: 0,
- width: splitViewWidth - 25 - defaultHorizontalHandleWidth, height: splitViewHeight },
- ],
- showIndices: [0],
- expectedGeometriesAfterShowing: [
- // First item (was second) should be visible with its implicit size.
- { x: 0, y: 0, width: 100, height: splitViewHeight },
- // Handle for first item (was second) should be visible.
- { x: 100, y: 0, width: defaultHorizontalHandleWidth, height: splitViewHeight },
- // Second item (was first) should be visible with its implicit size.
- { x: 100 + defaultHorizontalHandleWidth, y: 0,
- width: 25, height: splitViewHeight },
- { x: 100 + 25 + defaultHorizontalHandleWidth, y: 0,
- width: defaultHorizontalHandleWidth, height: splitViewHeight },
- { x: 100 + 25 + defaultHorizontalHandleWidth * 2, y: 0,
- width: splitViewWidth - 100 - 25 - defaultHorizontalHandleWidth * 2, height: splitViewHeight }
- ]
- }
- ]
- return data
- }
-
- function test_moveHiddenItems(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase,
- { "orientation": data.orientation })
- verify(control)
-
- for (var i = 0; i < data.hideIndices.length; ++i) {
- var itemToHide = control.itemAt(data.hideIndices[i])
- verify(itemToHide)
- itemToHide.visible = false
- }
-
- control.moveItem(data.moveFromIndex, data.moveToIndex)
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometriesAfterMoving, "after moving")
-
- for (i = 0; i < data.showIndices.length; ++i) {
- var itemToShow = control.itemAt(data.showIndices[i])
- verify(itemToShow)
- itemToShow.visible = true
- }
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compareSizes(control, data.expectedGeometriesAfterShowing, "after showing")
- }
-
- Component {
- id: flickableComponent
-
- Flickable {
- anchors.fill: parent
- anchors.margins: 100
- }
- }
-
- function test_draggingHandleInFlickable() {
- var flickable = createTemporaryObject(flickableComponent, testCase)
- verify(flickable)
-
- var control = threeSizedItemsComponent.createObject(flickable.contentItem)
- verify(control)
-
- control.anchors.fill = undefined
- control.width = 400
- control.height = control.parent.height - 100
- flickable.contentWidth = control.width
- flickable.contentHeight = control.height
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
-
- var contentXSpy = signalSpyComponent.createObject(flickable,
- { target: flickable, signalName: "contentXChanged" })
- verify(contentXSpy.valid)
- var contentYSpy = signalSpyComponent.createObject(flickable,
- { target: flickable, signalName: "contentYChanged" })
- verify(contentYSpy.valid)
-
- // Drag the first handle to the right;
- // the flickable's contentX and contentY shouldn't change.
- var firstItem = control.itemAt(0)
- var firstItemOriginalWidth = firstItem.width
- var handles = findHandles(control)
- var firstHandle = handles[0]
- // Add some vertical movement in there as well.
- mouseDrag(firstHandle, firstHandle.width / 2, firstHandle.height / 2, 100, 50)
- compare(contentXSpy.count, 0)
- compare(contentYSpy.count, 0)
- verify(firstItem.width > firstItemOriginalWidth)
-
- // Now do the same except vertically.
- control.orientation = Qt.Vertical
- control.width = control.parent.width - 100
- control.height = 400
- var firstItemOriginalHeight = firstItem.height
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
-
- // Add some horizontal movement in there as well.
- mouseDrag(firstHandle, firstHandle.width / 2, firstHandle.height / 2, 50, 100)
- compare(contentXSpy.count, 0)
- compare(contentYSpy.count, 0)
- verify(firstItem.height > firstItemOriginalHeight)
- }
-
- function test_hoveredPressed() {
- if ((Qt.platform.pluginName === "offscreen") || (Qt.platform.pluginName === "minimal"))
- skip("Mouse hovering not functional on offscreen/minimal platforms")
-
- var control = createTemporaryObject(threeSizedItemsComponent, testCase)
- verify(control)
- control.anchors.margins = 50
-
- var handles = findHandles(control)
- var firstHandle = handles[0]
-
- var handleCenter = control.mapFromItem(firstHandle, firstHandle.width / 2, firstHandle.height / 2)
- // Test fails if we don't do two moves for some reason...
- mouseMove(control, handleCenter.x, handleCenter.y)
- mouseMove(control, handleCenter.x, handleCenter.y)
- verify(firstHandle.SplitHandle.hovered)
- verify(!firstHandle.SplitHandle.pressed)
-
- mousePress(control, handleCenter.x, handleCenter.y)
- verify(firstHandle.SplitHandle.hovered)
- verify(firstHandle.SplitHandle.pressed)
-
- mouseRelease(control, handleCenter.x, handleCenter.y)
- verify(firstHandle.SplitHandle.hovered)
- verify(!firstHandle.SplitHandle.pressed)
-
- mouseMove(control, 0, 0)
- verify(!firstHandle.SplitHandle.hovered)
- verify(!firstHandle.SplitHandle.pressed)
- }
-
- // Tests removing/adding/moving an item while it's pressed.
- function test_modifyWhileHoveredPressed() {
- if ((Qt.platform.pluginName === "offscreen") || (Qt.platform.pluginName === "minimal"))
- skip("Mouse hovering not functional on offscreen/minimal platforms")
-
- var control = createTemporaryObject(threeSizedItemsComponent, testCase)
- verify(control)
- control.anchors.margins = 50
-
- var handles = findHandles(control)
- var firstHandle = handles[0]
-
- // First, ensure that the handle is hovered + pressed.
- var handleCenter = control.mapFromItem(firstHandle, firstHandle.width / 2, firstHandle.height / 2)
- // Test fails if we don't do two moves for some reason...
- mouseMove(control, handleCenter.x, handleCenter.y)
- mouseMove(control, handleCenter.x, handleCenter.y)
- verify(firstHandle.SplitHandle.hovered)
- verify(!firstHandle.SplitHandle.pressed)
-
- mousePress(control, handleCenter.x, handleCenter.y)
- verify(firstHandle.SplitHandle.hovered)
- verify(firstHandle.SplitHandle.pressed)
-
- // Then, remove it by removing the first item.
- control.removeItem(control.itemAt(0))
- handles = findHandles(control)
- firstHandle = null
- compare(handles.length, 1)
-
- // No handles should be hovered/pressed.
- for (var i = 0; i < handles.length; ++i) {
- var handle = handles[i]
- verify(!handle.SplitHandle.hovered, "handle at index " + i + " should not be hovered")
- verify(!handle.SplitHandle.pressed, "handle at index " + i + " should not be hovered")
- }
-
- mouseRelease(control, handleCenter.x, handleCenter.y)
- }
-
- Component {
- id: settingsComponent
- Settings {
- id: settings
- }
- }
-
- function test_saveAndRestoreState_data() {
- return [
- { tag: "Horizontal", orientation: Qt.Horizontal, propertyName: "preferredWidth", propertyValue: 123 },
- { tag: "Vertical", orientation: Qt.Vertical, propertyName: "preferredHeight", propertyValue: 234 }
- ]
- }
-
- function test_saveAndRestoreState(data) {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase, { orientation: data.orientation })
- verify(control)
- compare(control.orientation, data.orientation)
-
- var lastItem = control.itemAt(2)
- verify(lastItem)
- lastItem.SplitView[data.propertyName] = data.propertyValue
-
- // Save the state.
- var settings = createTemporaryObject(settingsComponent, testCase)
- verify(settings)
- settings.setValue("splitView", control.saveState())
-
- // Recreate the item to restore it to its "default" values.
- control = createTemporaryObject(threeSizedItemsComponent, testCase)
- lastItem = control.itemAt(2)
- verify(lastItem)
- compare(lastItem.SplitView[data.propertyName], -1)
-
- settings = createTemporaryObject(settingsComponent, testCase)
- verify(settings)
-
- // Restore the state.
- control.restoreState(settings.value("splitView"))
- compare(lastItem.SplitView[data.propertyName], data.propertyValue)
- }
-
- function test_changePreferredSizeDuringLayout() {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase)
- verify(control)
-
- var firstItem = control.itemAt(0)
- var secondItem = control.itemAt(1)
- secondItem.widthChanged.connect(function() {
- if (secondItem.width < 10)
- firstItem.SplitView.preferredWidth = 50
- })
-
- // Change the size of the item so that a layout happens, but
- // make the size small enough that the item's onWidthChanged handler gets triggered.
- // The onWidthChanged handler will set the preferredWidth of another item during the
- // layout, so we need to make sure the assignment isn't lost since we return early in that case.
- secondItem.implicitWidth = 5
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(secondItem.width, 5)
- compare(firstItem.width, 50)
-
- // Now do the same for height.
- control.orientation = Qt.Vertical
- secondItem.heightChanged.connect(function() {
- if (secondItem.height < 10)
- firstItem.SplitView.preferredHeight = 50
- })
- // Get the polishes for the orientation out of the way so that they
- // don't intefere with our results.
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
-
- secondItem.implicitHeight = 5
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
- compare(secondItem.height, 5)
- compare(firstItem.height, 50)
- }
-
- // When the user drags a handle, we internally set preferredWidth/Height
- // to reflect the new value. However, we also have to make sure that when
- // we do so, it doesn't trigger a delayed layout. This is why we have
- // m_ignoreNextDelayedLayoutRequest. This test checks that
- // m_ignoreNextDelayedLayoutRequest doesn't interfere with any action from
- // the user that results in a delayed layout.
- function test_changePreferredSizeDuringLayoutWhileDraggingHandle() {
- var control = createTemporaryObject(threeSizedItemsComponent, testCase)
- verify(control)
-
- var firstItem = control.itemAt(0)
- var secondItem = control.itemAt(1)
- firstItem.widthChanged.connect(function() {
- if (firstItem.width === 0)
- secondItem.SplitView.preferredWidth = 50
- })
-
- // Start dragging the handle.
- var handles = findHandles(control)
- var targetHandle = handles[0]
- mousePress(targetHandle)
- verify(control.resizing)
- var localPos = testCase.mapToItem(targetHandle, 15, testCase.height / 2)
-
- // Move the handle to the very left, so that the item's width becomes zero.
- mouseMove(targetHandle, -100, targetHandle.height / 2)
- verify(control.resizing)
- compare(firstItem.width, 0)
- compare(secondItem.SplitView.preferredWidth, 50)
- compare(secondItem.width, 50)
- mouseRelease(targetHandle, -100, targetHandle.height / 2, Qt.LeftButton)
- verify(!control.resizing)
- }
-
- Component {
- id: oneItemComponent
-
- SplitView {
- Item {}
- }
- }
-
- // QTBUG-79270
- function test_hideSplitViewWithOneItem() {
- var control = createTemporaryObject(oneItemComponent, testCase)
- verify(control)
- // Shouldn't be an assertion failure.
- control.visible = false
- }
-
- // QTBUG-79302: ensure that the Repeater's items are actually generated.
- // test_dragHandle:repeater tests dragging behavior with a Repeater.
- function test_repeater(data) {
- var control = createTemporaryObject(repeaterSplitViewComponent, testCase)
- verify(control)
- compare(control.repeater.count, 3)
- compare(control.contentChildren.length, 3)
- }
-
- Component {
- id: hoverableChildrenSplitViewComponent
-
- SplitView {
- handle: handleComponent
- anchors.fill: parent
-
- MouseArea {
- objectName: "mouseArea1"
- hoverEnabled: true
-
- SplitView.preferredWidth: 200
- }
- MouseArea {
- objectName: "mouseArea2"
- hoverEnabled: true
- }
- }
- }
-
- function test_hoverableChilden() {
- if (Qt.platform.pluginName === "offscreen" || Qt.platform.pluginName === "minimal")
- skip("Mouse hovering not functional on offscreen/minimal platforms")
-
- var control = createTemporaryObject(hoverableChildrenSplitViewComponent, testCase)
- verify(control)
-
- verify(isPolishScheduled(control))
- verify(waitForItemPolished(control))
-
- // Move the mouse over the handle.
- var handles = findHandles(control)
- var targetHandle = handles[0]
- // Test fails if we don't do two moves for some reason... QTBUG-94968
- mouseMove(targetHandle, targetHandle.width / 2, targetHandle.height / 2)
- mouseMove(targetHandle, targetHandle.width / 2, targetHandle.height / 2)
- verify(targetHandle.SplitHandle.hovered)
-
- // Move the mouse to the MouseArea on the left. The handle should no longer be hovered.
- mouseMove(control, 100, control.height / 2)
- verify(!targetHandle.SplitHandle.hovered)
-
- // Move the mouse back over the handle.
- mouseMove(targetHandle, targetHandle.width / 2, targetHandle.height / 2)
- mouseMove(targetHandle, targetHandle.width / 2, targetHandle.height / 2)
- verify(targetHandle.SplitHandle.hovered)
-
- // Move the mouse to the MouseArea on the right. The handle should no longer be hovered.
- mouseMove(control, control.width - 100, control.height / 2)
- verify(!targetHandle.SplitHandle.hovered)
- }
-}