| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 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 2.4 |
| import QtTest 1.0 |
| import QtQuick.Controls 1.4 |
| import QtQuick.Controls.Private 1.0 |
| import QtQuickControlsTests 1.0 |
| |
| Item { |
| id: container |
| width: 400 |
| height: 400 |
| |
| TestCase { |
| id: testCase |
| name: "Tests_TreeView" |
| when:windowShown |
| width:400 |
| height:400 |
| objectName: "testCase" |
| |
| SignalSpy { |
| id: spy |
| } |
| |
| Component { |
| id: newColumn |
| TableViewColumn { |
| role: "name" |
| title: "Name" |
| } |
| } |
| |
| property var instance_selectionModel: 'import QtQml.Models 2.2; ItemSelectionModel {}' |
| property var semiIndent: 20/2 // PM_TreeViewIndentation 20 in commonStyle |
| |
| function cleanup() |
| { |
| // Make sure to delete all children even when the test has failed. |
| for (var child in container.children) { |
| if (container.children[child].objectName !== "testCase") |
| container.children[child].destroy() |
| } |
| } |
| |
| function test_basic_setup() |
| { |
| var test_instanceStr = |
| 'import QtQuick 2.4; \ |
| import QtQuick.Controls 1.4; \ |
| import QtQuickControlsTests 1.0;\ |
| TreeView { \ |
| model: TreeModel {} \ |
| TableViewColumn { \ |
| role: "display"; \ |
| title: "Default"; \ |
| } \ |
| }' |
| |
| var tree = Qt.createQmlObject(test_instanceStr, container, '') |
| verify(!tree.currentIndex.valid) |
| compare(tree.columnCount, 1) |
| tree.addColumn(newColumn) |
| compare(tree.columnCount, 2) |
| } |
| |
| function test_clicked_signals() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| tree.forceActiveFocus() |
| |
| verify(!tree.currentIndex.valid) |
| spy.clear() |
| spy.target = tree |
| spy.signalName = "clicked" |
| compare(spy.count, 0) |
| mouseClick(tree, semiIndent + 50, 120, Qt.LeftButton, Qt.NoModifier, 10) |
| compare(spy.count, 1) |
| var clickedItem = spy.signalArguments[0][0] |
| verify(clickedItem.valid) |
| compare(clickedItem.row, 1) |
| compare(tree.currentIndex.row, 1) |
| compare(clickedItem.internalId, tree.currentIndex.internalId) |
| |
| spy.clear() |
| spy.target = tree |
| spy.signalName = "doubleClicked" |
| compare(spy.count, 0) |
| mouseDoubleClickSequence(tree, semiIndent + 50, 220, Qt.LeftButton) |
| compare(spy.count, 1) |
| clickedItem = spy.signalArguments[0][0] |
| verify(clickedItem.valid) |
| compare(clickedItem.row, 3) |
| compare(clickedItem.internalId, tree.currentIndex.internalId) |
| |
| spy.clear() |
| spy.target = tree |
| spy.signalName = "activated" |
| compare(spy.count, 0) |
| if (!tree.__activateItemOnSingleClick) |
| mouseDoubleClickSequence(tree, semiIndent + 50 , 120, Qt.LeftButton) |
| else |
| mouseClick(tree, semiIndent + 50, 120, Qt.LeftButton) |
| compare(spy.count, 1) |
| clickedItem = spy.signalArguments[0][0] |
| verify(clickedItem.valid) |
| compare(clickedItem.row, 1) |
| compare(clickedItem.internalId, tree.currentIndex.internalId) |
| } |
| |
| function test_headerHidden() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| tree.headerVisible = false |
| tree.forceActiveFocus() |
| |
| verify(!tree.currentIndex.valid) |
| spy.clear() |
| spy.target = tree |
| spy.signalName = "clicked" |
| compare(spy.count, 0) |
| mouseClick(tree, semiIndent + 50, 20, Qt.LeftButton) |
| compare(spy.count, 1) |
| verify(spy.signalArguments[0][0].valid) |
| compare(spy.signalArguments[0][0].row, 0) |
| compare(tree.currentIndex.row, 0) |
| } |
| |
| function test_expand_collapse() |
| { |
| if (Settings.hasTouchScreen) |
| skip("Fails with touch screens"); |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| tree.forceActiveFocus() |
| |
| spy.clear() |
| spy.target = tree |
| spy.signalName = "expanded" |
| |
| // expanded on click |
| compare(spy.count, 0) |
| mouseClick(tree, semiIndent, 70, Qt.LeftButton, Qt.NoModifier, 10) |
| compare(spy.count, 1) |
| var expandedIndex = spy.signalArguments[0][0] |
| verify(expandedIndex.valid) |
| compare(expandedIndex.row, 0) |
| compare(tree.isExpanded(expandedIndex), true) |
| |
| // expand first child on click |
| mouseClick(tree, semiIndent * 3, 120, Qt.LeftButton) |
| compare(spy.count, 2) |
| var childIndex = spy.signalArguments[1][0] |
| verify(childIndex.valid) |
| compare(childIndex.row, 0) |
| compare(tree.isExpanded(childIndex), true) |
| compare(childIndex.parent.internalId, expandedIndex.internalId) |
| |
| spy.clear() |
| spy.signalName = "collapsed" |
| |
| // collapsed on click top item |
| compare(spy.count, 0) |
| mouseClick(tree, semiIndent, 70, Qt.LeftButton) |
| compare(spy.count, 1) |
| var collapsedIndex = spy.signalArguments[0][0] |
| verify(collapsedIndex.valid) |
| compare(collapsedIndex.row, 0) |
| compare(tree.isExpanded(collapsedIndex), false) |
| compare(expandedIndex.internalId, collapsedIndex.internalId) |
| |
| // check hidden child is still expanded |
| compare(tree.isExpanded(childIndex), true) |
| |
| // collapse child with function |
| tree.collapse(childIndex) |
| compare(tree.isExpanded(childIndex), false) |
| compare(spy.count, 2) |
| compare(spy.signalArguments[1][0].row, 0) |
| |
| spy.clear() |
| spy.signalName = "expanded" |
| compare(spy.count, 0) |
| |
| // expand child with function |
| tree.expand(expandedIndex) |
| compare(tree.isExpanded(expandedIndex), true) |
| compare(spy.count, 1) |
| compare(spy.signalArguments[0][0].row, 0) |
| } |
| |
| function test_pressAndHold() |
| { |
| if (Settings.hasTouchScreen) |
| skip("Fails with touch screens"); |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| tree.forceActiveFocus() |
| |
| var styleIndent = !!tree.style.indentation ? tree.style.indentation/2 : 6 |
| verify(!tree.currentIndex.valid) |
| spy.clear() |
| spy.target = tree |
| spy.signalName = "pressAndHold" |
| compare(spy.count, 0) |
| mousePress(tree, styleIndent + 50, 70, Qt.LeftButton, Qt.NoModifier, 10) |
| mouseRelease(tree, styleIndent + 50, 70, Qt.LeftButton, Qt.NoModifier, 1000) |
| wait(20) |
| compare(spy.count, 1) |
| verify(spy.signalArguments[0][0].valid) |
| compare(spy.signalArguments[0][0].row, 0) |
| compare(tree.currentIndex.row, 0) |
| } |
| |
| function test_keys_navigation() |
| { |
| var component = Qt.createComponent("treeview/treeview_2.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| tree.forceActiveFocus() |
| |
| // select second item with no children |
| verify(!tree.currentIndex.valid) |
| mouseClick(tree, semiIndent + 50, 120, Qt.LeftButton, Qt.NoModifier, 10) |
| var secondTopItem = tree.currentIndex |
| verify(secondTopItem.valid) |
| verify(!secondTopItem.parent.valid) |
| compare(secondTopItem.row, 1) |
| |
| // Press right (selected item is non expandable) |
| compare(tree.collapsedCount, 0) |
| compare(tree.expandedCount, 0) |
| keyClick(Qt.Key_Right) |
| compare(tree.collapsedCount, 0) |
| compare(tree.expandedCount, 0) |
| compare(tree.currentIndex, secondTopItem) |
| |
| // Going down |
| keyClick(Qt.Key_Down) |
| var thirdTopItem = tree.currentIndex |
| compare(thirdTopItem.row, 2) |
| verify(!thirdTopItem.parent.valid) |
| |
| // Press right - expand - go down - go up - collapse |
| keyClick(Qt.Key_Right) |
| compare(tree.collapsedCount, 0) |
| compare(tree.expandedCount, 1) |
| compare(tree.isExpanded(thirdTopItem), true) |
| keyClick(Qt.Key_Down) |
| var firstChild_thirdTopItem = tree.currentIndex |
| compare(firstChild_thirdTopItem.row, 0) |
| verify(firstChild_thirdTopItem.parent.valid) |
| compare(firstChild_thirdTopItem.parent.row, 2) |
| compare(firstChild_thirdTopItem.parent.internalId, thirdTopItem.internalId) |
| keyClick(Qt.Key_Up) |
| verify(!tree.currentIndex.parent.valid) |
| compare(tree.currentIndex.internalId, thirdTopItem.internalId) |
| compare(tree.currentIndex.row, 2) |
| compare(tree.isExpanded(tree.currentIndex), true) |
| keyClick(Qt.Key_Left) |
| compare(tree.isExpanded(tree.currentIndex), false) |
| compare(tree.collapsedCount, 1) |
| compare(tree.expandedCount, 1) |
| } |
| |
| function test_selection_singleSelection() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| var selectionModel = Qt.createQmlObject(testCase.instance_selectionModel, container, '') |
| selectionModel.model = tree.model |
| |
| // Collect some model index |
| mouseClick(tree, semiIndent + 50, 20 + 50, Qt.LeftButton, Qt.NoModifier, 30) |
| var firstItem = tree.currentIndex |
| verify(firstItem.valid) |
| compare(firstItem.row, 0) |
| mouseClick(tree, semiIndent + 50, 20 + 2*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var secondItem = tree.currentIndex |
| verify(secondItem.valid) |
| compare(secondItem.row, 1) |
| mouseClick(tree, semiIndent + 50, 20 + 3*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var thirdItem = tree.currentIndex |
| verify(thirdItem.valid) |
| compare(thirdItem.row, 2) |
| mouseClick(tree, semiIndent + 50, 20 + 4*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var fourthItem = tree.currentIndex |
| verify(fourthItem.valid) |
| compare(fourthItem.row, 3) |
| mouseClick(tree, semiIndent + 50, 20 + 5*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var fifthItem = tree.currentIndex |
| verify(fifthItem.valid) |
| compare(fifthItem.row, 4) |
| mouseClick(tree, semiIndent + 50, 20 + 6*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var sixthItem = tree.currentIndex |
| verify(sixthItem.valid) |
| compare(sixthItem.row, 5) |
| |
| compare(tree.selection, null) |
| tree.selection = selectionModel |
| compare(tree.selection, selectionModel) |
| tree.selection.clear() |
| compare(tree.selection.hasSelection, false) |
| |
| //// Single selectionModel |
| compare(tree.selectionMode, SelectionMode.SingleSelection) |
| verify(!tree.selection.currentIndex.valid) |
| |
| mouseClick(tree, semiIndent + 50, 20 + 2*50, Qt.LeftButton, Qt.NoModifier, 10) |
| verify(tree.selection.currentIndex.valid) |
| |
| compare(secondItem.internalId, tree.currentIndex.internalId) |
| compare(secondItem.internalId, tree.selection.currentIndex.internalId) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.hasSelection, true) |
| var list = tree.selection.selectedIndexes |
| compare(list.length, 1) |
| if (list.length === 1) { |
| compare(list[0].internalId, secondItem.internalId) |
| compare(tree.selection.isSelected(secondItem), true) |
| } |
| |
| keyClick(Qt.Key_Down, Qt.ShiftModifier) |
| compare(thirdItem.internalId, tree.currentIndex.internalId) |
| compare(thirdItem.internalId, tree.selection.currentIndex.internalId) |
| |
| keyClick(Qt.Key_Down, Qt.ControlModifier) |
| compare(fourthItem.internalId, tree.currentIndex.internalId) |
| expectFailContinue('', 'BUG selected state not updated with Command/Control when SingleSelection') |
| compare(fourthItem.internalId, tree.selection.currentIndex.internalId) |
| expectFailContinue('', 'BUG selected state not updated with Command/Control when SingleSelection') |
| compare(tree.selection.isSelected(fourthItem), true) |
| } |
| |
| function test_selection_noSelection() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| var selectionModel = Qt.createQmlObject(testCase.instance_selectionModel, container, '') |
| selectionModel.model = tree.model |
| |
| // Collect some model index |
| mouseClick(tree, semiIndent + 50, 20 + 50, Qt.LeftButton) |
| var firstItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 2*50, Qt.LeftButton) |
| var secondItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 3*50, Qt.LeftButton) |
| var thirdItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 4*50, Qt.LeftButton) |
| var fourthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 5*50, Qt.LeftButton) |
| var fifthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 6*50, Qt.LeftButton) |
| var sixthItem = tree.currentIndex |
| |
| compare(tree.selection, null) |
| tree.selection = selectionModel |
| compare(tree.selection, selectionModel) |
| tree.selection.clear() |
| compare(tree.selection.hasSelection, false) |
| |
| //// No selection |
| tree.selectionMode = SelectionMode.NoSelection |
| compare(tree.selectionMode, SelectionMode.NoSelection) |
| |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton) |
| |
| compare(secondItem.internalId, tree.currentIndex.internalId) |
| verify(!tree.selection.currentIndex.valid) |
| compare(tree.selection.hasSelection, false) |
| compare(tree.selection.isSelected(secondItem), false) |
| |
| keyClick(Qt.Key_Down, Qt.ShiftModifier) |
| verify(!tree.selection.currentIndex.valid) |
| compare(tree.selection.hasSelection, false) |
| compare(tree.selection.isSelected(thirdItem), false) |
| |
| keyClick(Qt.Key_Down, Qt.ControlModifier) |
| verify(!tree.selection.currentIndex.valid) |
| compare(tree.selection.hasSelection, false) |
| } |
| |
| function test_selection_multiSelection() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| var selectionModel = Qt.createQmlObject(testCase.instance_selectionModel, container, '') |
| selectionModel.model = tree.model |
| |
| // Collect some model index |
| mouseClick(tree, semiIndent + 50, 20 + 50, Qt.LeftButton, Qt.NoModifier0, 10) |
| var firstItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 2*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var secondItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 3*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var thirdItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 4*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var fourthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 5*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var fifthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 6*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var sixthItem = tree.currentIndex |
| |
| compare(tree.selection, null) |
| tree.selection = selectionModel |
| compare(tree.selection, selectionModel) |
| tree.selection.clear() |
| compare(tree.selection.hasSelection, false) |
| |
| ////// Multi selection |
| tree.selectionMode = SelectionMode.MultiSelection |
| compare(tree.selectionMode, SelectionMode.MultiSelection) |
| |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton, Qt.NoModifier, 10) |
| |
| compare(secondItem.internalId, tree.currentIndex.internalId) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| var listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 1) |
| compare(listIndexes[0].internalId, secondItem.internalId) |
| verify(tree.selection.currentIndex.valid) |
| if (tree.selection.currentIndex.valid) |
| compare(tree.selection.currentIndex.internalId, secondItem.internalId) |
| |
| mouseClick(tree, semiIndent + 50, 70+150, Qt.LeftButton) |
| compare(fourthItem.internalId, tree.currentIndex.internalId) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(fourthItem), true) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 2) |
| compare(listIndexes[0].internalId, secondItem.internalId) |
| compare(listIndexes[1].internalId, fourthItem.internalId) |
| verify(tree.selection.currentIndex.valid) |
| if (tree.selection.currentIndex.valid) |
| compare(tree.selection.currentIndex.internalId, fourthItem.internalId) |
| |
| keyPress(Qt.Key_Shift) |
| mouseClick(tree, semiIndent + 50, 70+250, Qt.LeftButton) |
| keyRelease(Qt.Key_Shift) |
| compare(sixthItem.internalId, tree.currentIndex.internalId) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(fourthItem), true) |
| compare(tree.selection.isSelected(fifthItem), false) |
| compare(tree.selection.isSelected(sixthItem), true) |
| |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 3) |
| compare(listIndexes[0].internalId, secondItem.internalId) |
| compare(listIndexes[1].internalId, fourthItem.internalId) |
| compare(listIndexes[2].internalId, sixthItem.internalId) |
| verify(tree.selection.currentIndex.valid) |
| if (tree.selection.currentIndex.valid) |
| compare(tree.selection.currentIndex.internalId, sixthItem.internalId) |
| |
| |
| mouseClick(tree, semiIndent + 50, 70+150, Qt.LeftButton) |
| compare(fourthItem.internalId, tree.currentIndex.internalId) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(fourthItem), false) |
| compare(tree.selection.isSelected(sixthItem), true) |
| |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 2) |
| compare(listIndexes[0].internalId, secondItem.internalId) |
| compare(listIndexes[1].internalId, sixthItem.internalId) |
| verify(tree.selection.currentIndex.valid) |
| |
| mouseClick(tree, semiIndent + 50, 70+150, Qt.LeftButton) |
| compare(fourthItem.internalId, tree.currentIndex.internalId) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(fourthItem), true) |
| compare(tree.selection.isSelected(sixthItem), true) |
| |
| keyPress(Qt.Key_Shift) |
| keyClick(Qt.Key_Down) |
| keyClick(Qt.Key_Down) |
| keyClick(Qt.Key_Down) |
| keyRelease(Qt.Key_Shift) |
| compare(tree.selection.isSelected(fourthItem), true) |
| compare(tree.selection.isSelected(fifthItem), true) |
| compare(tree.selection.isSelected(sixthItem), false) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 4) |
| } |
| |
| function test_selection_extendedSelection() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| var selectionModel = Qt.createQmlObject(testCase.instance_selectionModel, container, '') |
| selectionModel.model = tree.model |
| |
| // Collect some model index |
| mouseClick(tree, semiIndent + 50, 20 + 50, Qt.LeftButton, Qt.NoModifier, 10) |
| var firstItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 2*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var secondItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 3*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var thirdItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 4*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var fourthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 5*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var fifthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 6*50, Qt.LeftButton, Qt.NoModifier, 10) |
| var sixthItem = tree.currentIndex |
| |
| compare(tree.selection, null) |
| tree.selection = selectionModel |
| compare(tree.selection, selectionModel) |
| tree.selection.clear() |
| compare(tree.selection.hasSelection, false) |
| |
| ////// Extended selection |
| tree.selectionMode = SelectionMode.ExtendedSelection |
| compare(tree.selectionMode, SelectionMode.ExtendedSelection) |
| |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton, Qt.NoModifier, 10) |
| |
| compare(secondItem.internalId, tree.currentIndex.internalId) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| var listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 1) |
| compare(listIndexes[0].internalId, secondItem.internalId) |
| verify(tree.selection.currentIndex.valid) |
| if (tree.selection.currentIndex.valid) |
| compare(tree.selection.currentIndex.internalId, secondItem.internalId) |
| |
| // Re-click does not deselect |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| // Ctrl/Cmd click deselect |
| mouseClick(tree, semiIndent + 50, 70+52, Qt.LeftButton, Qt.ControlModifier) |
| compare(tree.selection.hasSelection, false) |
| compare(tree.selection.isSelected(secondItem), false) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 0) |
| |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton) |
| keyPress(Qt.Key_Down, Qt.ShiftModifier) |
| keyPress(Qt.Key_Down, Qt.ShiftModifier) |
| keyClick(Qt.Key_Down, Qt.ShiftModifier) |
| |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 4) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(thirdItem), true) |
| compare(tree.selection.isSelected(fourthItem), true) |
| compare(tree.selection.isSelected(fifthItem), true) |
| |
| mouseClick(tree, semiIndent + 50, 70+300, Qt.LeftButton, Qt.ShiftModifier) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 6) |
| |
| mouseClick(tree, semiIndent + 50, 70+150, Qt.LeftButton, Qt.ControlModifier) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 5) |
| compare(tree.selection.isSelected(fourthItem), false) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(thirdItem), true) |
| compare(tree.selection.isSelected(sixthItem), true) |
| compare(tree.selection.isSelected(fifthItem), true) |
| } |
| |
| function test_selection_contiguousSelection() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| waitForRendering(tree) |
| |
| var selectionModel = Qt.createQmlObject(testCase.instance_selectionModel, container, '') |
| selectionModel.model = tree.model |
| |
| // Collect some model index |
| mouseClick(tree, semiIndent + 50, 20 + 50, Qt.LeftButton) |
| var firstItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 2*50, Qt.LeftButton) |
| var secondItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 3*50, Qt.LeftButton) |
| var thirdItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 4*50, Qt.LeftButton) |
| var fourthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 5*50, Qt.LeftButton) |
| var fifthItem = tree.currentIndex |
| mouseClick(tree, semiIndent + 50, 20 + 6*50, Qt.LeftButton) |
| var sixthItem = tree.currentIndex |
| |
| compare(tree.selection, null) |
| tree.selection = selectionModel |
| compare(tree.selection, selectionModel) |
| tree.selection.clear() |
| compare(tree.selection.hasSelection, false) |
| |
| ////// Contiguous selection |
| tree.selectionMode = SelectionMode.ContiguousSelection |
| compare(tree.selectionMode, SelectionMode.ContiguousSelection) |
| |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton) |
| |
| compare(secondItem.internalId, tree.currentIndex.internalId) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| var listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 1) |
| compare(listIndexes[0].internalId, secondItem.internalId) |
| verify(tree.selection.currentIndex.valid) |
| if (tree.selection.currentIndex.valid) |
| compare(tree.selection.currentIndex.internalId, secondItem.internalId) |
| |
| // Re-click does not deselect |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| // Ctrl/Cmd click deselect all, selects current |
| mouseClick(tree, semiIndent + 50, 70+52, Qt.LeftButton, Qt.ControlModifier) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 1) |
| |
| mouseClick(tree, semiIndent + 50, 70+50, Qt.LeftButton) |
| keyPress(Qt.Key_Down, Qt.ShiftModifier) |
| keyPress(Qt.Key_Down, Qt.ShiftModifier) |
| keyClick(Qt.Key_Down, Qt.ShiftModifier) |
| |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 4) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(thirdItem), true) |
| compare(tree.selection.isSelected(fourthItem), true) |
| compare(tree.selection.isSelected(fifthItem), true) |
| verify(tree.selection.currentIndex.valid) |
| if (tree.selection.currentIndex.valid) |
| compare(tree.selection.currentIndex.internalId, fifthItem.internalId) |
| |
| mouseClick(tree, semiIndent + 50, 70+300, Qt.LeftButton, Qt.ShiftModifier) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 6) |
| |
| mouseClick(tree, semiIndent + 50, 70+150, Qt.LeftButton, Qt.ShiftModifier) |
| |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 3) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(secondItem), true) |
| compare(tree.selection.isSelected(thirdItem), true) |
| compare(tree.selection.isSelected(fourthItem), true) |
| compare(tree.selection.isSelected(fifthItem), false) |
| compare(tree.selection.isSelected(sixthItem), false) |
| |
| mouseClick(tree, semiIndent + 50, 70+100, Qt.LeftButton) |
| listIndexes = tree.selection.selectedIndexes |
| compare(listIndexes.length, 1) |
| compare(tree.selection.hasSelection, true) |
| compare(tree.selection.isSelected(thirdItem), true) |
| } |
| |
| function test_indexAt() { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| verify(waitForRendering(tree), "TreeView did not render on time") |
| var model = tree.model |
| wait(50) |
| |
| // Sample each row and test |
| for (var row = 0; row < tree.__listView.count; row++) { |
| for (var x = 1; x < tree.getColumn(0).width; x += 10) { |
| var treeIndex = tree.indexAt(x, 50 * (row + 1) + 1) // offset by header height |
| var modelIndex = model.index(row, 0) |
| if (treeIndex.row !== modelIndex.row |
| || treeIndex.column !== modelIndex.column |
| || treeIndex.internalId !== modelIndex.internalId) { |
| console.log("Test about to fail: row = " + row + ", __listView.count =" + tree.__listView.count) |
| console.log(" . . . . . . . . . x =" + x + ", getColumn(0).width =" + tree.getColumn(0).width) |
| console.log("pairs of should-be-equal values: ", |
| treeIndex.row, modelIndex.row, |
| treeIndex.column, modelIndex.column, |
| treeIndex.internalId, modelIndex.internalId) |
| } |
| |
| compare(treeIndex.row, modelIndex.row) |
| compare(treeIndex.column, modelIndex.column) |
| compare(treeIndex.internalId, modelIndex.internalId) |
| } |
| } |
| |
| // Hide header, test again |
| tree.headerVisible = false |
| for (row = 0; row < tree.__listView.count; row++) { |
| for (x = 1; x < tree.getColumn(0).width; x += 10) { |
| treeIndex = tree.indexAt(x, 50 * row + 1) |
| modelIndex = model.index(row, 0) |
| if (treeIndex.row !== modelIndex.row |
| || treeIndex.column !== modelIndex.column |
| || treeIndex.internalId !== modelIndex.internalId) { |
| console.log("Test about to fail: row = " + row + ", __listView.count =" + __listView.count) |
| console.log(" . . . . . . . . . x =" + x + ", getColumn(0).width =" + getColumn(0).width) |
| } |
| compare(treeIndex.row, modelIndex.row) |
| compare(treeIndex.column, modelIndex.column) |
| compare(treeIndex.internalId, modelIndex.internalId) |
| } |
| } |
| |
| // Test outside the view content area |
| modelIndex = model.index(-1,-1) |
| |
| treeIndex = tree.indexAt(-10, 55) |
| compare(treeIndex.row, modelIndex.row) |
| compare(treeIndex.column, modelIndex.column) |
| compare(treeIndex.internalId, modelIndex.internalId) |
| |
| treeIndex = tree.indexAt(-10, tree.getColumn(0).width + 10) |
| compare(treeIndex.row, modelIndex.row) |
| compare(treeIndex.column, modelIndex.column) |
| compare(treeIndex.internalId, modelIndex.internalId) |
| |
| treeIndex = tree.indexAt(10, -10) |
| compare(treeIndex.row, modelIndex.row) |
| compare(treeIndex.column, modelIndex.column) |
| compare(treeIndex.internalId, modelIndex.internalId) |
| |
| treeIndex = tree.indexAt(10, tree.__listView.contentHeight + 10) |
| compare(treeIndex.row, modelIndex.row) |
| compare(treeIndex.column, modelIndex.column) |
| compare(treeIndex.internalId, modelIndex.internalId) |
| } |
| |
| function test_QTBUG_46891_selection_collapse_parent() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| var model = tree.model |
| model.removeRows(1, 9) |
| model.removeRows(1, 9, model.index(0, 0)) |
| waitForRendering(tree) |
| |
| var selectionModel = Qt.createQmlObject(testCase.instance_selectionModel, container, '') |
| selectionModel.model = tree.model |
| tree.selection = selectionModel |
| tree.selectionMode = SelectionMode.ExtendedSelection |
| |
| var parentItem = tree.model.index(0, 0) |
| tree.expand(parentItem) |
| verify(tree.isExpanded(parentItem)) |
| |
| wait(100) |
| mouseClick(tree, semiIndent + 50, 20 + 100, Qt.LeftButton) |
| verify(selectionModel.isSelected(tree.currentIndex)) |
| |
| tree.collapse(parentItem) |
| mouseClick(tree, semiIndent + 50, 20 + 50, Qt.LeftButton) |
| verify(selectionModel.isSelected(parentItem)) |
| } |
| |
| function test_QTBUG_53097_currentIndex_on_model_reset() |
| { |
| var component = Qt.createComponent("treeview/treeview_1.qml") |
| compare(component.status, Component.Ready) |
| var tree = component.createObject(container); |
| verify(tree !== null, "tree created is null") |
| tree.headerVisible = false |
| var model = tree.model |
| waitForRendering(tree) |
| |
| /* Select the first row */ |
| verify(!tree.currentIndex.valid) |
| mouseClick(tree, semiIndent + 50, 20, Qt.LeftButton) |
| compare(tree.currentIndex.row, 0) |
| |
| spy.clear() |
| spy.target = tree |
| spy.signalName = "currentIndexChanged" |
| compare(spy.count, 0) |
| |
| /* delete the row: the currentIndex must be updated */ |
| model.removeRows(0, 1) |
| compare(spy.count, 1) |
| } |
| } |
| } |