diff options
author | Eike Ziller <[email protected]> | 2023-11-28 16:10:37 +0100 |
---|---|---|
committer | Eike Ziller <[email protected]> | 2023-11-29 09:22:57 +0000 |
commit | 1f34461088946ac710c163c3aa4678360f06062b (patch) | |
tree | fe899956f84a3b515cf4813264a870a3232a5589 | |
parent | 8d851fab0baf04a3602444eea89f29cc089fb81f (diff) |
IMode: Make main window an (optional) property
Un-virtualize IMode::mainWindow. If the mode widget is a main window
directly, that is handled automatically, otherwise provide a setter. It
is better to have a central point for setting it, in case that it isn't
the mode widget in the first place. Also, using Aggregation::query for
this is actually a misuse of Aggregate, which is supposed to combine
_independent_ objects, not objects that are in the same hierarchy (which
can crash if the child object is deleted first).
Change-Id: I35381e0a05645022aac72501492ea6347953cd55
Reviewed-by: Marcus Tillmanns <[email protected]>
Reviewed-by: <[email protected]>
-rw-r--r-- | src/plugins/coreplugin/designmode.cpp | 18 | ||||
-rw-r--r-- | src/plugins/coreplugin/designmode.h | 9 | ||||
-rw-r--r-- | src/plugins/coreplugin/imode.cpp | 10 | ||||
-rw-r--r-- | src/plugins/coreplugin/imode.h | 3 | ||||
-rw-r--r-- | src/plugins/designer/formeditor.cpp | 9 |
5 files changed, 30 insertions, 19 deletions
diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp index 728edc25dc0..cb5a6129df5 100644 --- a/src/plugins/coreplugin/designmode.cpp +++ b/src/plugins/coreplugin/designmode.cpp @@ -23,14 +23,17 @@ #include <QStackedWidget> #include <QStringList> +using namespace Utils; + namespace Core { struct DesignEditorInfo { - int widgetIndex; + int widgetIndex = -1; QStringList mimeTypes; Context context; - QWidget *widget; + QWidget *widget = nullptr; + FancyMainWindow *mainWindow = nullptr; }; class DesignModePrivate @@ -107,16 +110,17 @@ void DesignMode::setDesignModeIsRequired() */ void DesignMode::registerDesignWidget(QWidget *widget, const QStringList &mimeTypes, - const Context &context) + const Context &context, + Utils::FancyMainWindow *mainWindow) { setDesignModeIsRequired(); int index = d->m_stackWidget->addWidget(widget); - auto info = new DesignEditorInfo; info->mimeTypes = mimeTypes; info->context = context; info->widgetIndex = index; info->widget = widget; + info->mainWindow = mainWindow; d->m_editors.append(info); } @@ -147,6 +151,7 @@ void DesignMode::currentEditorChanged(IEditor *editor) for (const QString &mime : editorInfo->mimeTypes) { if (mime == mimeType) { d->m_stackWidget->setCurrentIndex(editorInfo->widgetIndex); + setMainWindow(editorInfo->mainWindow); setActiveContext(editorInfo->context); mimeEditorAvailable = true; setEnabled(true); @@ -202,11 +207,6 @@ void DesignMode::setActiveContext(const Context &context) d->m_activeContext = context; } -Utils::FancyMainWindow *DesignMode::mainWindow() -{ - return Aggregation::query<Utils::FancyMainWindow>(d->m_stackWidget->currentWidget()); -} - void DesignMode::createModeIfRequired() { if (d) { diff --git a/src/plugins/coreplugin/designmode.h b/src/plugins/coreplugin/designmode.h index 82b00abb2b6..1f90d08dc5a 100644 --- a/src/plugins/coreplugin/designmode.h +++ b/src/plugins/coreplugin/designmode.h @@ -5,6 +5,10 @@ #include "imode.h" +namespace Utils { +class FancyMainWindow; +} + namespace Core { class IEditor; @@ -26,7 +30,8 @@ public: static void registerDesignWidget(QWidget *widget, const QStringList &mimeTypes, - const Context &context); + const Context &context, + Utils::FancyMainWindow *mainWindow = nullptr); static void unregisterDesignWidget(QWidget *widget); static void createModeIfRequired(); @@ -44,8 +49,6 @@ private: void currentEditorChanged(IEditor *editor); void updateContext(Utils::Id newMode, Utils::Id oldMode); void setActiveContext(const Context &context); - - Utils::FancyMainWindow *mainWindow() override; }; } // namespace Core diff --git a/src/plugins/coreplugin/imode.cpp b/src/plugins/coreplugin/imode.cpp index af68e12db34..81190327c98 100644 --- a/src/plugins/coreplugin/imode.cpp +++ b/src/plugins/coreplugin/imode.cpp @@ -19,6 +19,7 @@ public: QString m_displayName; QIcon m_icon; QMenu *m_menu = nullptr; + Utils::FancyMainWindow *m_mainWindow = nullptr; int m_priority = -1; Utils::Id m_id; bool m_isEnabled = true; @@ -181,7 +182,14 @@ void IMode::setMenu(QMenu *menu) Utils::FancyMainWindow *IMode::mainWindow() { - return Aggregation::query<Utils::FancyMainWindow>(widget()); + if (m_d->m_mainWindow) + return m_d->m_mainWindow; + return qobject_cast<Utils::FancyMainWindow *>(widget()); +} + +void IMode::setMainWindow(Utils::FancyMainWindow *mw) +{ + m_d->m_mainWindow = mw; } bool IMode::isEnabled() const diff --git a/src/plugins/coreplugin/imode.h b/src/plugins/coreplugin/imode.h index 728a128f9c2..af22b9c5d0b 100644 --- a/src/plugins/coreplugin/imode.h +++ b/src/plugins/coreplugin/imode.h @@ -50,7 +50,8 @@ public: void setId(Utils::Id id); void setMenu(QMenu *menu); - virtual Utils::FancyMainWindow *mainWindow(); + Utils::FancyMainWindow *mainWindow(); + void setMainWindow(Utils::FancyMainWindow *mw); signals: void enabledStateChanged(bool enabled); diff --git a/src/plugins/designer/formeditor.cpp b/src/plugins/designer/formeditor.cpp index 57075e7ecc2..57bb78f5a5a 100644 --- a/src/plugins/designer/formeditor.cpp +++ b/src/plugins/designer/formeditor.cpp @@ -407,10 +407,6 @@ void FormEditorData::fullInit() m_modeWidget = new QWidget; m_modeWidget->setObjectName("DesignerModeWidget"); - // make the editor widget (the dockable widget) accessible via the mode widget - auto agg = new Aggregation::Aggregate; - agg->add(m_modeWidget); - agg->add(m_editorWidget); auto layout = new QVBoxLayout(m_modeWidget); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); @@ -427,7 +423,10 @@ void FormEditorData::fullInit() designerContexts.add(Core::Constants::C_EDITORMANAGER); ICore::addContextObject(new DesignerContext(designerContexts, m_modeWidget, this)); - DesignMode::registerDesignWidget(m_modeWidget, QStringList(Utils::Constants::FORM_MIMETYPE), m_contexts); + DesignMode::registerDesignWidget(m_modeWidget, + QStringList(Utils::Constants::FORM_MIMETYPE), + m_contexts, + m_editorWidget); setupViewActions(); |