From 5a86b883fac45c263ff4d0b365881fb484dc248c Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 19 Oct 2023 10:24:54 +0200 Subject: [PATCH] QmlPreview: Avoid processing all editors Only act if there is a preview running. Explicitly connect and disconnect to the editor manager if the preview gets triggered. Fixes displaying message boxes when changing qml documents without a running preview. Reverts 66d94a82a32cdfdb344d55ef2c610ee9b3f03f7fi which had been a hotfix and provides a more intrusive solution to the misbehavior revealed by 5336fd83a004c1fe5265b9f9ba87320c031d2040. Change-Id: I88be4eca077ac1d56d8e4790a70220e7d3efa960 Reviewed-by: hjk Reviewed-by: --- src/plugins/qmlpreview/qmlpreviewplugin.cpp | 30 ++++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index 114b13ee78d..4d36d3059e4 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -114,7 +114,8 @@ public: void onEditorChanged(Core::IEditor *editor); void onEditorAboutToClose(Core::IEditor *editor); void setDirty(); - void attachToEditor(); + void attachToEditorManager(); + void detachFromEditorManager(); void checkEditor(); void checkFile(const QString &fileName); void triggerPreview(const QString &changedFile, const QByteArray &contents); @@ -165,7 +166,12 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent) runPreviewAction->setEnabled(ProjectManager::startupProject() != nullptr); connect(ProjectManager::instance(), &ProjectManager::startupProjectChanged, runPreviewAction, &QAction::setEnabled); - connect(runPreviewAction, &QAction::triggered, this, [this] { + connect(runPreviewAction, &QAction::triggered, this, [runPreviewAction, this] { + runPreviewAction->setEnabled(false); + attachToEditorManager(); + setDirty(); + onEditorChanged(Core::EditorManager::currentEditor()); + if (auto multiLanguageAspect = QmlProjectManager::QmlMultiLanguageAspect::current()) m_localeIsoCode = multiLanguageAspect->currentLocale(); bool skipDeploy = false; @@ -231,8 +237,6 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent) connect(q, &QmlPreviewPlugin::checkDocument, parser, &QmlPreviewParser::parse); connect(q, &QmlPreviewPlugin::previewedFileChanged, this, &QmlPreviewPluginPrivate::checkFile); connect(parser, &QmlPreviewParser::success, this, &QmlPreviewPluginPrivate::triggerPreview); - - attachToEditor(); } QmlPreviewPlugin::~QmlPreviewPlugin() @@ -439,9 +443,14 @@ void QmlPreviewPlugin::removePreview(RunControl *preview) { d->m_runningPreviews.removeOne(preview); emit runningPreviewsChanged(d->m_runningPreviews); + if (d->m_runningPreviews.isEmpty()) { + if (auto cmd = Core::ActionManager::command("QmlPreview.RunPreview"); cmd && cmd->action()) + cmd->action()->setEnabled(true); + d->detachFromEditorManager(); + } } -void QmlPreviewPluginPrivate::attachToEditor() +void QmlPreviewPluginPrivate::attachToEditorManager() { Core::EditorManager *editorManager = Core::EditorManager::instance(); connect(editorManager, &Core::EditorManager::currentEditorChanged, @@ -450,10 +459,17 @@ void QmlPreviewPluginPrivate::attachToEditor() this, &QmlPreviewPluginPrivate::onEditorAboutToClose); } +void QmlPreviewPluginPrivate::detachFromEditorManager() +{ + Core::EditorManager *editorManager = Core::EditorManager::instance(); + disconnect(editorManager, &Core::EditorManager::currentEditorChanged, + this, &QmlPreviewPluginPrivate::onEditorChanged); + disconnect(editorManager, &Core::EditorManager::editorAboutToClose, + this, &QmlPreviewPluginPrivate::onEditorAboutToClose); +} + void QmlPreviewPluginPrivate::checkEditor() { - if (m_runningPreviews.isEmpty()) - return; QmlJS::Dialect::Enum dialect = QmlJS::Dialect::AnyLanguage; Core::IDocument *doc = m_lastEditor->document(); using namespace Utils::Constants;