OSDN Git Service

QML JS Debugger: Don't update deltas when not debugging
[qt-creator-jp/qt-creator-jp.git] / src / plugins / qmljsinspector / qmljsinspector.cpp
index 5a464f5..5e0ca38 100644 (file)
@@ -30,7 +30,6 @@
 #include "qmljsinspector.h"
 #include "qmljsclientproxy.h"
 #include "qmljsinspectorcontext.h"
-#include "qmljsdelta.h"
 #include "qmljslivetextpreview.h"
 #include "qmljsprivateapi.h"
 
@@ -38,6 +37,7 @@
 
 #include <qmljs/qmljsmodelmanagerinterface.h>
 #include <qmljs/qmljsdocument.h>
+#include <qmljs/qmljsdelta.h>
 
 #include <debugger/debuggerrunner.h>
 #include <debugger/debuggerconstants.h>
@@ -116,13 +116,16 @@ enum {
     ConnectionAttemptSimultaneousInterval = 500
 };
 
+bool Inspector::m_showExperimentalWarning = true;
+
 Inspector::Inspector(QObject *parent)
     : QObject(parent),
       m_connectionTimer(new QTimer(this)),
       m_connectionAttempts(0),
       m_cppDebuggerState(0),
       m_simultaneousCppAndQmlDebugMode(false),
-      m_debugMode(StandaloneMode)
+      m_debugMode(StandaloneMode),
+      m_listeningToEditorManager(false)
 {
     m_clientProxy = ClientProxy::instance();
 
@@ -139,6 +142,7 @@ Inspector::Inspector(QObject *parent)
     connect(m_clientProxy, SIGNAL(aboutToReloadEngines()), SLOT(aboutToReloadEngines()));
     connect(m_clientProxy, SIGNAL(enginesChanged()), SLOT(updateEngineList()));
     connect(m_clientProxy, SIGNAL(aboutToDisconnect()), SLOT(disconnectWidgets()));
+    connect(m_clientProxy, SIGNAL(serverReloaded()), this, SLOT(serverReloaded()));
 
     connect(Debugger::DebuggerPlugin::instance(),
             SIGNAL(stateChanged(int)), this, SLOT(debuggerStateChanged(int)));
@@ -157,11 +161,10 @@ void Inspector::disconnectWidgets()
 
 void Inspector::disconnected()
 {
-    Core::EditorManager *em = Core::EditorManager::instance();
-    disconnect(em, SIGNAL(editorAboutToClose(Core::IEditor*)), this, SLOT(removePreviewForEditor(Core::IEditor*)));
-    disconnect(em, SIGNAL(editorOpened(Core::IEditor*)), this, SLOT(createPreviewForEditor(Core::IEditor*)));
     resetViews();
     updateMenuActions();
+
+    applyChangesToQmlObserverHelper(false);
 }
 
 void Inspector::aboutToReloadEngines()
@@ -224,21 +227,37 @@ void Inspector::initializeDocuments()
     if (!modelManager())
         return;
 
-    QmlJS::Snapshot snapshot = modelManager()->snapshot();
     Core::EditorManager *em = Core::EditorManager::instance();
-    connect(em, SIGNAL(editorAboutToClose(Core::IEditor*)), SLOT(removePreviewForEditor(Core::IEditor*)));
-    connect(em, SIGNAL(editorOpened(Core::IEditor*)), SLOT(createPreviewForEditor(Core::IEditor*)));
+    m_loadedSnapshot = modelManager()->snapshot();
+
+    if (!m_listeningToEditorManager) {
+        m_listeningToEditorManager = true;
+        connect(em, SIGNAL(editorAboutToClose(Core::IEditor*)), SLOT(removePreviewForEditor(Core::IEditor*)));
+        connect(em, SIGNAL(editorOpened(Core::IEditor*)), SLOT(createPreviewForEditor(Core::IEditor*)));
+    }
 
     // initial update
-    foreach (QmlJS::Document::Ptr doc, snapshot) {
-        QmlJSLiveTextPreview *preview = new QmlJSLiveTextPreview(doc, this);
-        connect(preview,
-                SIGNAL(selectedItemsChanged(QList<QDeclarativeDebugObjectReference>)),
-                SLOT(changeSelectedItems(QList<QDeclarativeDebugObjectReference>)));
-        m_textPreviews.insert(doc->fileName(), preview);
+    foreach (Core::IEditor *editor, em->openedEditors()) {
+        createPreviewForEditor(editor);
+    }
+
+    applyChangesToQmlObserverHelper(true);
+}
+
+void Inspector::serverReloaded()
+{
+    QmlJS::Snapshot snapshot = modelManager()->snapshot();
+    m_loadedSnapshot = snapshot;
+    for (QHash<QString, QmlJSLiveTextPreview *>::const_iterator it = m_textPreviews.constBegin();
+         it != m_textPreviews.constEnd(); ++it) {
+        Document::Ptr doc = snapshot.document(it.key());
+        it.value()->resetInitialDoc(doc);
     }
+    ClientProxy::instance()->queryEngineContext(0);
+    //ClientProxy::instance()->refreshObjectTree();
 }
 
+
 void Inspector::removePreviewForEditor(Core::IEditor *oldEditor)
 {
     if (QmlJSLiveTextPreview *preview = m_textPreviews.value(oldEditor->file()->fileName())) {
@@ -248,19 +267,30 @@ void Inspector::removePreviewForEditor(Core::IEditor *oldEditor)
 
 void Inspector::createPreviewForEditor(Core::IEditor *newEditor)
 {
-    if (newEditor && newEditor->id() == QmlJSEditor::Constants::C_QMLJSEDITOR_ID) {
+    if (newEditor && newEditor->id() == QmlJSEditor::Constants::C_QMLJSEDITOR_ID
+        && m_clientProxy->isConnected())
+    {
         QString filename = newEditor->file()->fileName();
         QmlJS::Document::Ptr doc = modelManager()->snapshot().document(filename);
+        if (!doc || !doc->qmlProgram())
+            return;
+        QmlJS::Document::Ptr initdoc = m_loadedSnapshot.document(filename);
+        if (!initdoc)
+            initdoc = doc;
 
         if (m_textPreviews.contains(filename)) {
             m_textPreviews.value(filename)->associateEditor(newEditor);
         } else {
-
-            QmlJSLiveTextPreview *preview = new QmlJSLiveTextPreview(doc, this);
+            QmlJSLiveTextPreview *preview = new QmlJSLiveTextPreview(doc, initdoc, this);
             connect(preview,
                     SIGNAL(selectedItemsChanged(QList<QDeclarativeDebugObjectReference>)),
                     SLOT(changeSelectedItems(QList<QDeclarativeDebugObjectReference>)));
+            connect(preview, SIGNAL(reloadQmlViewerRequested()), m_clientProxy, SLOT(reloadQmlViewer()));
+            connect(preview, SIGNAL(disableLivePreviewRequested()), SLOT(disableLivePreview()));
+
             m_textPreviews.insert(newEditor->file()->fileName(), preview);
+            preview->associateEditor(newEditor);
+            preview->updateDebugIds(m_clientProxy->rootObjectReference());
         }
     }
 }
@@ -620,3 +650,33 @@ bool Inspector::addQuotesForData(const QVariant &value) const
 
     return false;
 }
+
+bool Inspector::showExperimentalWarning()
+{
+    return m_showExperimentalWarning;
+}
+
+void Inspector::setShowExperimentalWarning(bool value)
+{
+    m_showExperimentalWarning = value;
+}
+
+void Inspector::setApplyChangesToQmlObserver(bool applyChanges)
+{
+    emit livePreviewActivated(applyChanges);
+    applyChangesToQmlObserverHelper(applyChanges);
+}
+
+void Inspector::applyChangesToQmlObserverHelper(bool applyChanges)
+{
+    QHashIterator<QString, QmlJSLiveTextPreview *> iter(m_textPreviews);
+    while(iter.hasNext()) {
+        iter.next();
+        iter.value()->setApplyChangesToQmlObserver(applyChanges);
+    }
+}
+
+void Inspector::disableLivePreview()
+{
+    setApplyChangesToQmlObserver(false);
+}