From 6dfe3250837ba5e224e5809a75575600afa841d5 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 5 Dec 2022 14:22:13 +0200 Subject: QmlDesigner: Fix texture source path for newly created textures Fixes: QDS-8448 Change-Id: Ibaf51444f2dff8d3de95edd4c8afbc7bc2cd2241 Reviewed-by: Qt CI Bot Reviewed-by: Tim Jenssen --- .../materialBrowserQmlSource/TextureItem.qml | 4 +- .../componentcore/modelnodeoperations.cpp | 7 ++ .../components/componentcore/modelnodeoperations.h | 2 + .../qmldesigner/components/createtexture.cpp | 14 ++-- .../materialbrowsertexturesmodel.cpp | 7 +- .../materialbrowser/materialbrowserview.cpp | 84 ---------------------- .../materialbrowser/materialbrowserview.h | 3 - 7 files changed, 26 insertions(+), 95 deletions(-) diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml index 3492a1dfef..2ad2a317ed 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/TextureItem.qml @@ -43,10 +43,8 @@ Rectangle { } ToolTip { - property bool hasSource: textureSource.slice(-1) !== "/" - visible: mouseArea.containsMouse - text: hasSource ? textureSource : qsTr("Texture has no source image.") + text: textureSource ? textureSource : qsTr("Texture has no source image.") delay: 1000 } diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index e6693f8e5d..3a3dd7d683 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -1731,6 +1731,13 @@ bool validateEffect(const QString &effectPath) return true; } +Utils::FilePath getImagesDefaultDirectory() +{ + return Utils::FilePath::fromString( + getAssetDefaultDirectory( + "images", QmlDesignerPlugin::instance()->documentManager().currentProjectDirPath().toString())); +} + } // namespace ModelNodeOperations } //QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 5dcc20ff91..2e60b25319 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -125,6 +125,8 @@ QString getEffectIcon(const QString &effectPath); bool useLayerEffect(); bool validateEffect(const QString &effectPath); +Utils::FilePath getImagesDefaultDirectory(); + // ModelNodePreviewImageOperations QVariant previewImageDataForGenericNode(const ModelNode &modelNode); QVariant previewImageDataForImageNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/components/createtexture.cpp b/src/plugins/qmldesigner/components/createtexture.cpp index 5a1c1e36f3..c7ab9701a9 100644 --- a/src/plugins/qmldesigner/components/createtexture.cpp +++ b/src/plugins/qmldesigner/components/createtexture.cpp @@ -4,6 +4,7 @@ #include "createtexture.h" #include "abstractview.h" +#include "documentmanager.h" #include "modelnodeoperations.h" #include "nodelistproperty.h" #include "nodemetainfo.h" @@ -41,7 +42,8 @@ void CreateTexture::execute(const QString &filePath, AddTextureMode mode, int sc bool CreateTexture::addFileToProject(const QString &filePath) { - AddFilesResult result = ModelNodeOperations::addImageToProject({filePath}, "images", false); + AddFilesResult result = ModelNodeOperations::addImageToProject( + {filePath}, ModelNodeOperations::getImagesDefaultDirectory().toString(), false); if (result.status() == AddFilesResult::Failed) { Core::AsynchronousMessageBox::warning(QObject::tr("Failed to Add Texture"), @@ -63,12 +65,16 @@ ModelNode CreateTexture::createTextureFromImage(const QString &assetPath, AddTex NodeMetaInfo metaInfo = m_view->model()->qtQuick3DTextureMetaInfo(); - QString sourceVal = QLatin1String("images/%1").arg(assetPath.split('/').last()); + Utils::FilePath imagePath = ModelNodeOperations::getImagesDefaultDirectory() + .pathAppended(Utils::FilePath::fromString(assetPath).fileName()); + QString sourceVal = imagePath.relativePathFrom( + QmlDesigner::DocumentManager::currentFilePath()).toString(); + ModelNode newTexNode = m_view->getTextureDefaultInstance(sourceVal); if (!newTexNode.isValid()) { newTexNode = m_view->createModelNode("QtQuick3D.Texture", - metaInfo.majorVersion(), - metaInfo.minorVersion()); + metaInfo.majorVersion(), + metaInfo.minorVersion()); newTexNode.validId(); VariantProperty sourceProp = newTexNode.variantProperty("source"); sourceProp.setValue(sourceVal); diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp index 3f5fde5a7c..0184b1cae1 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowsertexturesmodel.cpp @@ -34,7 +34,12 @@ QVariant MaterialBrowserTexturesModel::data(const QModelIndex &index, int role) QByteArray roleName = roleNames().value(role); if (roleName == "textureSource") { QString source = m_textureList.at(index.row()).variantProperty("source").value().toString(); - return QVariant(DocumentManager::currentResourcePath().path() + '/' + source); + if (source.isEmpty()) + return {}; + if (Utils::FilePath::fromString(source).isAbsolutePath()) + return QVariant(source); + return QVariant(QmlDesignerPlugin::instance()->documentManager().currentDesignDocument() + ->fileName().absolutePath().pathAppended(source).cleanPath().toString()); } if (roleName == "textureVisible") diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp index 39b9efe13a..37fd15000d 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.cpp @@ -450,85 +450,7 @@ void MaterialBrowserView::customNotification(const AbstractView *view, applyTextureToModel3D(nodeList.at(0), nodeList.at(1)); } else if (identifier == "apply_texture_to_material") { applyTextureToMaterial({nodeList.at(0)}, nodeList.at(1)); - } else if (identifier == "add_textures") { - if (data.size() != 4) { - qWarning() << "Wrong number of arguments passed to add_textures: " << data.size(); - return; - } - - QByteArray identifier = data.at(0).toByteArray(); - QStringList filePaths = data.at(1).toStringList(); - AddTextureMode mode = data.at(2).value(); - bool addToProject = data.at(3).toBool(); - - executeInTransaction(identifier, [&] { - addTextures(filePaths, mode, addToProject); - }); - } else if (identifier == "add_texture") { - if (data.size() != 4) { - qWarning() << "Wrong number of arguments passed to add_texture: " << data.size(); - return; - } - - QByteArray identifier = data.at(0).toByteArray(); - QString filePath = data.at(1).toString(); - AddTextureMode mode = data.at(2).value(); - bool addToProject = data.at(3).toBool(); - - executeInTransaction(identifier, [&] { - addOneTexture(filePath, mode, addToProject); - }); - } -} - -void MaterialBrowserView::addOneTexture(const QString &texPath, AddTextureMode mode, bool addToProject) -{ - if (addToProject) { - // copy image to project - AddFilesResult result = ModelNodeOperations::addImageToProject({texPath}, "images", false); - - if (result.status() == AddFilesResult::Failed) { - Core::AsynchronousMessageBox::warning(tr("Failed to Add Texture"), - tr("Could not add %1 to project.").arg(texPath)); - return; - } } - - if (mode == AddTextureMode::Image) - return; - - // create a texture from the image - ModelNode matLib = materialLibraryNode(); - if (!matLib.isValid()) - return; - - NodeMetaInfo metaInfo = model()->metaInfo("QtQuick3D.Texture"); - - QString sourceVal = QLatin1String("images/%1").arg(texPath.split('/').last()); - ModelNode texNode = getTextureDefaultInstance(sourceVal); - if (!texNode.isValid()) { - texNode = createModelNode("QtQuick3D.Texture", metaInfo.majorVersion(), - metaInfo.minorVersion()); - texNode.validId(); - VariantProperty sourceProp = texNode.variantProperty("source"); - sourceProp.setValue(sourceVal); - matLib.defaultNodeListProperty().reparentHere(texNode); - } - - // assign the texture as scene environment's light probe - if (mode == AddTextureMode::LightProbe && m_sceneId != -1) { - QmlObjectNode sceneEnv = resolveSceneEnv(); - if (sceneEnv.isValid()) { - sceneEnv.setBindingProperty("lightProbe", texNode.id()); - sceneEnv.setVariantProperty("backgroundMode", - QVariant::fromValue(Enumeration("SceneEnvironment", - "SkyBox"))); - } - } - QTimer::singleShot(0, this, [this, texNode]() { - if (model() && texNode.isValid()) - emitCustomNotification("selected_texture_changed", {texNode}); - }); } void MaterialBrowserView::active3DSceneChanged(qint32 sceneId) @@ -559,12 +481,6 @@ ModelNode MaterialBrowserView::resolveSceneEnv() return activeSceneEnv; } -void MaterialBrowserView::addTextures(const QStringList &filePaths, AddTextureMode mode, bool addToProject) -{ - for (const QString &texPath : filePaths) - addOneTexture(texPath, mode, addToProject); -} - void MaterialBrowserView::instancesCompleted(const QVector &completedNodeList) { for (const ModelNode &node : completedNodeList) { diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h index 2f8113a164..22e6c6a8d8 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h @@ -69,9 +69,6 @@ private: void requestPreviews(); ModelNode resolveSceneEnv(); - void addOneTexture(const QString &filePath, AddTextureMode mode, bool addToProject); - void addTextures(const QStringList &texturePaths, AddTextureMode mode, bool addToProject); - AsynchronousImageCache &m_imageCache; QPointer m_widget; QList m_selectedModels; // selected 3D model nodes -- cgit v1.2.3