From ba1051707c0ba65ecfbf2535e15a496e7f8ec75d Mon Sep 17 00:00:00 2001
From: J-P Nurmi <jpnurmi@digia.com>
Date: Thu, 25 Apr 2013 11:25:16 +0200
Subject: [PATCH] Add TabView::moveTab(from, to)

Change-Id: I4996f5156b111d5dc40a50ff0c845bf0dc62ea27
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
---
 src/controls/TabView.qml                 | 18 +++++++
 tests/auto/controls/data/tst_tabview.qml | 66 ++++++++++++++++++++++++
 2 files changed, 84 insertions(+)

diff --git a/src/controls/TabView.qml b/src/controls/TabView.qml
index 924b55013..40cf5caa9 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 ce4957214..973b6fde5 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)
-- 
GitLab