diff --git a/src/controls/TabView.qml b/src/controls/TabView.qml index 924b55013e99b56e05b333e5677ac42845fdaf7f..40cf5caa9d1268e707c1ec8b271d2087891a7489 100644 --- a/src/controls/TabView.qml +++ b/src/controls/TabView.qml @@ -116,6 +116,24 @@ FocusScope { __setOpacities() } + /*! Moves a tab \a from index \a to another. */ + function moveTab(from, to) { + __tabs.move(from, to, 1) + + if (currentIndex == from) { + currentIndex = to + } else { + var start = Math.min(from, to) + var end = Math.max(from, to) + if (currentIndex >= start && currentIndex <= end) { + if (from < to) + --currentIndex + else + ++currentIndex + } + } + } + /*! Returns the \l Tab item at \a index. */ function tabAt(index) { return __tabs[index] diff --git a/tests/auto/controls/data/tst_tabview.qml b/tests/auto/controls/data/tst_tabview.qml index ce49572142f2f593605ade3fd8e70777bfae5b0f..973b6fde52d98875f17298ff4541014766b90cad 100644 --- a/tests/auto/controls/data/tst_tabview.qml +++ b/tests/auto/controls/data/tst_tabview.qml @@ -125,6 +125,72 @@ TestCase { tabView.destroy() } + function test_moveTab_data() { + return [ + {tag:"0->1 (0)", from: 0, to: 1, currentBefore: 0, currentAfter: 1}, + {tag:"0->1 (1)", from: 0, to: 1, currentBefore: 1, currentAfter: 0}, + {tag:"0->1 (2)", from: 0, to: 1, currentBefore: 2, currentAfter: 2}, + + {tag:"0->2 (0)", from: 0, to: 2, currentBefore: 0, currentAfter: 2}, + {tag:"0->2 (1)", from: 0, to: 2, currentBefore: 1, currentAfter: 0}, + {tag:"0->2 (2)", from: 0, to: 2, currentBefore: 2, currentAfter: 1}, + + {tag:"1->0 (0)", from: 1, to: 0, currentBefore: 0, currentAfter: 1}, + {tag:"1->0 (1)", from: 1, to: 0, currentBefore: 1, currentAfter: 0}, + {tag:"1->0 (2)", from: 1, to: 0, currentBefore: 2, currentAfter: 2}, + + {tag:"1->2 (0)", from: 1, to: 2, currentBefore: 0, currentAfter: 0}, + {tag:"1->2 (1)", from: 1, to: 2, currentBefore: 1, currentAfter: 2}, + {tag:"1->2 (2)", from: 1, to: 2, currentBefore: 2, currentAfter: 1}, + + {tag:"2->0 (0)", from: 2, to: 0, currentBefore: 0, currentAfter: 1}, + {tag:"2->0 (1)", from: 2, to: 0, currentBefore: 1, currentAfter: 2}, + {tag:"2->0 (2)", from: 2, to: 0, currentBefore: 2, currentAfter: 0}, + + {tag:"2->1 (0)", from: 2, to: 1, currentBefore: 0, currentAfter: 0}, + {tag:"2->1 (1)", from: 2, to: 1, currentBefore: 1, currentAfter: 2}, + {tag:"2->1 (2)", from: 2, to: 1, currentBefore: 2, currentAfter: 1}, + + {tag:"0->0", from: 0, to: 0, currentBefore: 0, currentAfter: 0}, + {tag:"-1->0", from: 0, to: 0, currentBefore: 1, currentAfter: 1}, + {tag:"0->-1", from: 0, to: 0, currentBefore: 2, currentAfter: 2}, + {tag:"1->10", from: 0, to: 0, currentBefore: 0, currentAfter: 0}, + {tag:"10->2", from: 0, to: 0, currentBefore: 1, currentAfter: 1}, + {tag:"10->-1", from: 0, to: 0, currentBefore: 2, currentAfter: 2} + ] + } + + function test_moveTab(data) { + var tabView = Qt.createQmlObject('import QtQuick 2.1; import QtQuick.Controls 1.0; TabView { }', testCase, ''); + compare(tabView.count, 0) + + var titles = ["title 1", "title 2", "title 3"] + + var i = 0; + for (i = 0; i < titles.length; ++i) + tabView.addTab(titles[i], newTab) + + compare(tabView.count, titles.length) + for (i = 0; i < tabView.count; ++i) + compare(tabView.tabAt(i).title, titles[i]) + + tabView.currentIndex = data.currentBefore + tabView.moveTab(data.from, data.to) + + compare(tabView.count, titles.length) + compare(tabView.currentIndex, data.currentAfter) + + var title = titles[data.from] + titles.splice(data.from, 1) + titles.splice(data.to, 0, title) + + compare(tabView.count, titles.length) + for (i = 0; i < tabView.count; ++i) + compare(tabView.tabAt(i).title, titles[i]) + + tabView.destroy() + } + function test_dynamicTabs() { var tabView = Qt.createQmlObject('import QtQuick 2.1; import QtQuick.Controls 1.0; TabView { property Component tabComponent: Component { Tab { } } }', testCase, ''); compare(tabView.count, 0)