| /**************************************************************************** |
| ** |
| ** 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.2 |
| import QtTest 1.0 |
| import QtQuick.Controls 1.2 |
| import QtQuickControlsTests 1.0 |
| |
| Rectangle { |
| id: container |
| width: 400 |
| height: 400 |
| |
| TestCase { |
| id: testCase |
| name: "Tests_TableView" |
| when:windowShown |
| width:400 |
| height:400 |
| |
| Component { |
| id: newColumn |
| TableViewColumn { } |
| } |
| |
| function test_usingqmlmodel_data() { |
| return [ |
| {tag: "listmodel", a: "tableview/table5_listmodel.qml", expected: "A"}, |
| {tag: "countmodel", a: "tableview/table6_countmodel.qml", expected: 0}, |
| {tag: "arraymodel", a: "tableview/table7_arraymodel.qml", expected: "A"}, |
| {tag: "itemmodel", a: "tableview/table8_itemmodel.qml", expected: 10}, |
| ] |
| } |
| |
| function test_QTBUG_46468() { |
| var table = Qt.createQmlObject('import QtQuick.Controls 1.3; \n\ |
| import QtQuick 2.4; \n\ |
| TableView { \n\ |
| headerVisible: false; \n\ |
| TableViewColumn{} \n\ |
| model: 10; \n\ |
| }', testCase, '') |
| wait(50); |
| verify(table.__viewTopMargin === 0) |
| table.destroy() |
| } |
| |
| function test_headervisible() { |
| var table = Qt.createQmlObject('import QtQuick.Controls 1.3; \n\ |
| import QtQuick 2.4; \n\ |
| TableView { \n\ |
| headerVisible: true; \n\ |
| TableViewColumn{} \n\ |
| model: 10; \n\ |
| }', testCase, '') |
| wait(50); |
| testCase.visible = true // ### FIXME Why do I need this at all? |
| verify(table.visible) |
| verify(table.__listView.headerItem.visible) |
| verify(table.__listView.headerItem.height > 0) |
| table.destroy() |
| } |
| |
| function test_basic_setup() { |
| var test_instanceStr = |
| 'import QtQuick 2.2; \ |
| import QtQuick.Controls 1.2; \ |
| TableView { \ |
| TableViewColumn { \ |
| } \ |
| model: 10 \ |
| }' |
| |
| var table = Qt.createQmlObject(test_instanceStr, testCase, '') |
| compare(table.currentRow, -1) |
| verify(table.rowCount === 10) |
| verify (table.__currentRowItem === null) |
| table.currentRow = 0 |
| verify(table.__currentRowItem !== null) |
| verify (table.currentRow === 0) |
| table.currentRow = 3 |
| verify(table.__currentRowItem !== null) |
| verify (table.currentRow === 3) |
| table.destroy() |
| } |
| |
| function test_usingqmlmodel(data) { |
| |
| var component = Qt.createComponent(data.a) |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.forceActiveFocus(); |
| |
| verify(table.__currentRowItem !== undefined, "No current item found") |
| var label = findAChild(table.__currentRowItem, "label") |
| verify(label !== undefined) |
| compare(label.text, data.expected.toString()); |
| table.destroy(); |
| } |
| |
| |
| function rangeTest(arr, table) { |
| var ranges = table.selection.__ranges |
| if (arr.length !== ranges.length) |
| return false; |
| |
| for (var i = 0 ; i < ranges.length ; ++ i) { |
| if (!(arr[i][0] === ranges[i][0] && arr[i][1] === ranges[i][1])) |
| return false; |
| } |
| return true; |
| } |
| |
| |
| function test_keyboardSelection() { |
| var component = Qt.createComponent("tableview/table6_countmodel.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| verify(table !== null, "table created is null") |
| table.model = 30 |
| table.width = container.width |
| table.height = container.height |
| table.selectionMode = SelectionMode.SingleSelection |
| table.forceActiveFocus(); |
| keyClick(Qt.Key_Down); |
| verify(table.selection.contains(1)) |
| verify(table.selection.count === 1) |
| keyClick(Qt.Key_Down, Qt.ShiftModifier); |
| verify(table.selection.contains(2)) |
| verify(table.selection.count === 1) |
| table.selectionMode = SelectionMode.ExtendedSelection |
| keyClick(Qt.Key_Down, Qt.ShiftModifier); |
| verify(table.selection.contains(2)) |
| verify(table.selection.contains(3)) |
| verify(table.selection.count === 2) |
| table.selectionMode = SelectionMode.MultiSelection |
| keyClick(Qt.Key_Down); |
| keyClick(Qt.Key_Down, Qt.ShiftModifier); |
| verify(table.selection.contains(4)) |
| verify(table.selection.contains(5)) |
| verify(table.selection.count === 2) |
| |
| // Navigate to end using arrow keys |
| table.selectionMode = SelectionMode.SingleSelection |
| table.model = 3 |
| table.currentRow = -1 |
| keyClick(Qt.Key_Down); |
| verify(table.currentRow === 0) |
| verify(rangeTest([[0,0]], table)) |
| verify(table.selection.contains(0)) |
| keyClick(Qt.Key_Down); |
| verify(table.currentRow === 1) |
| verify(table.selection.contains(1)) |
| keyClick(Qt.Key_Down); |
| verify(table.currentRow === 2) |
| verify(table.selection.contains(2)) |
| keyClick(Qt.Key_Down); |
| verify(table.currentRow === 2) |
| verify(table.selection.contains(2)) |
| keyClick(Qt.Key_Up); |
| verify(table.currentRow === 1) |
| verify(table.selection.contains(1)) |
| keyClick(Qt.Key_Up); |
| verify(table.currentRow === 0) |
| verify(table.selection.contains(0)) |
| keyClick(Qt.Key_Up); |
| verify(table.currentRow === 0) |
| verify(table.selection.contains(0)) |
| |
| table.destroy() |
| } |
| |
| function test_keys() { |
| var component = Qt.createComponent("tableview/tv_keys.qml") |
| compare(component.status, Component.Ready) |
| var test = component.createObject(container); |
| verify(test !== null, "test control created is null") |
| var control1 = test.control1 |
| verify(control1 !== null) |
| |
| control1.forceActiveFocus() |
| verify(control1.activeFocus) |
| |
| control1.selectionMode = SelectionMode.SingleSelection |
| control1.model = 3 |
| control1.currentRow = -1 |
| |
| verify(control1.gotit === false) |
| verify(control1.currentRow === -1) |
| |
| keyClick(Qt.Key_Down); |
| verify(control1.activeFocus) |
| verify(control1.gotit === true) |
| verify(control1.currentRow === -1) |
| |
| keyClick(Qt.Key_Down); |
| verify(control1.activeFocus) |
| verify(control1.gotit === true) |
| verify(control1.currentRow === 0) |
| |
| test.destroy() |
| } |
| |
| function test_keys_2() { |
| var component = Qt.createComponent("tableview/tv_keys_2.qml") |
| compare(component.status, Component.Ready) |
| var test = component.createObject(container); |
| verify(test !== null, "test control created is null") |
| var control1 = test.control1 |
| verify(control1 !== null) |
| var control2 = control1.control2 |
| verify(control2 !== null) |
| |
| control2.forceActiveFocus() |
| verify(control2.activeFocus) |
| |
| control2.currentRow = 1 |
| control2.selection.select(1, 1) |
| |
| verify(control1.gotit === false) |
| verify(control2.currentRow === 1) |
| |
| keyClick(Qt.Key_Up); |
| verify(control1.activeFocus) |
| verify(control1.gotit === false) |
| verify(control2.currentRow === 0) |
| |
| keyClick(Qt.Key_Up); |
| verify(control1.activeFocus) |
| verify(control1.gotit === true) |
| verify(control2.currentRow === 0) |
| |
| control2.currentRow = 1 |
| control2.selection.select(1, 1) |
| control1.gotit = false |
| |
| verify(control1.gotit === false) |
| verify(control2.currentRow === 1) |
| |
| keyClick(Qt.Key_Down); |
| verify(control1.activeFocus) |
| verify(control1.gotit === false) |
| verify(control2.currentRow === 2) |
| |
| keyClick(Qt.Key_Down); |
| verify(control1.activeFocus) |
| verify(control1.gotit === true) |
| verify(control2.currentRow === 2) |
| |
| test.destroy() |
| } |
| |
| function test_selection() { |
| |
| var component = Qt.createComponent("tableview/table2_qabstractitemmodel.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.model = 100 |
| table.selection.select(0, 0) |
| |
| verify(rangeTest([[0,0]], table)) |
| table.selection.select(4, 10) |
| verify(rangeTest([[0,0], [4, 10]], table)) |
| table.selection.select(8, 10) |
| verify(rangeTest([[0,0], [4, 10]], table)) |
| table.selection.select(2, 10) |
| verify(rangeTest([[0,0], [2, 10]], table)) |
| table.selection.select(0, 1) |
| verify(rangeTest([[0,10]], table)) |
| table.selection.deselect(0, 1) |
| verify(rangeTest([[2,10]], table)) |
| table.selection.deselect(7, 4) |
| verify(rangeTest([[2,3],[8, 10]], table)) |
| table.selection.deselect(1, 2) |
| verify(rangeTest([[3,3],[8, 10]], table)) |
| table.selection.deselect(3, 3) |
| verify(rangeTest([[8, 10]], table)) |
| table.selection.select(15, 13) |
| verify(rangeTest([[8, 10],[13, 15]], table)) |
| table.selection.select(11, 11) |
| verify(rangeTest([[8, 11],[13, 15]], table)) |
| table.selection.deselect(11, 11) |
| verify(rangeTest([[8, 10],[13, 15]], table)) |
| table.selection.select(12, 15) |
| verify(rangeTest([[8, 10],[12, 15]], table)) |
| table.selection.select(0, 3) |
| verify(rangeTest([[0, 3],[8, 10],[12, 15]], table)) |
| table.selection.select(4, 7) |
| verify(rangeTest([[0, 10],[12, 15]], table)) |
| table.selection.select(0, 99) |
| verify(rangeTest([[0, 99]], table)) |
| table.selection.deselect(1, 1) |
| table.selection.deselect(4, 4) |
| verify(rangeTest([[0, 0],[2,3],[5, 99]], table)) |
| table.selection.deselect(3, 88) |
| verify(rangeTest([[0, 0],[2,2],[89, 99]], table)) |
| table.selection.deselect(88, 98) |
| verify(rangeTest([[0, 0],[2,2],[99, 99]], table)) |
| table.selection.deselect(99, 99) |
| verify(rangeTest([[0, 0],[2,2]], table)) |
| table.selection.select(0, 3) |
| verify(rangeTest([[0, 3]], table)) |
| table.selection.deselect(0, 99) |
| verify(rangeTest([], table)) |
| table.selection.select(5, 3) |
| table.selection.select(9, 8) |
| table.selection.select(1, 3) |
| verify(rangeTest([[1, 5],[8,9]], table)) |
| table.selection.select(0, 99) |
| table.selection.deselect(0, 0) |
| table.selection.deselect(4, 4) |
| table.selection.deselect(9, 13) |
| verify(rangeTest([[1,3],[5,8],[14,99]], table)) |
| table.selection.select(3, 14) |
| verify(rangeTest([[1,99]], table)) |
| |
| table.selection.clear() |
| table.selection.select(1, 1) |
| verify(rangeTest([[1,1]], table)) |
| table.selection.select(5, 5) |
| verify(rangeTest([[1,1],[5,5]], table)) |
| table.selection.select(9, 11) |
| verify(rangeTest([[1,1],[5,5],[9,11]], table)) |
| table.selection.select(1, 3) |
| verify(rangeTest([[1,3],[5,5],[9,11]], table)) |
| |
| table.selection.clear() |
| compare(table.selection.__ranges.length, 0) |
| var i |
| for (i = 0 ; i < table.rowCount ; i += 2) |
| table.selection.select(i) |
| compare(table.selection.__ranges.length, 50) |
| for (i = 1 ; i < table.rowCount ; i += 2) |
| table.selection.select(i) |
| compare(table.selection.__ranges.length, 1) |
| for (i = 0 ; i < table.rowCount ; i += 2) |
| table.selection.deselect(i) |
| compare(table.selection.__ranges.length, 50) |
| for (i = 1 ; i < table.rowCount ; i += 2) |
| table.selection.deselect(i) |
| compare(table.selection.__ranges.length, 0) |
| |
| table.selection.select(3, 14) |
| table.selection.select(19, 7) |
| verify(rangeTest([[3,19]], table)) |
| |
| table.model = 50 // clear selection on model change |
| compare(table.selection.__ranges.length, 0) |
| |
| table.selection.selectAll() |
| compare(table.selection.__ranges.length, 1) |
| verify(rangeTest([[0,49]], table)) |
| table.destroy() |
| } |
| |
| function test_selectionCount() { |
| |
| var component = Qt.createComponent("tableview/table2_qabstractitemmodel.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.model = 100 |
| |
| table.selection.select(0, 0) |
| compare(table.selection.count, 1) |
| table.selection.select(4, 6) |
| compare(table.selection.count, 4) |
| table.selection.select(10, 13) |
| compare(table.selection.count, 8) |
| table.selection.select(0, 99) |
| compare(table.selection.count, 100) |
| table.model = 50 |
| compare(table.selection.count, 0) |
| table.destroy() |
| } |
| |
| function test_selectionForeach() { |
| var component = Qt.createComponent("tableview/table2_qabstractitemmodel.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.model = 100 |
| |
| var iteration = 0 |
| function tryMe() { iteration++ } |
| iteration = 0 |
| table.selection.forEach(tryMe) |
| compare(iteration, 0) |
| table.selection.select(2, 5) |
| table.selection.select(10, 12) |
| table.selection.select(14, 22) |
| compare(table.selection.count, 16) |
| iteration = 0 |
| table.selection.forEach(tryMe) |
| compare(iteration, 16) |
| |
| iteration = 0 |
| table.selection.select(0, 99) |
| table.selection.forEach(tryMe) |
| compare(iteration, 100) |
| |
| function removeNext(index) { |
| table.selection.deselect(index + 1) |
| verify(index%2 == 1) |
| iteration++ |
| } |
| |
| iteration = 0 |
| table.selection.clear() |
| table.selection.select(1, 7) |
| table.selection.forEach(removeNext) |
| compare(iteration, 4) |
| |
| |
| function deleteAll(index) { |
| table.selection.deselect(0, table.selection.count) |
| iteration++ |
| } |
| |
| iteration = 0 |
| table.selection.clear() |
| table.selection.select(0) |
| table.selection.forEach(deleteAll) |
| compare(iteration, 1) |
| |
| function addEven(index) { |
| if (index + 2 < table.rowCount) |
| table.selection.select(index + 2) |
| iteration++ |
| verify (index %2 === 0) |
| } |
| |
| iteration = 0 |
| table.selection.clear() |
| table.selection.select(0) |
| table.selection.forEach(addEven) |
| compare(iteration, 50) |
| table.destroy() |
| } |
| |
| function test_selectionContains() { |
| var component = Qt.createComponent("tableview/table2_qabstractitemmodel.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.model = 100 |
| table.selection.select(0, 0) |
| verify(table.selection.contains(0)) |
| verify(!table.selection.contains(1)) |
| verify(!table.selection.contains(10)) |
| table.selection.select(3, 13) |
| verify(table.selection.contains(10)) |
| verify(!table.selection.contains(2)) |
| table.selection.deselect(5, 7) |
| verify(!table.selection.contains(5)) |
| verify(!table.selection.contains(6)) |
| verify(!table.selection.contains(7)) |
| verify(table.selection.contains(8)) |
| table.destroy() |
| } |
| |
| function test_initializedStyleData() { |
| var table = Qt.createQmlObject('import QtQuick.Controls 1.2; \ |
| import QtQuick 2.2; \ |
| TableView { \ |
| model: 3; \ |
| TableViewColumn{} \ |
| property var items: []; \ |
| property var rows: []; \ |
| itemDelegate: Item{ Component.onCompleted: { items.push(styleData.row) } } \ |
| rowDelegate: Item{ Component.onCompleted: { if (styleData.row !== undefined) rows.push(styleData.row) } } \ |
| }' |
| , testCase, '') |
| waitForRendering(table) |
| compare(table.items, [0, 1, 2]); |
| compare(table.rows, [0, 1, 2]); |
| table.destroy() |
| } |
| |
| |
| function test_usingcppqobjectmodel() { |
| |
| var component = Qt.createComponent("tableview/table1_qobjectmodel.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.forceActiveFocus(); |
| |
| // read data from the model directly |
| var valuefrommodel = table.model.value; |
| verify(valuefrommodel !== undefined, "The model has no defined value") |
| |
| verify(table.__currentRowItem !== undefined, "No current item found") |
| var label = findAChild(table.__currentRowItem, "label") |
| verify(label !== undefined) |
| compare(label.text, valuefrommodel.toString()); |
| table.destroy(); |
| } |
| |
| function test_usingcppqabstractitemmodel() { |
| |
| var component = Qt.createComponent("tableview/table2_qabstractitemmodel.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.forceActiveFocus(); |
| |
| // to go to next row (this model has 10 rows) |
| table.__listView.incrementCurrentIndex() |
| |
| // read data from the model directly |
| var valuefrommodel = table.model.dataAt(table.currentRow) |
| verify(valuefrommodel !== undefined, "The model has no defined value") |
| |
| verify(table.__currentRowItem !== undefined, "No current item found") |
| var label = findAChild(table.__currentRowItem, "label") |
| verify(label !== undefined) |
| compare(label.text, valuefrommodel.toString()) |
| table.destroy(); |
| } |
| |
| function test_usingcpplistmodel_data() { |
| return [ |
| {tag: "qobjectlistmodel", a: "tableview/table3_qobjectlist.qml", expected: 1}, |
| {tag: "qstringlistmodel", a: "tableview/table4_qstringlist.qml", expected: "B"}, |
| ] |
| } |
| |
| function test_usingcpplistmodel(data) { |
| |
| var component = Qt.createComponent(data.a) |
| compare(component.status, Component.Ready) |
| var table = component.createObject(testCase); |
| verify(table !== null, "table created is null") |
| table.forceActiveFocus(); |
| |
| // to go to next row (this model has 3 rows, read the second row) |
| table.__listView.incrementCurrentIndex() |
| |
| verify(table.__currentRowItem !== undefined, "No current item found") |
| var label = findAChild(table.__currentRowItem, "label") |
| verify(label !== undefined) |
| compare(label.text, data.expected.toString()); |
| table.destroy(); |
| } |
| |
| function test_buttonDelegate() { |
| var component = Qt.createComponent("tableview/table_buttondelegate.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container) |
| verify(table !== null, "table created is null") |
| compare(table.currentRow, -1) |
| waitForRendering(table) |
| |
| // wait for items to be created |
| var timeout = 2000 |
| while (timeout >= 0 && table.rowAt(20, 50) === -1) { |
| timeout -= 50 |
| wait(50) |
| } |
| |
| mousePress(table, 50, 20, Qt.LeftButton) |
| compare(table.currentRow, 0) |
| compare(table.tableClickCount, 0) |
| compare(table.buttonPressCount, 1) |
| compare(table.buttonReleaseCount, 0) |
| |
| mouseRelease(table, 50, 20, Qt.LeftButton) |
| compare(table.currentRow, 0) |
| compare(table.tableClickCount, 0) |
| compare(table.buttonPressCount, 1) |
| compare(table.buttonReleaseCount, 1) |
| |
| mouseClick(table, 50, 60, Qt.LeftButton) |
| compare(table.currentRow, 1) |
| compare(table.tableClickCount, 0) |
| compare(table.buttonPressCount, 2) |
| compare(table.buttonReleaseCount, 2) |
| |
| table.destroy() |
| } |
| |
| function test_QTBUG_31206() { |
| var component = Qt.createComponent("tableview/table_delegate2.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| verify(table !== null, "table created is null") |
| |
| // wait for items to be created |
| var timeout = 2000 |
| while (timeout >= 0 && table.rowAt(15, 55) === -1) { |
| timeout -= 50 |
| wait(50) |
| } |
| |
| compare(table.test, false) |
| mouseClick(table, 15 , 10, Qt.LeftButton) |
| compare(table.test, true) |
| table.destroy() |
| } |
| |
| function test_forwardMouseEventsToChildDelegate() { |
| var component = Qt.createComponent("tableview/table_delegate3.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| table.forceActiveFocus(); |
| verify(table !== null, "table created is null") |
| |
| // wait for items to be created |
| var timeout = 2000 |
| while (timeout >= 0 && table.rowAt(15, 55) === -1) { |
| timeout -= 50 |
| wait(50) |
| } |
| |
| compare(table._pressed, false) |
| compare(table._clicked, false) |
| compare(table._released, false) |
| compare(table._doubleClicked, false) |
| compare(table._pressAndHold, false) |
| |
| mousePress(table, 25 , 10, Qt.LeftButton) |
| compare(table._pressed, true) |
| table.clearTestData() |
| |
| mouseRelease(table, 25 , 10, Qt.LeftButton) |
| compare(table._released, true) |
| table.clearTestData() |
| |
| mouseClick(table, 25 , 10, Qt.LeftButton) |
| compare(table._clicked, true) |
| table.clearTestData() |
| |
| mouseDoubleClick(table, 25 , 10, Qt.LeftButton) |
| compare(table._doubleClicked, true) |
| table.clearTestData() |
| |
| mousePress(table, 25 , 10, Qt.LeftButton) |
| compare(table._pressAndHold, false) |
| tryCompare(table, "_pressAndHold", true, 5000) |
| table.clearTestData() |
| |
| table.destroy() |
| } |
| |
| function test_rightClickOnMouseAreaOverTableView() { |
| var component = Qt.createComponent("tableview/table_mousearea.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| table.forceActiveFocus(); |
| verify(table !== null, "table created is null") |
| |
| // wait for items to be created |
| var timeout = 2000 |
| while (timeout >= 0 && table.rowAt(15, 55) === -1) { |
| timeout -= 50 |
| wait(50) |
| } |
| |
| compare(table._pressed, false) |
| compare(table._clicked, false) |
| compare(table._released, false) |
| compare(table._doubleClicked, false) |
| compare(table._pressAndHold, false) |
| |
| mousePress(table, 25, 10, Qt.RightButton) |
| compare(table._pressed, true) |
| table.clearTestData() |
| |
| mouseRelease(table, 25, 10, Qt.RightButton) |
| compare(table._released, true) |
| table.clearTestData() |
| |
| mouseClick(table, 25, 10, Qt.RightButton) |
| compare(table._clicked, true) |
| table.clearTestData() |
| |
| mouseDoubleClick(table, 25, 10, Qt.RightButton) |
| compare(table._doubleClicked, true) |
| table.clearTestData() |
| |
| mousePress(table, 25 , 10, Qt.RightButton) |
| compare(table._pressAndHold, false) |
| tryCompare(table, "_pressAndHold", true, 5000) |
| table.clearTestData() |
| |
| table.destroy() |
| } |
| |
| function test_activated() { |
| var component = Qt.createComponent("tableview/table_activated.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| verify(table !== null, "table created is null") |
| table.forceActiveFocus(); |
| compare(table.test, -1) |
| compare(table.testClick, table.currentRow) |
| |
| if (!table.__activateItemOnSingleClick) |
| mouseDoubleClick(table, 15 , 45, Qt.LeftButton) |
| else |
| mouseClick(table, 15, 45, Qt.LeftButton) |
| |
| compare(table.testDoubleClick, table.currentRow) |
| compare(table.test, table.currentRow) |
| compare(table.testClick, table.currentRow) |
| |
| if (!table.__activateItemOnSingleClick) |
| mouseDoubleClick(table, 15 , 15, Qt.LeftButton) |
| else |
| mouseClick(table, 15, 15, Qt.LeftButton) |
| |
| compare(table.testDoubleClick, table.currentRow) |
| compare(table.testClick, table.currentRow) |
| compare(table.test, table.currentRow) |
| |
| table.destroy() |
| } |
| |
| function test_columnCount() { |
| var component = Qt.createComponent("tableview/table_multicolumns.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| verify(table !== null, "table created is null") |
| compare(table.columnCount, 3) |
| table.destroy() |
| } |
| |
| function test_rowCount() { |
| var component = Qt.createComponent("tableview/table_multicolumns.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| verify(table !== null, "table created is null") |
| compare(table.rowCount, 3) |
| table.destroy() |
| } |
| |
| function test_columnWidth() { |
| var tableView = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; TableView { }', testCase, ''); |
| compare(tableView.columnCount, 0) |
| var column = newColumn.createObject(testCase, {title: "title 1"}); |
| verify(column.__view === null) |
| compare(column.width, 160) |
| compare(column.title, "title 1") |
| tableView.addColumn(column) |
| compare(column.__view, tableView) |
| compare(column.width, tableView.viewport.width) |
| var tableView2 = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; TableView { }', testCase, ''); |
| ignoreWarning("TableView::insertColumn(): you cannot add a column to multiple views") |
| tableView2.addColumn(column) // should not work |
| compare(column.__view, tableView) //same as before |
| tableView2.destroy() |
| tableView.destroy() |
| } |
| |
| function test_dynamicColumns() { |
| var component = Qt.createComponent("tableview/table_dynamiccolumns.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container) |
| |
| // insertColumn(component), insertColumn(item), |
| // addColumn(component), addColumn(item), and static TableViewColumn {} |
| compare(table.columnCount, 5) |
| compare(table.getColumn(0).title, "inserted component") |
| compare(table.getColumn(1).title, "inserted item") |
| table.destroy() |
| } |
| |
| function test_addRemoveColumn() { |
| var tableView = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; TableView { }', testCase, ''); |
| compare(tableView.columnCount, 0) |
| tableView.addColumn(newColumn.createObject(testCase, {title: "title 1"})) |
| compare(tableView.columnCount, 1) |
| tableView.addColumn(newColumn.createObject(testCase, {title: "title 2"})) |
| compare(tableView.columnCount, 2) |
| compare(tableView.getColumn(0).title, "title 1") |
| compare(tableView.getColumn(1).title, "title 2") |
| |
| tableView.insertColumn(1, newColumn.createObject(testCase, {title: "title 3"})) |
| compare(tableView.columnCount, 3) |
| compare(tableView.getColumn(0).title, "title 1") |
| compare(tableView.getColumn(1).title, "title 3") |
| compare(tableView.getColumn(2).title, "title 2") |
| |
| tableView.insertColumn(0, newColumn.createObject(testCase, {title: "title 4"})) |
| compare(tableView.columnCount, 4) |
| compare(tableView.getColumn(0).title, "title 4") |
| compare(tableView.getColumn(1).title, "title 1") |
| compare(tableView.getColumn(2).title, "title 3") |
| compare(tableView.getColumn(3).title, "title 2") |
| |
| tableView.removeColumn(0) |
| compare(tableView.columnCount, 3) |
| compare(tableView.getColumn(0).title, "title 1") |
| compare(tableView.getColumn(1).title, "title 3") |
| compare(tableView.getColumn(2).title, "title 2") |
| |
| tableView.removeColumn(1) |
| compare(tableView.columnCount, 2) |
| compare(tableView.getColumn(0).title, "title 1") |
| compare(tableView.getColumn(1).title, "title 2") |
| |
| tableView.removeColumn(1) |
| compare(tableView.columnCount, 1) |
| compare(tableView.getColumn(0).title, "title 1") |
| |
| tableView.removeColumn(0) |
| compare(tableView.columnCount, 0) |
| tableView.destroy() |
| } |
| |
| function test_moveColumn_data() { |
| return [ |
| {tag:"0->1 (0)", from: 0, to: 1}, |
| {tag:"0->1 (1)", from: 0, to: 1}, |
| {tag:"0->1 (2)", from: 0, to: 1}, |
| |
| {tag:"0->2 (0)", from: 0, to: 2}, |
| {tag:"0->2 (1)", from: 0, to: 2}, |
| {tag:"0->2 (2)", from: 0, to: 2}, |
| |
| {tag:"1->0 (0)", from: 1, to: 0}, |
| {tag:"1->0 (1)", from: 1, to: 0}, |
| {tag:"1->0 (2)", from: 1, to: 0}, |
| |
| {tag:"1->2 (0)", from: 1, to: 2}, |
| {tag:"1->2 (1)", from: 1, to: 2}, |
| {tag:"1->2 (2)", from: 1, to: 2}, |
| |
| {tag:"2->0 (0)", from: 2, to: 0}, |
| {tag:"2->0 (1)", from: 2, to: 0}, |
| {tag:"2->0 (2)", from: 2, to: 0}, |
| |
| {tag:"2->1 (0)", from: 2, to: 1}, |
| {tag:"2->1 (1)", from: 2, to: 1}, |
| {tag:"2->1 (2)", from: 2, to: 1}, |
| |
| {tag:"0->0", from: 0, to: 0}, |
| {tag:"-1->0", from: -1, to: 0, warning: "TableView::moveColumn(): invalid argument"}, |
| {tag:"0->-1", from: 0, to: -1, warning: "TableView::moveColumn(): invalid argument"}, |
| {tag:"1->10", from: 1, to: 10, warning: "TableView::moveColumn(): invalid argument"}, |
| {tag:"10->2", from: 10, to: 2, warning: "TableView::moveColumn(): invalid argument"}, |
| {tag:"10->-1", from: 10, to: -1, warning: "TableView::moveColumn(): invalid argument"} |
| ] |
| } |
| |
| function test_moveColumn(data) { |
| var tableView = Qt.createQmlObject('import QtQuick 2.2; import QtQuick.Controls 1.2; TableView { }', testCase, ''); |
| compare(tableView.columnCount, 0) |
| |
| var titles = ["title 1", "title 2", "title 3"] |
| |
| var i = 0; |
| for (i = 0; i < titles.length; ++i) |
| tableView.addColumn(newColumn.createObject(testCase, {title: titles[i]})) |
| |
| compare(tableView.columnCount, titles.length) |
| for (i = 0; i < tableView.columnCount; ++i) |
| compare(tableView.getColumn(i).title, titles[i]) |
| |
| if (data.warning !== undefined) |
| ignoreWarning(data.warning) |
| tableView.moveColumn(data.from, data.to) |
| |
| compare(tableView.columnCount, titles.length) |
| |
| if (data.from >= 0 && data.from < tableView.columnCount && data.to >= 0 && data.to < tableView.columnCount) { |
| var title = titles[data.from] |
| titles.splice(data.from, 1) |
| titles.splice(data.to, 0, title) |
| } |
| |
| compare(tableView.columnCount, titles.length) |
| for (i = 0; i < tableView.columnCount; ++i) |
| compare(tableView.getColumn(i).title, titles[i]) |
| |
| tableView.destroy() |
| } |
| |
| function test_positionViewAtRow() { |
| var test_instanceStr = |
| 'import QtQuick 2.2; \ |
| import QtQuick.Controls 1.2; \ |
| TableView { \ |
| TableViewColumn { \ |
| } \ |
| model: 1000; \ |
| headerVisible: false; \ |
| }' |
| |
| var table = Qt.createQmlObject(test_instanceStr, container, '') |
| waitForRendering(table) |
| |
| var beginPos = table.mapFromItem(table.viewport, 0, 0) |
| |
| table.positionViewAtRow(0, ListView.Beginning) |
| compare(table.rowAt(beginPos.x, beginPos.y), 0) |
| |
| table.positionViewAtRow(100, ListView.Beginning) |
| compare(table.rowAt(beginPos.x, beginPos.y), 100) |
| |
| var endPos = table.mapFromItem(table.viewport, 0, table.viewport.height - 1) |
| |
| table.positionViewAtRow(900, ListView.End) |
| compare(table.rowAt(endPos.x, endPos.y), 900) |
| |
| table.positionViewAtRow(999, ListView.End) |
| compare(table.rowAt(endPos.x, endPos.y), 999) |
| |
| table.destroy() |
| } |
| |
| function test_resize_columns() { |
| var component = Qt.createComponent("tableview/table_resizecolumns.qml") |
| compare(component.status, Component.Ready) |
| var table = component.createObject(container); |
| verify(table !== null, "table created is null") |
| waitForRendering(table) |
| compare(table.getColumn(0).width, 20) |
| table.getColumn(0).resizeToContents() |
| compare(table.getColumn(0).width, 50) |
| table.getColumn(0).width = 20 |
| compare(table.getColumn(0).width, 20) |
| table.resizeColumnsToContents() |
| compare(table.getColumn(0).width, 50) |
| table.destroy() |
| } |
| |
| // In TableView, drawn text = table.__currentRowItem.children[1].children[1].itemAt(0).children[0].children[0].text |
| |
| function findAChild(item, name) |
| { |
| if (item.count === undefined) { |
| var i = 0 |
| while (item.children[i] !== undefined) { |
| var child = item.children[i] |
| if (child.objectName === name) |
| return child |
| else { |
| var found = findAChild(child, name) |
| if (found !== undefined) |
| return found |
| } |
| i++ |
| } |
| |
| } else { // item with count => columns |
| for (var j = 0; j < item.count ; j++) { |
| var tempitem = item.itemAt(j) |
| if (tempitem.objectName === name) |
| return tempitem |
| var found = findAChild(tempitem, name) |
| if (found !== undefined) |
| return found |
| } |
| } |
| return undefined // no matching child found |
| } |
| |
| Component { |
| id: textFieldDelegate |
| TextField { |
| objectName: "delegate-" + styleData.row + "-" + styleData.column |
| } |
| } |
| |
| function test_activeFocusOnTab() { |
| if (Qt.styleHints.tabFocusBehavior != Qt.TabFocusAllControls) |
| skip("This function doesn't support NOT iterating all.") |
| |
| var component = Qt.createComponent("tableview/table_activeFocusOnTab.qml") |
| compare(component.status, Component.Ready) |
| var control = component.createObject(container) |
| |
| verify(!control.control2.activeFocusOnTab) |
| |
| control.control1.forceActiveFocus() |
| verify(control.control1.activeFocus) |
| verify(!control.control2.activeFocus) |
| verify(!control.control3.activeFocus) |
| keyPress(Qt.Key_Tab) |
| verify(!control.control1.activeFocus) |
| verify(!control.control2.activeFocus) |
| verify(control.control3.activeFocus) |
| keyPress(Qt.Key_Tab) |
| verify(control.control1.activeFocus) |
| verify(!control.control2.activeFocus) |
| verify(!control.control3.activeFocus) |
| keyPress(Qt.Key_Tab, Qt.ShiftModifier) |
| verify(!control.control1.activeFocus) |
| verify(!control.control2.activeFocus) |
| verify(control.control3.activeFocus) |
| keyPress(Qt.Key_Tab, Qt.ShiftModifier) |
| verify(control.control1.activeFocus) |
| verify(!control.control2.activeFocus) |
| verify(!control.control3.activeFocus) |
| |
| control.control2.activeFocusOnTab = true |
| |
| verify(control.control2.activeFocusOnTab) |
| |
| keyPress(Qt.Key_Tab) |
| verify(!control.control1.activeFocus) |
| verify(control.control2.activeFocus) |
| verify(!control.control3.activeFocus) |
| keyPress(Qt.Key_Tab) |
| verify(!control.control1.activeFocus) |
| verify(!control.control2.activeFocus) |
| verify(control.control3.activeFocus) |
| keyPress(Qt.Key_Tab, Qt.ShiftModifier) |
| verify(!control.control1.activeFocus) |
| verify(control.control2.activeFocus) |
| verify(!control.control3.activeFocus) |
| keyPress(Qt.Key_Tab, Qt.ShiftModifier) |
| verify(control.control1.activeFocus) |
| verify(!control.control2.activeFocus) |
| verify(!control.control3.activeFocus) |
| |
| control.control2.itemDelegate = textFieldDelegate |
| |
| keyPress(Qt.Key_Tab) |
| verify(!control.control1.activeFocus) |
| verify(control.control2.activeFocus) |
| verify(!control.control3.activeFocus) |
| |
| for (var row = 0; row < 3; ++row) { |
| for (var col = 0; col < 2; ++col) { |
| keyPress(Qt.Key_Tab) |
| var delegate = findAChild(control.control2.__currentRowItem, "delegate-" + row + "-" + col) |
| verify(delegate) |
| verify(delegate.activeFocus) |
| } |
| } |
| |
| control.destroy() |
| } |
| |
| ListModel { |
| id: testModel |
| |
| ListElement { |
| name: "Red" |
| color: "#ff0000" |
| } |
| ListElement { |
| name: "Green" |
| color: "#00ff00" |
| } |
| ListElement { |
| name: "Blue" |
| color: "#0000ff" |
| } |
| } |
| |
| Component { |
| id: tableViewComponent |
| |
| TableView { |
| model: testModel |
| anchors.fill: parent |
| sortIndicatorVisible: true |
| |
| TableViewColumn { |
| title: "Name" |
| role: "name" |
| width: 100 |
| } |
| |
| TableViewColumn { |
| title: "Color" |
| role: "color" |
| width: 100 |
| } |
| } |
| } |
| |
| function test_sortIndicatorAfterColumnMoved() { |
| var tableView = tableViewComponent.createObject(testCase); |
| verify(tableView); |
| |
| compare(tableView.sortIndicatorColumn, 0); |
| tableView.moveColumn(0, 1); |
| compare(tableView.sortIndicatorColumn, 1); |
| } |
| |
| function test_resize_dynamic_columns() { |
| var component = Qt.createComponent("tableview/table_resizedynamiccolumns.qml") |
| compare(component.status, Component.Ready) |
| var table = createTemporaryObject(component, container); |
| verify(table !== null, "table created is null") |
| waitForRendering(table) |
| compare(table.getColumn(0).width, 20) |
| table.getColumn(0).resizeToContents() |
| tryCompare(table.getColumn(0), "width", 50) |
| table.getColumn(0).width = 20 |
| compare(table.getColumn(0).width, 20) |
| table.resizeColumnsToContents() |
| compare(table.getColumn(0).width, 50) |
| } |
| } |
| } |