diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp index 1c555890f2d..0547d7267da 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace QmlDesigner { @@ -80,10 +81,13 @@ void AssetsLibraryView::customNotification(const AbstractView * /*view*/, const QList & /*nodeList*/, const QList & /*data*/) { - if (identifier == "delete_selected_assets") + if (identifier == "delete_selected_assets") { m_widget->deleteSelectedAssets(); - else if (identifier == "asset_import_finished") + } else if (identifier == "asset_import_finished") { + // TODO: This custom notification should be removed once QDS-15163 is fixed and + // exportedTypeNamesChanged notification is reliable m_3dImportsSyncTimer.start(); + } } void AssetsLibraryView::modelAttached(Model *model) @@ -104,6 +108,13 @@ void AssetsLibraryView::modelAboutToBeDetached(Model *model) m_3dImportsSyncTimer.stop(); } +void AssetsLibraryView::exportedTypeNamesChanged(const ExportedTypeNames &added, + const ExportedTypeNames &removed) +{ + if (Utils3D::hasImported3dType(this, added, removed)) + m_3dImportsSyncTimer.start(); +} + void AssetsLibraryView::setResourcePath(const QString &resourcePath) { if (resourcePath == m_lastResourcePath) @@ -148,10 +159,6 @@ void AssetsLibraryView::sync3dImports() if (!model()) return; - // TODO: Once project storage supports notifications for new and removed types, - // sync3dImports() should be called in that case as well. - // Also, custom notification "asset_import_finished" should not be necessary in that case. - // Sync generated 3d imports to .q3d files in project content const GeneratedComponentUtils &compUtils = QmlDesignerPlugin::instance()->documentManager().generatedComponentUtils(); diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h index 2dc8f47cdf4..4eafc0f68cb 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibraryview.h @@ -33,6 +33,9 @@ public: // AbstractView void modelAttached(Model *model) override; void modelAboutToBeDetached(Model *model) override; + void exportedTypeNamesChanged(const ExportedTypeNames &added, + const ExportedTypeNames &removed) override; + void setResourcePath(const QString &resourcePath); private: diff --git a/src/plugins/qmldesigner/components/componentcore/utils3d.cpp b/src/plugins/qmldesigner/components/componentcore/utils3d.cpp index 3121ed9cdfb..11e3a9a4e21 100644 --- a/src/plugins/qmldesigner/components/componentcore/utils3d.cpp +++ b/src/plugins/qmldesigner/components/componentcore/utils3d.cpp @@ -566,5 +566,24 @@ void openNodeInPropertyEditor(const ModelNode &node) node.view()->emitCustomNotification("force_editing_node", {node}); // To PropertyEditor } +bool hasImported3dType(AbstractView *view, + const AbstractView::ExportedTypeNames &added, + const AbstractView::ExportedTypeNames &removed) +{ + QTC_ASSERT(view && view->model(), return false); + + using Storage::Info::ExportedTypeName; + + const QByteArray import3dPrefix = QmlDesignerPlugin::instance()->documentManager() + .generatedComponentUtils().import3dTypePrefix().toUtf8(); + + auto generatedModuleIds = view->model()->moduleIdsStartsWith(import3dPrefix, + Storage::ModuleKind::QmlLibrary); + std::ranges::sort(generatedModuleIds); + + return Utils::set_has_common_element(added, generatedModuleIds, {}, &ExportedTypeName::moduleId) + || Utils::set_has_common_element(removed, generatedModuleIds, {}, &ExportedTypeName::moduleId); +} + } // namespace Utils3D } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/utils3d.h b/src/plugins/qmldesigner/components/componentcore/utils3d.h index 2bc17366207..c1cacb9ac46 100644 --- a/src/plugins/qmldesigner/components/componentcore/utils3d.h +++ b/src/plugins/qmldesigner/components/componentcore/utils3d.h @@ -52,7 +52,9 @@ void duplicateMaterial(AbstractView *view, const ModelNode &material); bool addQuick3DImportAndView3D(AbstractView *view, bool suppressWarningDialog = false); void assignMaterialTo3dModel(AbstractView *view, const ModelNode &modelNode, const ModelNode &materialNode = {}); - +bool hasImported3dType(AbstractView *view, + const AbstractView::ExportedTypeNames &added, + const AbstractView::ExportedTypeNames &removed); } // namespace Utils3D } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index fdfecebdf58..11edda9005e 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -317,8 +317,6 @@ void Edit3DView::modelAttached(Model *model) m_isBakingLightsSupported = qtVer->qtVersion() >= QVersionNumber(6, 5, 0); } #ifdef QDS_USE_PROJECTSTORAGE - // TODO: Handle actual entries changed signal/notification once it is available. - // Until then, we simply get what entries are available at model attach time. onEntriesChanged(); #else connect(model->metaInfo().itemLibraryInfo(), @@ -462,7 +460,9 @@ void Edit3DView::customNotification([[maybe_unused]] const AbstractView *view, self->m_pickView3dNode = self->modelNodeForInternalId(qint32(data[1].toInt())); }); } else if (identifier == "asset_import_finished" || identifier == "assets_deleted") { - handleEntriesChanged(); + // TODO: These custom notifications should be removed once QDS-15163 is fixed and + // exportedTypeNamesChanged notification is reliable + onEntriesChanged(); } } @@ -571,6 +571,13 @@ void Edit3DView::variantPropertiesChanged(const QList &property maybeStoreCurrentSceneEnvironment(propertyList); } +void Edit3DView::exportedTypeNamesChanged(const ExportedTypeNames &added, + const ExportedTypeNames &removed) +{ + if (Utils3D::hasImported3dType(this, added, removed)) + onEntriesChanged(); +} + void Edit3DView::sendInputEvent(QEvent *e) const { if (isAttached()) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index e89cf8cac22..0cc421c8566 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -80,7 +80,8 @@ public: PropertyChangeFlags propertyChange) override; void variantPropertiesChanged(const QList &propertyList, PropertyChangeFlags propertyChange) override; - + void exportedTypeNamesChanged(const ExportedTypeNames &added, + const ExportedTypeNames &removed) override; void sendInputEvent(QEvent *e) const; void edit3DViewResized(const QSize &size) const;