From 7ea6492a17736e079ddf192b18d061076dfbf9c7 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Fri, 29 Oct 2021 15:39:05 +0300 Subject: [PATCH] QmlDesigner: Add imports to subcomponent manager whenever they change Possible imports were never added to subcomponent manager after initial design mode activation, and imports added manually via text editor were also not added to subcomponent manager. The old implementation also added duplicate imports to subcomponent manager if imports were removed and readded to the document via item library. Fixes: QDS-5345 Change-Id: If45884f50b68282630af1d472af2816640b81c04 Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../components/edit3d/edit3dview.cpp | 5 ---- .../components/integration/designdocument.cpp | 4 +-- .../components/integration/designdocument.h | 2 +- .../itemlibrary/itemlibraryassetimporter.cpp | 2 -- .../itemlibrary/itemlibraryview.cpp | 8 ++++++ .../itemlibrary/itemlibrarywidget.cpp | 1 - .../navigator/navigatortreemodel.cpp | 1 - .../include/subcomponentmanager.h | 4 +-- .../metainfo/subcomponentmanager.cpp | 27 ++++++++++++++----- 9 files changed, 33 insertions(+), 21 deletions(-) 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());