forked from qt-creator/qt-creator
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:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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();
|
||||||
|
@@ -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);
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user