diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/languageserverprotocol/lsputils.h | 2 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtool.cpp | 29 | ||||
-rw-r--r-- | src/plugins/clangtools/clangtool.h | 3 | ||||
-rw-r--r-- | src/plugins/mcusupport/mcusupportoptions.cpp | 6 | ||||
-rw-r--r-- | src/plugins/mcusupport/mcusupportsdk.cpp | 222 | ||||
-rw-r--r-- | src/plugins/mcusupport/mcusupportsdk.h | 9 | ||||
-rw-r--r-- | src/plugins/projectexplorer/sessionmodel.cpp | 4 | ||||
-rw-r--r-- | src/plugins/projectexplorer/sessionmodel.h | 2 | ||||
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.cpp | 2 | ||||
-rw-r--r-- | src/plugins/qtsupport/qtoptionspage.cpp | 37 | ||||
-rw-r--r-- | src/plugins/qtsupport/qtoptionspage.h | 2 | ||||
-rw-r--r-- | src/plugins/qtsupport/qtsupportplugin.cpp | 2 |
12 files changed, 209 insertions, 111 deletions
diff --git a/src/libs/languageserverprotocol/lsputils.h b/src/libs/languageserverprotocol/lsputils.h index 8da5fdd93af..435d956eeb8 100644 --- a/src/libs/languageserverprotocol/lsputils.h +++ b/src/libs/languageserverprotocol/lsputils.h @@ -118,7 +118,7 @@ public: LanguageClientValue(const T &value) : Utils::variant<T, std::nullptr_t>(value) { } LanguageClientValue(const QJsonValue &value) { - if (QTC_GUARD(value.isUndefined()) || value.isNull()) + if (!QTC_GUARD(!value.isUndefined()) || value.isNull()) *this = nullptr; else *this = fromJsonValue<T>(value); diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 87ce2875f79..0928e40e6bd 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -696,9 +696,12 @@ void ClangTool::startTool(ClangTool::FileSelection fileSelection, connect(m_runWorker, &ClangToolRunWorker::buildFailed,this, &ClangTool::onBuildFailed); connect(m_runWorker, &ClangToolRunWorker::startFailed, this, &ClangTool::onStartFailed); connect(m_runWorker, &ClangToolRunWorker::started, this, &ClangTool::onStarted); - connect(m_runWorker, &ClangToolRunWorker::runnerFinished, - this, &ClangTool::updateForCurrentState); - connect(m_runControl, &RunControl::destroyed, [this](){ m_runWorker = nullptr; }); + connect(m_runWorker, &ClangToolRunWorker::runnerFinished, this, [this]() { + m_filesCount = m_runWorker->totalFilesToAnalyze(); + m_filesSucceeded = m_runWorker->filesAnalyzed(); + m_filesFailed = m_runWorker->filesNotAnalyzed(); + updateForCurrentState(); + }); // More init and UI update m_diagnosticFilterModel->setProject(project); @@ -857,6 +860,10 @@ void ClangTool::reset() m_state = State::Initial; m_runControl = nullptr; m_runWorker = nullptr; + + m_filesCount = 0; + m_filesSucceeded = 0; + m_filesFailed = 0; } static bool canAnalyzeProject(Project *project) @@ -1039,8 +1046,6 @@ void ClangTool::onRunControlStopped() void ClangTool::update() { updateForInitialState(); - if (!m_runWorker) - return; updateForCurrentState(); } @@ -1162,9 +1167,9 @@ void ClangTool::updateForCurrentState() // Info bar: errors const bool hasErrorText = !m_infoBarWidget->errorText().isEmpty(); - const bool hasErrors = m_runWorker && m_runWorker->filesNotAnalyzed() > 0; + const bool hasErrors = m_filesFailed > 0; if (hasErrors && !hasErrorText) { - const QString text = makeLink( tr("Failed to analyze %1 files.").arg(m_runWorker->filesNotAnalyzed())); + const QString text = makeLink( tr("Failed to analyze %1 files.").arg(m_filesFailed)); m_infoBarWidget->setError(InfoBarWidget::Warning, text, [this]() { showOutputPane(); }); } @@ -1177,12 +1182,12 @@ void ClangTool::updateForCurrentState() break; case State::AnalyzerRunning: showProgressIcon = true; - if (m_runWorker->totalFilesToAnalyze() == 0) { + if (m_filesCount == 0) { infoText = tr("Analyzing..."); // Not yet fully started/initialized } else { infoText = tr("Analyzing... %1 of %2 files processed.") - .arg(m_runWorker->filesAnalyzed() + m_runWorker->filesNotAnalyzed()) - .arg(m_runWorker->totalFilesToAnalyze()); + .arg(m_filesSucceeded + m_filesFailed) + .arg(m_filesCount); } break; case State::PreparationStarted: @@ -1195,7 +1200,7 @@ void ClangTool::updateForCurrentState() infoText = tr("Analysis stopped by user."); break; case State::AnalyzerFinished: - infoText = tr("Finished processing %1 files.").arg(m_runWorker->totalFilesToAnalyze()); + infoText = tr("Finished processing %1 files.").arg(m_filesCount); break; case State::ImportFinished: infoText = tr("Diagnostics imported."); @@ -1208,7 +1213,7 @@ void ClangTool::updateForCurrentState() // Info bar: diagnostic stats QString diagText; if (issuesFound) { - diagText = tr("%1 diagnostics. %2 fixits, %4 selected.") + diagText = tr("%1 diagnostics. %2 fixits, %3 selected.") .arg(issuesVisible) .arg(m_diagnosticFilterModel->fixitsScheduable()) .arg(m_diagnosticFilterModel->fixitsScheduled()); diff --git a/src/plugins/clangtools/clangtool.h b/src/plugins/clangtools/clangtool.h index 3ee72da83c7..a32bb50c2c1 100644 --- a/src/plugins/clangtools/clangtool.h +++ b/src/plugins/clangtools/clangtool.h @@ -162,6 +162,9 @@ private: QAction *m_stopAction = nullptr; State m_state = State::Initial; + int m_filesCount = 0; + int m_filesSucceeded = 0; + int m_filesFailed = 0; DiagnosticFilterModel *m_diagnosticFilterModel = nullptr; diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 2ce44293b72..894eb9cb4cd 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -61,7 +61,7 @@ namespace McuSupport { namespace Internal { -static const int KIT_VERSION = 3; // Bumps up whenever details in Kit creation change +static const int KIT_VERSION = 4; // Bumps up whenever details in Kit creation change static QString packagePathFromSettings(const QString &settingsKey, const QString &defaultPath = {}) { @@ -441,14 +441,14 @@ void McuSupportOptions::deletePackagesAndTargets() const QVersionNumber &McuSupportOptions::supportedQulVersion() { - static const QVersionNumber v({1, 1, 0}); + static const QVersionNumber v({1, 1}); return v; } void McuSupportOptions::setQulDir(const Utils::FilePath &dir) { deletePackagesAndTargets(); - Sdk::hardcodedTargetsAndPackages(dir, &packages, &mcuTargets); + Sdk::targetsAndPackages(dir, &packages, &mcuTargets); //packages.append(qtForMCUsSdkPackage); for (auto package : packages) { connect(package, &McuPackage::changed, [this](){ diff --git a/src/plugins/mcusupport/mcusupportsdk.cpp b/src/plugins/mcusupport/mcusupportsdk.cpp index bd57cd5c50e..757d919315b 100644 --- a/src/plugins/mcusupport/mcusupportsdk.cpp +++ b/src/plugins/mcusupport/mcusupportsdk.cpp @@ -27,10 +27,17 @@ #include "mcusupportoptions.h" #include "mcusupportsdk.h" +#include <utils/algorithm.h> #include <utils/hostosinfo.h> #include <utils/fileutils.h> #include <QDir> +#include <QDirIterator> +#include <QHash> +#include <QJsonArray> +#include <QJsonDocument> +#include <QJsonObject> +#include <QVariant> namespace McuSupport { namespace Internal { @@ -220,9 +227,9 @@ static McuPackage *createMcuXpressoIdePackage() return result; } -static McuPackage *createFreeRTOSSourcesPackage(const QString &envVarPrefix) +static McuPackage *createFreeRTOSSourcesPackage(const QString &envVar) { - const QString envVar = envVarPrefix + "_FREERTOS_DIR"; + const QString envVarPrefix = envVar.chopped(strlen("_FREERTOS_DIR")); const QString defaultPath = qEnvironmentVariableIsSet(envVar.toLatin1()) ? @@ -238,98 +245,147 @@ static McuPackage *createFreeRTOSSourcesPackage(const QString &envVarPrefix) return result; } -void hardcodedTargetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage *> *packages, - QVector<McuTarget *> *mcuTargets) +struct McuTargetDescription { - McuToolChainPackage* armGccPackage = Sdk::createArmGccPackage(); - McuToolChainPackage *ghsToolchainPackage = createGhsToolchainPackage(); - McuToolChainPackage* desktopToolChainPackage = createDesktopToolChainPackage(); - McuPackage* stm32CubeFwF7SdkPackage = Sdk::createStm32CubeFwF7SdkPackage(); - McuPackage* stm32CubeProgrammerPackage = Sdk::createStm32CubeProgrammerPackage(); - McuPackage* evkbImxrt1050SdkPackage = Sdk::createEvkbImxrt1050SdkPackage(); - McuPackage *mcuXpressoIdePackage = createMcuXpressoIdePackage(); - McuPackage *rglPackage = createRGLPackage(); - McuPackage *freeRTOSSTM32F7Package = createFreeRTOSSourcesPackage("STM32F7"); - McuPackage *freeRTOSIMXRT1050Package = createFreeRTOSSourcesPackage("IMXRT1050"); - McuPackage *freeRTOSIMXRT1064Package = createFreeRTOSSourcesPackage("IMXRT1064"); - - QVector<McuPackage*> stmEvalPackages = { - armGccPackage, stm32CubeProgrammerPackage}; - QVector<McuPackage*> nxpEvalPackages = { - armGccPackage, mcuXpressoIdePackage}; - QVector<McuPackage*> renesasEvalPackages = { - ghsToolchainPackage, rglPackage}; - QVector<McuPackage*> desktopPackages = {}; - *packages = { - armGccPackage, desktopToolChainPackage, ghsToolchainPackage, - stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage, - mcuXpressoIdePackage, rglPackage, - freeRTOSSTM32F7Package, freeRTOSIMXRT1050Package, freeRTOSIMXRT1064Package}; - - const QString vendorStm = "STM"; - const QString vendorNxp = "NXP"; - const QString vendorQt = "Qt"; - const QString vendorRenesas = "Renesas"; - - const struct { - const QString &vendor; - const QString qulPlatform; - const QVector<McuPackage*> &packages; - McuToolChainPackage *toolchainPackage; - McuPackage *freeRTOSPackage; - const QVector<int> colorDepths; - } targets[] = { - {vendorNxp, {"MIMXRT1050-EVK"}, nxpEvalPackages, armGccPackage, - freeRTOSIMXRT1050Package, {16}}, - {vendorNxp, {"MIMXRT1064-EVK"}, nxpEvalPackages, armGccPackage, - freeRTOSIMXRT1064Package, {16}}, - {vendorQt, {"Qt"}, desktopPackages, desktopToolChainPackage, - nullptr, {32}}, - {vendorRenesas, {"RH850-D1M1A"}, renesasEvalPackages, ghsToolchainPackage, - nullptr, {32}}, - {vendorStm, {"STM32F469I-DISCOVERY"}, stmEvalPackages, armGccPackage, - nullptr, {24}}, - {vendorStm, {"STM32F7508-DISCOVERY"}, stmEvalPackages, armGccPackage, - freeRTOSSTM32F7Package, {32, 16}}, - {vendorStm, {"STM32F769I-DISCOVERY"}, stmEvalPackages, armGccPackage, - freeRTOSSTM32F7Package, {32}}, - {vendorStm, {"STM32H750B-DISCOVERY"}, stmEvalPackages, armGccPackage, - nullptr, {32}}, - {vendorStm, {"STM32L4R9I-DISCOVERY"}, stmEvalPackages, armGccPackage, - nullptr, {24}}, - {vendorStm, {"STM32L4R9I-EVAL"}, stmEvalPackages, armGccPackage, - nullptr, {24}} + QString qulVersion; + QString platform; + QString platformVendor; + QVector<int> colorDepths; + QString toolchainId; + QString boardSdkEnvVar; + QString freeRTOSEnvVar; +}; + +static QVector<McuTarget *> targetsFromDescriptions(const QList<McuTargetDescription> &descriptions, + QVector<McuPackage *> *packages) +{ + const QHash<QString, McuToolChainPackage *> tcPkgs = { + {{"armgcc"}, createArmGccPackage()}, + {{"greenhills"}, createGhsToolchainPackage()}, + {{"desktop"}, createDesktopToolChainPackage()}, + }; + + const QHash<QString, McuPackage *> vendorPkgs = { + {{"ST"}, createStm32CubeProgrammerPackage()}, + {{"NXP"}, createMcuXpressoIdePackage()}, + {{"Renesas"}, createRGLPackage()} }; - const QString QulTargetTemplate = - dir.toString() + "/lib/cmake/Qul/QulTargets/QulTargets_%1_%2.cmake"; - for (const auto target : targets) { - for (auto os : {McuTarget::OS::Desktop, McuTarget::OS::BareMetal, - McuTarget::OS::FreeRTOS}) { - for (int colorDepth : target.colorDepths) { - QVector<McuPackage*> required3rdPartyPackages = target.packages; + QHash<QString, McuPackage *> freeRTOSPkgs; + QVector<McuTarget *> mcuTargets; + + for (auto desc : descriptions) { + McuToolChainPackage *tcPkg = tcPkgs.value(desc.toolchainId); + if (desc.toolchainId == "desktop") { + auto mcuTarget = new McuTarget(desc.platformVendor, desc.platform, + McuTarget::OS::Desktop, {}, tcPkg); + mcuTargets.append(mcuTarget); + continue; + } + for (auto os : {McuTarget::OS::BareMetal, McuTarget::OS::FreeRTOS}) { + for (int colorDepth : desc.colorDepths) { + QVector<McuPackage*> required3rdPartyPkgs = { + vendorPkgs.value(desc.platformVendor), tcPkg + }; if (os == McuTarget::OS::FreeRTOS) { - if (target.freeRTOSPackage) - required3rdPartyPackages.append(target.freeRTOSPackage); - else + if (desc.freeRTOSEnvVar.isEmpty()) { continue; - } else if (os == McuTarget::OS::Desktop && target.toolchainPackage->type() - != McuToolChainPackage::TypeDesktop) { - continue; + } else { + if (!freeRTOSPkgs.contains(desc.freeRTOSEnvVar)) { + auto freeRTOSPkg = createFreeRTOSSourcesPackage(desc.freeRTOSEnvVar); + freeRTOSPkgs.insert(desc.freeRTOSEnvVar, freeRTOSPkg); + } + required3rdPartyPkgs.append(freeRTOSPkgs.value(desc.freeRTOSEnvVar)); + } } - const QString QulTarget = - QulTargetTemplate.arg(target.qulPlatform, QString::number(colorDepth)); - if (!Utils::FilePath::fromUserInput(QulTarget).exists()) - continue; - auto mcuTarget = new McuTarget(target.vendor, target.qulPlatform, os, - required3rdPartyPackages, target.toolchainPackage); - if (target.colorDepths.count() > 1) + auto mcuTarget = new McuTarget(desc.platformVendor, desc.platform, os, + required3rdPartyPkgs, tcPkg); + if (desc.colorDepths.count() > 1) mcuTarget->setColorDepth(colorDepth); - mcuTargets->append(mcuTarget); + mcuTargets.append(mcuTarget); } } } + + packages->append(Utils::transform<QVector<McuPackage *> >( + tcPkgs.values(), [&](McuToolChainPackage *tcPkg) { return tcPkg; })); + packages->append(vendorPkgs.values().toVector()); + packages->append(freeRTOSPkgs.values().toVector()); + + return mcuTargets; +} + +static QFileInfoList targetDescriptionFiles(const Utils::FilePath &dir) +{ + // Workaround for UL-2390: Instead of "./kits/", walk through "./lib/cmake/Qul/boards/" + QFileInfoList result; + QDirIterator it(dir.toString() + "/lib/cmake/Qul/boards/", {QLatin1String("*.json")}, + QDir::Files, QDirIterator::Subdirectories); + while (it.hasNext()) + result.append(it.next()); + return result; +} + +static QString freeRTOSEnvVarForPlatform(const QString &platform) +{ + if (platform == "STM32F769I-DISCOVERY" || platform == "STM32F7508-DISCOVERY") + return {"STM32F7_FREERTOS_DIR"}; + else if (platform == "MIMXRT1050-EVK") + return {"IMXRT1050_FREERTOS_DIR"}; + else if (platform == "MIMXRT1064-EVK") + return {"IMXRT1064_FREERTOS_DIR"}; + + return {}; +} + +static McuTargetDescription parseDescriptionJson(const QByteArray &data) +{ + const QJsonDocument document = QJsonDocument::fromJson(data); + const QJsonObject target = document.object(); + const QJsonObject toolchain = target.value("toolchain").toObject(); + const QJsonObject boardSdk = target.value("boardSdk").toObject(); + + const QString platform = target.value("platform").toString(); + + const QVariantList colorDepths = target.value("colorDepths").toArray().toVariantList(); + const auto colorDepthsVector = Utils::transform<QVector<int> >( + colorDepths, [&](const QVariant &colorDepth) { return colorDepth.toInt(); }); + + return { + target.value("qulVersion").toString(), + platform, + target.value("platformVendor").toString(), + colorDepthsVector, + toolchain.value("id").toString(), + boardSdk.value("boardSdkEnvVar").toString(), + freeRTOSEnvVarForPlatform(platform) // Workaround for UL-2514: Missing FreeRTOS information + }; +} + +void targetsAndPackages(const Utils::FilePath &dir, QVector<McuPackage *> *packages, + QVector<McuTarget *> *mcuTargets) +{ + QList<McuTargetDescription> descriptions; + + for (const QFileInfo &fileInfo : targetDescriptionFiles(dir)) { + QFile file(fileInfo.absoluteFilePath()); + if (!file.open(QFile::ReadOnly)) + continue; + const McuTargetDescription desc = parseDescriptionJson(file.readAll()); + if (!McuSupportOptions::supportedQulVersion() + .isPrefixOf(QVersionNumber::fromString(desc.qulVersion))) + continue; + descriptions.append(desc); + } + + if (!descriptions.isEmpty()) { + // Workaround for missing JSON file for Desktop target: + descriptions.prepend({McuSupportOptions::supportedQulVersion().toString(), + {"Qt"}, {"Qt"}, {32}, {"desktop"}, {}, {}}); + + mcuTargets->append(targetsFromDescriptions(descriptions, packages)); + } } } // namespace Sdk diff --git a/src/plugins/mcusupport/mcusupportsdk.h b/src/plugins/mcusupport/mcusupportsdk.h index 444855b881a..1cc2adadc7e 100644 --- a/src/plugins/mcusupport/mcusupportsdk.h +++ b/src/plugins/mcusupport/mcusupportsdk.h @@ -27,6 +27,10 @@ #include <QVector> +namespace Utils { +class FilePath; +} + namespace McuSupport { namespace Internal { class McuPackage; @@ -36,9 +40,8 @@ namespace Sdk { McuPackage *createQtForMCUsPackage(); -// Legacy: List of targets supported by Qt for MCUs 1.0 -void hardcodedTargetsAndPackages(const Utils::FilePath &qulDir, - QVector<McuPackage*> *packages, QVector<McuTarget*> *mcuTargets); +void targetsAndPackages(const Utils::FilePath &qulDir, + QVector<McuPackage*> *packages, QVector<McuTarget*> *mcuTargets); } // namespace Sdk } // namespace Internal diff --git a/src/plugins/projectexplorer/sessionmodel.cpp b/src/plugins/projectexplorer/sessionmodel.cpp index a535294f91d..5ba79dbf807 100644 --- a/src/plugins/projectexplorer/sessionmodel.cpp +++ b/src/plugins/projectexplorer/sessionmodel.cpp @@ -192,6 +192,8 @@ void SessionModel::sort(int column, Qt::SortOrder order) return isLess; }; Utils::sort(m_sortedSessions, cmp); + m_currentSortColumn = column; + m_currentSortOrder = order; endResetModel(); } @@ -237,6 +239,7 @@ void SessionModel::deleteSessions(const QStringList &sessions) beginResetModel(); SessionManager::deleteSessions(sessions); m_sortedSessions = SessionManager::sessions(); + sort(m_currentSortColumn, m_currentSortOrder); endResetModel(); } @@ -268,6 +271,7 @@ void SessionModel::runSessionNameInputDialog(SessionNameInputDialog *sessionInpu createSession(newSession); m_sortedSessions = SessionManager::sessions(); endResetModel(); + sort(m_currentSortColumn, m_currentSortOrder); if (sessionInputDialog->isSwitchToRequested()) switchToSession(newSession); diff --git a/src/plugins/projectexplorer/sessionmodel.h b/src/plugins/projectexplorer/sessionmodel.h index a4c09132f82..d95102590c4 100644 --- a/src/plugins/projectexplorer/sessionmodel.h +++ b/src/plugins/projectexplorer/sessionmodel.h @@ -81,6 +81,8 @@ private: void runSessionNameInputDialog(ProjectExplorer::Internal::SessionNameInputDialog *sessionInputDialog, std::function<void(const QString &)> createSession); QStringList m_sortedSessions; + int m_currentSortColumn = 0; + Qt::SortOrder m_currentSortOrder = Qt::AscendingOrder; }; } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index b3264dfb592..96efcd1d6ba 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -480,7 +480,7 @@ void QbsBuildSystem::updateProjectNodes(const std::function<void ()> &continuati m_treeCreationWatcher = new TreeCreationWatcher(this); connect(m_treeCreationWatcher, &TreeCreationWatcher::finished, this, [this, watcher = m_treeCreationWatcher, continuation] { - std::unique_ptr<QbsProjectNode> rootNode(m_treeCreationWatcher->result()); + std::unique_ptr<QbsProjectNode> rootNode(watcher->result()); if (watcher != m_treeCreationWatcher) { watcher->deleteLater(); return; diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 95c3b84d50c..3f851979fe6 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -823,28 +823,41 @@ static QString linkingPurposeText() "Linking with a Qt installation automatically registers Qt versions and kits."); } -void QtOptionsPageWidget::setupLinkWithQtButton() +static bool canLinkWithQt(QString *toolTip) { + bool canLink = true; bool installSettingsExist; const Utils::optional<QString> installSettingsValue = currentlyLinkedQtDir( &installSettingsExist); QStringList tip; tip << linkingPurposeText(); if (!FilePath::fromString(Core::ICore::resourcePath()).isWritablePath()) { - m_ui.linkWithQtButton->setEnabled(false); - tip << tr("%1's resource directory is not writable.").arg(Core::Constants::IDE_DISPLAY_NAME); + canLink = false; + tip << QtOptionsPageWidget::tr("%1's resource directory is not writable.") + .arg(Core::Constants::IDE_DISPLAY_NAME); } // guard against redirecting Qt Creator that is part of a Qt installations // TODO this fails for pre-releases in the online installer // TODO this will fail when make Qt Creator non-required in the Qt installers if (installSettingsExist && !installSettingsValue) { - m_ui.linkWithQtButton->setEnabled(false); - tip << tr("%1 is part of a Qt installation.").arg(Core::Constants::IDE_DISPLAY_NAME); + canLink = false; + tip << QtOptionsPageWidget::tr("%1 is part of a Qt installation.") + .arg(Core::Constants::IDE_DISPLAY_NAME); } const QString link = installSettingsValue ? *installSettingsValue : QString(); if (!link.isEmpty()) - tip << tr("%1 is currently linked to \"%2\".").arg(Core::Constants::IDE_DISPLAY_NAME, link); - m_ui.linkWithQtButton->setToolTip(tip.join("\n\n")); + tip << QtOptionsPageWidget::tr("%1 is currently linked to \"%2\".") + .arg(Core::Constants::IDE_DISPLAY_NAME, link); + if (toolTip) + *toolTip = tip.join("\n\n"); + return canLink; +} + +void QtOptionsPageWidget::setupLinkWithQtButton() +{ + QString tip; + canLinkWithQt(&tip); + m_ui.linkWithQtButton->setToolTip(tip); connect(m_ui.linkWithQtButton, &QPushButton::clicked, this, &QtOptionsPage::linkWithQt); } @@ -1018,6 +1031,16 @@ QtOptionsPage::QtOptionsPage() setWidgetCreator([] { return new QtOptionsPageWidget; }); } +bool QtOptionsPage::canLinkWithQt() +{ + return Internal::canLinkWithQt(nullptr); +} + +bool QtOptionsPage::isLinkedWithQt() +{ + return currentlyLinkedQtDir(nullptr).has_value(); +} + void QtOptionsPage::linkWithQt() { QtOptionsPageWidget::linkWithQt(); diff --git a/src/plugins/qtsupport/qtoptionspage.h b/src/plugins/qtsupport/qtoptionspage.h index e2bfc9cbef9..6f5599f51a1 100644 --- a/src/plugins/qtsupport/qtoptionspage.h +++ b/src/plugins/qtsupport/qtoptionspage.h @@ -35,6 +35,8 @@ class QtOptionsPage final : public Core::IOptionsPage public: QtOptionsPage(); + static bool canLinkWithQt(); + static bool isLinkedWithQt(); static void linkWithQt(); }; diff --git a/src/plugins/qtsupport/qtsupportplugin.cpp b/src/plugins/qtsupport/qtsupportplugin.cpp index 40f00c1e2ce..7a8466f81f5 100644 --- a/src/plugins/qtsupport/qtsupportplugin.cpp +++ b/src/plugins/qtsupport/qtsupportplugin.cpp @@ -122,7 +122,7 @@ static void askAboutQtInstallation() { // if the install settings exist, the Qt Creator installation is (probably) already linked to // a Qt installation, so don't ask - if (QFile::exists(ICore::settings(QSettings::SystemScope)->fileName()) + if (!QtOptionsPage::canLinkWithQt() || QtOptionsPage::isLinkedWithQt() || !ICore::infoBar()->canInfoBeAdded(kLinkWithQtInstallationSetting)) return; |