aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libs/languageserverprotocol/lsputils.h2
-rw-r--r--src/plugins/clangtools/clangtool.cpp29
-rw-r--r--src/plugins/clangtools/clangtool.h3
-rw-r--r--src/plugins/mcusupport/mcusupportoptions.cpp6
-rw-r--r--src/plugins/mcusupport/mcusupportsdk.cpp222
-rw-r--r--src/plugins/mcusupport/mcusupportsdk.h9
-rw-r--r--src/plugins/projectexplorer/sessionmodel.cpp4
-rw-r--r--src/plugins/projectexplorer/sessionmodel.h2
-rw-r--r--src/plugins/qbsprojectmanager/qbsproject.cpp2
-rw-r--r--src/plugins/qtsupport/qtoptionspage.cpp37
-rw-r--r--src/plugins/qtsupport/qtoptionspage.h2
-rw-r--r--src/plugins/qtsupport/qtsupportplugin.cpp2
12 files changed, 209 insertions, 111 deletions
diff --git a/src/libs/languageserverprotocol/lsputils.h b/src/libs/languageserverprotocol/lsputils.h
index 8da5fdd93a..435d956eeb 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 87ce2875f7..0928e40e6b 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 3ee72da83c..a32bb50c2c 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 2ce44293b7..894eb9cb4c 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 bd57cd5c50..757d919315 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 444855b881..1cc2adadc7 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 a535294f91..5ba79dbf80 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 a4c09132f8..d95102590c 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 b3264dfb59..96efcd1d6b 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 95c3b84d50..3f851979fe 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 e2bfc9cbef..6f5599f51a 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 40f00c1e2c..7a8466f81f 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;