From 5cd474522a7438986663d551cbc324f456cd6818 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 31 Oct 2019 15:48:42 +0100 Subject: Target setup page: Fix some glitches - Make sure the "Manage" button is always enabled. - Clear the list of possible build configs and collapse the details widget when a kit becomes unusable. - Do not collapse the details widget when it gets selected. - The "Details" button was sometimes grayed out when it shouldn't have been. Change-Id: Ibc0f44213b633aebddfa7542d7dbdd0244df23f9 Reviewed-by: Christian Kandeler Reviewed-by: Christian Stenger --- src/libs/utils/detailsbutton.cpp | 8 ++++++ src/libs/utils/detailsbutton.h | 1 + src/libs/utils/detailswidget.cpp | 10 +++++++ src/libs/utils/detailswidget.h | 2 ++ src/plugins/projectexplorer/targetsetupwidget.cpp | 32 ++++++++++++++++++----- src/plugins/projectexplorer/targetsetupwidget.h | 3 +++ 6 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/libs/utils/detailsbutton.cpp b/src/libs/utils/detailsbutton.cpp index abceff7b2d..07c27d3b70 100644 --- a/src/libs/utils/detailsbutton.cpp +++ b/src/libs/utils/detailsbutton.cpp @@ -110,6 +110,14 @@ bool DetailsButton::event(QEvent *e) return false; } +void DetailsButton::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::EnabledChange) { + m_checkedPixmap = QPixmap(); + m_uncheckedPixmap = QPixmap(); + } +} + void DetailsButton::paintEvent(QPaintEvent *e) { QWidget::paintEvent(e); diff --git a/src/libs/utils/detailsbutton.h b/src/libs/utils/detailsbutton.h index dabbe75918..3c7286e9ee 100644 --- a/src/libs/utils/detailsbutton.h +++ b/src/libs/utils/detailsbutton.h @@ -71,6 +71,7 @@ public: protected: void paintEvent(QPaintEvent *e) override; bool event(QEvent *e) override; + void changeEvent(QEvent *e) override; private: QPixmap cacheRendering(const QSize &size, bool checked); diff --git a/src/libs/utils/detailswidget.cpp b/src/libs/utils/detailswidget.cpp index dd02d1a4a5..06159b101e 100644 --- a/src/libs/utils/detailswidget.cpp +++ b/src/libs/utils/detailswidget.cpp @@ -229,6 +229,16 @@ void DetailsWidget::setUseCheckBox(bool b) d->updateControls(); } +void DetailsWidget::setCheckable(bool b) +{ + d->m_summaryCheckBox->setEnabled(b); +} + +void DetailsWidget::setExpandable(bool b) +{ + d->m_detailsButton->setEnabled(b); +} + void DetailsWidget::setChecked(bool b) { d->m_summaryCheckBox->setChecked(b); diff --git a/src/libs/utils/detailswidget.h b/src/libs/utils/detailswidget.h index f96f0f549d..e9c55c9eaf 100644 --- a/src/libs/utils/detailswidget.h +++ b/src/libs/utils/detailswidget.h @@ -78,6 +78,8 @@ public: bool useCheckBox(); void setUseCheckBox(bool b); + void setCheckable(bool b); + void setExpandable(bool b); void setIcon(const QIcon &icon); static QPixmap createBackground(const QSize &size, int topHeight, QWidget *widget); diff --git a/src/plugins/projectexplorer/targetsetupwidget.cpp b/src/plugins/projectexplorer/targetsetupwidget.cpp index 432abb53b4..ddcda6d8ff 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.cpp +++ b/src/plugins/projectexplorer/targetsetupwidget.cpp @@ -122,7 +122,7 @@ bool TargetSetupWidget::isKitSelected() const void TargetSetupWidget::setKitSelected(bool b) { // Only check target if there are build configurations possible - b &= !selectedBuildInfoList().isEmpty(); + b &= hasSelectedBuildConfigurations(); m_ignoreChange = true; m_detailsWidget->setChecked(b); m_detailsWidget->widget()->setEnabled(b); @@ -187,9 +187,12 @@ void TargetSetupWidget::targetCheckBoxToggled(bool b) if (m_ignoreChange) return; m_detailsWidget->widget()->setEnabled(b); - m_detailsWidget->setState(b && Utils::contains(m_infoStore, &BuildInfoStore::hasIssues) - ? Utils::DetailsWidget::Expanded - : Utils::DetailsWidget::Collapsed); + if (b && (contains(m_infoStore, &BuildInfoStore::hasIssues) + || !contains(m_infoStore, &BuildInfoStore::isEnabled))) { + m_detailsWidget->setState(DetailsWidget::Expanded); + } else if (!b) { + m_detailsWidget->setState(Utils::DetailsWidget::Collapsed); + } emit selectedToggled(); } @@ -230,12 +233,13 @@ void TargetSetupWidget::update(const Kit::Predicate &predicate) // Kits that don't fulfill the project predicate are not selectable, because we cannot // guarantee that we can handle the project sensibly (e.g. qmake project without Qt). if (predicate && !predicate(kit())) { - setEnabled(false); + toggleEnabled(false); + m_infoStore.clear(); m_detailsWidget->setToolTip(tr("You cannot use this kit, because it does not fulfill " "the project's prerequisites.")); return; } - setEnabled(true); + toggleEnabled(true); m_detailsWidget->setIcon(kit()->isValid() ? kit()->icon() : Icons::CRITICAL.icon()); m_detailsWidget->setToolTip(m_kit->toHtml()); updateDefaultBuildDirectories(); @@ -251,6 +255,22 @@ const QList TargetSetupWidget::buildInfoList(const Kit *k, const File return {info}; } +bool TargetSetupWidget::hasSelectedBuildConfigurations() const +{ + return !selectedBuildInfoList().isEmpty(); +} + +void TargetSetupWidget::toggleEnabled(bool enabled) +{ + m_detailsWidget->widget()->setEnabled(enabled && hasSelectedBuildConfigurations()); + m_detailsWidget->setCheckable(enabled); + m_detailsWidget->setExpandable(enabled); + if (!enabled) { + m_detailsWidget->setState(DetailsWidget::Collapsed); + m_detailsWidget->setChecked(false); + } +} + const QList TargetSetupWidget::selectedBuildInfoList() const { QList result; diff --git a/src/plugins/projectexplorer/targetsetupwidget.h b/src/plugins/projectexplorer/targetsetupwidget.h index 80f64ad918..6534baf700 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.h +++ b/src/plugins/projectexplorer/targetsetupwidget.h @@ -78,6 +78,9 @@ signals: private: static const QList buildInfoList(const Kit *k, const Utils::FilePath &projectPath); + bool hasSelectedBuildConfigurations() const; + + void toggleEnabled(bool enabled); void checkBoxToggled(bool b); void pathChanged(); void targetCheckBoxToggled(bool b); -- cgit v1.2.1