From 4f17958625ff297782c0dbacdf4249b4e4ba2807 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Tue, 30 Mar 2010 18:16:05 +0200
Subject: [PATCH] Avoid multiple currentEditorChanged signals and stream line
 switching to preferred mode.

Switching to preferred mode is solely done by the editor manager.
---
 src/plugins/coreplugin/designmode.cpp         | 43 ++++++++-----------
 src/plugins/coreplugin/designmode.h           |  3 +-
 .../editormanager/editormanager.cpp           |  1 -
 3 files changed, 18 insertions(+), 29 deletions(-)

diff --git a/src/plugins/coreplugin/designmode.cpp b/src/plugins/coreplugin/designmode.cpp
index 34473c5ebb5..37d48741d5c 100644
--- a/src/plugins/coreplugin/designmode.cpp
+++ b/src/plugins/coreplugin/designmode.cpp
@@ -41,6 +41,7 @@
 #include <coreplugin/icorelistener.h>
 #include <coreplugin/editormanager/ieditor.h>
 #include <extensionsystem/pluginmanager.h>
+#include <utils/qtcassert.h>
 
 #include <QtCore/QPair>
 #include <QtCore/QFileInfo>
@@ -87,7 +88,6 @@ struct DesignEditorInfo {
     int widgetIndex;
     QStringList mimeTypes;
     QList<int> context;
-    bool preferredMode;
     QWidget *widget;
 };
 
@@ -181,13 +181,11 @@ QStringList DesignMode::registeredMimeTypes() const
   */
 void DesignMode::registerDesignWidget(QWidget *widget,
                                       const QStringList &mimeTypes,
-                                      const QList<int> &context,
-                                      bool preferDesignMode)
+                                      const QList<int> &context)
 {
     int index = d->m_stackWidget->addWidget(widget);
 
     DesignEditorInfo *info = new DesignEditorInfo;
-    info->preferredMode = preferDesignMode;
     info->mimeTypes = mimeTypes;
     info->context = context;
     info->widgetIndex = index;
@@ -209,8 +207,10 @@ void DesignMode::unregisterDesignWidget(QWidget *widget)
 // if editor changes, check if we have valid mimetype registered.
 void DesignMode::currentEditorChanged(Core::IEditor *editor)
 {
+    if (d->m_currentEditor.data() == editor)
+        return;
+
     bool mimeEditorAvailable = false;
-    bool modeActivated = false;
     Core::ICore *core = Core::ICore::instance();
 
     if (editor && editor->file()) {
@@ -227,10 +227,6 @@ void DesignMode::currentEditorChanged(Core::IEditor *editor)
                     setActiveContext(editorInfo->context);
                     mimeEditorAvailable = true;
                     setEnabled(true);
-                    if (editorInfo->preferredMode && core->modeManager()->currentMode() != this) {
-                        core->modeManager()->activateMode(Constants::MODE_DESIGN);
-                        modeActivated = true;
-                    }
                     break;
                 }
             }
@@ -238,29 +234,24 @@ void DesignMode::currentEditorChanged(Core::IEditor *editor)
                 break;
         }
     }
+    if (d->m_currentEditor)
+        disconnect(d->m_currentEditor.data(), SIGNAL(changed()), this, SLOT(updateActions()));
+
     if (!mimeEditorAvailable) {
         setActiveContext(QList<int>());
         setEnabled(false);
-    }
-
-    if (!mimeEditorAvailable && core->modeManager()->currentMode() == this)
-    {
-        // switch back to edit mode - we don't want to be here
-        core->modeManager()->activateMode(Constants::MODE_EDIT);
-    }
+        d->m_currentEditor = QWeakPointer<Core::IEditor>();
+        emit actionsUpdated(d->m_currentEditor.data());
 
-    if (d->m_currentEditor.data() == editor)
-        return;
-
-    if (d->m_currentEditor)
-        disconnect(d->m_currentEditor.data(), SIGNAL(changed()), this, SLOT(updateActions()));
+        QTC_ASSERT(core->modeManager()->currentMode() != this, core->modeManager()->activateMode(Constants::MODE_EDIT));
+    } else {
+        d->m_currentEditor = QWeakPointer<Core::IEditor>(editor);
 
-    d->m_currentEditor = QWeakPointer<Core::IEditor>(editor);
+        if (d->m_currentEditor)
+            connect(d->m_currentEditor.data(), SIGNAL(changed()), this, SLOT(updateActions()));
 
-    if (d->m_currentEditor)
-        connect(d->m_currentEditor.data(), SIGNAL(changed()), this, SLOT(updateActions()));
-
-    emit actionsUpdated(d->m_currentEditor.data());
+        emit actionsUpdated(d->m_currentEditor.data());
+    }
 }
 
 void DesignMode::updateActions()
diff --git a/src/plugins/coreplugin/designmode.h b/src/plugins/coreplugin/designmode.h
index eaeecd99323..03da5f61dee 100644
--- a/src/plugins/coreplugin/designmode.h
+++ b/src/plugins/coreplugin/designmode.h
@@ -59,8 +59,7 @@ public:
 
     void registerDesignWidget(QWidget *widget,
                               const QStringList &mimeTypes,
-                              const QList<int> &context,
-                              bool preferDesignMode = false);
+                              const QList<int> &context);
     void unregisterDesignWidget(QWidget *widget);
 
     QStringList registeredMimeTypes() const;
diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index d78c62913a9..048e8a57c5c 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -979,7 +979,6 @@ Core::IEditor *EditorManager::activateEditor(Core::Internal::EditorView *view, C
         if (isVisible())
             editor->widget()->setFocus();
     }
-    emit currentEditorChanged(editor);
     return editor;
 }
 
-- 
GitLab