summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Ghinet <samuel.ghinet@qt.io>2022-11-25 20:02:30 +0200
committerSamuel Ghinet <samuel.ghinet@qt.io>2022-12-02 12:34:57 +0000
commit728605b2ae903f786dd26346635d368fddef0c69 (patch)
tree08e30125b2b2a9098a13ecf7b7d13971bcbe8df8
parent16ec1ab67fb5728e56aa0a57ca7fb478a0de7b89 (diff)
downloadqt-creator-728605b2ae903f786dd26346635d368fddef0c69.tar.gz
Refactor: Extract the code for adding a texture
Task-number: QDS-8344 Change-Id: I433e2beb3ffd6346ea37e093705943b0701efd3d Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--src/plugins/qmldesigner/CMakeLists.txt2
-rw-r--r--src/plugins/qmldesigner/components/addtexture.h10
-rw-r--r--src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp14
-rw-r--r--src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h6
-rw-r--r--src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h3
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp45
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h3
-rw-r--r--src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h2
-rw-r--r--src/plugins/qmldesigner/components/createtexture.cpp116
-rw-r--r--src/plugins/qmldesigner/components/createtexture.h43
-rw-r--r--src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h2
11 files changed, 194 insertions, 52 deletions
diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt
index 01fd880263..e3e1122abc 100644
--- a/src/plugins/qmldesigner/CMakeLists.txt
+++ b/src/plugins/qmldesigner/CMakeLists.txt
@@ -588,7 +588,7 @@ extend_qtc_plugin(QmlDesigner
PUBLIC_INCLUDES components
DEFINES QMLDESIGNERCOMPONENTS_LIBRARY
SOURCES
- addtexture.h
+ createtexture.cpp createtexture.h
qmldesignercomponents_global.h
)
diff --git a/src/plugins/qmldesigner/components/addtexture.h b/src/plugins/qmldesigner/components/addtexture.h
deleted file mode 100644
index 8547b4bf84..0000000000
--- a/src/plugins/qmldesigner/components/addtexture.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (C) 2022 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
-
-#pragma once
-
-namespace QmlDesigner {
-
-enum class AddTextureMode { Image, Texture, LightProbe };
-
-} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp
index 94e8c6412e..ef6aa9f610 100644
--- a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp
+++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp
@@ -4,7 +4,9 @@
#include "assetslibraryview.h"
#include "assetslibrarywidget.h"
+#include "createtexture.h"
#include "qmldesignerplugin.h"
+
#include <asynchronousimagecache.h>
#include <bindingproperty.h>
#include <coreplugin/icore.h>
@@ -44,6 +46,7 @@ public:
AssetsLibraryView::AssetsLibraryView(ExternalDependenciesInterface &externalDependencies)
: AbstractView{externalDependencies}
+ , m_createTextures{this, false}
{}
AssetsLibraryView::~AssetsLibraryView()
@@ -62,9 +65,9 @@ WidgetInfo AssetsLibraryView::widgetInfo()
connect(m_widget, &AssetsLibraryWidget::addTexturesRequested, this,
[&] (const QStringList &filePaths, AddTextureMode mode) {
- // to MaterialBrowserView
- emitCustomNotification("add_textures", {}, {"AssetsLibraryView::widgetInfo",
- filePaths, QVariant::fromValue(mode), false});
+ executeInTransaction("AssetsLibraryView::widgetInfo", [&]() {
+ m_createTextures.execute(filePaths, mode, m_sceneId);
+ });
});
}
@@ -111,4 +114,9 @@ AssetsLibraryView::ImageCacheData *AssetsLibraryView::imageCacheData()
return m_imageCacheData.get();
}
+void AssetsLibraryView::active3DSceneChanged(qint32 sceneId)
+{
+ m_sceneId = sceneId;
+}
+
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h
index 4194195ec5..95a4c868d5 100644
--- a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h
+++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h
@@ -3,7 +3,8 @@
#pragma once
-#include <abstractview.h>
+#include "abstractview.h"
+#include "createtexture.h"
#include <QPointer>
@@ -30,6 +31,7 @@ public:
void modelAboutToBeDetached(Model *model) override;
void setResourcePath(const QString &resourcePath);
+ void active3DSceneChanged(qint32 sceneId) override;
private:
class ImageCacheData;
@@ -39,6 +41,8 @@ private:
std::unique_ptr<ImageCacheData> m_imageCacheData;
QPointer<AssetsLibraryWidget> m_widget;
QString m_lastResourcePath;
+ CreateTextures m_createTextures;
+ qint32 m_sceneId = -1;
};
}
diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h
index 4d8737518a..90a7038b5d 100644
--- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h
+++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h
@@ -4,8 +4,9 @@
#pragma once
#include <previewtooltip/previewtooltipbackend.h>
-#include "addtexture.h"
+
#include "assetslibrarymodel.h"
+#include "createtexture.h"
#include <QFileIconProvider>
#include <QFrame>
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
index 58c677039f..856d4077e1 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp
@@ -4,12 +4,11 @@
#include "contentlibraryview.h"
#include "contentlibrarybundleimporter.h"
-#include "contentlibrarywidget.h"
#include "contentlibrarymaterial.h"
#include "contentlibrarymaterialsmodel.h"
#include "contentlibrarytexture.h"
#include "contentlibrarytexturesmodel.h"
-#include "modelnodeoperations.h"
+#include "contentlibrarywidget.h"
#include "nodelistproperty.h"
#include "qmldesignerconstants.h"
#include "qmlobjectnode.h"
@@ -31,6 +30,7 @@ namespace QmlDesigner {
ContentLibraryView::ContentLibraryView(ExternalDependenciesInterface &externalDependencies)
: AbstractView(externalDependencies)
+ , m_createTexture(this, true)
{}
ContentLibraryView::~ContentLibraryView()
@@ -54,14 +54,20 @@ WidgetInfo ContentLibraryView::widgetInfo()
[&] (QmlDesigner::ContentLibraryTexture *tex) {
m_draggedBundleTexture = tex;
});
+
connect(m_widget, &ContentLibraryWidget::addTextureRequested, this,
[&] (const QString &texPath, AddTextureMode mode) {
- emitCustomNotification("add_texture", {}, {"ContentLibraryView::widgetInfo",
- texPath, QVariant::fromValue(mode), true});
+ executeInTransaction("ContentLibraryView::widgetInfo", [&]() {
+ m_createTexture.execute(texPath, mode, m_sceneId);
+ });
});
- connect(m_widget, &ContentLibraryWidget::updateSceneEnvStateRequested,
- this, &ContentLibraryView::resolveSceneEnv);
+ connect(m_widget, &ContentLibraryWidget::updateSceneEnvStateRequested, this, [&]() {
+ ModelNode activeSceneEnv = m_createTexture.resolveSceneEnv(m_sceneId);
+ const bool sceneEnvExists = activeSceneEnv.isValid();
+ m_widget->texturesModel()->setHasSceneEnv(sceneEnvExists);
+ m_widget->environmentsModel()->setHasSceneEnv(sceneEnvExists);
+ });
ContentLibraryMaterialsModel *materialsModel = m_widget->materialsModel().data();
@@ -318,33 +324,6 @@ ModelNode ContentLibraryView::createMaterial(const NodeMetaInfo &metaInfo)
return newMatNode;
}
-ModelNode ContentLibraryView::resolveSceneEnv()
-{
- ModelNode activeSceneEnv;
-
- if (m_sceneId != -1) {
- ModelNode activeScene = active3DSceneNode();
- if (activeScene.isValid()) {
- QmlObjectNode view3D;
- if (activeScene.metaInfo().isQtQuick3DView3D()) {
- view3D = activeScene;
- } else {
- ModelNode sceneParent = activeScene.parentProperty().parentModelNode();
- if (sceneParent.metaInfo().isQtQuick3DView3D())
- view3D = sceneParent;
- }
- if (view3D.isValid())
- activeSceneEnv = modelNodeForId(view3D.expression("environment"));
- }
- }
-
- const bool sceneEnvExists = activeSceneEnv.isValid();
- m_widget->texturesModel()->setHasSceneEnv(sceneEnvExists);
- m_widget->environmentsModel()->setHasSceneEnv(sceneEnvExists);
-
- return activeSceneEnv;
-}
-
void ContentLibraryView::updateBundleMaterialsImportedState()
{
using namespace Utils;
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
index c54ec924d0..46055f49a9 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.h
@@ -3,6 +3,7 @@
#pragma once
+#include "createtexture.h"
#include "abstractview.h"
#include "nodemetainfo.h"
@@ -47,7 +48,6 @@ private:
void applyBundleMaterialToDropTarget(const ModelNode &bundleMat, const NodeMetaInfo &metaInfo = {});
ModelNode getBundleMaterialDefaultInstance(const TypeName &type);
ModelNode createMaterial(const NodeMetaInfo &metaInfo);
- ModelNode resolveSceneEnv();
QPointer<ContentLibraryWidget> m_widget;
QList<ModelNode> m_bundleMaterialTargets;
@@ -57,6 +57,7 @@ private:
bool m_bundleMaterialAddToSelected = false;
bool m_hasQuick3DImport = false;
qint32 m_sceneId = -1;
+ CreateTexture m_createTexture;
};
} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h
index f6866e0309..ea41027a67 100644
--- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h
+++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h
@@ -3,7 +3,7 @@
#pragma once
-#include "addtexture.h"
+#include "createtexture.h"
#include <QFrame>
#include <QPointer>
diff --git a/src/plugins/qmldesigner/components/createtexture.cpp b/src/plugins/qmldesigner/components/createtexture.cpp
new file mode 100644
index 0000000000..5a1c1e36f3
--- /dev/null
+++ b/src/plugins/qmldesigner/components/createtexture.cpp
@@ -0,0 +1,116 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
+
+#include "createtexture.h"
+
+#include "abstractview.h"
+#include "modelnodeoperations.h"
+#include "nodelistproperty.h"
+#include "nodemetainfo.h"
+#include "qmlobjectnode.h"
+#include "variantproperty.h"
+
+#include <coreplugin/messagebox.h>
+
+#include <QTimer>
+
+namespace QmlDesigner {
+
+CreateTexture::CreateTexture(AbstractView *view, bool importFile)
+ : m_view{view}
+ , m_importFile{importFile}
+{}
+
+void CreateTexture::execute(const QString &filePath, AddTextureMode mode, int sceneId)
+{
+ if (m_importFile && !addFileToProject(filePath))
+ return;
+
+ ModelNode texture = createTextureFromImage(filePath, mode);
+ if (!texture.isValid())
+ return;
+
+ if (mode == AddTextureMode::LightProbe && sceneId != -1)
+ assignTextureAsLightProbe(texture, sceneId);
+
+ QTimer::singleShot(0, m_view, [this, texture]() {
+ if (m_view->model())
+ m_view->emitCustomNotification("selected_texture_changed", {texture});
+ });
+}
+
+bool CreateTexture::addFileToProject(const QString &filePath)
+{
+ AddFilesResult result = ModelNodeOperations::addImageToProject({filePath}, "images", false);
+
+ if (result.status() == AddFilesResult::Failed) {
+ Core::AsynchronousMessageBox::warning(QObject::tr("Failed to Add Texture"),
+ QObject::tr("Could not add %1 to project.").arg(filePath));
+ return false;
+ }
+
+ return true;
+}
+
+ModelNode CreateTexture::createTextureFromImage(const QString &assetPath, AddTextureMode mode)
+{
+ if (mode != AddTextureMode::Texture && mode != AddTextureMode::LightProbe)
+ return {};
+
+ ModelNode matLib = m_view->materialLibraryNode();
+ if (!matLib.isValid())
+ return {};
+
+ NodeMetaInfo metaInfo = m_view->model()->qtQuick3DTextureMetaInfo();
+
+ QString sourceVal = QLatin1String("images/%1").arg(assetPath.split('/').last());
+ ModelNode newTexNode = m_view->getTextureDefaultInstance(sourceVal);
+ if (!newTexNode.isValid()) {
+ newTexNode = m_view->createModelNode("QtQuick3D.Texture",
+ metaInfo.majorVersion(),
+ metaInfo.minorVersion());
+ newTexNode.validId();
+ VariantProperty sourceProp = newTexNode.variantProperty("source");
+ sourceProp.setValue(sourceVal);
+ matLib.defaultNodeListProperty().reparentHere(newTexNode);
+ }
+
+ return newTexNode;
+}
+
+void CreateTexture::assignTextureAsLightProbe(const ModelNode &texture, int sceneId)
+{
+ ModelNode sceneEnvNode = resolveSceneEnv(sceneId);
+ QmlObjectNode sceneEnv = sceneEnvNode;
+ if (sceneEnv.isValid()) {
+ sceneEnv.setBindingProperty("lightProbe", texture.id());
+ sceneEnv.setVariantProperty("backgroundMode",
+ QVariant::fromValue(Enumeration("SceneEnvironment",
+ "SkyBox")));
+ }
+}
+
+ModelNode CreateTexture::resolveSceneEnv(int sceneId)
+{
+ ModelNode activeSceneEnv;
+
+ if (sceneId != -1) {
+ ModelNode activeScene = m_view->active3DSceneNode();
+ if (activeScene.isValid()) {
+ QmlObjectNode view3D;
+ if (activeScene.metaInfo().isQtQuick3DView3D()) {
+ view3D = activeScene;
+ } else {
+ ModelNode sceneParent = activeScene.parentProperty().parentModelNode();
+ if (sceneParent.metaInfo().isQtQuick3DView3D())
+ view3D = sceneParent;
+ }
+ if (view3D.isValid())
+ activeSceneEnv = m_view->modelNodeForId(view3D.expression("environment"));
+ }
+ }
+
+ return activeSceneEnv;
+}
+
+} // namespace QmlDesigner
diff --git a/src/plugins/qmldesigner/components/createtexture.h b/src/plugins/qmldesigner/components/createtexture.h
new file mode 100644
index 0000000000..ba29397c20
--- /dev/null
+++ b/src/plugins/qmldesigner/components/createtexture.h
@@ -0,0 +1,43 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
+
+#pragma once
+
+#include <modelnode.h>
+
+namespace QmlDesigner {
+
+class AbstractView;
+
+enum class AddTextureMode { Image, Texture, LightProbe };
+
+class CreateTexture
+{
+public:
+ CreateTexture(AbstractView *view, bool importFiles = false);
+ void execute(const QString &filePath, AddTextureMode mode, int sceneId);
+ ModelNode resolveSceneEnv(int sceneId);
+
+private:
+ bool addFileToProject(const QString &filePath);
+ ModelNode createTextureFromImage(const QString &assetPath, AddTextureMode mode);
+
+ void assignTextureAsLightProbe(const ModelNode &texture, int sceneId);
+
+private:
+ AbstractView *m_view = nullptr;
+ bool m_importFile = false;
+};
+
+class CreateTextures : public CreateTexture
+{
+public:
+ using CreateTexture::CreateTexture;
+ void execute(const QStringList &filePaths, AddTextureMode mode, int sceneId)
+ {
+ for (const QString &path : filePaths)
+ CreateTexture::execute(path, mode, sceneId);
+ }
+};
+
+}
diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h
index 5b16c0e626..2f8113a164 100644
--- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h
+++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserview.h
@@ -4,7 +4,7 @@
#pragma once
#include "abstractview.h"
-#include "addtexture.h"
+#include "createtexture.h"
#include <QPointer>
#include <QSet>