diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml
index d93f236fede..54476c3be43 100644
--- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml
+++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml
@@ -12,6 +12,8 @@ Item {
readonly property int cellWidth: 100
readonly property int cellHeight: 120
+ readonly property bool enableUiElements: materialBrowserModel.hasMaterialLibrary
+ && materialBrowserModel.hasQuick3DImport
property var currMaterialItem: null
@@ -54,16 +56,14 @@ Item {
acceptedButtons: Qt.RightButton
onClicked: (mouse) => {
- if (materialBrowserModel.hasMaterialRoot || !materialBrowserModel.hasQuick3DImport)
+ if (!root.enableUiElements)
return;
var matsSecBottom = mapFromItem(materialsSection, 0, materialsSection.y).y
+ materialsSection.height;
- if (!materialBrowserModel.hasMaterialRoot && materialBrowserModel.hasQuick3DImport
- && mouse.y < matsSecBottom) {
+ if (mouse.y < matsSecBottom)
ctxMenu.popupMenu()
- }
}
}
@@ -90,7 +90,7 @@ Item {
Row {
width: root.width
- enabled: !materialBrowserModel.hasMaterialRoot && materialBrowserModel.hasQuick3DImport
+ enabled: root.enableUiElements
StudioControls.SearchBox {
id: searchBox
@@ -105,10 +105,10 @@ Item {
Text {
text: {
- if (materialBrowserModel.hasMaterialRoot)
- qsTr("Material Browser is disabled inside a material component.")
- else if (!materialBrowserModel.hasQuick3DImport)
+ if (!materialBrowserModel.hasQuick3DImport)
qsTr("To use Material Browser, first add the QtQuick3D module in the Components view.")
+ else if (!materialBrowserModel.hasMaterialLibrary)
+ qsTr("Material Browser is disabled inside a non-visual component.")
else
""
}
@@ -129,7 +129,7 @@ Item {
width: root.width
height: root.height - searchBox.height
clip: true
- visible: materialBrowserModel.hasQuick3DImport && !materialBrowserModel.hasMaterialRoot
+ visible: root.enableUiElements
interactive: !ctxMenu.opened
Column {
@@ -187,7 +187,7 @@ Item {
color: StudioTheme.Values.themeTextColor
font.pixelSize: StudioTheme.Values.baseFontSize
leftPadding: 10
- visible: materialBrowserModel.isEmpty && !searchBox.isEmpty() && !materialBrowserModel.hasMaterialRoot
+ visible: materialBrowserModel.isEmpty && !searchBox.isEmpty() && materialBrowserModel.hasMaterialLibrary
}
Text {
@@ -213,7 +213,7 @@ Item {
normalColor: "transparent"
buttonSize: StudioTheme.Values.sectionHeadHeight
onClicked: materialBrowserModel.addNewMaterial()
- enabled: materialBrowserModel.hasQuick3DImport
+ enabled: root.enableUiElements
}
}
@@ -254,7 +254,7 @@ Item {
color: StudioTheme.Values.themeTextColor
font.pixelSize: StudioTheme.Values.baseFontSize
leftPadding: 10
- visible: materialBrowserModel.isEmpty && !searchBox.isEmpty() && !materialBrowserModel.hasMaterialRoot
+ visible: materialBrowserModel.isEmpty && !searchBox.isEmpty() && materialBrowserModel.hasMaterialLibrary
}
Text {
@@ -280,7 +280,7 @@ Item {
normalColor: "transparent"
buttonSize: StudioTheme.Values.sectionHeadHeight
onClicked: materialBrowserTexturesModel.addNewTexture()
- enabled: materialBrowserModel.hasQuick3DImport
+ enabled: root.enableUiElements
}
}
}
diff --git a/share/qtcreator/qmldesigner/materialEditorQmlSources/EmptyMaterialEditorPane.qml b/share/qtcreator/qmldesigner/materialEditorQmlSources/EmptyMaterialEditorPane.qml
index 5b9044ac4c2..304279b63af 100644
--- a/share/qtcreator/qmldesigner/materialEditorQmlSources/EmptyMaterialEditorPane.qml
+++ b/share/qtcreator/qmldesigner/materialEditorQmlSources/EmptyMaterialEditorPane.qml
@@ -32,8 +32,14 @@ PropertyEditorPane {
height: 150
Text {
- text: hasQuick3DImport ? qsTr("There are no materials in this project.
Select '+' to create one.")
- : qsTr("To use Material Editor, first add the QtQuick3D module in the Components view.")
+ text: {
+ if (!hasQuick3DImport)
+ qsTr("To use Material Editor, first add the QtQuick3D module in the Components view.")
+ else if (!hasMaterialLibrary)
+ qsTr("Material Editor is disabled inside a non-visual component.")
+ else
+ qsTr("There are no materials in this project.
Select '+' to create one.")
+ }
textFormat: Text.RichText
color: StudioTheme.Values.themeTextColor
font.pixelSize: StudioTheme.Values.mediumFontSize
diff --git a/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml b/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml
index 0a1b97f34bb..25edbf2d083 100644
--- a/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml
+++ b/share/qtcreator/qmldesigner/materialEditorQmlSources/MaterialEditorToolBar.qml
@@ -28,7 +28,7 @@ Rectangle {
normalColor: StudioTheme.Values.themeSectionHeadBackground
iconSize: StudioTheme.Values.bigIconFontSize
buttonSize: root.height
- enabled: hasMaterial && hasModelSelection && hasQuick3DImport && !hasMaterialRoot
+ enabled: hasMaterial && hasModelSelection && hasQuick3DImport && hasMaterialLibrary
onClicked: root.toolBarAction(ToolBarAction.ApplyToSelected)
tooltip: qsTr("Apply material to selected model.")
}
@@ -39,7 +39,7 @@ Rectangle {
normalColor: StudioTheme.Values.themeSectionHeadBackground
iconSize: StudioTheme.Values.bigIconFontSize
buttonSize: root.height
- enabled: hasQuick3DImport && !hasMaterialRoot
+ enabled: hasQuick3DImport && hasMaterialLibrary
onClicked: root.toolBarAction(ToolBarAction.AddNewMaterial)
tooltip: qsTr("Create new material.")
}
@@ -50,7 +50,7 @@ Rectangle {
normalColor: StudioTheme.Values.themeSectionHeadBackground
iconSize: StudioTheme.Values.bigIconFontSize
buttonSize: root.height
- enabled: hasMaterial && hasQuick3DImport && !hasMaterialRoot
+ enabled: hasMaterial && hasQuick3DImport && hasMaterialLibrary
onClicked: root.toolBarAction(ToolBarAction.DeleteCurrentMaterial)
tooltip: qsTr("Delete current material.")
}
@@ -61,7 +61,7 @@ Rectangle {
normalColor: StudioTheme.Values.themeSectionHeadBackground
iconSize: StudioTheme.Values.bigIconFontSize
buttonSize: root.height
- enabled: hasMaterial && hasQuick3DImport && !hasMaterialRoot
+ enabled: hasMaterial && hasQuick3DImport && hasMaterialLibrary
onClicked: root.toolBarAction(ToolBarAction.OpenMaterialBrowser)
tooltip: qsTr("Open material browser.")
}
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp
index ea2e1e47089..210b62d227e 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.cpp
@@ -171,18 +171,18 @@ void MaterialBrowserModel::setHasModelSelection(bool b)
emit hasModelSelectionChanged();
}
-bool MaterialBrowserModel::hasMaterialRoot() const
+bool MaterialBrowserModel::hasMaterialLibrary() const
{
- return m_hasMaterialRoot;
+ return m_hasMaterialLibrary;
}
-void MaterialBrowserModel::setHasMaterialRoot(bool b)
+void MaterialBrowserModel::setHasMaterialLibrary(bool b)
{
- if (m_hasMaterialRoot == b)
+ if (m_hasMaterialLibrary == b)
return;
- m_hasMaterialRoot = b;
- emit hasMaterialRootChanged();
+ m_hasMaterialLibrary = b;
+ emit hasMaterialLibraryChanged();
}
QString MaterialBrowserModel::copiedMaterialType() const
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h
index f850aaedb01..ca8c5cad74f 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsermodel.h
@@ -21,7 +21,7 @@ class MaterialBrowserModel : public QAbstractListModel
Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged)
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged)
- Q_PROPERTY(bool hasMaterialRoot READ hasMaterialRoot WRITE setHasMaterialRoot NOTIFY hasMaterialRootChanged)
+ Q_PROPERTY(bool hasMaterialLibrary READ hasMaterialLibrary WRITE setHasMaterialLibrary NOTIFY hasMaterialLibraryChanged)
Q_PROPERTY(QString copiedMaterialType READ copiedMaterialType WRITE setCopiedMaterialType NOTIFY copiedMaterialTypeChanged)
Q_PROPERTY(QStringList defaultMaterialSections MEMBER m_defaultMaterialSections NOTIFY materialSectionsChanged)
Q_PROPERTY(QStringList principledMaterialSections MEMBER m_principledMaterialSections NOTIFY materialSectionsChanged)
@@ -44,8 +44,8 @@ public:
bool hasModelSelection() const;
void setHasModelSelection(bool b);
- bool hasMaterialRoot() const;
- void setHasMaterialRoot(bool b);
+ bool hasMaterialLibrary() const;
+ void setHasMaterialLibrary(bool b);
QString copiedMaterialType() const;
void setCopiedMaterialType(const QString &matType);
@@ -87,7 +87,7 @@ signals:
void isEmptyChanged();
void hasQuick3DImportChanged();
void hasModelSelectionChanged();
- void hasMaterialRootChanged();
+ void hasMaterialLibraryChanged();
void copiedMaterialTypeChanged();
void materialSectionsChanged();
void selectedIndexChanged(int idx);
@@ -119,7 +119,7 @@ private:
bool m_isEmpty = true;
bool m_hasQuick3DImport = false;
bool m_hasModelSelection = false;
- bool m_hasMaterialRoot = false;
+ bool m_hasMaterialLibrary = false;
bool m_allPropsCopied = true;
QString m_copiedMaterialType;
};
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp
index 5af32bce600..635e9938154 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp
@@ -164,8 +164,7 @@ void MaterialBrowserView::modelAttached(Model *model)
AbstractView::modelAttached(model);
m_widget->clearSearchFilter();
- m_widget->materialBrowserModel()->setHasMaterialRoot(
- rootModelNode().metaInfo().isQtQuick3DMaterial());
+ m_widget->materialBrowserModel()->setHasMaterialLibrary(false);
m_hasQuick3DImport = model->hasImport("QtQuick3D");
// Project load is already very busy and may even trigger puppet reset, so let's wait a moment
@@ -198,6 +197,7 @@ void MaterialBrowserView::refreshModel(bool updateImages)
m_widget->clearSearchFilter();
m_widget->materialBrowserModel()->setMaterials(materials, m_hasQuick3DImport);
m_widget->materialBrowserTexturesModel()->setTextures(textures);
+ m_widget->materialBrowserModel()->setHasMaterialLibrary(matLib.isValid());
if (updateImages) {
for (const ModelNode &node : std::as_const(materials))
@@ -223,6 +223,7 @@ bool MaterialBrowserView::isTexture(const ModelNode &node) const
void MaterialBrowserView::modelAboutToBeDetached(Model *model)
{
m_widget->materialBrowserModel()->setMaterials({}, m_hasQuick3DImport);
+ m_widget->materialBrowserModel()->setHasMaterialLibrary(false);
m_widget->clearPreviewCache();
if (m_propertyGroupsLoaded) {
@@ -291,6 +292,9 @@ void MaterialBrowserView::nodeReparented(const ModelNode &node,
{
Q_UNUSED(propertyChange)
+ if (node.id() == Constants::MATERIAL_LIB_ID)
+ m_widget->materialBrowserModel()->setHasMaterialLibrary(true);
+
if (!isMaterial(node) && !isTexture(node))
return;
@@ -323,6 +327,7 @@ void MaterialBrowserView::nodeAboutToBeRemoved(const ModelNode &removedNode)
// removing the material lib node
if (removedNode.id() == Constants::MATERIAL_LIB_ID) {
m_widget->materialBrowserModel()->setMaterials({}, m_hasQuick3DImport);
+ m_widget->materialBrowserModel()->setHasMaterialLibrary(false);
m_widget->clearPreviewCache();
return;
}
diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp
index 57e6eab9e25..3f788e7f3fd 100644
--- a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp
+++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.cpp
@@ -227,18 +227,18 @@ void MaterialEditorContextObject::setHasQuick3DImport(bool b)
emit hasQuick3DImportChanged();
}
-bool MaterialEditorContextObject::hasMaterialRoot() const
+bool MaterialEditorContextObject::hasMaterialLibrary() const
{
- return m_hasMaterialRoot;
+ return m_hasMaterialLibrary;
}
-void MaterialEditorContextObject::setHasMaterialRoot(bool b)
+void MaterialEditorContextObject::setHasMaterialLibrary(bool b)
{
- if (b == m_hasMaterialRoot)
+ if (b == m_hasMaterialLibrary)
return;
- m_hasMaterialRoot = b;
- emit hasMaterialRootChanged();
+ m_hasMaterialLibrary = b;
+ emit hasMaterialLibraryChanged();
}
bool MaterialEditorContextObject::hasModelSelection() const
diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h
index af155511338..39aeff83326 100644
--- a/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h
+++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorcontextobject.h
@@ -38,7 +38,7 @@ class MaterialEditorContextObject : public QObject
Q_PROPERTY(bool hasActiveTimeline READ hasActiveTimeline NOTIFY hasActiveTimelineChanged)
Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport WRITE setHasQuick3DImport NOTIFY hasQuick3DImportChanged)
Q_PROPERTY(bool hasModelSelection READ hasModelSelection WRITE setHasModelSelection NOTIFY hasModelSelectionChanged)
- Q_PROPERTY(bool hasMaterialRoot READ hasMaterialRoot WRITE setHasMaterialRoot NOTIFY hasMaterialRootChanged)
+ Q_PROPERTY(bool hasMaterialLibrary READ hasMaterialLibrary WRITE setHasMaterialLibrary NOTIFY hasMaterialLibraryChanged)
Q_PROPERTY(QQmlPropertyMap *backendValues READ backendValues WRITE setBackendValues NOTIFY backendValuesChanged)
@@ -93,8 +93,8 @@ public:
bool hasQuick3DImport() const;
void setHasQuick3DImport(bool b);
- bool hasMaterialRoot() const;
- void setHasMaterialRoot(bool b);
+ bool hasMaterialLibrary() const;
+ void setHasMaterialLibrary(bool b);
bool hasModelSelection() const;
void setHasModelSelection(bool b);
@@ -132,7 +132,7 @@ signals:
void hasAliasExportChanged();
void hasActiveTimelineChanged();
void hasQuick3DImportChanged();
- void hasMaterialRootChanged();
+ void hasMaterialLibraryChanged();
void hasModelSelectionChanged();
private:
@@ -161,7 +161,7 @@ private:
bool m_aliasExport = false;
bool m_hasActiveTimeline = false;
bool m_hasQuick3DImport = false;
- bool m_hasMaterialRoot = false;
+ bool m_hasMaterialLibrary = false;
bool m_hasModelSelection = false;
ModelNode m_selectedMaterial;
diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
index 379ccc411ac..e93f99cb7d2 100644
--- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
+++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.cpp
@@ -61,6 +61,8 @@ MaterialEditorView::MaterialEditorView(ExternalDependenciesInterface &externalDe
if (model() && model()->rewriterView() && !model()->rewriterView()->hasIncompleteTypeInformation()
&& model()->rewriterView()->errors().isEmpty()) {
ensureMaterialLibraryNode();
+ if (m_qmlBackEnd && m_qmlBackEnd->contextObject())
+ m_qmlBackEnd->contextObject()->setHasMaterialLibrary(materialLibraryNode().isValid());
m_ensureMatLibTimer.stop();
}
});
@@ -534,7 +536,7 @@ void MaterialEditorView::setupQmlBackend()
QString specificQmlData;
QString currentTypeName;
- if (m_selectedMaterial.isValid() && m_hasQuick3DImport) {
+ if (m_selectedMaterial.isValid() && m_hasQuick3DImport && (materialLibraryNode().isValid() || m_hasMaterialRoot)) {
qmlPaneUrl = QUrl::fromLocalFile(materialEditorResourcesPath() + "/MaterialEditorPane.qml");
TypeName diffClassName;
@@ -587,7 +589,7 @@ void MaterialEditorView::setupQmlBackend()
currentQmlBackend->widget()->installEventFilter(this);
currentQmlBackend->contextObject()->setHasQuick3DImport(m_hasQuick3DImport);
- currentQmlBackend->contextObject()->setHasMaterialRoot(m_hasMaterialRoot);
+ currentQmlBackend->contextObject()->setHasMaterialLibrary(materialLibraryNode().isValid());
currentQmlBackend->contextObject()->setSpecificQmlData(specificQmlData);
currentQmlBackend->contextObject()->setCurrentType(currentTypeName);
@@ -781,6 +783,7 @@ void MaterialEditorView::modelAboutToBeDetached(Model *model)
AbstractView::modelAboutToBeDetached(model);
m_dynamicPropertiesModel->reset();
m_qmlBackEnd->materialEditorTransaction()->end();
+ m_qmlBackEnd->contextObject()->setHasMaterialLibrary(false);
}
void MaterialEditorView::propertiesRemoved(const QList &propertyList)
@@ -1103,6 +1106,21 @@ void MaterialEditorView::customNotification([[maybe_unused]] const AbstractView
}
}
+void MaterialEditorView::nodeReparented(const ModelNode &node,
+ const NodeAbstractProperty &newPropertyParent,
+ const NodeAbstractProperty &oldPropertyParent,
+ PropertyChangeFlags propertyChange)
+{
+ if (node.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject())
+ m_qmlBackEnd->contextObject()->setHasMaterialLibrary(true);
+}
+
+void MaterialEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode)
+{
+ if (removedNode.id() == Constants::MATERIAL_LIB_ID && m_qmlBackEnd && m_qmlBackEnd->contextObject())
+ m_qmlBackEnd->contextObject()->setHasMaterialLibrary(false);
+}
+
void QmlDesigner::MaterialEditorView::highlightSupportedProperties(bool highlight)
{
if (!m_selectedMaterial.isValid())
diff --git a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h
index 5c0a59d3a0e..c0880c738bc 100644
--- a/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h
+++ b/src/plugins/qmldesigner/components/materialeditor/materialeditorview.h
@@ -62,6 +62,10 @@ public:
void importsChanged(const QList &addedImports, const QList &removedImports) override;
void customNotification(const AbstractView *view, const QString &identifier,
const QList &nodeList, const QList &data) override;
+ void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent,
+ const NodeAbstractProperty &oldPropertyParent,
+ AbstractView::PropertyChangeFlags propertyChange) override;
+ void nodeAboutToBeRemoved(const ModelNode &removedNode) override;
void dragStarted(QMimeData *mimeData) override;
void dragEnded() override;
diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
index 8f937f97958..fe5d5a18ca8 100644
--- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp
@@ -806,8 +806,11 @@ void AbstractView::changeRootNodeType(const TypeName &type, int majorVersion, in
void AbstractView::ensureMaterialLibraryNode()
{
ModelNode matLib = modelNodeForId(Constants::MATERIAL_LIB_ID);
- if (matLib.isValid() || rootModelNode().metaInfo().isQtQuick3DMaterial())
+ if (matLib.isValid()
+ || (!rootModelNode().metaInfo().isQtQuick3DNode()
+ && !rootModelNode().metaInfo().isQtQuickItem())) {
return;
+ }
executeInTransaction(__FUNCTION__, [&] {
// Create material library node
diff --git a/tests/unit/mockup/qmldesigner/designercore/include/nodemetainfo.h b/tests/unit/mockup/qmldesigner/designercore/include/nodemetainfo.h
index 9a350961032..f898f752152 100644
--- a/tests/unit/mockup/qmldesigner/designercore/include/nodemetainfo.h
+++ b/tests/unit/mockup/qmldesigner/designercore/include/nodemetainfo.h
@@ -76,6 +76,7 @@ public:
bool isQtQuick3DModel() const { return {}; }
bool isQtQuick3DMaterial() const { return {}; }
bool isQtQuickLoader() const { return {}; }
+ bool isQtQuickItem() const { return {}; }
QString importDirectoryPath() const { return {}; }