diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml index 2ad2a317ed4..a223668dc9b 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml @@ -44,8 +44,18 @@ Rectangle { ToolTip { visible: mouseArea.containsMouse - text: textureSource ? textureSource : qsTr("Texture has no source image.") + // contentWidth is not calculated correctly by the toolTip (resulting in a wider tooltip than + // needed). Using a helper Text to calculate the correct width + contentWidth: helperText.width + bottomInset: -2 + text: textureToolTip delay: 1000 + + Text { + id: helperText + text: textureToolTip + visible: false + } } Image { diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp index e3ed0870b22..f348580937d 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp @@ -3,6 +3,7 @@ #include "materialbrowsertexturesmodel.h" +#include "designeractionmanager.h" #include "designmodewidget.h" #include "qmldesignerplugin.h" #include "qmlobjectnode.h" @@ -31,8 +32,7 @@ QVariant MaterialBrowserTexturesModel::data(const QModelIndex &index, int role) QTC_ASSERT(index.isValid() && index.row() < m_textureList.count(), return {}); QTC_ASSERT(roleNames().contains(role), return {}); - QByteArray roleName = roleNames().value(role); - if (roleName == "textureSource") { + if (role == RoleTexSource) { QString source = QmlObjectNode(m_textureList.at(index.row())).modelValue("source").toString(); if (source.isEmpty()) return {}; @@ -42,15 +42,36 @@ QVariant MaterialBrowserTexturesModel::data(const QModelIndex &index, int role) ->fileName().absolutePath().pathAppended(source).cleanPath().toString()); } - if (roleName == "textureVisible") + if (role == RoleTexVisible) return isTextureVisible(index.row()); - if (roleName == "hasDynamicProperties") + if (role == RoleTexHasDynamicProps) return !m_textureList.at(index.row()).dynamicProperties().isEmpty(); - if (roleName == "textureInternalId") + if (role == RoleTexInternalId) return m_textureList.at(index.row()).internalId(); + if (role == RoleTexToolTip) { + QString source = QmlObjectNode(m_textureList.at(index.row())).modelValue("source").toString(); + if (source.isEmpty()) + return tr("Texture has no source image."); + + const QString noData = tr("Texture has no data."); + + auto op = QmlDesignerPlugin::instance()->viewManager().designerActionManager() + .modelNodePreviewOperation(m_textureList.at(index.row())); + if (!op) + return noData; + + QVariantMap imgMap = op(m_textureList.at(index.row())).toMap(); + if (imgMap.isEmpty()) + return noData; + + return QLatin1String("%1\n%2\n%3").arg(imgMap.value("id").toString(), + source.split('/').last(), + imgMap.value("info").toString()); + } + return {}; } @@ -68,14 +89,14 @@ bool MaterialBrowserTexturesModel::isValidIndex(int idx) const return idx > -1 && idx < rowCount(); } - QHash MaterialBrowserTexturesModel::roleNames() const { static const QHash roles { - {Qt::UserRole + 1, "textureSource"}, - {Qt::UserRole + 2, "textureVisible"}, - {Qt::UserRole + 3, "hasDynamicProperties"}, - {Qt::UserRole + 4, "textureInternalId"} + {RoleTexHasDynamicProps, "hasDynamicProperties"}, + {RoleTexInternalId, "textureInternalId"}, + {RoleTexSource, "textureSource"}, + {RoleTexToolTip, "textureToolTip"}, + {RoleTexVisible, "textureVisible"} }; return roles; } @@ -181,12 +202,12 @@ void MaterialBrowserTexturesModel::updateTextureSource(const ModelNode &texture) { int idx = textureIndex(texture); if (idx != -1) - emit dataChanged(index(idx, 0), index(idx, 0), {roleNames().key("textureSource")}); + emit dataChanged(index(idx, 0), index(idx, 0), {RoleTexSource, RoleTexToolTip}); } void MaterialBrowserTexturesModel::updateAllTexturesSources() { - emit dataChanged(index(0, 0), index(rowCount() - 1, 0), {roleNames().key("textureSource")}); + emit dataChanged(index(0, 0), index(rowCount() - 1, 0), {RoleTexSource, RoleTexToolTip}); } void MaterialBrowserTexturesModel::updateSelectedTexture() diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h index c99d7511ea9..c12b0be93e2 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.h @@ -87,6 +87,12 @@ private: bool m_isEmpty = true; bool m_hasSingleModelSelection = false; bool m_hasSceneEnv = false; + + const static int RoleTexHasDynamicProps = Qt::UserRole + 1; + const static int RoleTexInternalId = Qt::UserRole + 2; + const static int RoleTexSource = Qt::UserRole + 3; + const static int RoleTexToolTip = Qt::UserRole + 4; + const static int RoleTexVisible = Qt::UserRole + 5; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 534ee4c4922..1f4df699481 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -323,12 +323,18 @@ void MaterialBrowserView::modelNodePreviewPixmapChanged(const ModelNode &node, c m_widget->updateMaterialPreview(node, pixmap); } +void MaterialBrowserView::nodeIdChanged(const ModelNode &node, [[maybe_unused]] const QString &newId, + [[maybe_unused]] const QString &oldId) +{ + if (isTexture(node)) + m_widget->materialBrowserTexturesModel()->updateTextureSource(node); +} + void MaterialBrowserView::variantPropertiesChanged(const QList &propertyList, [[maybe_unused]] PropertyChangeFlags propertyChange) { for (const VariantProperty &property : propertyList) { ModelNode node(property.parentModelNode()); - if (isMaterial(node) && property.name() == "objectName") { m_widget->materialBrowserModel()->updateMaterialName(node); } else if (property.name() == "source") { diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h index b78d54e1660..0d2ec42af0d 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h @@ -36,6 +36,7 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; void modelNodePreviewPixmapChanged(const ModelNode &node, const QPixmap &pixmap) override; + void nodeIdChanged(const ModelNode &node, const QString &newId, const QString &oldId) override; void variantPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) override; void propertiesRemoved(const QList &propertyList) override; void nodeReparented(const ModelNode &node, const NodeAbstractProperty &newPropertyParent,