From e9bd72bd0f170cd3ec11c172bde93984c7ce714e Mon Sep 17 00:00:00 2001 From: Takumi Asaki Date: Tue, 1 Jul 2014 11:21:15 +0900 Subject: [PATCH] TargetSetupPage: Add CheckBox to select/deselect all kits Change-Id: I46990751002d4193a51b0ce919a181ff026ddd49 Reviewed-by: Daniel Teske --- .../projectexplorer/targetsetuppage.cpp | 55 ++++++++++++++++++- src/plugins/projectexplorer/targetsetuppage.h | 3 + 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/targetsetuppage.cpp b/src/plugins/projectexplorer/targetsetuppage.cpp index dd9ccbbcd0f..228bf62cad4 100644 --- a/src/plugins/projectexplorer/targetsetuppage.cpp +++ b/src/plugins/projectexplorer/targetsetuppage.cpp @@ -50,6 +50,7 @@ #include #include #include +#include namespace ProjectExplorer { namespace Internal { @@ -64,6 +65,7 @@ public: QLabel *descriptionLabel; QLabel *noValidKitLabel; QLabel *optionHintLabel; + QCheckBox *allKitsCheckBox; void setupUi(QWidget *q) { @@ -89,6 +91,10 @@ public: optionHintLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); optionHintLabel->setVisible(false); + allKitsCheckBox = new QCheckBox(setupTargetPage); + allKitsCheckBox->setTristate(true); + allKitsCheckBox->setText(TargetSetupPage::tr("Select all kits")); + centralWidget = new QWidget(setupTargetPage); QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Fixed); policy.setHorizontalStretch(0); @@ -115,6 +121,7 @@ public: verticalLayout_2->addWidget(noValidKitLabel); verticalLayout_2->addWidget(descriptionLabel); verticalLayout_2->addWidget(optionHintLabel); + verticalLayout_2->addWidget(allKitsCheckBox); verticalLayout_2->addWidget(centralWidget); verticalLayout_2->addWidget(scrollAreaWidget); @@ -124,6 +131,9 @@ public: QObject::connect(optionHintLabel, SIGNAL(linkActivated(QString)), q, SLOT(openOptions())); + + QObject::connect(allKitsCheckBox, SIGNAL(clicked()), + q, SLOT(changeAllKitsSelections())); } }; @@ -243,8 +253,10 @@ bool TargetSetupPage::isKitSelected(Core::Id id) const void TargetSetupPage::setKitSelected(Core::Id id, bool selected) { TargetSetupWidget *widget = m_widgets.value(id); - if (widget) + if (widget) { widget->setKitSelected(selected); + kitSelectionChanged(); + } } bool TargetSetupPage::isComplete() const @@ -289,6 +301,8 @@ void TargetSetupPage::reset() m_widgets.clear(); m_firstWidget = 0; + + m_ui->allKitsCheckBox->setChecked(false); } void TargetSetupPage::setProjectPath(const QString &path) @@ -401,8 +415,10 @@ void TargetSetupPage::selectAtLeastOneKit() Kit *defaultKit = KitManager::defaultKit(); if (defaultKit) widget = m_widgets.value(defaultKit->id(), m_firstWidget); - if (widget) + if (widget) { widget->setKitSelected(true); + kitSelectionChanged(); + } m_firstWidget = 0; } emit completeChanged(); // Is this necessary? @@ -417,6 +433,7 @@ void TargetSetupPage::updateVisibility() bool hasKits = !m_widgets.isEmpty(); m_ui->noValidKitLabel->setVisible(!hasKits); m_ui->optionHintLabel->setVisible(m_forceOptionHint || !hasKits); + m_ui->allKitsCheckBox->setVisible(hasKits); emit completeChanged(); } @@ -433,6 +450,34 @@ void TargetSetupPage::import(const Utils::FileName &path) import(path, false); } +void TargetSetupPage::kitSelectionChanged() +{ + int selected = 0; + int deselected = 0; + foreach (TargetSetupWidget *widget, m_widgets) { + if (widget->isKitSelected()) + ++selected; + else + ++deselected; + } + if (selected > 0 && deselected > 0) + m_ui->allKitsCheckBox->setCheckState(Qt::PartiallyChecked); + else if (selected > 0 && deselected == 0) + m_ui->allKitsCheckBox->setCheckState(Qt::Checked); + else + m_ui->allKitsCheckBox->setCheckState(Qt::Unchecked); +} + +void TargetSetupPage::changeAllKitsSelections() +{ + if (m_ui->allKitsCheckBox->checkState() == Qt::PartiallyChecked) + m_ui->allKitsCheckBox->setCheckState(Qt::Checked); + bool checked = m_ui->allKitsCheckBox->isChecked(); + foreach (TargetSetupWidget *widget, m_widgets) + widget->setKitSelected(checked); + emit completeChanged(); +} + bool TargetSetupPage::isUpdating() const { if (m_importer) @@ -462,6 +507,7 @@ void TargetSetupPage::import(const Utils::FileName &path, bool silent) widget->addBuildInfo(info, true); widget->setKitSelected(true); widget->expandWidget(); + kitSelectionChanged(); } emit completeChanged(); } @@ -475,6 +521,7 @@ void TargetSetupPage::removeWidget(Kit *k) m_firstWidget = 0; widget->deleteLater(); m_widgets.remove(k->id()); + kitSelectionChanged(); } TargetSetupWidget *TargetSetupPage::addWidget(Kit *k) @@ -499,6 +546,8 @@ TargetSetupWidget *TargetSetupPage::addWidget(Kit *k) widget->setKitSelected(m_preferredMatcher && m_preferredMatcher->matches(k)); m_widgets.insert(k->id(), widget); + connect(widget, SIGNAL(selectedToggled()), + this, SLOT(kitSelectionChanged())); m_baseLayout->addWidget(widget); m_baseLayout->addWidget(m_importWidget); @@ -512,6 +561,8 @@ TargetSetupWidget *TargetSetupPage::addWidget(Kit *k) if (!m_firstWidget) m_firstWidget = widget; + kitSelectionChanged(); + return widget; } diff --git a/src/plugins/projectexplorer/targetsetuppage.h b/src/plugins/projectexplorer/targetsetuppage.h index 9a58db66f4a..0b86488b443 100644 --- a/src/plugins/projectexplorer/targetsetuppage.h +++ b/src/plugins/projectexplorer/targetsetuppage.h @@ -96,6 +96,9 @@ private slots: void openOptions(); void import(const Utils::FileName &path); + void kitSelectionChanged(); + void changeAllKitsSelections(); + private: bool isUpdating() const; void selectAtLeastOneKit();