aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Ziller <[email protected]>2023-11-28 16:10:37 +0100
committerEike Ziller <[email protected]>2023-11-29 09:22:57 +0000
commit1f34461088946ac710c163c3aa4678360f06062b (patch)
treefe899956f84a3b515cf4813264a870a3232a5589
parent8d851fab0baf04a3602444eea89f29cc089fb81f (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.cpp18
-rw-r--r--src/plugins/coreplugin/designmode.h9
-rw-r--r--src/plugins/coreplugin/imode.cpp10
-rw-r--r--src/plugins/coreplugin/imode.h3
-rw-r--r--src/plugins/designer/formeditor.cpp9
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();