Rename the tab's title if its dock widget changes

This commit is contained in:
Sergio Martins
2020-09-21 16:19:35 +01:00
parent 03b574434c
commit 7080712501
8 changed files with 54 additions and 6 deletions

View File

@@ -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<DropArea *>(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<DockWidgetBase*>(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);
}

View File

@@ -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

View File

@@ -170,3 +170,8 @@ QRect FrameWidget::dragRect() const
return rect;
}
void FrameWidget::renameTab(int index, const QString &text)
{
m_tabWidget->renameTab(index, text);
}

View File

@@ -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;

View File

@@ -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<DockWidgetBase *>(widget(index));

View File

@@ -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;

View File

@@ -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
*/

View File

@@ -436,6 +436,7 @@ private Q_SLOTS:
void tst_honourUserGeometry();
void tst_closeRemovesFromSideBar();
void tst_tabTitleChanges();
private:
std::unique_ptr<MultiSplitter> createMultiSplitterFromSetup(MultiSplitterSetup setup, QHash<QWidget *, Frame *> &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<FrameWidget*>(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)) {