diff --git a/src/private/widgets/TabWidget.cpp b/src/private/widgets/TabWidget.cpp index de698381..0b8d5026 100644 --- a/src/private/widgets/TabWidget.cpp +++ b/src/private/widgets/TabWidget.cpp @@ -245,3 +245,14 @@ void TabWidget::onTabRemoved() { m_frame->onDockWidgetCountChanged(); } + +void TabWidget::onCurrentTabChanged(int index) +{ + if (index < 0 || !(Config::self().flags() & Config::Flag_TitleBarIsFocusable) ) + return; + + // A tab changing also counts as a change of scope + if (!m_frame->isFocused()) { + m_frame->FocusScope::focus(Qt::MouseFocusReason); + } +} diff --git a/src/private/widgets/TabWidgetWidget.cpp b/src/private/widgets/TabWidgetWidget.cpp index 177885ae..fa86459f 100644 --- a/src/private/widgets/TabWidgetWidget.cpp +++ b/src/private/widgets/TabWidgetWidget.cpp @@ -44,6 +44,9 @@ TabWidgetWidget::TabWidgetWidget(Frame *parent) } }); + connect(this, &QTabWidget::currentChanged, this, [this] (int index) { + onCurrentTabChanged(index); + }); } TabBar *TabWidgetWidget::tabBar() const diff --git a/src/private/widgets/TabWidget_p.h b/src/private/widgets/TabWidget_p.h index 32fcead6..5c126205 100644 --- a/src/private/widgets/TabWidget_p.h +++ b/src/private/widgets/TabWidget_p.h @@ -173,6 +173,7 @@ public: protected: void onTabInserted(); void onTabRemoved(); + void onCurrentTabChanged(int index); private: Frame *const m_frame; diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 2f938ae5..6d3f136f 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -430,6 +430,7 @@ private Q_SLOTS: void tst_isFocused(); void tst_setWidget(); void tst_isInMainWindow(); + void tst_titleBarFocusedWhenTabsChange(); private: std::unique_ptr createMultiSplitterFromSetup(MultiSplitterSetup setup, QHash &frameMap) const; @@ -5836,6 +5837,34 @@ void TestDocks::tst_isInMainWindow() delete fw; } +void TestDocks::tst_titleBarFocusedWhenTabsChange() +{ + EnsureTopLevelsDeleted e; + Config::self().setFlags(Config::Flag_TitleBarIsFocusable); + + auto dock1 = createDockWidget(QStringLiteral("dock1"), new QLineEdit()); + auto dock2 = createDockWidget(QStringLiteral("dock2"), new QLineEdit()); + auto dock3 = createDockWidget(QStringLiteral("dock3"), new QLineEdit()); + + auto m1 = createMainWindow(QSize(2560, 809), MainWindowOption_None, "MainWindow1"); + + m1->addDockWidget(dock1, Location_OnLeft); + m1->addDockWidget(dock2, Location_OnRight); + dock2->addDockWidgetAsTab(dock3); + + dock1->setFocus(Qt::NoFocusReason); + + QVERIFY(Testing::waitForEvent(dock1, QEvent::FocusIn)); + QVERIFY(dock1->titleBar()->isFocused()); + + auto frame2 = qobject_cast(dock2->frame()); + TabWidget *tb = frame2->tabWidget(); + QCOMPARE(tb->currentIndex(), 1); // Was the last to be added + tb->setCurrentDockWidget(0); + QVERIFY(!dock1->titleBar()->isFocused()); + QVERIFY(dock2->titleBar()->isFocused()); +} + int main(int argc, char *argv[]) { if (!qpaPassedAsArgument(argc, argv)) {