From a5935cb27a0609764586302bf109796d74060f3d Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 23 Jan 2018 10:33:18 +0100 Subject: [PATCH] DesignMode: Create only when needed Postpone the Mode object creation until it is really necessary, the private data object may be needed before. In the QmlDesigner this patch moves the connection to the DesignMode instance back to delayedInitialize, essentially reverting part of e8b3b8140bd5d. Change-Id: I07146b0bc93eede09af8e824e916edb6de1817ef Reviewed-by: Eike Ziller --- src/plugins/coreplugin/coreplugin.cpp | 11 ++---- src/plugins/coreplugin/coreplugin.h | 4 --- src/plugins/coreplugin/designmode.cpp | 34 ++++++++++++------- src/plugins/coreplugin/designmode.h | 10 +++--- src/plugins/qmldesigner/qmldesignerplugin.cpp | 6 ++-- 5 files changed, 33 insertions(+), 32 deletions(-) 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();