QmlDesigner: Expose dynamic texture and vector properties in components

Provide editor templates for Texture, TextureInput, and vectorXd
type dynamic properties exposed by components.

Change-Id: Ie7ae62aeffc5e151a1300b3aefdfc68584ccda6a
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Miikka Heikkinen
2022-09-09 17:05:14 +03:00
parent c1bc770564
commit a2c8972ce1
6 changed files with 233 additions and 4 deletions

View File

@@ -0,0 +1,17 @@
PropertyLabel {
text: "%1"
tooltip: "%1"
}
SecondColumnLayout {
ItemFilterComboBox {
typeFilter: "QtQuick3D.%3"
validator: RegExpValidator { regExp: /(^$|^[a-z_]\w*)/ }
backendValue: backendValues.%2
implicitWidth: StudioTheme.Values.singleControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
width: implicitWidth
}
ExpandingSpacer {}
}

View File

@@ -78,4 +78,25 @@ AutoTypes {
sourceFile: "ImageEditorTemplate.template"
separateSection: true
}
Type {
typeNames: ["TextureInput", "Texture"]
sourceFile: "3DItemFilterComboBoxEditorTemplate.template"
needsTypeArg: true
}
Type {
typeNames: ["vector2d"]
sourceFile: "Vector2dEditorTemplate.template"
}
Type {
typeNames: ["vector3d"]
sourceFile: "Vector3dEditorTemplate.template"
}
Type {
typeNames: ["vector4d"]
sourceFile: "Vector4dEditorTemplate.template"
}
}

View File

@@ -0,0 +1,42 @@
PropertyLabel {
text: "%1"
tooltip: "%1"
}
ColumnLayout {
SecondColumnLayout {
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_x
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "X"
}
Spacer { implicitWidth: StudioTheme.Values.controlGap }
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_y
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "Y"
}
ExpandingSpacer {}
}
}

View File

@@ -0,0 +1,61 @@
PropertyLabel {
text: "%1"
tooltip: "%1"
}
ColumnLayout {
SecondColumnLayout {
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_x
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "X"
}
Spacer { implicitWidth: StudioTheme.Values.controlGap }
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_y
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "Y"
}
ExpandingSpacer {}
}
SecondColumnLayout {
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_z
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "Z"
}
ExpandingSpacer {}
}
}

View File

@@ -0,0 +1,78 @@
PropertyLabel {
text: "%1"
tooltip: "%1"
}
ColumnLayout {
SecondColumnLayout {
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_x
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "X"
}
Spacer { implicitWidth: StudioTheme.Values.controlGap }
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_y
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "Y"
}
ExpandingSpacer {}
}
SecondColumnLayout {
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_z
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "Z"
}
Spacer { implicitWidth: StudioTheme.Values.controlGap }
SpinBox {
minimumValue: -9999999
maximumValue: 9999999
decimals: 2
backendValue: backendValues.%2_w
implicitWidth: StudioTheme.Values.twoControlColumnWidth
+ StudioTheme.Values.actionIndicatorWidth
}
Spacer { implicitWidth: StudioTheme.Values.controlLabelGap }
ControlLabel {
text: "W"
}
ExpandingSpacer {}
}
}

View File

@@ -586,7 +586,7 @@ inline bool dotPropertyHeuristic(const QmlObjectNode &node, const NodeMetaInfo &
NodeMetaInfo rectangleInfo = node.view()->model()->metaInfo("QtQuick.Rectangle");
NodeMetaInfo imageInfo = node.view()->model()->metaInfo("QtQuick.Image");
if (typeName == "font"
if (typeName == "font" || typeName == "Texture" || typeName == "vector4d"
|| itemInfo.hasProperty(itemProperty)
|| textInfo.isSubclassOf(typeName)
|| rectangleInfo.isSubclassOf(typeName)
@@ -607,10 +607,13 @@ QString PropertyEditorQmlBackend::templateGeneration(const NodeMetaInfo &type,
QStringList allTypes; // all template types
QStringList separateSectionTypes; // separate section types only
QStringList needsTypeArgTypes; // types that need type as third parameter
for (const QmlJS::SimpleReaderNode::Ptr &node : nodes) {
if (node->propertyNames().contains("separateSection"))
separateSectionTypes.append(variantToStringList(node->property("typeNames").value));
if (node->propertyNames().contains("needsTypeArg"))
needsTypeArgTypes.append(variantToStringList(node->property("typeNames").value));
allTypes.append(variantToStringList(node->property("typeNames").value));
}
@@ -668,8 +671,8 @@ QString PropertyEditorQmlBackend::templateGeneration(const NodeMetaInfo &type,
Utils::sort(basicProperties);
auto findAndFillTemplate = [&nodes, &node, &type](const PropertyName &label,
const PropertyName &property) {
auto findAndFillTemplate = [&nodes, &node, &type, &needsTypeArgTypes](
const PropertyName &label, const PropertyName &property) {
PropertyName underscoreProperty = property;
underscoreProperty.replace('.', '_');
@@ -687,7 +690,14 @@ QString PropertyEditorQmlBackend::templateGeneration(const NodeMetaInfo &type,
if (file.open(QIODevice::ReadOnly)) {
QString source = QString::fromUtf8(file.readAll());
file.close();
filledTemplate = source.arg(QString::fromUtf8(label)).arg(QString::fromUtf8(underscoreProperty));
if (needsTypeArgTypes.contains(QString::fromUtf8(typeName))) {
filledTemplate = source.arg(QString::fromUtf8(label),
QString::fromUtf8(underscoreProperty),
QString::fromUtf8(typeName));
} else {
filledTemplate = source.arg(QString::fromUtf8(label),
QString::fromUtf8(underscoreProperty));
}
} else {
qWarning().nospace() << "template definition source file not found:" << fileName;
}