forked from qt-creator/qt-creator
QmlDesigner: Disable assigning a texture to a model with no materials
Disable apply texture to selected model option from texture editor's toolbar when the selected model has no material. Also relevant fixes to make sure texture assigning happens in the current state. Fixes: QDS-8395 Change-Id: Iab2e8fce4696c6bd5d50636b4077362ba04cb8a0 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
@@ -28,7 +28,7 @@ Rectangle {
|
|||||||
normalColor: StudioTheme.Values.themeSectionHeadBackground
|
normalColor: StudioTheme.Values.themeSectionHeadBackground
|
||||||
iconSize: StudioTheme.Values.bigIconFontSize
|
iconSize: StudioTheme.Values.bigIconFontSize
|
||||||
buttonSize: root.height
|
buttonSize: root.height
|
||||||
enabled: hasTexture && hasModelSelection && hasQuick3DImport && hasMaterialLibrary
|
enabled: hasTexture && hasSingleModelSelection && hasQuick3DImport && hasMaterialLibrary
|
||||||
onClicked: root.toolBarAction(ToolBarAction.ApplyToSelected)
|
onClicked: root.toolBarAction(ToolBarAction.ApplyToSelected)
|
||||||
tooltip: qsTr("Apply texture to selected model's material.")
|
tooltip: qsTr("Apply texture to selected model's material.")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -481,9 +481,9 @@ void MaterialBrowserView::instancePropertyChanged(const QList<QPair<ModelNode, P
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MaterialBrowserView::applyTextureToModel3D(const ModelNode &model3D, const ModelNode &texture)
|
void MaterialBrowserView::applyTextureToModel3D(const QmlObjectNode &model3D, const ModelNode &texture)
|
||||||
{
|
{
|
||||||
if (!texture.isValid() || !model3D.isValid() || !model3D.metaInfo().isQtQuick3DModel())
|
if (!texture.isValid() || !model3D.isValid() || !model3D.modelNode().metaInfo().isQtQuick3DModel())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BindingProperty matsProp = model3D.bindingProperty("materials");
|
BindingProperty matsProp = model3D.bindingProperty("materials");
|
||||||
@@ -547,14 +547,13 @@ void MaterialBrowserView::applyTextureToProperty(const QString &matId, const QSt
|
|||||||
{
|
{
|
||||||
QTC_ASSERT(!m_appliedTextureId.isEmpty(), return);
|
QTC_ASSERT(!m_appliedTextureId.isEmpty(), return);
|
||||||
|
|
||||||
ModelNode mat = modelNodeForId(matId);
|
QmlObjectNode mat = modelNodeForId(matId);
|
||||||
QTC_ASSERT(mat.isValid(), return);
|
QTC_ASSERT(mat.isValid(), return);
|
||||||
|
|
||||||
BindingProperty texProp = mat.bindingProperty(propName.toLatin1());
|
BindingProperty texProp = mat.bindingProperty(propName.toLatin1());
|
||||||
QTC_ASSERT(texProp.isValid(), return);
|
QTC_ASSERT(texProp.isValid(), return);
|
||||||
|
|
||||||
QmlObjectNode qmlObjNode(mat);
|
mat.setBindingProperty(propName.toLatin1(), m_appliedTextureId);
|
||||||
qmlObjNode.setBindingProperty(propName.toLatin1(), m_appliedTextureId);
|
|
||||||
|
|
||||||
closeChooseMatPropsView();
|
closeChooseMatPropsView();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public:
|
|||||||
void instancesCompleted(const QVector<ModelNode> &completedNodeList) override;
|
void instancesCompleted(const QVector<ModelNode> &completedNodeList) override;
|
||||||
void instancePropertyChanged(const QList<QPair<ModelNode, PropertyName> > &propertyList) override;
|
void instancePropertyChanged(const QList<QPair<ModelNode, PropertyName> > &propertyList) override;
|
||||||
|
|
||||||
void applyTextureToModel3D(const ModelNode &model3D, const ModelNode &texture);
|
void applyTextureToModel3D(const QmlObjectNode &model3D, const ModelNode &texture);
|
||||||
void applyTextureToMaterial(const QList<ModelNode> &materials, const ModelNode &texture);
|
void applyTextureToMaterial(const QList<ModelNode> &materials, const ModelNode &texture);
|
||||||
|
|
||||||
Q_INVOKABLE void updatePropsModel(const QString &matId);
|
Q_INVOKABLE void updatePropsModel(const QString &matId);
|
||||||
|
|||||||
@@ -145,18 +145,18 @@ void TextureEditorContextObject::setHasMaterialLibrary(bool b)
|
|||||||
emit hasMaterialLibraryChanged();
|
emit hasMaterialLibraryChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextureEditorContextObject::hasModelSelection() const
|
bool TextureEditorContextObject::hasSingleModelSelection() const
|
||||||
{
|
{
|
||||||
return m_hasModelSelection;
|
return m_hasSingleModelSelection;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureEditorContextObject::setHasModelSelection(bool b)
|
void TextureEditorContextObject::setHasSingleModelSelection(bool b)
|
||||||
{
|
{
|
||||||
if (b == m_hasModelSelection)
|
if (b == m_hasSingleModelSelection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_hasModelSelection = b;
|
m_hasSingleModelSelection = b;
|
||||||
emit hasModelSelectionChanged();
|
emit hasSingleModelSelectionChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureEditorContextObject::setSelectedMaterial(const ModelNode &matNode)
|
void TextureEditorContextObject::setSelectedMaterial(const ModelNode &matNode)
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ class TextureEditorContextObject : public QObject
|
|||||||
Q_PROPERTY(bool hasAliasExport READ hasAliasExport NOTIFY hasAliasExportChanged)
|
Q_PROPERTY(bool hasAliasExport READ hasAliasExport NOTIFY hasAliasExportChanged)
|
||||||
Q_PROPERTY(bool hasActiveTimeline READ hasActiveTimeline NOTIFY hasActiveTimelineChanged)
|
Q_PROPERTY(bool hasActiveTimeline READ hasActiveTimeline NOTIFY hasActiveTimelineChanged)
|
||||||
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
|
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
|
||||||
Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged)
|
Q_PROPERTY(bool hasSingleModelSelection READ hasSingleModelSelection WRITE setHasSingleModelSelection
|
||||||
|
NOTIFY hasSingleModelSelectionChanged)
|
||||||
Q_PROPERTY(bool hasMaterialLibrary READ hasMaterialLibrary WRITE setHasMaterialLibrary NOTIFY hasMaterialLibraryChanged)
|
Q_PROPERTY(bool hasMaterialLibrary READ hasMaterialLibrary WRITE setHasMaterialLibrary NOTIFY hasMaterialLibraryChanged)
|
||||||
|
|
||||||
Q_PROPERTY(QQmlPropertyMap *backendValues READ backendValues WRITE setBackendValues NOTIFY backendValuesChanged)
|
Q_PROPERTY(QQmlPropertyMap *backendValues READ backendValues WRITE setBackendValues NOTIFY backendValuesChanged)
|
||||||
@@ -91,8 +92,8 @@ public:
|
|||||||
bool hasMaterialLibrary() const;
|
bool hasMaterialLibrary() const;
|
||||||
void setHasMaterialLibrary(bool b);
|
void setHasMaterialLibrary(bool b);
|
||||||
|
|
||||||
bool hasModelSelection() const;
|
bool hasSingleModelSelection() const;
|
||||||
void setHasModelSelection(bool b);
|
void setHasSingleModelSelection(bool b);
|
||||||
|
|
||||||
bool hasAliasExport() const { return m_aliasExport; }
|
bool hasAliasExport() const { return m_aliasExport; }
|
||||||
|
|
||||||
@@ -124,7 +125,7 @@ signals:
|
|||||||
void hasActiveTimelineChanged();
|
void hasActiveTimelineChanged();
|
||||||
void hasQuick3DImportChanged();
|
void hasQuick3DImportChanged();
|
||||||
void hasMaterialLibraryChanged();
|
void hasMaterialLibraryChanged();
|
||||||
void hasModelSelectionChanged();
|
void hasSingleModelSelectionChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QUrl m_specificsUrl;
|
QUrl m_specificsUrl;
|
||||||
@@ -148,7 +149,7 @@ private:
|
|||||||
bool m_hasActiveTimeline = false;
|
bool m_hasActiveTimeline = false;
|
||||||
bool m_hasQuick3DImport = false;
|
bool m_hasQuick3DImport = false;
|
||||||
bool m_hasMaterialLibrary = false;
|
bool m_hasMaterialLibrary = false;
|
||||||
bool m_hasModelSelection = false;
|
bool m_hasSingleModelSelection = false;
|
||||||
|
|
||||||
ModelNode m_selectedTexture;
|
ModelNode m_selectedTexture;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -451,6 +451,8 @@ void TextureEditorView::setupQmlBackend()
|
|||||||
currentQmlBackend->contextObject()->setHasQuick3DImport(m_hasQuick3DImport);
|
currentQmlBackend->contextObject()->setHasQuick3DImport(m_hasQuick3DImport);
|
||||||
currentQmlBackend->contextObject()->setHasMaterialLibrary(materialLibraryNode().isValid());
|
currentQmlBackend->contextObject()->setHasMaterialLibrary(materialLibraryNode().isValid());
|
||||||
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
|
||||||
|
bool hasValidSelection = QmlObjectNode(m_selectedModel).hasBindingProperty("materials");
|
||||||
|
currentQmlBackend->contextObject()->setHasSingleModelSelection(hasValidSelection);
|
||||||
|
|
||||||
m_qmlBackEnd = currentQmlBackend;
|
m_qmlBackEnd = currentQmlBackend;
|
||||||
|
|
||||||
@@ -554,6 +556,11 @@ void TextureEditorView::propertiesRemoved(const QList<AbstractProperty> &propert
|
|||||||
setValue(m_selectedTexture, property.name(), QmlObjectNode(m_selectedTexture).instanceValue(property.name()));
|
setValue(m_selectedTexture, property.name(), QmlObjectNode(m_selectedTexture).instanceValue(property.name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (property.name() == "materials" && (node == m_selectedModel
|
||||||
|
|| QmlObjectNode(m_selectedModel).propertyChangeForCurrentState() == node)) {
|
||||||
|
m_qmlBackEnd->contextObject()->setHasSingleModelSelection(false);
|
||||||
|
}
|
||||||
|
|
||||||
dynamicPropertiesModel()->dispatchPropertyChanges(property);
|
dynamicPropertiesModel()->dispatchPropertyChanges(property);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -598,6 +605,12 @@ void TextureEditorView::bindingPropertiesChanged(const QList<BindingProperty> &p
|
|||||||
setValue(m_selectedTexture, property.name(), QmlObjectNode(m_selectedTexture).modelValue(property.name()));
|
setValue(m_selectedTexture, property.name(), QmlObjectNode(m_selectedTexture).modelValue(property.name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (property.name() == "materials" && (node == m_selectedModel
|
||||||
|
|| QmlObjectNode(m_selectedModel).propertyChangeForCurrentState() == node)) {
|
||||||
|
bool hasMaterials = QmlObjectNode(m_selectedModel).hasBindingProperty("materials");
|
||||||
|
m_qmlBackEnd->contextObject()->setHasSingleModelSelection(hasMaterials);
|
||||||
|
}
|
||||||
|
|
||||||
dynamicPropertiesModel()->dispatchPropertyChanges(property);
|
dynamicPropertiesModel()->dispatchPropertyChanges(property);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -660,7 +673,8 @@ void TextureEditorView::selectedNodesChanged(const QList<ModelNode> &selectedNod
|
|||||||
if (selectedNodeList.size() == 1 && selectedNodeList.at(0).metaInfo().isQtQuick3DModel())
|
if (selectedNodeList.size() == 1 && selectedNodeList.at(0).metaInfo().isQtQuick3DModel())
|
||||||
m_selectedModel = selectedNodeList.at(0);
|
m_selectedModel = selectedNodeList.at(0);
|
||||||
|
|
||||||
m_qmlBackEnd->contextObject()->setHasModelSelection(m_selectedModel.isValid());
|
bool hasValidSelection = QmlObjectNode(m_selectedModel).hasBindingProperty("materials");
|
||||||
|
m_qmlBackEnd->contextObject()->setHasSingleModelSelection(hasValidSelection);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureEditorView::currentStateChanged(const ModelNode &node)
|
void TextureEditorView::currentStateChanged(const ModelNode &node)
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ public:
|
|||||||
QVariant modelValue(const PropertyName &name) const;
|
QVariant modelValue(const PropertyName &name) const;
|
||||||
bool isTranslatableText(const PropertyName &name) const;
|
bool isTranslatableText(const PropertyName &name) const;
|
||||||
QString stripedTranslatableText(const PropertyName &name) const;
|
QString stripedTranslatableText(const PropertyName &name) const;
|
||||||
|
BindingProperty bindingProperty(const PropertyName &name) const;
|
||||||
QString expression(const PropertyName &name) const;
|
QString expression(const PropertyName &name) const;
|
||||||
bool isInBaseState() const;
|
bool isInBaseState() const;
|
||||||
bool timelineIsActive() const;
|
bool timelineIsActive() const;
|
||||||
|
|||||||
@@ -256,23 +256,28 @@ QString QmlObjectNode::stripedTranslatableText(const PropertyName &name) const
|
|||||||
return instanceValue(name).toString();
|
return instanceValue(name).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString QmlObjectNode::expression(const PropertyName &name) const
|
BindingProperty QmlObjectNode::bindingProperty(const PropertyName &name) const
|
||||||
{
|
{
|
||||||
if (!isValid())
|
if (!isValid())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
if (currentState().isBaseState())
|
if (currentState().isBaseState())
|
||||||
return modelNode().bindingProperty(name).expression();
|
return modelNode().bindingProperty(name);
|
||||||
|
|
||||||
if (!currentState().hasPropertyChanges(modelNode()))
|
if (!currentState().hasPropertyChanges(modelNode()))
|
||||||
return modelNode().bindingProperty(name).expression();
|
return modelNode().bindingProperty(name);
|
||||||
|
|
||||||
QmlPropertyChanges propertyChanges(currentState().propertyChanges(modelNode()));
|
QmlPropertyChanges propertyChanges(currentState().propertyChanges(modelNode()));
|
||||||
|
|
||||||
if (!propertyChanges.modelNode().hasProperty(name))
|
if (!propertyChanges.modelNode().hasProperty(name))
|
||||||
return modelNode().bindingProperty(name).expression();
|
return modelNode().bindingProperty(name);
|
||||||
|
|
||||||
return propertyChanges.modelNode().bindingProperty(name).expression();
|
return propertyChanges.modelNode().bindingProperty(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString QmlObjectNode::expression(const PropertyName &name) const
|
||||||
|
{
|
||||||
|
return bindingProperty(name).expression();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
Reference in New Issue
Block a user