From 0a74a1e99e37e6685e627577dd52d4f06e3c2832 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 23 Dec 2022 11:32:27 +0100 Subject: [PATCH] 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: Reviewed-by: David Schulz Reviewed-by: Qt CI Bot --- src/plugins/qtsupport/qtoptionspage.cpp | 38 ++++++++++++++----------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index f1cbc250b3b..b1f3c129712 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 settingsDirForQtDir(const QString &qtDir) +static std::optional 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 = "" + Tr::tr( - "Qt installation information was not found in \"%1\". " - "Choose a directory that contains one of the files %2") - .arg(qtDir, "
" + filesToCheck.join('\n') + "
"); + *errorString = "" + + Tr::tr("Qt installation information was not found in \"%1\". " + "Choose a directory that contains one of the files %2") + .arg(qtDir.toUserOutput(), + "
" + filesToCheck.join('\n') + "
"); } 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 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 settingsDir = settingsDirForQtDir(pathInput->rawFilePath().toString()); + const std::optional 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; } }