void PropertyEditorNodeWrapper::changeValue(const QString &propertyName) { const QmlDesigner::PropertyName name = propertyName.toUtf8(); if (name.isNull()) return; if (m_modelNode.isValid()) { QmlDesigner::QmlObjectNode qmlObjectNode(m_modelNode); PropertyEditorValue *valueObject = qvariant_cast<PropertyEditorValue *>(m_valuesPropertyMap.value(name)); if (valueObject->value().isValid()) qmlObjectNode.setVariantProperty(name, valueObject->value()); else qmlObjectNode.removeProperty(name); } }
void QmlModelView::nodeInstancePropertyChanged(const ModelNode &node, const QString &propertyName) { if (debug) qDebug() << this << __FUNCTION__ << node << propertyName; QmlObjectNode qmlObjectNode(node); if (!qmlObjectNode.isValid()) return; if (isTransformProperty(propertyName)) transformChanged(qmlObjectNode, propertyName); else if (propertyName == "parent") parentChanged(qmlObjectNode); else if (propertyName == "state") changeToState(node, qmlObjectNode.instanceValue(propertyName).toString()); else otherPropertyChanged(qmlObjectNode, propertyName); }
void PropertyEditorNodeWrapper::setup() { Q_ASSERT(m_editorValue); Q_ASSERT(m_editorValue->modelNode().isValid()); if ((m_editorValue->modelNode().isValid() && m_modelNode.isValid())) { QmlDesigner::QmlObjectNode qmlObjectNode(m_modelNode); foreach ( const QString &propertyName, m_valuesPropertyMap.keys()) m_valuesPropertyMap.clear(propertyName); foreach (QObject *object, m_valuesPropertyMap.children()) delete object; foreach (const QmlDesigner::PropertyName &propertyName, m_modelNode.metaInfo().propertyNames()) { if (qmlObjectNode.isValid()) { PropertyEditorValue *valueObject = new PropertyEditorValue(&m_valuesPropertyMap); valueObject->setName(propertyName); valueObject->setValue(qmlObjectNode.instanceValue(propertyName)); connect(valueObject, SIGNAL(valueChanged(QString,QVariant)), &m_valuesPropertyMap, SIGNAL(valueChanged(QString,QVariant))); m_valuesPropertyMap.insert(propertyName, QVariant::fromValue(valueObject)); } } }
void PropertyEditorView::changeExpression(const QString &propertyName) { PropertyName name = propertyName.toUtf8(); if (name.isNull()) return; if (m_locked) return; if (!m_selectedNode.isValid()) return; RewriterTransaction transaction = beginRewriterTransaction(QByteArrayLiteral("PropertyEditorView::changeExpression")); try { PropertyName underscoreName(name); underscoreName.replace('.', '_'); QmlObjectNode qmlObjectNode(m_selectedNode); PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(underscoreName); if (!value) { qWarning() << "PropertyEditor::changeExpression no value for " << underscoreName; return; } if (qmlObjectNode.modelNode().metaInfo().isValid() && qmlObjectNode.modelNode().metaInfo().hasProperty(name)) { if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "QColor") { if (QColor(value->expression().remove('"')).isValid()) { qmlObjectNode.setVariantProperty(name, QColor(value->expression().remove('"'))); transaction.commit(); //committing in the try block return; } } else if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "bool") { if (value->expression().compare("false", Qt::CaseInsensitive) == 0 || value->expression().compare("true", Qt::CaseInsensitive) == 0) { if (value->expression().compare("true", Qt::CaseInsensitive) == 0) qmlObjectNode.setVariantProperty(name, true); else qmlObjectNode.setVariantProperty(name, false); transaction.commit(); //committing in the try block return; } } else if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "int") { bool ok; int intValue = value->expression().toInt(&ok); if (ok) { qmlObjectNode.setVariantProperty(name, intValue); transaction.commit(); //committing in the try block return; } } else if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "qreal") { bool ok; qreal realValue = value->expression().toFloat(&ok); if (ok) { qmlObjectNode.setVariantProperty(name, realValue); transaction.commit(); //committing in the try block return; } } } if (value->expression().isEmpty()) return; if (qmlObjectNode.expression(name) != value->expression() || !qmlObjectNode.propertyAffectedByCurrentState(name)) qmlObjectNode.setBindingProperty(name, value->expression()); transaction.commit(); //committing in the try block } catch (const RewritingException &e) { e.showException(); } }
void PropertyEditorView::changeValue(const QString &name) { PropertyName propertyName = name.toUtf8(); if (propertyName.isNull()) return; if (m_locked) return; if (propertyName == "type") return; if (!m_selectedNode.isValid()) return; if (propertyName == "id") { PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(propertyName); const QString newId = value->value().toString(); if (newId == m_selectedNode.id()) return; if (m_selectedNode.isValidId(newId) && !hasId(newId)) { m_selectedNode.setIdWithRefactoring(newId); } else { m_locked = true; value->setValue(m_selectedNode.id()); m_locked = false; if (!m_selectedNode.isValidId(newId)) Core::AsynchronousMessageBox::warning(tr("Invalid Id"), tr("%1 is an invalid id.").arg(newId)); else Core::AsynchronousMessageBox::warning(tr("Invalid Id"), tr("%1 already exists.").arg(newId)); } return; } PropertyName underscoreName(propertyName); underscoreName.replace('.', '_'); PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(underscoreName); if (value ==0) return; QmlObjectNode qmlObjectNode(m_selectedNode); QVariant castedValue; if (qmlObjectNode.modelNode().metaInfo().isValid() && qmlObjectNode.modelNode().metaInfo().hasProperty(propertyName)) { castedValue = qmlObjectNode.modelNode().metaInfo().propertyCastedValue(propertyName, value->value()); } else if (propertyIsAttachedLayoutProperty(propertyName)) { castedValue = value->value(); } else { qWarning() << "PropertyEditor:" <<propertyName << "cannot be casted (metainfo)"; return ; } if (value->value().isValid() && !castedValue.isValid()) { qWarning() << "PropertyEditor:" << propertyName << "not properly casted (metainfo)"; return ; } if (qmlObjectNode.modelNode().metaInfo().isValid() && qmlObjectNode.modelNode().metaInfo().hasProperty(propertyName)) if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(propertyName) == "QUrl" || qmlObjectNode.modelNode().metaInfo().propertyTypeName(propertyName) == "url") { //turn absolute local file paths into relative paths QString filePath = castedValue.toUrl().toString(); if (QFileInfo(filePath).exists() && QFileInfo(filePath).isAbsolute()) { QDir fileDir(QFileInfo(model()->fileUrl().toLocalFile()).absolutePath()); castedValue = QUrl(fileDir.relativeFilePath(filePath)); } } if (castedValue.type() == QVariant::Color) { QColor color = castedValue.value<QColor>(); QColor newColor = QColor(color.name()); newColor.setAlpha(color.alpha()); castedValue = QVariant(newColor); } try { if (!value->value().isValid()) { //reset qmlObjectNode.removeProperty(propertyName); } else { if (castedValue.isValid() && !castedValue.isNull()) { m_locked = true; qmlObjectNode.setVariantProperty(propertyName, castedValue); m_locked = false; } } } catch (const RewritingException &e) { e.showException(); } }
void PropertyEditorView::changeValue(const QString &name) { PropertyName propertyName = name.toUtf8(); if (propertyName.isNull()) return; if (m_locked) return; if (propertyName == "type") return; if (!m_selectedNode.isValid()) return; if (propertyName == "id") { PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(propertyName); const QString newId = value->value().toString(); if (newId == m_selectedNode.id()) return; if (m_selectedNode.isValidId(newId) && !modelNodeForId(newId).isValid() ) { if (m_selectedNode.id().isEmpty() || newId.isEmpty()) { //no id try { m_selectedNode.setId(newId); } catch (InvalidIdException &e) { //better save then sorry m_locked = true; value->setValue(m_selectedNode.id()); m_locked = false; QMessageBox::warning(0, tr("Invalid Id"), e.description()); } } else { //there is already an id, so we refactor if (rewriterView()) rewriterView()->renameId(m_selectedNode.id(), newId); } } else { m_locked = true; value->setValue(m_selectedNode.id()); m_locked = false; if (!m_selectedNode.isValidId(newId)) QMessageBox::warning(0, tr("Invalid Id"), tr("%1 is an invalid id.").arg(newId)); else QMessageBox::warning(0, tr("Invalid Id"), tr("%1 already exists.").arg(newId)); } return; } //.replace(QLatin1Char('.'), QLatin1Char('_')) PropertyName underscoreName(propertyName); underscoreName.replace('.', '_'); PropertyEditorValue *value = m_qmlBackEndForCurrentType->propertyValueForName(underscoreName); if (value ==0) return; QmlObjectNode qmlObjectNode(m_selectedNode); QVariant castedValue; if (qmlObjectNode.modelNode().metaInfo().isValid() && qmlObjectNode.modelNode().metaInfo().hasProperty(propertyName)) { castedValue = qmlObjectNode.modelNode().metaInfo().propertyCastedValue(propertyName, value->value()); } else { qWarning() << "PropertyEditor:" <<propertyName << "cannot be casted (metainfo)"; return ; } if (value->value().isValid() && !castedValue.isValid()) { qWarning() << "PropertyEditor:" << propertyName << "not properly casted (metainfo)"; return ; } if (qmlObjectNode.modelNode().metaInfo().isValid() && qmlObjectNode.modelNode().metaInfo().hasProperty(propertyName)) if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(propertyName) == "QUrl" || qmlObjectNode.modelNode().metaInfo().propertyTypeName(propertyName) == "url") { //turn absolute local file paths into relative paths QString filePath = castedValue.toUrl().toString(); if (QFileInfo(filePath).exists() && QFileInfo(filePath).isAbsolute()) { QDir fileDir(QFileInfo(model()->fileUrl().toLocalFile()).absolutePath()); castedValue = QUrl(fileDir.relativeFilePath(filePath)); } } if (castedValue.type() == QVariant::Color) { QColor color = castedValue.value<QColor>(); QColor newColor = QColor(color.name()); newColor.setAlpha(color.alpha()); castedValue = QVariant(newColor); } try { if (!value->value().isValid()) { //reset qmlObjectNode.removeProperty(propertyName); } else { if (castedValue.isValid() && !castedValue.isNull()) { m_locked = true; qmlObjectNode.setVariantProperty(propertyName, castedValue); m_locked = false; } } } catch (RewritingException &e) { QMessageBox::warning(0, "Error", e.description()); } }