diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 175b081a35a..e5a8c1747aa 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -31,7 +31,6 @@ #include #include -#include #include #include #include @@ -324,10 +323,6 @@ void Edit3DView::addQuick3DImport() } else { model()->changeImports({import}, {}); } - - // Subcomponent manager update needed to make item library entries appear - QmlDesignerPlugin::instance()->currentDesignDocument() - ->updateSubcomponentManagerImport(import); return; } } diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 0b7d7fa2c92..2659ffbbd75 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -388,9 +388,9 @@ void DesignDocument::updateSubcomponentManager() currentModel()->imports() + currentModel()->possibleImports()); } -void DesignDocument::updateSubcomponentManagerImport(const Import &import) +void DesignDocument::addSubcomponentManagerImport(const Import &import) { - m_subComponentManager->updateImport(import); + m_subComponentManager->addAndParseImport(import); } void DesignDocument::deleteSelected() diff --git a/src/plugins/qmldesigner/components/integration/designdocument.h b/src/plugins/qmldesigner/components/integration/designdocument.h index 0e73c13e31c..0d80f344de1 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.h +++ b/src/plugins/qmldesigner/components/integration/designdocument.h @@ -69,7 +69,7 @@ public: void attachRewriterToModel(); void close(); void updateSubcomponentManager(); - void updateSubcomponentManagerImport(const Import &import); + void addSubcomponentManagerImport(const Import &import); bool isUndoAvailable() const; bool isRedoAvailable() const; diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp index 69ac3ff3165..90ed6b03821 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp @@ -686,8 +686,6 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport() model->changeImports(newImportsToAdd, {}); transaction.commit(); - for (const Import &import : qAsConst(newImportsToAdd)) - doc->updateSubcomponentManagerImport(import); } } catch (const RewritingException &e) { addError(tr("Failed to update imports: %1").arg(e.description())); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 9c8b4e09f90..95f1fc3faa5 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -132,6 +132,10 @@ void ItemLibraryView::modelAboutToBeDetached(Model *model) void ItemLibraryView::importsChanged(const QList &addedImports, const QList &removedImports) { + DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); + for (const auto &import : addedImports) + document->addSubcomponentManagerImport(import); + updateImports(); // TODO: generalize the logic below to allow adding/removing any Qml component when its import is added/removed @@ -165,6 +169,10 @@ void ItemLibraryView::importsChanged(const QList &addedImports, const QL void ItemLibraryView::possibleImportsChanged(const QList &possibleImports) { + DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); + for (const auto &import : possibleImports) + document->addSubcomponentManagerImport(import); + m_widget->updatePossibleImports(possibleImports); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index ef1e85287a7..28b5d9fb947 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -357,7 +357,6 @@ void ItemLibraryWidget::handleAddImport(int index) auto document = QmlDesignerPlugin::instance()->currentDesignDocument(); document->documentModel()->changeImports({import}, {}); - document->updateSubcomponentManagerImport(import); m_stackedWidget->setCurrentIndex(0); // switch to the Components view after import is added updateSearch(); diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 08dfc9fd039..e936a419b47 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -879,7 +879,6 @@ void NavigatorTreeModel::addImport(const QString &importName) if (possImport.url() == import.url()) { import = possImport; m_view->model()->changeImports({import}, {}); - QmlDesignerPlugin::instance()->currentDesignDocument()->updateSubcomponentManagerImport(import); break; } } diff --git a/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h b/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h index 66e93abda3a..556a7f5a0d6 100644 --- a/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h +++ b/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h @@ -49,7 +49,7 @@ public: explicit SubComponentManager(Model *model, QObject *parent = nullptr); void update(const QUrl &fileUrl, const QList &imports); - void updateImport(const Import &import); + void addAndParseImport(const Import &import); QStringList qmlFiles() const; QStringList directories() const; @@ -59,7 +59,7 @@ private: // functions void parseFile(const QString &canonicalFilePath, bool addToLibrary, const QString&); void parseFile(const QString &canonicalFilePath); - void addImport(const Import &import, int index = -1); + bool addImport(const Import &import, int index = -1); void removeImport(int index); void parseDirectories(); QFileInfoList watchedFiles(const QString &canonicalDirPath); diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp index 4e1fd500664..63185d8dfb0 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -69,16 +69,18 @@ SubComponentManager::SubComponentManager(Model *model, QObject *parent) this, [this](const QString &path) { parseDirectory(path); }); } -void SubComponentManager::addImport(const Import &import, int index) +bool SubComponentManager::addImport(const Import &import, int index) { if (debug) qDebug() << Q_FUNC_INFO << index << import.file().toUtf8(); + bool importExists = false; if (import.isFileImport()) { QFileInfo dirInfo = QFileInfo(m_filePath.resolved(import.file()).toLocalFile()); if (dirInfo.exists() && dirInfo.isDir()) { const QString canonicalDirPath = dirInfo.canonicalFilePath(); m_watcher.addPath(canonicalDirPath); + importExists = true; //m_dirToQualifier.insertMulti(canonicalDirPath, import.qualifier()); ### todo: proper support for import as } } else { @@ -91,16 +93,21 @@ void SubComponentManager::addImport(const Import &import, int index) if (dirInfo.exists() && dirInfo.isDir()) { const QString canonicalDirPath = dirInfo.canonicalFilePath(); m_watcher.addPath(canonicalDirPath); + importExists = true; //m_dirToQualifier.insertMulti(canonicalDirPath, import.qualifier()); ### todo: proper support for import as } } // TODO: QDeclarativeDomImport::Library } - if (index == -1) - m_imports.append(import); - else - m_imports.insert(index, import); + if (importExists) { + if (index == -1) + m_imports.append(import); + else + m_imports.insert(index, import); + } + + return importExists; } void SubComponentManager::removeImport(int index) @@ -544,9 +551,15 @@ void SubComponentManager::update(const QUrl &filePath, const QList &impo parseDirectories(); } -void SubComponentManager::updateImport(const Import &import) +void SubComponentManager::addAndParseImport(const Import &import) { - addImport(import); + for (const auto &existingImport : std::as_const(m_imports)) { + if (import == existingImport) + return; + } + + if (!addImport(import)) + return; if (import.isFileImport()) { QFileInfo dirInfo = QFileInfo(m_filePath.resolved(import.file()).toLocalFile());