src/declarative/qml/qdeclarativeenginedebug.cpp
changeset 37 758a864f9613
parent 33 3e2da88830cd
--- a/src/declarative/qml/qdeclarativeenginedebug.cpp	Fri Sep 17 08:34:18 2010 +0300
+++ b/src/declarative/qml/qdeclarativeenginedebug.cpp	Mon Oct 04 01:19:32 2010 +0300
@@ -58,7 +58,13 @@
 
 QT_BEGIN_NAMESPACE
 
-QList<QDeclarativeEngine *> QDeclarativeEngineDebugServer::m_engines;
+Q_GLOBAL_STATIC(QDeclarativeEngineDebugServer, qmlEngineDebugServer);
+
+QDeclarativeEngineDebugServer *QDeclarativeEngineDebugServer::instance()
+{
+    return qmlEngineDebugServer();
+}
+
 QDeclarativeEngineDebugServer::QDeclarativeEngineDebugServer(QObject *parent)
 : QDeclarativeDebugService(QLatin1String("QDeclarativeEngine"), parent),
     m_watch(new QDeclarativeWatcher(this))
@@ -182,7 +188,7 @@
 }
 
 void QDeclarativeEngineDebugServer::buildObjectDump(QDataStream &message, 
-                                           QObject *object, bool recur)
+                                           QObject *object, bool recur, bool dumpProperties)
 {
     message << objectData(object);
 
@@ -209,6 +215,8 @@
             continue;
         QDeclarativeBoundSignal *signal = QDeclarativeBoundSignal::cast(child);
         if (signal) {
+            if (!dumpProperties)
+                continue;
             QDeclarativeObjectProperty prop;
             prop.type = QDeclarativeObjectProperty::SignalProperty;
             prop.hasNotifySignal = false;
@@ -229,12 +237,17 @@
             fakeProperties << prop;
         } else {
             if (recur)
-                buildObjectDump(message, child, recur);
+                buildObjectDump(message, child, recur, dumpProperties);
             else
                 message << objectData(child);
         }
     }
 
+    if (!dumpProperties) {
+        message << 0;
+        return;
+    }
+
     message << (object->metaObject()->propertyCount() + fakeProperties.count());
 
     for (int ii = 0; ii < object->metaObject()->propertyCount(); ++ii) 
@@ -257,8 +270,7 @@
 
     QDeclarativeContextData *child = p->childContexts;
     while (child) {
-        if (!child->isInternal)
-            ++count;
+        ++count;
         child = child->nextChild;
     }
 
@@ -266,8 +278,7 @@
 
     child = p->childContexts;
     while (child) {
-        if (!child->isInternal) 
-            buildObjectList(message, child->asQDeclarativeContext());
+        buildObjectList(message, child->asQDeclarativeContext());
         child = child->nextChild;
     }
 
@@ -372,8 +383,9 @@
         int queryId;
         int objectId;
         bool recurse;
+        bool dumpProperties = true;
 
-        ds >> queryId >> objectId >> recurse;
+        ds >> queryId >> objectId >> recurse >> dumpProperties;
 
         QObject *object = QDeclarativeDebugService::objectForId(objectId);
 
@@ -382,7 +394,7 @@
         rs << QByteArray("FETCH_OBJECT_R") << queryId;
 
         if (object) 
-            buildObjectDump(rs, object, recurse);
+            buildObjectDump(rs, object, recurse, dumpProperties);
 
         sendMessage(reply);
     } else if (type == "WATCH_OBJECT") {
@@ -485,24 +497,22 @@
 
     if (object && context) {
 
+        QDeclarativeProperty property(object, propertyName, context);
         if (isLiteralValue) {
-            QDeclarativeProperty literalProperty(object, propertyName, context);
-            literalProperty.write(expression);
+            property.write(expression);
+        } else if (hasValidSignal(object, propertyName)) {
+            QDeclarativeExpression *declarativeExpression = new QDeclarativeExpression(context, object, expression.toString());
+            QDeclarativePropertyPrivate::setSignalExpression(property, declarativeExpression);
+        } else if (property.isProperty()) {
+            QDeclarativeBinding *binding = new QDeclarativeBinding(expression.toString(), object, context);
+            binding->setTarget(property);
+            binding->setNotifyOnValueChanged(true);
+            QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::setBinding(property, binding);
+            if (oldBinding)
+                oldBinding->destroy();
+            binding->update();
         } else {
-            if (hasValidSignal(object, propertyName)) {
-                QDeclarativeProperty property(object, propertyName);
-                QDeclarativeExpression *declarativeExpression = new QDeclarativeExpression(context, object, expression.toString());
-                QDeclarativePropertyPrivate::setSignalExpression(property, declarativeExpression);
-            } else {
-                QDeclarativeBinding *binding = new QDeclarativeBinding(expression.toString(), object, context);
-                QDeclarativeProperty property(object, propertyName, context);
-                binding->setTarget(property);
-                binding->setNotifyOnValueChanged(true);
-                QDeclarativeAbstractBinding *oldBinding = QDeclarativePropertyPrivate::setBinding(property, binding);
-                if (oldBinding)
-                    oldBinding->destroy();
-                binding->update();
-            }
+            qWarning() << "QDeclarativeEngineDebugServer::setBinding: unable to set property" << propertyName << "on object" << object;
         }
     }
 }
@@ -594,4 +604,19 @@
     m_engines.removeAll(engine);
 }
 
+void QDeclarativeEngineDebugServer::objectCreated(QDeclarativeEngine *engine, QObject *object)
+{
+    Q_ASSERT(engine);
+    Q_ASSERT(m_engines.contains(engine));
+
+    int engineId = QDeclarativeDebugService::idForObject(engine);
+    int objectId = QDeclarativeDebugService::idForObject(object);
+
+    QByteArray reply;
+    QDataStream rs(&reply, QIODevice::WriteOnly);
+
+    rs << QByteArray("OBJECT_CREATED") << engineId << objectId;
+    sendMessage(reply);
+}
+
 QT_END_NAMESPACE