Rename the tab's title if its dock widget changes
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -170,3 +170,8 @@ QRect FrameWidget::dragRect() const
|
||||
return rect;
|
||||
}
|
||||
|
||||
void FrameWidget::renameTab(int index, const QString &text)
|
||||
{
|
||||
m_tabWidget->renameTab(index, text);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user