Introduce main window affinity

By default a dock widget can dock into any main window.
With affinities, we can now have a dock widget "belong" to a main window
and only be able to dock into it (or into other floating dock widgets
with the same affinity).

See DockWidgetBase::setAffinity() and MainWindowBase::setAffinity().
This commit is contained in:
Sergio Martins
2020-02-09 21:02:21 +00:00
parent 59bb0d8e71
commit d6997eaf7f
13 changed files with 234 additions and 10 deletions

View File

@@ -51,6 +51,7 @@ public:
}
QString name;
QString affinityName;
const MainWindowOptions m_options;
};
@@ -73,6 +74,12 @@ void MainWindowBase::addDockWidgetAsTab(DockWidgetBase *widget)
Q_ASSERT(widget);
qCDebug(addwidget) << Q_FUNC_INFO << widget;
if (widget->affinityName() != affinityName()) {
qWarning() << Q_FUNC_INFO << "Refusing to dock widget with incompatible affinity."
<< widget->affinityName() << affinityName();
return;
}
if (d->supportsCentralFrame()) {
dropArea()->m_centralFrame->addWidget(widget);
} else {
@@ -82,7 +89,7 @@ void MainWindowBase::addDockWidgetAsTab(DockWidgetBase *widget)
void MainWindowBase::addDockWidget(DockWidgetBase *dw, Location location, DockWidgetBase *relativeTo, AddingOption option)
{
dropArea()->addDockWidget(dw, location, relativeTo, option);
dropArea()->addDockWidget(dw, location, relativeTo, option);
}
QString MainWindowBase::uniqueName() const
@@ -100,6 +107,26 @@ MultiSplitterLayout *MainWindowBase::multiSplitterLayout() const
return dropArea()->multiSplitterLayout();
}
void MainWindowBase::setAffinityName(const QString &name)
{
if (d->affinityName == name)
return;
if (!d->affinityName.isEmpty()) {
qWarning() << Q_FUNC_INFO
<< "Affinity is already set, refusing to change."
<< "Submit a feature request with a good justification.";
return;
}
d->affinityName = name;
}
QString MainWindowBase::affinityName() const
{
return d->affinityName;
}
void MainWindowBase::setUniqueName(const QString &uniqueName)
{
if (uniqueName.isEmpty())