diff --git a/src/DockAreaTabBar.cpp b/src/DockAreaTabBar.cpp index 1666283..53096b7 100644 --- a/src/DockAreaTabBar.cpp +++ b/src/DockAreaTabBar.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include "FloatingDockContainer.h" #include "DockAreaWidget.h" @@ -69,6 +70,16 @@ struct DockAreaTabBarPrivate * The function reassigns the stylesheet to update the tabs */ void updateTabs(); + + /** + * Convenience function to access first tab + */ + CDockWidgetTab* firstTab() const {return _this->tab(0);} + + /** + * Convenience function to access last tab + */ + CDockWidgetTab* lastTab() const {return _this->tab(_this->count() - 1);} }; // struct DockAreaTabBarPrivate @@ -366,6 +377,8 @@ void CDockAreaTabBar::onTabWidgetMoved(const QPoint& GlobalPos) int fromIndex = d->TabsLayout->indexOf(MovingTab); auto MousePos = mapFromGlobal(GlobalPos); + MousePos.rx() = qMax(d->firstTab()->geometry().left(), MousePos.x()); + MousePos.rx() = qMin(d->lastTab()->geometry().right(), MousePos.x()); int toIndex = -1; // Find tab under mouse for (int i = 0; i < count(); ++i) @@ -381,38 +394,23 @@ void CDockAreaTabBar::onTabWidgetMoved(const QPoint& GlobalPos) if (toIndex == fromIndex) { toIndex = -1; - continue; - } - - if (toIndex < 0) - { - toIndex = 0; } break; } - // Now check if the mouse is behind the last tab - if (toIndex < 0) - { - if (MousePos.x() > tab(count() - 1)->geometry().right()) - { - ADS_PRINT("after all tabs"); - toIndex = count() - 1; - } - else - { - toIndex = fromIndex; - } - } - - d->TabsLayout->removeWidget(MovingTab); - d->TabsLayout->insertWidget(toIndex, MovingTab); - if (toIndex >= 0) + if (toIndex > -1) { + d->TabsLayout->removeWidget(MovingTab); + d->TabsLayout->insertWidget(toIndex, MovingTab); ADS_PRINT("tabMoved from " << fromIndex << " to " << toIndex); emit tabMoved(fromIndex, toIndex); setCurrentIndex(toIndex); } + else + { + // Ensure that the moved tab is reset to its start position + d->TabsLayout->update(); + } } //=========================================================================== diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index d979c8a..78f527f 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -357,16 +357,19 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev) } // move tab + bool TabOutsideBar = false; if (d->isDraggingState(DraggingTab)) { // Moving the tab is always allowed because it does not mean moving the // dock widget around d->moveTab(ev); + TabOutsideBar = (geometry().right() < 0) || (geometry().left() > parentWidget()->rect().right()); } + // Maybe a fixed drag distance is better here ? int DragDistanceY = qAbs(d->GlobalDragStartMousePosition.y() - ev->globalPos().y()); - if (DragDistanceY >= CDockManager::startDragDistance()) + if (DragDistanceY >= CDockManager::startDragDistance() || TabOutsideBar) { // If this is the last dock area in a dock container with only // one single dock widget it does not make sense to move it to a new @@ -390,7 +393,7 @@ void CDockWidgetTab::mouseMoveEvent(QMouseEvent* ev) // tab because it looks strange if it remains on its dragged position if (d->isDraggingState(DraggingTab) && !CDockManager::configFlags().testFlag(CDockManager::OpaqueUndocking)) { - this->move(d->TabDragStartPosition); + parentWidget()->layout()->update(); } d->startFloating(); }