From f7020a83c66a5e831002216b650b9b847d2070d6 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Mon, 21 Feb 2022 13:35:30 +0200 Subject: [PATCH] QmlDesigner: Fix project path inside imported subcomponent When user goes inside a Qml that is part of an imported component, project path is not accessible. This commit fixes it. Fixes: QDS-6201 Change-Id: I4efff48399e487b586b10383f19c2d6877714dc9 Reviewed-by: Miikka Heikkinen Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../componentcore/modelnodeoperations.cpp | 13 ++----------- .../components/integration/designdocument.cpp | 2 +- src/plugins/qmldesigner/documentmanager.cpp | 15 +++++++++++---- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 5327098cf3a..79242905905 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -989,15 +989,6 @@ void addTabBarToStackedContainer(const SelectionContext &selectionContext) } -Utils::FilePath projectFilePath() -{ - if (auto *doc = QmlDesignerPlugin::instance()->documentManager().currentDesignDocument()) { - if (auto *proj = ProjectExplorer::SessionManager::projectForFile(doc->fileName())) - return proj->projectDirectory(); - } - return Utils::FilePath(); -} - static AddFilesResult addFilesToProject(const QStringList &fileNames, const QString &defaultDirectory) { QString directory = AddImagesDialog::getDirectory(fileNames, defaultDirectory); @@ -1050,10 +1041,10 @@ static QString getAssetDefaultDirectory(const QString &assetDir, const QString & { QString adjustedDefaultDirectory = defaultDirectory; - Utils::FilePath contentPath = projectFilePath(); + Utils::FilePath contentPath = QmlDesignerPlugin::instance()->documentManager().currentProjectDirPath(); if (contentPath.pathAppended("content").exists()) - contentPath = contentPath.pathAppended("content"); + contentPath = contentPath.pathAppended("content"); Utils::FilePath assetPath = contentPath.pathAppended(assetDir); diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index f32a66b832f..e9e76c29cba 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -344,7 +344,7 @@ Utils::FilePath DesignDocument::projectFolder() const bool DesignDocument::hasProject() const { - return ProjectExplorer::SessionManager::projectForFile(fileName()); + return !DocumentManager::currentProjectDirPath().isEmpty(); } void DesignDocument::changeToInFileComponentModel(ComponentTextModifier *textModifer) diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index d75d570fc92..453dd96232a 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -358,11 +358,18 @@ Utils::FilePath DocumentManager::currentProjectDirPath() return {}; Utils::FilePath qmlFileName = QmlDesignerPlugin::instance()->currentDesignDocument()->fileName(); - ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile(qmlFileName); - if (!project) - return {}; - return project->projectDirectory(); + ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile(qmlFileName); + if (project) + return project->projectDirectory(); + + const QList projects = ProjectExplorer::SessionManager::projects(); + for (auto p : projects) { + if (qmlFileName.startsWith(p->projectDirectory().toString())) + return p->projectDirectory(); + } + + return {}; } QStringList DocumentManager::isoIconsQmakeVariableValue(const QString &proPath)