summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorLasse Holmstedt <lasse.holmstedt@nokia.com>2010-07-16 09:41:56 +0200
committerLasse Holmstedt <lasse.holmstedt@nokia.com>2010-07-16 10:25:32 +0200
commita457d2eec3117b08d5dd27ec6605a9beab2b49cd (patch)
tree6a52fc8a8e9434d50412f771a33a1cd0681ef5a5 /src/plugins
parentc77e560f659e1c0c42b616b89a5072d3bda472f3 (diff)
downloadqt-creator-a457d2eec3117b08d5dd27ec6605a9beab2b49cd.tar.gz
Live preview: Creating objects dynamically
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/qmljsinspector/qmljsclientproxy.cpp7
-rw-r--r--src/plugins/qmljsinspector/qmljsclientproxy.h2
-rw-r--r--src/plugins/qmljsinspector/qmljsdelta.cpp32
-rw-r--r--src/plugins/qmljsinspector/qmljsdelta.h4
-rw-r--r--src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp18
-rw-r--r--src/plugins/qmljsinspector/qmljsdesigndebugclient.h3
6 files changed, 65 insertions, 1 deletions
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
index 9b01e49e3c..9300cc6f3f 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp
@@ -408,6 +408,13 @@ void ClientProxy::changeToSelectMarqueeTool()
m_designClient->changeToSelectMarqueeTool();
}
+void ClientProxy::createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parentRef,
+ const QStringList &imports, const QString &filename)
+{
+ if (isDesignClientConnected())
+ m_designClient->createQmlObject(qmlText, parentRef, imports, filename);
+}
+
bool ClientProxy::isDesignClientConnected() const
{
return (m_designClient && m_conn->isConnected());
diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h
index 8aca054636..85d002425d 100644
--- a/src/plugins/qmljsinspector/qmljsclientproxy.h
+++ b/src/plugins/qmljsinspector/qmljsclientproxy.h
@@ -102,6 +102,8 @@ public slots:
void changeToZoomTool();
void changeToSelectTool();
void changeToSelectMarqueeTool();
+ void createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parent,
+ const QStringList &imports, const QString &filename = QString());
private slots:
void contextChanged();
diff --git a/src/plugins/qmljsinspector/qmljsdelta.cpp b/src/plugins/qmljsinspector/qmljsdelta.cpp
index 5a90b7fb34..5a304dc51d 100644
--- a/src/plugins/qmljsinspector/qmljsdelta.cpp
+++ b/src/plugins/qmljsinspector/qmljsdelta.cpp
@@ -98,6 +98,7 @@ static QString label(UiObjectMember *member, Document::Ptr doc)
} else if(UiArrayBinding *foo = cast<UiArrayBinding *>(member)) {
str = label(foo->qualifiedId) + QLatin1String("[]");
} else if(UiScriptBinding *foo = cast<UiScriptBinding *>(member)) {
+ Q_UNUSED(foo)
} else {
quint32 start = member->firstSourceLocation().begin();
quint32 end = member->lastSourceLocation().end();
@@ -277,6 +278,34 @@ static QString _methodName(UiSourceElement *source)
}
+void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const QList<QDeclarativeDebugObjectReference > &debugReferences, const Document::Ptr &doc)
+{
+ if (!member || !parentMember)
+ return;
+
+ // create new objects
+ if (UiObjectDefinition* uiObjectDef = cast<UiObjectDefinition *>(member)) {
+ unsigned begin = uiObjectDef->firstSourceLocation().begin();
+ unsigned end = uiObjectDef->lastSourceLocation().end();
+ QString qmlText = doc->source().mid(begin, end - begin);
+ QStringList importList;
+ for (UiImportList *it = doc->qmlProgram()->imports; it; it = it->next) {
+ if (!it->import)
+ continue;
+ unsigned importBegin = it->import->firstSourceLocation().begin();
+ unsigned importEnd = it->import->lastSourceLocation().end();
+
+ importList << doc->source().mid(importBegin, importEnd - importBegin);
+ }
+
+ foreach(const QDeclarativeDebugObjectReference &ref, debugReferences) {
+ if (ref.debugId() != -1) {
+ ClientProxy::instance()->createQmlObject(qmlText, ref, importList, doc->fileName());
+ }
+ }
+ }
+}
+
Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::Ptr &doc2, const DebugIdMap &debugIds)
{
Q_ASSERT(doc1->qmlProgram());
@@ -297,13 +326,14 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P
while(!todo.isEmpty()) {
UiObjectMember *y = todo.takeFirst();
todo += children(y);
+
if (!M.way2.contains(y)) {
+ insert(y, parents2.parent.value(y), newDebuggIds.value(parents2.parent.value(y)), doc2);
qDebug () << "insert " << label(y, doc2) << " to " << label(parents2.parent.value(y), doc2);
continue;
}
UiObjectMember *x = M.way2[y];
-
//--8<---------------------------------------------------------------------------------------
if (debugIds.contains(x)) {
newDebuggIds[y] = debugIds[x];
diff --git a/src/plugins/qmljsinspector/qmljsdelta.h b/src/plugins/qmljsinspector/qmljsdelta.h
index 38d9922378..0138e88031 100644
--- a/src/plugins/qmljsinspector/qmljsdelta.h
+++ b/src/plugins/qmljsinspector/qmljsdelta.h
@@ -78,6 +78,10 @@ public:
static QmlJS::AST::UiObjectMemberList *objectMembers(QmlJS::AST::UiObjectMember *object);
private:
+ void insert(UiObjectMember *member, UiObjectMember *parentMember,
+ const QList<QDeclarativeDebugObjectReference> &debugReferences, const Document::Ptr &doc);
+
+private:
QmlJS::Document::Ptr _doc;
QmlJS::Document::Ptr _previousDoc;
QList<Change> _changes;
diff --git a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
index 819336639c..0e8a2c9a46 100644
--- a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
+++ b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp
@@ -213,6 +213,24 @@ void QmlJSDesignDebugClient::changeToZoomTool()
sendMessage(message);
}
+void QmlJSDesignDebugClient::createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parentRef,
+ const QStringList &imports, const QString &filename)
+{
+ if (!m_connection || !m_connection->isConnected())
+ return;
+
+ QByteArray message;
+ QDataStream ds(&message, QIODevice::WriteOnly);
+
+ ds << QByteArray("CREATE_OBJECT")
+ << qmlText
+ << parentRef.debugId()
+ << imports
+ << filename;
+
+ sendMessage(message);
+}
+
void QmlJSDesignDebugClient::applyChangesToQmlFile()
{
if (!m_connection || !m_connection->isConnected())
diff --git a/src/plugins/qmljsinspector/qmljsdesigndebugclient.h b/src/plugins/qmljsinspector/qmljsdesigndebugclient.h
index f4124b1a81..32c0fcbf4a 100644
--- a/src/plugins/qmljsinspector/qmljsdesigndebugclient.h
+++ b/src/plugins/qmljsinspector/qmljsdesigndebugclient.h
@@ -64,6 +64,9 @@ public:
void changeToSelectMarqueeTool();
void changeToZoomTool();
+ void createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parentRef,
+ const QStringList &imports, const QString &filename);
+
void applyChangesToQmlFile();
void applyChangesFromQmlFile();