diff options
author | Eike Ziller <eike.ziller@qt.io> | 2022-12-23 11:32:27 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2023-01-04 08:44:08 +0000 |
commit | 0a74a1e99e37e6685e627577dd52d4f06e3c2832 (patch) | |
tree | 43a05dc82bc437a2d43c294967831ac03b747396 | |
parent | fffd732edc49adc328470cf37a4e18ab5a78be47 (diff) |
Properly support relative paths in Link with Qt UI
Relative paths are resolved based on the applicationDirPath, so reflect
that in the path chooser too.
Also, do not resolve relative paths in the path chooser to absolute
paths when writing to the settings.
Change-Id: Iaeffa2cad1e145adbbc5c918b5f8ff14f6f2b31e
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r-- | src/plugins/qtsupport/qtoptionspage.cpp | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index f1cbc250b3..b1f3c12971 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -930,29 +930,32 @@ static QStringList qtversionFilesToCheck() return Utils::transform(kSubdirsToCheck, [](const QString &dir) { return qtVersionsFile(dir); }); } -static std::optional<QString> settingsDirForQtDir(const QString &qtDir) +static std::optional<FilePath> settingsDirForQtDir(const FilePath &baseDirectory, + const FilePath &qtDir) { - const QStringList dirsToCheck = Utils::transform(kSubdirsToCheck, [qtDir](const QString &dir) { - return QString(qtDir + '/' + dir); + const FilePaths dirsToCheck = Utils::transform(kSubdirsToCheck, [qtDir](const QString &dir) { + return qtDir / dir; }); - const QString validDir = Utils::findOrDefault(dirsToCheck, [](const QString &dir) { - return QFile::exists(settingsFile(dir)) || QFile::exists(qtVersionsFile(dir)); + const FilePath validDir = Utils::findOrDefault(dirsToCheck, [baseDirectory](const FilePath &dir) { + return QFile::exists(settingsFile(baseDirectory.resolvePath(dir).toString())) + || QFile::exists(qtVersionsFile(baseDirectory.resolvePath(dir).toString())); }); if (!validDir.isEmpty()) return validDir; return {}; } -static bool validateQtInstallDir(FancyLineEdit *input, QString *errorString) +static bool validateQtInstallDir(PathChooser *input, QString *errorString) { - const QString qtDir = input->text(); - if (!settingsDirForQtDir(qtDir)) { + const FilePath qtDir = input->rawFilePath(); + if (!settingsDirForQtDir(input->baseDirectory(), qtDir)) { if (errorString) { const QStringList filesToCheck = settingsFilesToCheck() + qtversionFilesToCheck(); - *errorString = "<html><body>" + Tr::tr( - "Qt installation information was not found in \"%1\". " - "Choose a directory that contains one of the files %2") - .arg(qtDir, "<pre>" + filesToCheck.join('\n') + "</pre>"); + *errorString = "<html><body>" + + Tr::tr("Qt installation information was not found in \"%1\". " + "Choose a directory that contains one of the files %2") + .arg(qtDir.toUserOutput(), + "<pre>" + filesToCheck.join('\n') + "</pre>"); } return false; } @@ -988,13 +991,14 @@ void QtOptionsPageWidget::linkWithQt() auto pathInput = new PathChooser; pathLayout->addWidget(pathInput); pathInput->setExpectedKind(PathChooser::ExistingDirectory); + pathInput->setBaseDirectory(FilePath::fromString(QCoreApplication::applicationDirPath())); pathInput->setPromptDialogTitle(title); pathInput->setMacroExpander(nullptr); pathInput->setValidationFunction([pathInput](FancyLineEdit *input, QString *errorString) { if (pathInput->defaultValidationFunction() && !pathInput->defaultValidationFunction()(input, errorString)) return false; - return validateQtInstallDir(input, errorString); + return validateQtInstallDir(pathInput, errorString); }); const std::optional<FilePath> currentLink = currentlyLinkedQtDir(nullptr); pathInput->setFilePath(currentLink ? *currentLink : defaultQtInstallationPath()); @@ -1027,10 +1031,12 @@ void QtOptionsPageWidget::linkWithQt() dialog.exec(); if (dialog.result() == QDialog::Accepted) { - const std::optional<QString> settingsDir = settingsDirForQtDir(pathInput->rawFilePath().toString()); + const std::optional<FilePath> settingsDir = settingsDirForQtDir(pathInput->baseDirectory(), + pathInput->rawFilePath()); if (QTC_GUARD(settingsDir)) { - QSettings(settingsFile(Core::ICore::resourcePath().toString()), QSettings::IniFormat) - .setValue(kInstallSettingsKey, *settingsDir); + QSettings settings(settingsFile(Core::ICore::resourcePath().toString()), + QSettings::IniFormat); + settings.setValue(kInstallSettingsKey, settingsDir->toVariant()); askForRestart = true; } } |