QmlDesigner: Use new validation approach in property editor

Many validation tests can now be skipped.

Task-number: QDS-7454
Change-Id: I3fe3ee1fcf97b965872cb6f76f00034caeb72ba0
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2022-08-31 10:26:28 +02:00
parent 60a6fad2ae
commit 563e055c5a
4 changed files with 31 additions and 52 deletions

View File

@@ -34,7 +34,7 @@ int GradientModel::rowCount(const QModelIndex & /*parent*/) const
QmlDesigner::ModelNode gradientNode = QmlDesigner::ModelNode gradientNode =
m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode(); m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode();
if (gradientNode.isValid() && gradientNode.hasNodeListProperty("stops")) if (gradientNode.hasNodeListProperty("stops"))
return gradientNode.nodeListProperty("stops").toModelNodeList().count(); return gradientNode.nodeListProperty("stops").toModelNodeList().count();
} }
} }

View File

@@ -808,7 +808,7 @@ NodeMetaInfo PropertyEditorQmlBackend::findCommonAncestor(const ModelNode &node)
if (!node.isValid()) if (!node.isValid())
return node.metaInfo(); return node.metaInfo();
if (auto metaInfo = node.metaInfo(); metaInfo.isValid()) if (auto metaInfo = node.metaInfo())
return metaInfo; return metaInfo;
AbstractView *view = node.view(); AbstractView *view = node.view();

View File

@@ -38,13 +38,10 @@ PropertyEditorValue::PropertyEditorValue(QObject *parent)
QVariant PropertyEditorValue::value() const QVariant PropertyEditorValue::value() const
{ {
QVariant returnValue = m_value; QVariant returnValue = m_value;
if (modelNode().isValid()) { if (auto metaInfo = modelNode().metaInfo(); metaInfo.property(name()).propertyType().isUrl()) {
if (auto metaInfo = modelNode().metaInfo(); returnValue = returnValue.toUrl().toString();
metaInfo.isValid() && metaInfo.hasProperty(name())
&& metaInfo.property(name()).propertyType().isUrl()) {
returnValue = returnValue.toUrl().toString();
}
} }
return returnValue; return returnValue;
} }
@@ -82,30 +79,24 @@ static void fixAmbigousColorNames(const QmlDesigner::ModelNode &modelNode,
const QmlDesigner::PropertyName &name, const QmlDesigner::PropertyName &name,
QVariant *value) QVariant *value)
{ {
if (modelNode.isValid()) { if (auto metaInfo = modelNode.metaInfo(); metaInfo.property(name).propertyType().isColor()) {
if (auto metaInfo = modelNode.metaInfo(); if ((value->type() == QVariant::Color)) {
metaInfo.isValid() && metaInfo.property(name).propertyType().isColor()) { QColor color = value->value<QColor>();
if ((value->type() == QVariant::Color)) { int alpha = color.alpha();
QColor color = value->value<QColor>(); color = QColor(color.name());
int alpha = color.alpha(); color.setAlpha(alpha);
color = QColor(color.name()); *value = color;
color.setAlpha(alpha); } else if (value->toString() != QStringLiteral("transparent")) {
*value = color; *value = QColor(value->toString()).name(QColor::HexArgb);
} else if (value->toString() != QStringLiteral("transparent")) {
*value = QColor(value->toString()).name(QColor::HexArgb);
}
} }
} }
} }
static void fixUrl(const QmlDesigner::ModelNode &modelNode, const QmlDesigner::PropertyName &name, QVariant *value) static void fixUrl(const QmlDesigner::ModelNode &modelNode, const QmlDesigner::PropertyName &name, QVariant *value)
{ {
if (modelNode.isValid()) { if (auto metaInfo = modelNode.metaInfo(); metaInfo.property(name).propertyType().isUrl()) {
if (auto metaInfo = modelNode.metaInfo(); if (!value->isValid())
metaInfo.isValid() && metaInfo.property(name).propertyType().isUrl()) *value = QStringLiteral("");
if (!value->isValid())
*value = QStringLiteral("");
} }
} }
@@ -124,12 +115,8 @@ void PropertyEditorValue::setValueWithEmit(const QVariant &value)
{ {
if (!compareVariants(value, m_value ) || isBound()) { if (!compareVariants(value, m_value ) || isBound()) {
QVariant newValue = value; QVariant newValue = value;
if (modelNode().isValid()) { if (auto metaInfo = modelNode().metaInfo(); metaInfo.property(name()).propertyType().isUrl()) {
if (auto metaInfo = modelNode().metaInfo(); newValue = QUrl(newValue.toString());
metaInfo.isValid() && metaInfo.hasProperty(name())
&& metaInfo.property(name()).propertyType().isUrl()) {
newValue = QUrl(newValue.toString());
}
} }
if (cleverDoubleCompare(newValue, m_value)) if (cleverDoubleCompare(newValue, m_value))
@@ -212,7 +199,7 @@ bool PropertyEditorValue::isBound() const
bool PropertyEditorValue::isInModel() const bool PropertyEditorValue::isInModel() const
{ {
return modelNode().isValid() && modelNode().hasProperty(name()); return modelNode().hasProperty(name());
} }
QmlDesigner::PropertyName PropertyEditorValue::name() const QmlDesigner::PropertyName PropertyEditorValue::name() const
@@ -248,7 +235,7 @@ bool PropertyEditorValue::isTranslated() const
metaInfo.isValid() && metaInfo.hasProperty(name()) metaInfo.isValid() && metaInfo.hasProperty(name())
&& metaInfo.property(name()).propertyType().isString()) { && metaInfo.property(name()).propertyType().isString()) {
const QmlDesigner::QmlObjectNode objectNode(modelNode()); const QmlDesigner::QmlObjectNode objectNode(modelNode());
if (objectNode.isValid() && objectNode.hasBindingProperty(name())) { if (objectNode.hasBindingProperty(name())) {
const QRegularExpression rx( const QRegularExpression rx(
QRegularExpression::anchoredPattern("qsTr(|Id|anslate)\\(\".*\"\\)")); QRegularExpression::anchoredPattern("qsTr(|Id|anslate)\\(\".*\"\\)"));
//qsTr() //qsTr()
@@ -422,7 +409,7 @@ QString PropertyEditorValue::getTranslationContext() const
metaInfo.isValid() && metaInfo.hasProperty(name()) metaInfo.isValid() && metaInfo.hasProperty(name())
&& metaInfo.property(name()).propertyType().isString()) { && metaInfo.property(name()).propertyType().isString()) {
const QmlDesigner::QmlObjectNode objectNode(modelNode()); const QmlDesigner::QmlObjectNode objectNode(modelNode());
if (objectNode.isValid() && objectNode.hasBindingProperty(name())) { if (objectNode.hasBindingProperty(name())) {
const QRegularExpression rx(QRegularExpression::anchoredPattern( const QRegularExpression rx(QRegularExpression::anchoredPattern(
"qsTranslate\\(\"(.*)\"\\s*,\\s*\".*\"\\s*\\)")); "qsTranslate\\(\"(.*)\"\\s*,\\s*\".*\"\\s*\\)"));
const QRegularExpressionMatch match = rx.match(expression()); const QRegularExpressionMatch match = rx.match(expression());
@@ -438,7 +425,7 @@ bool PropertyEditorValue::isIdList() const
{ {
if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name())) { if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name())) {
const QmlDesigner::QmlObjectNode objectNode(modelNode()); const QmlDesigner::QmlObjectNode objectNode(modelNode());
if (objectNode.isValid() && objectNode.hasBindingProperty(name())) { if (objectNode.hasBindingProperty(name())) {
static const QRegularExpression rx(QRegularExpression::anchoredPattern( static const QRegularExpression rx(QRegularExpression::anchoredPattern(
"^[a-z_]\\w*|^[A-Z]\\w*\\.{1}([a-z_]\\w*\\.?)+")); "^[a-z_]\\w*|^[A-Z]\\w*\\.{1}([a-z_]\\w*\\.?)+"));
const QString exp = objectNode.propertyAffectedByCurrentState(name()) ? expression() : modelNode().bindingProperty(name()).expression(); const QString exp = objectNode.propertyAffectedByCurrentState(name()) ? expression() : modelNode().bindingProperty(name()).expression();
@@ -586,11 +573,7 @@ bool PropertyEditorNodeWrapper::exists()
QString PropertyEditorNodeWrapper::type() QString PropertyEditorNodeWrapper::type()
{ {
if (!(m_modelNode.isValid()))
return QString();
return m_modelNode.simplifiedTypeName(); return m_modelNode.simplifiedTypeName();
} }
QmlDesigner::ModelNode PropertyEditorNodeWrapper::parentModelNode() const QmlDesigner::ModelNode PropertyEditorNodeWrapper::parentModelNode() const
@@ -635,8 +618,7 @@ void PropertyEditorNodeWrapper::add(const QString &type)
void PropertyEditorNodeWrapper::remove() void PropertyEditorNodeWrapper::remove()
{ {
if ((m_editorValue && m_editorValue->modelNode().isValid())) { if ((m_editorValue && m_editorValue->modelNode().isValid())) {
if (QmlDesigner::QmlObjectNode(m_modelNode).isValid()) QmlDesigner::QmlObjectNode(m_modelNode).destroy();
QmlDesigner::QmlObjectNode(m_modelNode).destroy();
m_editorValue->modelNode().removeProperty(m_editorValue->name()); m_editorValue->modelNode().removeProperty(m_editorValue->name());
} else { } else {
qWarning("PropertyEditorNodeWrapper::remove failed - node invalid"); qWarning("PropertyEditorNodeWrapper::remove failed - node invalid");
@@ -675,13 +657,12 @@ void PropertyEditorNodeWrapper::setup()
Q_ASSERT(m_editorValue); Q_ASSERT(m_editorValue);
Q_ASSERT(m_editorValue->modelNode().isValid()); Q_ASSERT(m_editorValue->modelNode().isValid());
if ((m_editorValue->modelNode().isValid() && m_modelNode.isValid())) { if ((m_editorValue->modelNode().isValid() && m_modelNode.isValid())) {
QmlDesigner::QmlObjectNode qmlObjectNode(m_modelNode);
const QStringList propertyNames = m_valuesPropertyMap.keys(); const QStringList propertyNames = m_valuesPropertyMap.keys();
for (const QString &propertyName : propertyNames) for (const QString &propertyName : propertyNames)
m_valuesPropertyMap.clear(propertyName); m_valuesPropertyMap.clear(propertyName);
qDeleteAll(m_valuesPropertyMap.children()); qDeleteAll(m_valuesPropertyMap.children());
if (qmlObjectNode.isValid()) { if (QmlDesigner::QmlObjectNode qmlObjectNode = m_modelNode) {
for (const auto &property : m_modelNode.metaInfo().properties()) { for (const auto &property : m_modelNode.metaInfo().properties()) {
const auto &propertyName = property.name(); const auto &propertyName = property.name();
auto valueObject = new PropertyEditorValue(&m_valuesPropertyMap); auto valueObject = new PropertyEditorValue(&m_valuesPropertyMap);

View File

@@ -161,8 +161,8 @@ void PropertyEditorView::changeValue(const QString &name)
QVariant castedValue; QVariant castedValue;
if (metaInfo.isValid() && metaInfo.hasProperty(propertyName)) { if (auto property = metaInfo.property(propertyName)) {
castedValue = metaInfo.property(propertyName).castedValue(value->value()); castedValue = property.castedValue(value->value());
} else if (propertyIsAttachedLayoutProperty(propertyName)) { } else if (propertyIsAttachedLayoutProperty(propertyName)) {
castedValue = value->value(); castedValue = value->value();
} else { } else {
@@ -177,8 +177,7 @@ void PropertyEditorView::changeValue(const QString &name)
bool propertyTypeUrl = false; bool propertyTypeUrl = false;
if (metaInfo.isValid() && metaInfo.hasProperty(propertyName) if (metaInfo.property(propertyName).propertyType().isUrl()) {
&& metaInfo.property(propertyName).propertyType().isUrl()) {
// turn absolute local file paths into relative paths // turn absolute local file paths into relative paths
propertyTypeUrl = true; propertyTypeUrl = true;
QString filePath = castedValue.toUrl().toString(); QString filePath = castedValue.toUrl().toString();
@@ -247,9 +246,8 @@ void PropertyEditorView::changeExpression(const QString &propertyName)
return; return;
} }
if (auto metaInfo = qmlObjectNode->modelNode().metaInfo(); if (auto property = qmlObjectNode->modelNode().metaInfo().property(name)) {
metaInfo.isValid() && metaInfo.hasProperty(name)) { const auto &propertType = property.propertyType();
const auto &propertType = metaInfo.property(name).propertyType();
if (propertType.isColor()) { if (propertType.isColor()) {
if (QColor(value->expression().remove('"')).isValid()) { if (QColor(value->expression().remove('"')).isValid()) {
qmlObjectNode->setVariantProperty(name, QColor(value->expression().remove('"'))); qmlObjectNode->setVariantProperty(name, QColor(value->expression().remove('"')));
@@ -642,7 +640,7 @@ void PropertyEditorView::propertiesRemoved(const QList<AbstractProperty>& proper
if ("width" == property.name() || "height" == property.name()) { if ("width" == property.name() || "height" == property.name()) {
const QmlItemNode qmlItemNode = m_selectedNode; const QmlItemNode qmlItemNode = m_selectedNode;
if (qmlItemNode.isValid() && qmlItemNode.isInLayout()) if (qmlItemNode.isInLayout())
resetPuppet(); resetPuppet();
} }