From 1a12b42c291784bc097487c4f4533df9efaded11 Mon Sep 17 00:00:00 2001 From: Tobias Markmann Date: Fri, 19 Aug 2016 10:47:54 +0200 Subject: Support dropping tabs on tab widgets Previously users could only drag and drop tabs on other tab bars. With this change the user can simply drop the tab on another tab widgets. This works on all QtTabWidgets that have a QtDNDTabBar set, regardless of their number of child widgets. This works by forwarding dragEnverEvent() and dropEvent() calls on the QtTabWidget to the corresponding QtDNDTabBar. Tabs dropped on the tab widget instead of the tab bar are added at the end of the tab bar. Test-Information: Tested with Qt 5.5.1 on OS X 10.11.6 and Windows 7. Change-Id: Ie73e02de24472eab2d20a89c937fb6630b1ef7b8 diff --git a/Swift/QtUI/QtTabWidget.cpp b/Swift/QtUI/QtTabWidget.cpp index 9f353d7..cda1847 100644 --- a/Swift/QtUI/QtTabWidget.cpp +++ b/Swift/QtUI/QtTabWidget.cpp @@ -6,6 +6,8 @@ #include +#include + namespace Swift { QtTabWidget::QtTabWidget(QWidget* parent) : QTabWidget(parent) { @@ -22,5 +24,26 @@ QTabBar* QtTabWidget::tabBar() { void QtTabWidget::setTabBar(QTabBar* tabBar) { QTabWidget::setTabBar(tabBar); + if (dynamic_cast(tabBar)) { + setAcceptDrops(true); + } + else { + setAcceptDrops(false); + } +} + +void QtTabWidget::dragEnterEvent(QDragEnterEvent* event) { + QtDNDTabBar* dndTabBar = dynamic_cast(tabBar()); + if (dndTabBar) { + dndTabBar->dragEnterEvent(event); + } } + +void QtTabWidget::dropEvent(QDropEvent* event) { + QtDNDTabBar* dndTabBar = dynamic_cast(tabBar()); + if (dndTabBar) { + dndTabBar->dropEvent(event); + } +} + } diff --git a/Swift/QtUI/QtTabWidget.h b/Swift/QtUI/QtTabWidget.h index de1a846..a9d0df8 100644 --- a/Swift/QtUI/QtTabWidget.h +++ b/Swift/QtUI/QtTabWidget.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -17,5 +17,9 @@ namespace Swift { QTabBar* tabBar(); void setTabBar(QTabBar* tabBar); + + protected: + virtual void dragEnterEvent(QDragEnterEvent* event); + virtual void dropEvent(QDropEvent* event); }; } diff --git a/Swift/QtUI/Trellis/QtDNDTabBar.h b/Swift/QtUI/Trellis/QtDNDTabBar.h index 40eb66d..e9b6771 100644 --- a/Swift/QtUI/Trellis/QtDNDTabBar.h +++ b/Swift/QtUI/Trellis/QtDNDTabBar.h @@ -8,6 +8,8 @@ #include +#include + namespace Swift { class QtDNDTabBar : public QTabBar { @@ -22,6 +24,7 @@ class QtDNDTabBar : public QTabBar { virtual QSize sizeHint() const; + friend class QtTabWidget; signals: void onDropSucceeded(); -- cgit v0.10.2-6-g49f6