From ec43a6c005cd719e80305f9f1666c1a7f1be7bd1 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 6 Jan 2023 09:47:53 +0100 Subject: [PATCH] QmlProjectManager: FilePathify further Change-Id: I8d83cc93778f8786c30e0aaef459c51005139b19 Reviewed-by: Alessandro Portale Reviewed-by: Artem Sokolovskii Reviewed-by: --- .../qmlpreview/qmlpreviewruncontrol.cpp | 9 ++-- .../qmlprojectmanager/qmlmainfileaspect.cpp | 54 +++++++++---------- .../qmlprojectmanager/qmlmainfileaspect.h | 14 ++--- src/plugins/qmlprojectmanager/qmlproject.cpp | 37 ++++++------- src/plugins/qmlprojectmanager/qmlproject.h | 6 +-- .../qmlprojectrunconfiguration.cpp | 6 +-- 6 files changed, 61 insertions(+), 65 deletions(-) diff --git a/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp b/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp index dab9af41364..57088ad19bf 100644 --- a/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp +++ b/src/plugins/qmlpreview/qmlpreviewruncontrol.cpp @@ -173,18 +173,17 @@ public: runControl->target()->buildSystem()); QTC_ASSERT(qmlBuildSystem, return); - const QString mainScript = aspect->mainScript; - const QString currentFile = aspect->currentFile; + const FilePath mainScript = aspect->mainScript; + const FilePath currentFile = aspect->currentFile; - const QString mainScriptFromProject = qmlBuildSystem->targetFile( - FilePath::fromString(mainScript)).path(); + const QString mainScriptFromProject = qmlBuildSystem->targetFile(mainScript).path(); QStringList qmlProjectRunConfigurationArguments = cmd.splitArguments(); if (!currentFile.isEmpty() && qmlProjectRunConfigurationArguments.last().contains(mainScriptFromProject)) { qmlProjectRunConfigurationArguments.removeLast(); cmd = CommandLine(cmd.executable(), qmlProjectRunConfigurationArguments); - cmd.addArg(currentFile); + cmd.addArg(currentFile.path()); } } diff --git a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp index 820f85085cf..08e236504d7 100644 --- a/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp +++ b/src/plugins/qmlprojectmanager/qmlmainfileaspect.cpp @@ -32,9 +32,9 @@ namespace QmlProjectManager { const char M_CURRENT_FILE[] = "CurrentFile"; const char CURRENT_FILE[] = QT_TRANSLATE_NOOP("::QmlProjectManager", ""); -static bool caseInsensitiveLessThan(const QString &s1, const QString &s2) +static bool caseInsensitiveLessThan(const FilePath &s1, const FilePath &s2) { - return s1.toLower() < s2.toLower(); + return s1.toString().toCaseFolded() < s2.toString().toCaseFolded(); } QmlMainFileAspect::QmlMainFileAspect(Target *target) @@ -89,12 +89,12 @@ void QmlMainFileAspect::fromMap(const QVariantMap &map) void QmlMainFileAspect::updateFileComboBox() { - QDir projectDir(m_target->project()->projectDirectory().toString()); + const FilePath projectDir = m_target->project()->projectDirectory(); if (mainScriptSource() == FileInProjectFile) { - const QString mainScriptInFilePath = projectDir.relativeFilePath(mainScript()); + const FilePath mainScriptInFilePath = projectDir.relativeChildPath(mainScript()); m_fileListModel.clear(); - m_fileListModel.appendRow(new QStandardItem(mainScriptInFilePath)); + m_fileListModel.appendRow(new QStandardItem(mainScriptInFilePath.toString())); if (m_fileListCombo) m_fileListCombo->setEnabled(false); return; @@ -106,27 +106,25 @@ void QmlMainFileAspect::updateFileComboBox() m_fileListModel.appendRow(new QStandardItem(CURRENT_FILE)); QModelIndex currentIndex; - QStringList sortedFiles = Utils::transform(m_target->project()->files(Project::SourceFiles), - &Utils::FilePath::toString); + FilePaths sortedFiles = m_target->project()->files(Project::SourceFiles); // make paths relative to project directory - QStringList relativeFiles; - for (const QString &fn : std::as_const(sortedFiles)) - relativeFiles += projectDir.relativeFilePath(fn); + FilePaths relativeFiles; + for (const FilePath &fn : std::as_const(sortedFiles)) + relativeFiles += projectDir.relativeChildPath(fn); sortedFiles = relativeFiles; std::stable_sort(sortedFiles.begin(), sortedFiles.end(), caseInsensitiveLessThan); - QString mainScriptPath; + FilePath mainScriptPath; if (mainScriptSource() != FileInEditor) - mainScriptPath = projectDir.relativeFilePath(mainScript()); + mainScriptPath = projectDir.relativeChildPath(mainScript()); - for (const QString &fn : std::as_const(sortedFiles)) { - QFileInfo fileInfo(fn); - if (fileInfo.suffix() != "qml") + for (const FilePath &fn : std::as_const(sortedFiles)) { + if (fn.suffixView() != u"qml") continue; - auto item = new QStandardItem(fn); + auto item = new QStandardItem(fn.toString()); m_fileListModel.appendRow(item); if (mainScriptPath == fn) @@ -170,7 +168,7 @@ void QmlMainFileAspect::setScriptSource(MainScriptSource source, const QString & m_mainScriptFilename.clear(); } else { // FileInSettings m_scriptFile = settingsPath; - m_mainScriptFilename = m_target->project()->projectDirectory().toString() + '/' + m_scriptFile; + m_mainScriptFilename = m_target->project()->projectDirectory() / m_scriptFile; } emit changed(); @@ -180,14 +178,11 @@ void QmlMainFileAspect::setScriptSource(MainScriptSource source, const QString & /** Returns absolute path to main script file. */ -QString QmlMainFileAspect::mainScript() const +FilePath QmlMainFileAspect::mainScript() const { if (!qmlBuildSystem()->mainFile().isEmpty()) { - const QString pathInProject = qmlBuildSystem()->mainFile(); - if (QFileInfo(pathInProject).isAbsolute()) - return pathInProject; - else - return QDir(qmlBuildSystem()->canonicalProjectDir().toString()).absoluteFilePath(pathInProject); + const FilePath pathInProject = qmlBuildSystem()->mainFile(); + return qmlBuildSystem()->canonicalProjectDir().resolvePath(pathInProject); } if (!m_mainScriptFilename.isEmpty()) @@ -196,7 +191,7 @@ QString QmlMainFileAspect::mainScript() const return m_currentFileFilename; } -QString QmlMainFileAspect::currentFile() const +FilePath QmlMainFileAspect::currentFile() const { return m_currentFileFilename; } @@ -207,7 +202,7 @@ void QmlMainFileAspect::changeCurrentFile(Core::IEditor *editor) editor = EditorManager::currentEditor(); if (editor) - m_currentFileFilename = editor->document()->filePath().toString(); + m_currentFileFilename = editor->document()->filePath(); emit changed(); } @@ -219,7 +214,7 @@ bool QmlMainFileAspect::isQmlFilePresent() IDocument *document = EditorManager::currentDocument(); const MimeType mainScriptMimeType = mimeTypeForFile(mainScript()); if (document) { - m_currentFileFilename = document->filePath().toString(); + m_currentFileFilename = document->filePath(); if (mainScriptMimeType.matchesName(ProjectExplorer::Constants::QML_MIMETYPE) || mainScriptMimeType.matchesName(ProjectExplorer::Constants::QMLUI_MIMETYPE)) { qmlFileFound = true; @@ -229,13 +224,13 @@ bool QmlMainFileAspect::isQmlFilePresent() || mainScriptMimeType.matchesName(QmlJSTools::Constants::QMLPROJECT_MIMETYPE)) { // find a qml file with lowercase filename. This is slow, but only done // in initialization/other border cases. - const auto files = m_target->project()->files(Project::SourceFiles); + const FilePaths files = m_target->project()->files(Project::SourceFiles); for (const FilePath &filename : files) { if (!filename.isEmpty() && filename.baseName().at(0).isLower()) { const MimeType type = mimeTypeForFile(filename); if (type.matchesName(ProjectExplorer::Constants::QML_MIMETYPE) || type.matchesName(ProjectExplorer::Constants::QMLUI_MIMETYPE)) { - m_currentFileFilename = filename.toString(); + m_currentFileFilename = filename; qmlFileFound = true; break; } @@ -252,4 +247,5 @@ QmlBuildSystem *QmlMainFileAspect::qmlBuildSystem() const { return static_cast(m_target->buildSystem()); } -} // namespace QmlProjectManager + +} // QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlmainfileaspect.h b/src/plugins/qmlprojectmanager/qmlmainfileaspect.h index 4ec23dc2cd5..b71fa6784b8 100644 --- a/src/plugins/qmlprojectmanager/qmlmainfileaspect.h +++ b/src/plugins/qmlprojectmanager/qmlmainfileaspect.h @@ -38,8 +38,8 @@ public: struct Data : BaseAspect::Data { - QString mainScript; - QString currentFile; + Utils::FilePath mainScript; + Utils::FilePath currentFile; }; void addToLayout(Utils::Layouting::LayoutBuilder &builder) final; @@ -52,8 +52,8 @@ public: void setScriptSource(MainScriptSource source, const QString &settingsPath = QString()); - QString mainScript() const; - QString currentFile() const; + Utils::FilePath mainScript() const; + Utils::FilePath currentFile() const; void changeCurrentFile(Core::IEditor *editor = nullptr); bool isQmlFilePresent(); QmlBuildSystem *qmlBuildSystem() const; @@ -64,9 +64,9 @@ public: QStandardItemModel m_fileListModel; QString m_scriptFile; // absolute path to current file (if being used) - QString m_currentFileFilename; + Utils::FilePath m_currentFileFilename; // absolute path to selected main script (if being used) - QString m_mainScriptFilename; + Utils::FilePath m_mainScriptFilename; }; -} // namespace QmlProjectManager +} // QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index 6ce64397796..c283ec73e31 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -250,7 +250,9 @@ void QmlBuildSystem::parseProject(RefreshOptions options) } } -bool QmlBuildSystem::setFileSettingInProjectFile(const QString &setting, const Utils::FilePath &mainFilePath, const QString &oldFile) +bool QmlBuildSystem::setFileSettingInProjectFile(const QString &setting, + const FilePath &mainFilePath, + const FilePath &oldFile) { // make sure to change it also in the qmlproject file const Utils::FilePath qmlProjectFilePath = project()->projectFilePath(); @@ -283,7 +285,7 @@ bool QmlBuildSystem::setFileSettingInProjectFile(const QString &setting, const U auto index = fileContent.lastIndexOf("}"); fileContent.insert(index, addedText); } else { - QString originalFileName = oldFile; + QString originalFileName = oldFile.path(); originalFileName.replace(".", "\\."); const QRegularExpression expression(QString("%1\\s*\"(%2)\"").arg(settingQmlCode).arg(originalFileName)); @@ -328,43 +330,42 @@ void QmlBuildSystem::refresh(RefreshOptions options) emit projectChanged(); } -QString QmlBuildSystem::mainFile() const +FilePath QmlBuildSystem::mainFile() const { if (m_projectItem) - return m_projectItem->mainFile(); - return QString(); + return FilePath::fromString(m_projectItem->mainFile()); + return {}; } -QString QmlBuildSystem::mainUiFile() const +FilePath QmlBuildSystem::mainUiFile() const { if (m_projectItem) - return m_projectItem->mainUiFile(); - return QString(); + return FilePath::fromString(m_projectItem->mainUiFile()); + return {}; } -Utils::FilePath QmlBuildSystem::mainFilePath() const +FilePath QmlBuildSystem::mainFilePath() const { - return projectDirectory().pathAppended(mainFile()); + return projectDirectory().resolvePath(mainFile()); } -Utils::FilePath QmlBuildSystem::mainUiFilePath() const +FilePath QmlBuildSystem::mainUiFilePath() const { - return projectDirectory().pathAppended(mainUiFile()); + return projectDirectory().resolvePath(mainUiFile()); } -bool QmlBuildSystem::setMainFileInProjectFile(const Utils::FilePath &newMainFilePath) +bool QmlBuildSystem::setMainFileInProjectFile(const FilePath &newMainFilePath) { - return setFileSettingInProjectFile("mainFile", newMainFilePath, mainFile()); } -bool QmlBuildSystem::setMainUiFileInProjectFile(const Utils::FilePath &newMainUiFilePath) +bool QmlBuildSystem::setMainUiFileInProjectFile(const FilePath &newMainUiFilePath) { return setMainUiFileInMainFile(newMainUiFilePath) && setFileSettingInProjectFile("mainUiFile", newMainUiFilePath, mainUiFile()); } -bool QmlBuildSystem::setMainUiFileInMainFile(const Utils::FilePath &newMainUiFilePath) +bool QmlBuildSystem::setMainUiFileInMainFile(const FilePath &newMainUiFilePath) { Core::FileChangeBlocker fileChangeBlocker(mainFilePath()); const QList editors = Core::DocumentModel::editorsForFilePath(mainFilePath()); @@ -793,9 +794,9 @@ bool QmlBuildSystem::deleteFiles(Node *context, const FilePaths &filePaths) bool QmlBuildSystem::renameFile(Node * context, const FilePath &oldFilePath, const FilePath &newFilePath) { if (dynamic_cast(context)) { - if (oldFilePath.endsWith(mainFile())) + if (oldFilePath.endsWith(mainFile().path())) return setMainFileInProjectFile(newFilePath); - if (oldFilePath.endsWith(mainUiFile())) + if (oldFilePath.endsWith(mainUiFile().path())) return setMainUiFileInProjectFile(newFilePath); return true; diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h index ed52764f0a0..e7387e030ae 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.h +++ b/src/plugins/qmlprojectmanager/qmlproject.h @@ -53,8 +53,8 @@ public: void refresh(RefreshOptions options); Utils::FilePath canonicalProjectDir() const; - QString mainFile() const; - QString mainUiFile() const; + Utils::FilePath mainFile() const; + Utils::FilePath mainUiFile() const; Utils::FilePath mainFilePath() const; Utils::FilePath mainUiFilePath() const; @@ -106,7 +106,7 @@ signals: private: bool setFileSettingInProjectFile(const QString &setting, const Utils::FilePath &mainFilePath, - const QString &oldFile); + const Utils::FilePath &oldFile); std::unique_ptr m_projectItem; Utils::FilePath m_canonicalProjectDir; diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 081a0bec574..8e8527b32c0 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -54,7 +54,7 @@ private: QString disabledReason() const final; bool isEnabled() const final; - QString mainScript() const; + FilePath mainScript() const; FilePath qmlRuntimeFilePath() const; void createQtVersionAspect(); @@ -108,7 +108,7 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id) cmd.addArg("widget"); } - const FilePath main = bs->targetFile(FilePath::fromString(mainScript())); + const FilePath main = bs->targetFile(mainScript()); if (!main.isEmpty()) cmd.addArg(main.nativePath()); @@ -292,7 +292,7 @@ bool QmlProjectRunConfiguration::isEnabled() const && activeBuildSystem()->hasParsingData(); } -QString QmlProjectRunConfiguration::mainScript() const +FilePath QmlProjectRunConfiguration::mainScript() const { return m_qmlMainFileAspect->mainScript(); }