From 4612fb20b5d292a10f300f470bea9820ac64ef42 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Tue, 28 Mar 2023 01:58:46 +0300 Subject: [PATCH] QmlDesigner: Update assets context menu based on scene env state Also remove signals emitted from the assets widget to the view since the widget now has a reference to the view. Fixes: QDS-9467 Change-Id: I80a2aef4c35aeeb344cc71c890664e1645d4334a Reviewed-by: Miikka Heikkinen --- .../AssetsContextMenu.qml | 8 ++-- .../assetslibrary/assetslibraryview.cpp | 29 ------------ .../assetslibrary/assetslibraryview.h | 4 -- .../assetslibrary/assetslibrarywidget.cpp | 47 +++++++++++-------- .../assetslibrary/assetslibrarywidget.h | 24 +++++----- 5 files changed, 44 insertions(+), 68 deletions(-) diff --git a/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetsContextMenu.qml b/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetsContextMenu.qml index ba0a430b213..391c6220481 100644 --- a/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetsContextMenu.qml +++ b/share/qtcreator/qmldesigner/assetsLibraryQmlSources/AssetsContextMenu.qml @@ -31,7 +31,7 @@ StudioControls.Menu { { root.__showInGraphicalShellEnabled = true - rootView.updateHasMaterialLibrary() + rootView.updateContextMenuActionsEnableState() root.__onFolderCreated = onFolderCreated root.__fileIndex = "" @@ -46,7 +46,7 @@ StudioControls.Menu { { root.__showInGraphicalShellEnabled = true - rootView.updateHasMaterialLibrary() + rootView.updateContextMenuActionsEnableState() root.__onFolderCreated = onFolderCreated root.__dirPath = dirPath @@ -77,7 +77,7 @@ StudioControls.Menu { addTexturesItem.text = qsTr("Add Texture") } - rootView.updateHasMaterialLibrary() + rootView.updateContextMenuActionsEnableState() root.__onFolderCreated = onFolderCreated root.__selectedAssetPathsList = selectedAssetPathsList @@ -132,7 +132,7 @@ StudioControls.Menu { StudioControls.MenuItem { id: addLightProbes text: qsTr("Add Light Probe") - enabled: rootView.hasMaterialLibrary + enabled: rootView.hasMaterialLibrary && rootView.hasSceneEnv visible: root.__fileIndex && root.__selectedAssetPathsList.length === 1 && AssetsLibraryBackend.assetsModel.allFilePathsAreTextures(root.__selectedAssetPathsList) height: addLightProbes.visible ? addLightProbes.implicitHeight : 0 diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp index c888c116b39..c8bb96bb1ac 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp @@ -4,7 +4,6 @@ #include "assetslibraryview.h" #include "assetslibrarywidget.h" -#include "createtexture.h" #include "designmodecontext.h" #include "qmldesignerplugin.h" @@ -47,7 +46,6 @@ public: AssetsLibraryView::AssetsLibraryView(ExternalDependenciesInterface &externalDependencies) : AbstractView{externalDependencies} - , m_createTextures{this} {} AssetsLibraryView::~AssetsLibraryView() @@ -67,23 +65,6 @@ WidgetInfo AssetsLibraryView::widgetInfo() auto context = new Internal::AssetsLibraryContext(m_widget.data()); Core::ICore::addContextObject(context); - - connect(m_widget, &AssetsLibraryWidget::addTexturesRequested, this, - [&] (const QStringList &filePaths, AddTextureMode mode) { - executeInTransaction("AssetsLibraryView::widgetInfo", [&]() { - m_createTextures.execute(filePaths, mode, m_sceneId); - }); - }); - - connect(m_widget, &AssetsLibraryWidget::hasMaterialLibraryUpdateRequested, this, [&]() { - m_widget->setHasMaterialLibrary(model() && materialLibraryNode().isValid() - && model()->hasImport("QtQuick3D")); - }); - - connect(m_widget, &AssetsLibraryWidget::endDrag, this, [&]() { - if (model()) - model()->endDrag(); - }); } return createWidgetInfo(m_widget.data(), "Assets", WidgetInfo::LeftPane, 0, tr("Assets")); @@ -103,18 +84,13 @@ void AssetsLibraryView::modelAttached(Model *model) AbstractView::modelAttached(model); m_widget->clearSearchFilter(); - m_widget->setModel(model); setResourcePath(DocumentManager::currentResourcePath().toFileInfo().absoluteFilePath()); - - m_sceneId = model->active3DSceneId(); } void AssetsLibraryView::modelAboutToBeDetached(Model *model) { AbstractView::modelAboutToBeDetached(model); - - m_widget->setModel(nullptr); } void AssetsLibraryView::setResourcePath(const QString &resourcePath) @@ -141,9 +117,4 @@ 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 15979dc38b0..f1a408c303f 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h @@ -4,7 +4,6 @@ #pragma once #include "abstractview.h" -#include "createtexture.h" #include @@ -31,7 +30,6 @@ public: void modelAboutToBeDetached(Model *model) override; void setResourcePath(const QString &resourcePath); - void active3DSceneChanged(qint32 sceneId) override; private: class ImageCacheData; @@ -44,8 +42,6 @@ private: std::unique_ptr m_imageCacheData; QPointer m_widget; QString m_lastResourcePath; - CreateTextures m_createTextures; - qint32 m_sceneId = -1; }; } diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 5d6e87524b5..14110cc699a 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -6,9 +6,8 @@ #include "asset.h" #include "assetslibraryiconprovider.h" #include "assetslibrarymodel.h" -#include "designeractionmanager.h" #include "assetslibraryview.h" - +#include "designeractionmanager.h" #include "modelnodeoperations.h" #include "qmldesignerconstants.h" #include "qmldesignerplugin.h" @@ -58,7 +57,7 @@ bool AssetsLibraryWidget::eventFilter(QObject *obj, QEvent *event) if (obj == m_assetsWidget->quickWidget()) QMetaObject::invokeMethod(m_assetsWidget->rootObject(), "handleViewFocusOut"); } else if (event->type() == QMouseEvent::MouseMove) { - if (!m_assetsToDrag.isEmpty() && !m_model.isNull()) { + if (!m_assetsToDrag.isEmpty() && m_assetsView->model()) { QMouseEvent *me = static_cast(event); if ((me->globalPos() - m_dragStartPoint).manhattanLength() > 10) { QMimeData *mimeData = new QMimeData; @@ -70,8 +69,8 @@ bool AssetsLibraryWidget::eventFilter(QObject *obj, QEvent *event) mimeData->setUrls(urlsToDrag); - m_model->startDrag(mimeData, m_assetsIconProvider->requestPixmap(m_assetsToDrag[0], - nullptr, {128, 128})); + m_assetsView->model()->startDrag(mimeData, m_assetsIconProvider->requestPixmap( + m_assetsToDrag[0], nullptr, {128, 128})); m_assetsToDrag.clear(); } @@ -92,6 +91,7 @@ AssetsLibraryWidget::AssetsLibraryWidget(AsynchronousImageCache &asynchronousFon , m_assetsIconProvider{new AssetsLibraryIconProvider(synchronousFontImageCache)} , m_assetsModel{new AssetsLibraryModel(this)} , m_assetsView{view} + , m_createTextures{view} , m_assetsWidget{new StudioQuickWidget(this)} { setWindowTitle(tr("Assets Library", "Title of assets library widget")); @@ -225,22 +225,27 @@ int AssetsLibraryWidget::qtVersion() const void AssetsLibraryWidget::addTextures(const QStringList &filePaths) { - emit addTexturesRequested(filePaths, AddTextureMode::Texture); + m_assetsView->executeInTransaction(__FUNCTION__, [&] { + m_createTextures.execute(filePaths, AddTextureMode::Texture, + m_assetsView->model()->active3DSceneId()); + }); } void AssetsLibraryWidget::addLightProbe(const QString &filePath) { - emit addTexturesRequested({filePath}, AddTextureMode::LightProbe); + m_assetsView->executeInTransaction(__FUNCTION__, [&] { + m_createTextures.execute({filePath}, AddTextureMode::LightProbe, + m_assetsView->model()->active3DSceneId()); + }); } -void AssetsLibraryWidget::updateHasMaterialLibrary() +void AssetsLibraryWidget::updateContextMenuActionsEnableState() { - emit hasMaterialLibraryUpdateRequested(); -} + setHasMaterialLibrary(m_assetsView->materialLibraryNode().isValid() + && m_assetsView->model()->hasImport("QtQuick3D")); -bool AssetsLibraryWidget::hasMaterialLibrary() const -{ - return m_hasMaterialLibrary; + ModelNode activeSceneEnv = m_createTextures.resolveSceneEnv(m_assetsView->model()->active3DSceneId()); + setHasSceneEnv(activeSceneEnv.isValid()); } void AssetsLibraryWidget::setHasMaterialLibrary(bool enable) @@ -252,6 +257,15 @@ void AssetsLibraryWidget::setHasMaterialLibrary(bool enable) emit hasMaterialLibraryChanged(); } +void AssetsLibraryWidget::setHasSceneEnv(bool b) +{ + if (b == m_hasSceneEnv) + return; + + m_hasSceneEnv = b; + emit hasSceneEnvChanged(); +} + void AssetsLibraryWidget::invalidateThumbnail(const QString &id) { m_assetsIconProvider->invalidateThumbnail(id); @@ -331,7 +345,7 @@ void AssetsLibraryWidget::handleExtFilesDrop(const QList &simpleFilePaths, if (!complexFilePathStrings.empty()) addResources(complexFilePathStrings); - emit endDrag(); + m_assetsView->model()->endDrag(); } QSet AssetsLibraryWidget::supportedAssetSuffixes(bool complex) @@ -353,11 +367,6 @@ void AssetsLibraryWidget::openEffectMaker(const QString &filePath) ModelNodeOperations::openEffectMaker(filePath); } -void AssetsLibraryWidget::setModel(Model *model) -{ - m_model = model; -} - QString AssetsLibraryWidget::qmlSourcesPath() { #ifdef SHARE_QML_PATH diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h index 97a06104f4b..90ae46010a7 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h @@ -3,10 +3,10 @@ #pragma once -#include -#include - #include "createtexture.h" +#include "previewtooltipbackend.h" + +#include #include #include @@ -42,7 +42,8 @@ class AssetsLibraryWidget : public QFrame { Q_OBJECT - Q_PROPERTY(bool hasMaterialLibrary READ hasMaterialLibrary NOTIFY hasMaterialLibraryChanged) + Q_PROPERTY(bool hasMaterialLibrary MEMBER m_hasMaterialLibrary NOTIFY hasMaterialLibraryChanged) + Q_PROPERTY(bool hasSceneEnv MEMBER m_hasSceneEnv NOTIFY hasSceneEnvChanged) // Needed for a workaround for a bug where after drag-n-dropping an item, the ScrollView scrolls to a random position Q_PROPERTY(bool isDragging MEMBER m_isDragging NOTIFY isDraggingChanged) @@ -62,12 +63,8 @@ public: void updateModel(); void setResourcePath(const QString &resourcePath); - void setModel(Model *model); static QPair getAssetTypeAndData(const QString &assetPath); - bool hasMaterialLibrary() const; - void setHasMaterialLibrary(bool enable); - void deleteSelectedAssets(); Q_INVOKABLE void startDragAsset(const QStringList &assetPaths, const QPointF &mousePos); @@ -92,7 +89,7 @@ public: Q_INVOKABLE void addTextures(const QStringList &filePaths); Q_INVOKABLE void addLightProbe(const QString &filePaths); - Q_INVOKABLE void updateHasMaterialLibrary(); + Q_INVOKABLE void updateContextMenuActionsEnableState(); Q_INVOKABLE QString getUniqueEffectPath(const QString &parentFolder, const QString &effectName); Q_INVOKABLE bool createNewEffect(const QString &effectPath, bool openEffectMaker = true); @@ -108,9 +105,8 @@ signals: const QList &complexFilePaths, const QString &targetDirPath); void directoryCreated(const QString &path); - void addTexturesRequested(const QStringList &filePaths, QmlDesigner::AddTextureMode mode); - void hasMaterialLibraryUpdateRequested(); void hasMaterialLibraryChanged(); + void hasSceneEnvChanged(); void isDraggingChanged(); void endDrag(); void deleteSelectedAssetsRequested(); @@ -125,6 +121,9 @@ private: void updateSearch(); void setIsDragging(bool val); + void setHasMaterialLibrary(bool enable); + void setHasSceneEnv(bool b); + QSize m_itemIconSize; SynchronousImageCache &m_fontImageCache; @@ -132,17 +131,18 @@ private: AssetsLibraryIconProvider *m_assetsIconProvider = nullptr; AssetsLibraryModel *m_assetsModel = nullptr; AssetsLibraryView *m_assetsView = nullptr; + CreateTextures m_createTextures = nullptr; QScopedPointer m_assetsWidget; std::unique_ptr m_fontPreviewTooltipBackend; QShortcut *m_qmlSourceUpdateShortcut = nullptr; - QPointer m_model; QStringList m_assetsToDrag; bool m_updateRetry = false; QString m_filterText; QPoint m_dragStartPoint; bool m_hasMaterialLibrary = false; + bool m_hasSceneEnv = false; bool m_isDragging = false; };