diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 2b472577b8f94b1ee960b27d1cfef0aa6265be77..9d8c6e6e23d492e40b01a5e988f3e1e71032ad2e 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -51,6 +51,7 @@ #include <QtGui/QStackedWidget> #include <QmlEngine> #include <QmlMetaType> +#include <QMessageBox> enum { debug = false @@ -77,13 +78,18 @@ void createPropertyEditorValue(const QmlObjectNode &fxObjectNode, const QString { QString propertyName(name); propertyName.replace(".", "_"); - PropertyEditorValue *valueObject = new PropertyEditorValue(propertyMap); + 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))); + propertyMap->insert(propertyName, QmlMetaType::qmlType(valueObject->metaObject())->fromObject(valueObject)); + } valueObject->setName(propertyName); valueObject->setIsInModel(fxObjectNode.modelNode().hasProperty(name)); valueObject->setIsInSubState(fxObjectNode.propertyAffectedByCurrentState(name)); valueObject->setModelNode(fxObjectNode.modelNode()); - if (fxObjectNode.propertyAffectedByCurrentState(name) && !(fxObjectNode.modelNode().property(propertyName).isBindingProperty())) { + if (fxObjectNode.propertyAffectedByCurrentState(name) && !(fxObjectNode.modelNode().property(name).isBindingProperty())) { valueObject->setValue(fxObjectNode.modelValue(name)); } else { @@ -97,14 +103,14 @@ void createPropertyEditorValue(const QmlObjectNode &fxObjectNode, const QString } else { valueObject->setExpression(fxObjectNode.instanceValue(name).toString()); } - - QObject::connect(valueObject, SIGNAL(valueChanged(QString)), propertyMap, SIGNAL(valueChanged(QString))); - propertyMap->insert(propertyName, QmlMetaType::qmlType(valueObject->metaObject())->fromObject(valueObject)); } void PropertyEditor::NodeType::setValue(const QmlObjectNode &fxObjectNode, const QString &name, const QVariant &value) { - createPropertyEditorValue(fxObjectNode, name, value, &m_backendValuesPropertyMap); + //createPropertyEditorValue(fxObjectNode, name, value, &m_backendValuesPropertyMap); + PropertyEditorValue *propertyValue = qobject_cast<PropertyEditorValue*>(QmlMetaType::toQObject(m_backendValuesPropertyMap.value(name))); + if (propertyValue) + propertyValue->setValue(value); } void PropertyEditor::NodeType::setup(const QmlObjectNode &fxObjectNode, const QString &stateName, const QUrl &qmlSpecificsFile) @@ -114,9 +120,7 @@ void PropertyEditor::NodeType::setup(const QmlObjectNode &fxObjectNode, const QS QmlContext *ctxt = m_view->rootContext(); - // First remove complex objects from backend, so that we don't trigger a flood of updates - ctxt->setContextProperty("anchorBackend", 0); - ctxt->setContextProperty("backendValues", 0); + // First remove complex objects from backend, so that we don't trigger a flood of updates //foreach (const QString &propertyName, m_backendValuesPropertyMap.keys()) // m_backendValuesPropertyMap.clear(propertyName); @@ -159,12 +163,12 @@ void PropertyEditor::NodeType::setup(const QmlObjectNode &fxObjectNode, const QS } PropertyEditor::PropertyEditor(QWidget *parent) : - QmlModelView(parent), - m_parent(parent), - m_updateShortcut(0), - m_timerId(0), - m_stackedWidget(new QStackedWidget(parent)), - m_currentType(0) + QmlModelView(parent), + m_parent(parent), + m_updateShortcut(0), + m_timerId(0), + m_stackedWidget(new QStackedWidget(parent)), + m_currentType(0) { m_updateShortcut = new QShortcut(QKeySequence("F5"), m_stackedWidget); connect(m_updateShortcut, SIGNAL(activated()), this, SLOT(reloadQml())); @@ -184,6 +188,8 @@ PropertyEditor::~PropertyEditor() void PropertyEditor::changeValue(const QString &name) { + if (name.isNull()) + return; if (name == "type") return; @@ -238,20 +244,18 @@ void PropertyEditor::changeValue(const QString &name) } } - try { - if (!value->value().isValid()) { - fxObjectNode.removeVariantProperty(propertyName); - } else { - if (castedValue.isValid() && !castedValue.isNull()) - fxObjectNode.setVariantProperty(propertyName, castedValue); - } + try { + if (!value->value().isValid()) { + fxObjectNode.removeVariantProperty(propertyName); + } else { + if (castedValue.isValid() && !castedValue.isNull()) + fxObjectNode.setVariantProperty(propertyName, castedValue); } + } - catch (Exception &e) { - qDebug() << "PropertyEditor::changeValue() " << name; - qDebug() << e.description(); - qDebug() << e; - } + catch (Exception &e) { + QMessageBox::warning(0, "Error", e.description()); + } } void PropertyEditor::changeExpression(const QString &name) @@ -311,7 +315,7 @@ void PropertyEditor::setQmlDir(const QString &qmlDir) void PropertyEditor::delayedResetView() { if (m_timerId == 0) - m_timerId = startTimer(50); + m_timerId = startTimer(50); } void PropertyEditor::timerEvent(QTimerEvent *timerEvent) @@ -374,7 +378,7 @@ void PropertyEditor::resetView() } void PropertyEditor::selectedNodesChanged(const QList<ModelNode> &selectedNodeList, - const QList<ModelNode> &lastSelectedNodeList) + const QList<ModelNode> &lastSelectedNodeList) { Q_UNUSED(lastSelectedNodeList); @@ -470,15 +474,15 @@ void PropertyEditor::nodeIdChanged(const ModelNode& node, const QString& newId, { QmlModelView::nodeIdChanged(node, newId, oldId); - if (!m_selectedNode.isValid()) + if (!m_selectedNode.isValid()) return; - if (node == m_selectedNode) { + if (node == m_selectedNode) { - if (m_currentType) { - m_currentType->setValue(node, "id", newId); - } - } + if (m_currentType) { + m_currentType->setValue(node, "id", newId); + } + } } void PropertyEditor::select(const ModelNode &node)