blob: 324d9cff93fad533bd3f90cf1f157b9b553eaf4c [file] [log] [blame]
/****************************************************************************
**
** 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)
}
}
}