From 70807125015101feef47a6d5518447df4e3dcb88 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Mon, 21 Sep 2020 16:19:35 +0100 Subject: [PATCH] Rename the tab's title if its dock widget changes --- src/private/Frame.cpp | 21 +++++++++++++++------ src/private/Frame_p.h | 3 +++ src/private/widgets/FrameWidget.cpp | 5 +++++ src/private/widgets/FrameWidget_p.h | 1 + src/private/widgets/TabWidgetWidget.cpp | 5 +++++ src/private/widgets/TabWidgetWidget_p.h | 1 + src/private/widgets/TabWidget_p.h | 3 +++ tests/tst_docks.cpp | 21 +++++++++++++++++++++ 8 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/private/Frame.cpp b/src/private/Frame.cpp index df3282de..994b90ce 100644 --- a/src/private/Frame.cpp +++ b/src/private/Frame.cpp @@ -57,9 +57,8 @@ Frame::Frame(QWidgetOrQuick *parent, FrameOptions options) qCDebug(creation) << "Frame" << ((void*)this) << s_dbg_numFrames; connect(this, &Frame::currentDockWidgetChanged, this, &Frame::updateTitleAndIcon); - m_inCtor = false; - setDropArea(qobject_cast(QWidgetAdapter::parentWidget())); + m_inCtor = false; } Frame::~Frame() @@ -95,6 +94,16 @@ void Frame::updateTitleAndIcon() } } +void Frame::onDockWidgetTitleChanged() +{ + updateTitleAndIcon(); + + if (!m_inCtor) { // don't call pure virtual in ctor + if (auto dw = qobject_cast(sender())) + renameTab(indexOfDockWidget(dw), dw->title()); + } +} + void Frame::addWidget(DockWidgetBase *dockWidget, AddingOption addingOption) { insertWidget(dockWidget, dockWidgetCount(), addingOption); // append @@ -151,14 +160,14 @@ void Frame::insertWidget(DockWidgetBase *dockWidget, int index, AddingOption add } } - connect(dockWidget, &DockWidgetBase::titleChanged, this, &Frame::updateTitleAndIcon); - connect(dockWidget, &DockWidgetBase::iconChanged, this, &Frame::updateTitleAndIcon); + connect(dockWidget, &DockWidgetBase::titleChanged, this, &Frame::onDockWidgetTitleChanged); + connect(dockWidget, &DockWidgetBase::iconChanged, this, &Frame::onDockWidgetTitleChanged); } void Frame::removeWidget(DockWidgetBase *dw) { - disconnect(dw, &DockWidgetBase::titleChanged, this, &Frame::updateTitleAndIcon); - disconnect(dw, &DockWidgetBase::iconChanged, this, &Frame::updateTitleAndIcon); + disconnect(dw, &DockWidgetBase::titleChanged, this, &Frame::onDockWidgetTitleChanged); + disconnect(dw, &DockWidgetBase::iconChanged, this, &Frame::onDockWidgetTitleChanged); removeWidget_impl(dw); } diff --git a/src/private/Frame_p.h b/src/private/Frame_p.h index 7ca48259..3d1ecff6 100644 --- a/src/private/Frame_p.h +++ b/src/private/Frame_p.h @@ -105,6 +105,7 @@ public: int dockWidgetCount() const; void updateTitleAndIcon(); + void onDockWidgetTitleChanged(); void updateTitleBarVisibility(); bool containsMouse(QPoint globalPos) const; TitleBar *titleBar() const; @@ -242,6 +243,8 @@ Q_SIGNALS: void focusedWidgetChanged() override; protected: + virtual void renameTab(int index, const QString &) = 0; + /** * @brief Returns the minimum size of the dock widgets. * This might be slightly smaller than Frame::minSize() due to the QTabWidget having some margins diff --git a/src/private/widgets/FrameWidget.cpp b/src/private/widgets/FrameWidget.cpp index 3ad88025..bf1b8a5d 100644 --- a/src/private/widgets/FrameWidget.cpp +++ b/src/private/widgets/FrameWidget.cpp @@ -170,3 +170,8 @@ QRect FrameWidget::dragRect() const return rect; } +void FrameWidget::renameTab(int index, const QString &text) +{ + m_tabWidget->renameTab(index, text); +} + diff --git a/src/private/widgets/FrameWidget_p.h b/src/private/widgets/FrameWidget_p.h index 538bc27a..e4b6390d 100644 --- a/src/private/widgets/FrameWidget_p.h +++ b/src/private/widgets/FrameWidget_p.h @@ -50,6 +50,7 @@ protected: DockWidgetBase *dockWidgetAt_impl(int index) const override; int dockWidgetCount_impl() const override; QRect dragRect() const override; + void renameTab(int index, const QString &) override; private: friend class TestDocks; TabWidget *const m_tabWidget; diff --git a/src/private/widgets/TabWidgetWidget.cpp b/src/private/widgets/TabWidgetWidget.cpp index fa86459f..734c4e1c 100644 --- a/src/private/widgets/TabWidgetWidget.cpp +++ b/src/private/widgets/TabWidgetWidget.cpp @@ -118,6 +118,11 @@ void TabWidgetWidget::detachTab(DockWidgetBase *dockWidget) tabBar()->detachTab(dockWidget); } +void TabWidgetWidget::renameTab(int index, const QString &text) +{ + setTabText(index, text); +} + DockWidgetBase *TabWidgetWidget::dockwidgetAt(int index) const { return qobject_cast(widget(index)); diff --git a/src/private/widgets/TabWidgetWidget_p.h b/src/private/widgets/TabWidgetWidget_p.h index 5250bb5d..2a71b4b0 100644 --- a/src/private/widgets/TabWidgetWidget_p.h +++ b/src/private/widgets/TabWidgetWidget_p.h @@ -48,6 +48,7 @@ protected: void insertDockWidget(int index, DockWidgetBase *, const QIcon&, const QString &title) override; void setTabBarAutoHide(bool) override; void detachTab(DockWidgetBase *dockWidget) override; + void renameTab(int index, const QString &) override; DockWidgetBase *dockwidgetAt(int index) const override; int currentIndex() const override; diff --git a/src/private/widgets/TabWidget_p.h b/src/private/widgets/TabWidget_p.h index d90466a4..43cb5e3e 100644 --- a/src/private/widgets/TabWidget_p.h +++ b/src/private/widgets/TabWidget_p.h @@ -123,6 +123,9 @@ public: virtual void setTabBarAutoHide(bool) = 0; + ///@brief rename's the tab's text + virtual void renameTab(int index, const QString &) = 0; + /** * @brief Returns the current index */ diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 317d82db..87f1c205 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -436,6 +436,7 @@ private Q_SLOTS: void tst_honourUserGeometry(); void tst_closeRemovesFromSideBar(); + void tst_tabTitleChanges(); private: std::unique_ptr createMultiSplitterFromSetup(MultiSplitterSetup setup, QHash &frameMap) const; @@ -5986,6 +5987,26 @@ void TestDocks::tst_closeRemovesFromSideBar() delete fw1; } +void TestDocks::tst_tabTitleChanges() +{ + // Tests that the tab's title changes if the dock widget's title changes + + EnsureTopLevelsDeleted e; + auto dw1 = new DockWidget(QStringLiteral("1")); + auto dw2 = new DockWidget(QStringLiteral("2")); + + dw1->addDockWidgetAsTab(dw2); + + auto frame = qobject_cast(dw1->frame()); + QTabBar *tb = frame->tabBar(); + QCOMPARE(tb->tabText(0), QStringLiteral("1")); + + dw1->setTitle(QStringLiteral("other")); + QCOMPARE(tb->tabText(0), QStringLiteral("other")); + + delete dw1->window(); +} + int main(int argc, char *argv[]) { if (!qpaPassedAsArgument(argc, argv)) {