From 37d8c1e44c89864987a2a28da9c75697a97b2601 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 23 Oct 2024 10:13:24 +0200 Subject: [PATCH] PE: Fix Kit enablement The TargetSetupWidget::toggleEnabled(), called first, sets the enablement for TargetSetupWidget's subcontrols, but not for TargetSetupWidget itself. In the scenario from the bugreport the toggleEnabled() was called with false, but the enablement of TargetSetupWidget was still true. Later, when selectAtLeastOneEnabledKit() is called, the internals take TargetSetupWidget's enablement into account, not the state set with previous call to toggleEnabled(). Rename toggleEnabled() into setValid(), store the flag internally, and add a getter isValid(). Reuse this getter in selectAtLeastOneEnabledKit(). Fixes: QTCREATORBUG-31879 Change-Id: I7b9be718cc6732afab6eb26387b2a88701a7fd67 Reviewed-by: Christian Kandeler Reviewed-by: hjk --- src/plugins/projectexplorer/targetsetuppage.cpp | 6 +++--- src/plugins/projectexplorer/targetsetupwidget.cpp | 15 ++++++++------- src/plugins/projectexplorer/targetsetupwidget.h | 4 +++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/plugins/projectexplorer/targetsetuppage.cpp b/src/plugins/projectexplorer/targetsetuppage.cpp index 5b752071fd5..979fb6772bc 100644 --- a/src/plugins/projectexplorer/targetsetuppage.cpp +++ b/src/plugins/projectexplorer/targetsetuppage.cpp @@ -460,7 +460,7 @@ void TargetSetupPagePrivate::selectAtLeastOneEnabledKit() auto isPreferred = [this](const TargetSetupWidget *w) { const Tasks tasks = m_tasksGenerator(w->kit()); - return w->isEnabled() && tasks.isEmpty(); + return w->isValid() && tasks.isEmpty(); }; // Use default kit if that is preferred: @@ -476,14 +476,14 @@ void TargetSetupPagePrivate::selectAtLeastOneEnabledKit() if (!toCheckWidget) { // Use default kit if it is enabled: toCheckWidget = findOrDefault(m_widgets, [defaultKit](const TargetSetupWidget *w) { - return w->isEnabled() && w->kit() == defaultKit; + return w->isValid() && w->kit() == defaultKit; }); } if (!toCheckWidget) { // Use the first enabled widget: toCheckWidget = findOrDefault(m_widgets, - [](const TargetSetupWidget *w) { return w->isEnabled(); }); + [](const TargetSetupWidget *w) { return w->isValid(); }); } if (toCheckWidget) { diff --git a/src/plugins/projectexplorer/targetsetupwidget.cpp b/src/plugins/projectexplorer/targetsetupwidget.cpp index 315c4d1f9db..6a26a6a3df3 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.cpp +++ b/src/plugins/projectexplorer/targetsetupwidget.cpp @@ -217,12 +217,12 @@ void TargetSetupWidget::update(const TasksGenerator &generator) // Kits that where the taskGenarator reports an error are not selectable, because we cannot // guarantee that we can handle the project sensibly (e.g. qmake project without Qt). if (!errorTask.isNull()) { - toggleEnabled(false); + setValid(false); m_infoStore.clear(); return; } - toggleEnabled(true); + setValid(true); updateDefaultBuildDirectories(); } @@ -241,12 +241,13 @@ bool TargetSetupWidget::hasSelectableBuildConfigurations() const return !m_infoStore.empty(); } -void TargetSetupWidget::toggleEnabled(bool enabled) +void TargetSetupWidget::setValid(bool valid) { - m_detailsWidget->widget()->setEnabled(enabled); - m_detailsWidget->setCheckable(enabled); - m_detailsWidget->setExpandable(enabled && hasSelectableBuildConfigurations()); - if (!enabled) { + m_isValid = valid; + m_detailsWidget->widget()->setEnabled(valid); + m_detailsWidget->setCheckable(valid); + m_detailsWidget->setExpandable(valid && hasSelectableBuildConfigurations()); + if (!valid) { m_detailsWidget->setState(DetailsWidget::Collapsed); m_detailsWidget->setChecked(false); } diff --git a/src/plugins/projectexplorer/targetsetupwidget.h b/src/plugins/projectexplorer/targetsetupwidget.h index 4768e35fd5c..2aca36550c5 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.h +++ b/src/plugins/projectexplorer/targetsetupwidget.h @@ -43,6 +43,7 @@ public: bool isKitSelected() const; void setKitSelected(bool b); + bool isValid() const { return m_isValid; } void addBuildInfo(const BuildInfo &info, bool isImport); @@ -59,7 +60,7 @@ private: bool hasSelectableBuildConfigurations() const; - void toggleEnabled(bool enabled); + void setValid(bool valid); void checkBoxToggled(QCheckBox *checkBox, bool b); void pathChanged(Utils::PathChooser *pathChooser); void targetCheckBoxToggled(bool b); @@ -70,6 +71,7 @@ private: void clear(); void updateDefaultBuildDirectories(); + bool m_isValid = false; Kit *m_kit; Utils::FilePath m_projectPath; bool m_haveImported = false;