From 7d482601770caf249480815a423ca5576b0cd378 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Mon, 31 Jul 2023 13:58:43 +0300 Subject: [PATCH] QmlDesigner: Prevent bundle effect add when no active 3D scene found Fixes: QDS-10205 Change-Id: I88f3e6f95ea9beab1470dd8057d2b01497c2caf0 Reviewed-by: Miikka Heikkinen Reviewed-by: Qt CI Patch Build Bot --- .../ContentLibraryEffectContextMenu.qml | 2 +- .../contentlibrary/contentlibraryview.cpp | 2 ++ .../contentlibrary/contentlibrarywidget.cpp | 14 ++++++++++++++ .../contentlibrary/contentlibrarywidget.h | 8 +++++++- .../qmldesigner/components/edit3d/edit3dwidget.cpp | 3 ++- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml index 3abbfe88ada..1e0bcf1eb40 100644 --- a/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml +++ b/share/qtcreator/qmldesigner/contentLibraryQmlSource/ContentLibraryEffectContextMenu.qml @@ -26,7 +26,7 @@ StudioControls.Menu { StudioControls.MenuItem { text: qsTr("Add an instance") - enabled: root.targetAvailable + enabled: root.targetAvailable && ContentLibraryBackend.rootView.hasActive3DScene onTriggered: ContentLibraryBackend.effectsModel.addInstance(root.targetItem) } diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp index 3f64f8d8b4f..241c8bdd500 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibraryview.cpp @@ -181,6 +181,7 @@ void ContentLibraryView::modelAttached(Model *model) m_sceneId = model->active3DSceneId(); + m_widget->setHasActive3DScene(m_sceneId != -1); m_widget->clearSearchFilter(); m_widget->effectsModel()->loadBundle(); @@ -214,6 +215,7 @@ void ContentLibraryView::importsChanged(const Imports &addedImports, const Impor void ContentLibraryView::active3DSceneChanged(qint32 sceneId) { m_sceneId = sceneId; + m_widget->setHasActive3DScene(m_sceneId != -1); } void ContentLibraryView::selectedNodesChanged(const QList &selectedNodeList, diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp index 78bc1f07c3c..1b5bdb8c768 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.cpp @@ -662,6 +662,20 @@ void ContentLibraryWidget::setHasMaterialLibrary(bool b) m_materialsModel->updateIsEmpty(); } +bool ContentLibraryWidget::hasActive3DScene() const +{ + return m_hasActive3DScene; +} + +void ContentLibraryWidget::setHasActive3DScene(bool b) +{ + if (m_hasActive3DScene == b) + return; + + m_hasActive3DScene = b; + emit hasActive3DSceneChanged(); +} + void ContentLibraryWidget::reloadQmlSource() { const QString materialBrowserQmlPath = qmlSourcesPath() + "/ContentLibrary.qml"; diff --git a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h index 9f9fd167c32..a5baa66dd1c 100644 --- a/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h +++ b/src/plugins/qmldesigner/components/contentlibrary/contentlibrarywidget.h @@ -29,8 +29,9 @@ class ContentLibraryWidget : public QFrame { Q_OBJECT - Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport NOTIFY hasQuick3DImportChanged) + Q_PROPERTY(bool hasQuick3DImport READ hasQuick3DImport NOTIFY hasQuick3DImportChanged) Q_PROPERTY(bool hasMaterialLibrary READ hasMaterialLibrary NOTIFY hasMaterialLibraryChanged) + Q_PROPERTY(bool hasActive3DScene READ hasActive3DScene WRITE setHasActive3DScene NOTIFY hasActive3DSceneChanged) // 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) @@ -49,6 +50,9 @@ public: bool hasMaterialLibrary() const; void setHasMaterialLibrary(bool b); + bool hasActive3DScene() const; + void setHasActive3DScene(bool b); + Q_INVOKABLE void handleSearchFilterChanged(const QString &filterText); void setMaterialsModel(QPointer newMaterialsModel); @@ -75,6 +79,7 @@ signals: void updateSceneEnvStateRequested(); void hasQuick3DImportChanged(); void hasMaterialLibraryChanged(); + void hasActive3DSceneChanged(); void isDraggingChanged(); protected: @@ -111,6 +116,7 @@ private: QPoint m_dragStartPoint; bool m_hasMaterialLibrary = false; + bool m_hasActive3DScene = false; bool m_hasQuick3DImport = false; bool m_isDragging = false; QString m_baseUrl; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 163cfc951ed..be0afacfaba 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -541,7 +541,8 @@ void Edit3DWidget::dragEnterEvent(QDragEnterEvent *dragEnterEvent) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_MATERIAL) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_BUNDLE_EFFECT) || dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_TEXTURE)) { - dragEnterEvent->acceptProposedAction(); + if (m_view->active3DSceneNode().isValid()) + dragEnterEvent->acceptProposedAction(); } else if (dragEnterEvent->mimeData()->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO)) { QByteArray data = dragEnterEvent->mimeData()->data(Constants::MIME_TYPE_ITEM_LIBRARY_INFO); if (!data.isEmpty()) {