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 <mahmoud.badri@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2021-10-29 15:39:05 +03:00
parent 3b62755061
commit 7ea6492a17
9 changed files with 33 additions and 21 deletions

View File

@@ -31,7 +31,6 @@
#include <nodeinstanceview.h> #include <nodeinstanceview.h>
#include <designeractionmanager.h> #include <designeractionmanager.h>
#include <qmldesignerplugin.h>
#include <designersettings.h> #include <designersettings.h>
#include <qmldesignerconstants.h> #include <qmldesignerconstants.h>
#include <viewmanager.h> #include <viewmanager.h>
@@ -324,10 +323,6 @@ void Edit3DView::addQuick3DImport()
} else { } else {
model()->changeImports({import}, {}); model()->changeImports({import}, {});
} }
// Subcomponent manager update needed to make item library entries appear
QmlDesignerPlugin::instance()->currentDesignDocument()
->updateSubcomponentManagerImport(import);
return; return;
} }
} }

View File

@@ -388,9 +388,9 @@ void DesignDocument::updateSubcomponentManager()
currentModel()->imports() + currentModel()->possibleImports()); 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() void DesignDocument::deleteSelected()

View File

@@ -69,7 +69,7 @@ public:
void attachRewriterToModel(); void attachRewriterToModel();
void close(); void close();
void updateSubcomponentManager(); void updateSubcomponentManager();
void updateSubcomponentManagerImport(const Import &import); void addSubcomponentManagerImport(const Import &import);
bool isUndoAvailable() const; bool isUndoAvailable() const;
bool isRedoAvailable() const; bool isRedoAvailable() const;

View File

@@ -686,8 +686,6 @@ void ItemLibraryAssetImporter::finalizeQuick3DImport()
model->changeImports(newImportsToAdd, {}); model->changeImports(newImportsToAdd, {});
transaction.commit(); transaction.commit();
for (const Import &import : qAsConst(newImportsToAdd))
doc->updateSubcomponentManagerImport(import);
} }
} catch (const RewritingException &e) { } catch (const RewritingException &e) {
addError(tr("Failed to update imports: %1").arg(e.description())); addError(tr("Failed to update imports: %1").arg(e.description()));

View File

@@ -132,6 +132,10 @@ void ItemLibraryView::modelAboutToBeDetached(Model *model)
void ItemLibraryView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) void ItemLibraryView::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports)
{ {
DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument();
for (const auto &import : addedImports)
document->addSubcomponentManagerImport(import);
updateImports(); updateImports();
// TODO: generalize the logic below to allow adding/removing any Qml component when its import is added/removed // 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<Import> &addedImports, const QL
void ItemLibraryView::possibleImportsChanged(const QList<Import> &possibleImports) void ItemLibraryView::possibleImportsChanged(const QList<Import> &possibleImports)
{ {
DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument();
for (const auto &import : possibleImports)
document->addSubcomponentManagerImport(import);
m_widget->updatePossibleImports(possibleImports); m_widget->updatePossibleImports(possibleImports);
} }

View File

@@ -357,7 +357,6 @@ void ItemLibraryWidget::handleAddImport(int index)
auto document = QmlDesignerPlugin::instance()->currentDesignDocument(); auto document = QmlDesignerPlugin::instance()->currentDesignDocument();
document->documentModel()->changeImports({import}, {}); document->documentModel()->changeImports({import}, {});
document->updateSubcomponentManagerImport(import);
m_stackedWidget->setCurrentIndex(0); // switch to the Components view after import is added m_stackedWidget->setCurrentIndex(0); // switch to the Components view after import is added
updateSearch(); updateSearch();

View File

@@ -879,7 +879,6 @@ void NavigatorTreeModel::addImport(const QString &importName)
if (possImport.url() == import.url()) { if (possImport.url() == import.url()) {
import = possImport; import = possImport;
m_view->model()->changeImports({import}, {}); m_view->model()->changeImports({import}, {});
QmlDesignerPlugin::instance()->currentDesignDocument()->updateSubcomponentManagerImport(import);
break; break;
} }
} }

View File

@@ -49,7 +49,7 @@ public:
explicit SubComponentManager(Model *model, QObject *parent = nullptr); explicit SubComponentManager(Model *model, QObject *parent = nullptr);
void update(const QUrl &fileUrl, const QList<Import> &imports); void update(const QUrl &fileUrl, const QList<Import> &imports);
void updateImport(const Import &import); void addAndParseImport(const Import &import);
QStringList qmlFiles() const; QStringList qmlFiles() const;
QStringList directories() const; QStringList directories() const;
@@ -59,7 +59,7 @@ private: // functions
void parseFile(const QString &canonicalFilePath, bool addToLibrary, const QString&); void parseFile(const QString &canonicalFilePath, bool addToLibrary, const QString&);
void parseFile(const QString &canonicalFilePath); 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 removeImport(int index);
void parseDirectories(); void parseDirectories();
QFileInfoList watchedFiles(const QString &canonicalDirPath); QFileInfoList watchedFiles(const QString &canonicalDirPath);

View File

@@ -69,16 +69,18 @@ SubComponentManager::SubComponentManager(Model *model, QObject *parent)
this, [this](const QString &path) { parseDirectory(path); }); 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) if (debug)
qDebug() << Q_FUNC_INFO << index << import.file().toUtf8(); qDebug() << Q_FUNC_INFO << index << import.file().toUtf8();
bool importExists = false;
if (import.isFileImport()) { if (import.isFileImport()) {
QFileInfo dirInfo = QFileInfo(m_filePath.resolved(import.file()).toLocalFile()); QFileInfo dirInfo = QFileInfo(m_filePath.resolved(import.file()).toLocalFile());
if (dirInfo.exists() && dirInfo.isDir()) { if (dirInfo.exists() && dirInfo.isDir()) {
const QString canonicalDirPath = dirInfo.canonicalFilePath(); const QString canonicalDirPath = dirInfo.canonicalFilePath();
m_watcher.addPath(canonicalDirPath); m_watcher.addPath(canonicalDirPath);
importExists = true;
//m_dirToQualifier.insertMulti(canonicalDirPath, import.qualifier()); ### todo: proper support for import as //m_dirToQualifier.insertMulti(canonicalDirPath, import.qualifier()); ### todo: proper support for import as
} }
} else { } else {
@@ -91,18 +93,23 @@ void SubComponentManager::addImport(const Import &import, int index)
if (dirInfo.exists() && dirInfo.isDir()) { if (dirInfo.exists() && dirInfo.isDir()) {
const QString canonicalDirPath = dirInfo.canonicalFilePath(); const QString canonicalDirPath = dirInfo.canonicalFilePath();
m_watcher.addPath(canonicalDirPath); m_watcher.addPath(canonicalDirPath);
importExists = true;
//m_dirToQualifier.insertMulti(canonicalDirPath, import.qualifier()); ### todo: proper support for import as //m_dirToQualifier.insertMulti(canonicalDirPath, import.qualifier()); ### todo: proper support for import as
} }
} }
// TODO: QDeclarativeDomImport::Library // TODO: QDeclarativeDomImport::Library
} }
if (importExists) {
if (index == -1) if (index == -1)
m_imports.append(import); m_imports.append(import);
else else
m_imports.insert(index, import); m_imports.insert(index, import);
} }
return importExists;
}
void SubComponentManager::removeImport(int index) void SubComponentManager::removeImport(int index)
{ {
const Import import = m_imports.takeAt(index); const Import import = m_imports.takeAt(index);
@@ -544,9 +551,15 @@ void SubComponentManager::update(const QUrl &filePath, const QList<Import> &impo
parseDirectories(); 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()) { if (import.isFileImport()) {
QFileInfo dirInfo = QFileInfo(m_filePath.resolved(import.file()).toLocalFile()); QFileInfo dirInfo = QFileInfo(m_filePath.resolved(import.file()).toLocalFile());