diff --git a/examples/basic/main.cpp b/examples/basic/main.cpp index 4f1b7f18..bea6e5b1 100644 --- a/examples/basic/main.cpp +++ b/examples/basic/main.cpp @@ -112,7 +112,8 @@ int main(int argc, char **argv) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); QApplication app(argc, argv); - // KDDockWidgets::Config::self().setFlags(KDDockWidgets::Config::Flag_HideTitleBarWhenTabsVisible); + //KDDockWidgets::Config::self().setFlags( KDDockWidgets::Config::Flags() | KDDockWidgets::Config::Flag_HideTitleBarWhenTabsVisible | KDDockWidgets::Config::Flag_AlwaysShowTabs); + //KDDockWidgets::Config::self().setFlags( KDDockWidgets::Config::Flags() | KDDockWidgets::Config::Flag_AlwaysShowTabs); app.setOrganizationName(QStringLiteral("KDAB")); app.setApplicationName(QStringLiteral("Test app")); qApp->setStyle(QStyleFactory::create(QStringLiteral("Fusion"))); diff --git a/src/TabWidget.cpp b/src/TabWidget.cpp index 1fb139d0..be362ad6 100644 --- a/src/TabWidget.cpp +++ b/src/TabWidget.cpp @@ -75,20 +75,24 @@ std::unique_ptr TabBar::makeWindow() if (hideTitleBarWhenTabsVisible) { if (dock) { if (alwaysShowTabs && hasSingleDockWidget()) { - // Case #2. User is dragging a tab but there's only 1 tab (and tabs are always visible), so drag everything instead, no detaching happens + // Case #1. User is dragging a tab but there's only 1 tab (and tabs are always visible), so drag everything instead, no detaching happens return m_tabWidget->makeWindow(); } - } else { - // Case #1. User is dragging on the QTabBar background, not on an actual tab + // Case #2. User is dragging on the QTabBar background, not on an actual tab. + // As Flag_HideTitleBarWhenTabsVisible is set, we let the user drag through the tab widget background. return m_tabWidget->makeWindow(); } + } else { + if (dock && hasSingleDockWidget() && alwaysShowTabs) { + // Case #3. window with title bar and single tab, no detaching should happen, just use the title bar. + return {}; + } } if (!dock) return {}; - FloatingWindow *floatingWindow = detachTab(dock); auto draggable = KDDockWidgets::usesNativeTitleBar() ? static_cast(floatingWindow) @@ -131,7 +135,7 @@ QWidgetOrQuick *TabBar::asWidget() const } TabWidget::TabWidget(QWidgetOrQuick *thisWidget, Frame *frame) - : Draggable(thisWidget, Config::self().flags() & Config::Flag_HideTitleBarWhenTabsVisible) + : Draggable(thisWidget, Config::self().flags() & (Config::Flag_HideTitleBarWhenTabsVisible | Config::Flag_AlwaysShowTabs)) , m_frame(frame) , m_thisWidget(thisWidget) { @@ -198,6 +202,11 @@ QWidgetOrQuick *TabWidget::asWidget() const return m_thisWidget; } +Frame *TabWidget::frame() const +{ + return m_frame; +} + std::unique_ptr TabWidget::makeWindow() { // This is called when using Flag_HideTitleBarWhenTabsVisible diff --git a/src/TabWidget_p.h b/src/TabWidget_p.h index c154e05e..ebfb5cfc 100644 --- a/src/TabWidget_p.h +++ b/src/TabWidget_p.h @@ -170,6 +170,9 @@ public: */ QWidgetOrQuick *asWidget() const; + ///@brief getter for the frame + Frame *frame() const; + // Draggable interface std::unique_ptr makeWindow() override; diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index c3954ef3..c6d3680b 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -388,6 +388,7 @@ private Q_SLOTS: void tst_tabBarWithHiddenTitleBar(); void tst_dragByTabBar_data(); void tst_dragByTabBar(); + void tst_dragBySingleTab(); void tst_addToHiddenMainWindow(); void tst_minSizeChanges(); @@ -4169,6 +4170,26 @@ void TestDocks::tst_dragByTabBar() dragFloatingWindowTo(fw, dropArea, DropIndicatorOverlayInterface::DropLocation_Right); } +void TestDocks::tst_dragBySingleTab() +{ + // Tests dragging via a tab when there's only 1 tab, and we're using Flag_AlwaysShowTabs + EnsureTopLevelsDeleted e; + Config::self().setFlags(Config::Flag_AlwaysShowTabs); + auto dock1 = createDockWidget("dock1", new MyWidget2(QSize(400, 400))); + dock1->show(); + + auto frame1 = dock1->frame(); + + QPoint globalPressPos = dragPointForWidget(frame1, 0); + QTabBar *tabBar = static_cast(frame1)->tabBar(); + QVERIFY(tabBar); + SetExpectedWarning sew("No window being dragged for"); // because dragging by tab does nothing in this case + drag(tabBar, globalPressPos, QPoint(0, 0)); + + delete dock1; + waitForDeleted(frame1); +} + void TestDocks::tst_addToHiddenMainWindow() { EnsureTopLevelsDeleted e;