From 9df256c922c4137d78e887792680f740470c57b9 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Tue, 16 Feb 2010 12:42:33 +0100
Subject: [PATCH] QmlDesigner.propertyEditor: enables creating of panes
 beforehand

This patch allows setting up property panes before a selection is made
---
 .../propertyeditor/propertyeditor.cpp         | 73 +++++++++++++++++++
 .../propertyeditor/propertyeditor.h           |  2 +
 2 files changed, 75 insertions(+)

diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
index c429b1c8084..f7ece5729ed 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp
@@ -74,6 +74,20 @@ PropertyEditor::NodeType::~NodeType()
 {
 }
 
+void setupPropertyEditorValue(const QString &name, QmlPropertyMap *propertyMap, PropertyEditor *propertyEditor)
+{
+    QString propertyName(name);
+    propertyName.replace(QLatin1Char('.'), QLatin1Char('_'));
+    PropertyEditorValue *valueObject = qobject_cast<PropertyEditorValue*>(QmlMetaType::toQObject(propertyMap->value(propertyName)));
+    if (!valueObject) {
+        valueObject = new PropertyEditorValue(propertyMap);
+        QObject::connect(valueObject, SIGNAL(valueChanged(QString)), propertyMap, SIGNAL(valueChanged(QString)));
+        QObject::connect(valueObject, SIGNAL(expressionChanged(QString)), propertyEditor, SLOT(changeExpression(QString)));
+        propertyMap->insert(propertyName, QVariant::fromValue(valueObject));
+    }
+    valueObject->setName(propertyName);
+}
+
 void createPropertyEditorValue(const QmlObjectNode &fxObjectNode, const QString &name, const QVariant &value, QmlPropertyMap *propertyMap, PropertyEditor *propertyEditor)
 {
     QString propertyName(name);
@@ -157,6 +171,41 @@ void PropertyEditor::NodeType::setup(const QmlObjectNode &fxObjectNode, const QS
     }
 }
 
+void PropertyEditor::NodeType::initialSetup(const QString &typeName, const QUrl &qmlSpecificsFile, PropertyEditor *propertyEditor)
+{
+    QmlContext *ctxt = m_view->rootContext();
+
+    NodeMetaInfo metaInfo = propertyEditor->model()->metaInfo().nodeMetaInfo(typeName, 4, 6);
+
+    foreach (const QString &propertyName, metaInfo.properties(true).keys())
+        setupPropertyEditorValue(propertyName, &m_backendValuesPropertyMap, propertyEditor);
+
+    PropertyEditorValue *valueObject = qobject_cast<PropertyEditorValue*>(QmlMetaType::toQObject(m_backendValuesPropertyMap.value("className")));
+    if (!valueObject)
+        valueObject = new PropertyEditorValue(&m_backendValuesPropertyMap);
+    valueObject->setName("className");
+
+    valueObject->setValue(typeName);
+    QObject::connect(valueObject, SIGNAL(valueChanged(QString)), &m_backendValuesPropertyMap, SIGNAL(valueChanged(QString)));
+    m_backendValuesPropertyMap.insert("className", QVariant::fromValue(valueObject));
+
+    // id
+    valueObject = qobject_cast<PropertyEditorValue*>(QmlMetaType::toQObject(m_backendValuesPropertyMap.value("id")));
+    if (!valueObject)
+        valueObject = new PropertyEditorValue(&m_backendValuesPropertyMap);
+    valueObject->setName("id");
+    valueObject->setValue("id");
+    QObject::connect(valueObject, SIGNAL(valueChanged(QString)), &m_backendValuesPropertyMap, SIGNAL(valueChanged(QString)));
+    m_backendValuesPropertyMap.insert("id", QVariant::fromValue(valueObject));
+
+    ctxt->setContextProperty("anchorBackend", &m_backendAnchorBinding);
+    ctxt->setContextProperty("backendValues", &m_backendValuesPropertyMap);
+
+    ctxt->setContextProperty("specificsUrl", QVariant(qmlSpecificsFile));
+    ctxt->setContextProperty("stateName", QVariant(QLatin1String("basestate")));
+    ctxt->setContextProperty("isBaseState", QVariant(true));
+}
+
 PropertyEditor::PropertyEditor(QWidget *parent) :
         QmlModelView(parent),
         m_parent(parent),
@@ -182,6 +231,30 @@ PropertyEditor::~PropertyEditor()
     qDeleteAll(m_typeHash);
 }
 
+void PropertyEditor::setupPane(const QString &typeName)
+{
+    if (m_typeHash.contains(typeName))
+        return;
+
+    QUrl qmlFile = fileToUrl(locateQmlFile(QLatin1String("Qt/ItemPane.qml")));
+    QUrl qmlSpecificsFile;
+
+    qmlSpecificsFile = fileToUrl(locateQmlFile(typeName + "Specifics.qml"));
+
+    NodeType *type = m_typeHash.value(typeName);
+
+    type = new NodeType(qmlFile, this);
+
+    m_stackedWidget->addWidget(type->m_view);
+    m_typeHash.insert(typeName, type);
+
+    QmlContext *ctxt = type->m_view->rootContext();
+    type->initialSetup(typeName, qmlSpecificsFile, this);
+    ctxt->setContextProperty("finishedNotify", QVariant(false) );
+    type->m_view->execute();
+    ctxt->setContextProperty("finishedNotify", QVariant(true) );
+}
+
 void PropertyEditor::changeValue(const QString &name)
 {
     if (name.isNull())
diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h
index 8898984c7d2..20cdef39557 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h
+++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.h
@@ -52,6 +52,7 @@ class PropertyEditor: public QmlModelView
         ~NodeType();
 
         void setup(const QmlObjectNode &fxObjectNode, const QString &stateName, const QUrl &qmlSpecificsFile, PropertyEditor *propertyEditor);
+        void initialSetup(const QString &typeName, const QUrl &qmlSpecificsFile, PropertyEditor *propertyEditor);
         void setValue(const QmlObjectNode &fxObjectNode, const QString &name, const QVariant &value);
 
         QmlView *m_view;
@@ -98,6 +99,7 @@ protected:
     void timerEvent(QTimerEvent *event);
     void otherPropertyChanged(const QmlObjectNode &);
     void transformChanged(const QmlObjectNode &qmlObjectNode);
+    void PropertyEditor::setupPane(const QString &typeName);
     void stateChanged(const QmlModelState &newQmlModelState, const QmlModelState &oldQmlModelState);
 
 private slots:
-- 
GitLab