diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 379e198d133..7e7d05cfaa9 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -71,7 +71,6 @@ using namespace Utils; CorePlugin::CorePlugin() : m_mainWindow(0) , m_editMode(0) - , m_designMode(0) , m_locator(0) { qRegisterMetaType(); @@ -90,11 +89,7 @@ CorePlugin::~CorePlugin() delete m_editMode; } - if (m_designMode) { - if (DesignMode::designModeIsRequired()) - removeObject(m_designMode); - delete m_designMode; - } + DesignMode::destroyModeIfRequired(); delete m_mainWindow; setCreatorTheme(0); @@ -159,7 +154,6 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) m_editMode = new EditMode; addObject(m_editMode); ModeManager::activateMode(m_editMode->id()); - m_designMode = new DesignMode; InfoBar::initialize(ICore::settings(), creatorTheme()); } @@ -226,8 +220,7 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) void CorePlugin::extensionsInitialized() { - if (DesignMode::designModeIsRequired()) - addObject(m_designMode); + DesignMode::createModeIfRequired(); Find::extensionsInitialized(); m_locator->extensionsInitialized(); m_mainWindow->extensionsInitialized(); diff --git a/src/plugins/coreplugin/coreplugin.h b/src/plugins/coreplugin/coreplugin.h index 2f86226a711..32c3f94f2bd 100644 --- a/src/plugins/coreplugin/coreplugin.h +++ b/src/plugins/coreplugin/coreplugin.h @@ -38,9 +38,6 @@ class PathChooser; } namespace Core { - -class DesignMode; - namespace Internal { class EditMode; @@ -83,7 +80,6 @@ private: MainWindow *m_mainWindow; EditMode *m_editMode; - DesignMode *m_designMode; Locator *m_locator; ReaperPrivate m_reaper; }; diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp index 33a016129cf..735121192ac 100644 --- a/src/plugins/coreplugin/designmode.cpp +++ b/src/plugins/coreplugin/designmode.cpp @@ -29,10 +29,11 @@ #include #include #include +#include #include #include -#include +#include #include #include @@ -59,7 +60,6 @@ public: public: QPointer m_currentEditor; bool m_isActive = false; - bool m_isRequired = false; QList m_editors; QStackedWidget *m_stackWidget; Context m_activeContext; @@ -79,9 +79,6 @@ static DesignModePrivate *d = nullptr; DesignMode::DesignMode() { - m_instance = this; - d = new DesignModePrivate; - ICore::addPreCloseListener([]() -> bool { m_instance->currentEditorChanged(0); return true; @@ -107,7 +104,6 @@ DesignMode::DesignMode() DesignMode::~DesignMode() { qDeleteAll(d->m_editors); - delete d; } DesignMode *DesignMode::instance() @@ -117,12 +113,9 @@ DesignMode *DesignMode::instance() void DesignMode::setDesignModeIsRequired() { - d->m_isRequired = true; -} - -bool DesignMode::designModeIsRequired() -{ - return d->m_isRequired; + // d != nullptr indicates "isRequired". + if (!d) + d = new DesignModePrivate; } /** @@ -227,4 +220,21 @@ void DesignMode::setActiveContext(const Context &context) d->m_activeContext = context; } +void DesignMode::createModeIfRequired() +{ + if (d) { + m_instance = new DesignMode; + ExtensionSystem::PluginManager::addObject(m_instance); + } +} + +void DesignMode::destroyModeIfRequired() +{ + if (m_instance) { + ExtensionSystem::PluginManager::removeObject(m_instance); + delete m_instance; + } + delete d; +} + } // namespace Core diff --git a/src/plugins/coreplugin/designmode.h b/src/plugins/coreplugin/designmode.h index 0bda118c74d..be9dc897e7f 100644 --- a/src/plugins/coreplugin/designmode.h +++ b/src/plugins/coreplugin/designmode.h @@ -42,23 +42,25 @@ class CORE_EXPORT DesignMode : public IMode Q_OBJECT public: - explicit DesignMode(); - virtual ~DesignMode(); - static DesignMode *instance(); static void setDesignModeIsRequired(); - static bool designModeIsRequired(); static void registerDesignWidget(QWidget *widget, const QStringList &mimeTypes, const Context &context); static void unregisterDesignWidget(QWidget *widget); + static void createModeIfRequired(); + static void destroyModeIfRequired(); + signals: void actionsUpdated(Core::IEditor *editor); private: + DesignMode(); + ~DesignMode() final; + void updateActions(); void currentEditorChanged(IEditor *editor); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 21fd06824a9..84ab7d25db3 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -199,6 +199,9 @@ bool QmlDesignerPlugin::delayedInitialize() d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::TextTool); d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::PathTool); + connect(Core::DesignMode::instance(), &Core::DesignMode::actionsUpdated, + &d->shortCutManager, &ShortCutManager::updateActions); + return true; } @@ -253,9 +256,6 @@ void QmlDesignerPlugin::integrateIntoQtCreator(QWidget *modeWidget) Core::DesignMode::registerDesignWidget(modeWidget, mimeTypes, d->context->context()); - connect(Core::DesignMode::instance(), &Core::DesignMode::actionsUpdated, - &d->shortCutManager, &ShortCutManager::updateActions); - connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, [this] (Core::IEditor *editor) { if (d && checkIfEditorIsQtQuick(editor) && isInDesignerMode()) changeEditor();