From c27d0bb1cbc1429cf77a80d585cd02a7c35d7ff9 Mon Sep 17 00:00:00 2001 From: Daniel Engelke Date: Tue, 17 Oct 2017 16:32:25 +0200 Subject: [PATCH] Add filter box to kit selection in target setup dialog The kit list gets quite long when having multiple qt versions installed. To prevent having to search through the whole list when wanting to select kits, a filter option based on kit names has been introduced. Change-Id: Id533eb62680de69e956396fc4624b61a8c2de909 Reviewed-by: Tobias Hunger --- .../projectexplorer/targetsetuppage.cpp | 60 ++++++++++++++++--- src/plugins/projectexplorer/targetsetuppage.h | 3 + 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/plugins/projectexplorer/targetsetuppage.cpp b/src/plugins/projectexplorer/targetsetuppage.cpp index c84beaf226d..dd41777de11 100644 --- a/src/plugins/projectexplorer/targetsetuppage.cpp +++ b/src/plugins/projectexplorer/targetsetuppage.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -52,6 +53,15 @@ namespace ProjectExplorer { namespace Internal { +static Utils::FileName importDirectory(const QString &projectPath) +{ + // Setup import widget: + auto path = Utils::FileName::fromString(projectPath); + path = path.parentDir(); // base dir + path = path.parentDir(); // parent dir + + return path; +} class TargetSetupPageUi { @@ -64,6 +74,7 @@ public: QLabel *noValidKitLabel; QLabel *optionHintLabel; QCheckBox *allKitsCheckBox; + Utils::FancyLineEdit *kitFilterLineEdit; void setupUi(TargetSetupPage *q) { @@ -93,6 +104,10 @@ public: allKitsCheckBox->setTristate(true); allKitsCheckBox->setText(TargetSetupPage::tr("Select all kits")); + kitFilterLineEdit = new Utils::FancyLineEdit(setupTargetPage); + kitFilterLineEdit->setFiltering(true); + kitFilterLineEdit->setPlaceholderText(TargetSetupPage::tr("Type to filter kits by name...")); + centralWidget = new QWidget(setupTargetPage); QSizePolicy policy(QSizePolicy::Preferred, QSizePolicy::Fixed); policy.setHorizontalStretch(0); @@ -115,8 +130,9 @@ public: auto verticalLayout_2 = new QVBoxLayout(setupTargetPage); verticalLayout_2->addWidget(headerLabel); - verticalLayout_2->addWidget(noValidKitLabel); verticalLayout_2->addWidget(descriptionLabel); + verticalLayout_2->addWidget(kitFilterLineEdit); + verticalLayout_2->addWidget(noValidKitLabel); verticalLayout_2->addWidget(optionHintLabel); verticalLayout_2->addWidget(allKitsCheckBox); verticalLayout_2->addWidget(centralWidget); @@ -131,6 +147,9 @@ public: QObject::connect(allKitsCheckBox, &QAbstractButton::clicked, q, &TargetSetupPage::changeAllKitsSelections); + + QObject::connect(kitFilterLineEdit, &Utils::FancyLineEdit::filterChanged, + q, &TargetSetupPage::kitFilterChanged); } }; @@ -246,20 +265,16 @@ bool TargetSetupPage::isComplete() const void TargetSetupPage::setupWidgets() { // Known profiles: - QList kitList; - kitList = KitManager::kits(m_requiredPredicate); - kitList = KitManager::sortKits(kitList); + auto kitList = sortedKitList(m_requiredPredicate); foreach (Kit *k, kitList) addWidget(k); // Setup import widget: - Utils::FileName path = Utils::FileName::fromString(m_projectPath); - path = path.parentDir(); // base dir - path = path.parentDir(); // parent dir - m_importWidget->setCurrentDirectory(path); + m_importWidget->setCurrentDirectory(Internal::importDirectory(m_projectPath)); updateVisibility(); + selectAtLeastOneKit(); } void TargetSetupPage::reset() @@ -434,6 +449,35 @@ void TargetSetupPage::kitSelectionChanged() m_ui->allKitsCheckBox->setCheckState(Qt::Unchecked); } +QList TargetSetupPage::sortedKitList(const Kit::Predicate &predicate) +{ + const auto kitList = KitManager::kits(predicate); + + return KitManager::sortKits(kitList); +} + +void TargetSetupPage::kitFilterChanged(const QString &filterText) +{ + // Reset current shown kits + reset(); + + if (filterText.isEmpty()) { + setupWidgets(); + } else { + const auto kitList = sortedKitList(m_requiredPredicate); + + foreach (Kit *kit, kitList) { + if (kit->displayName().contains(filterText, Qt::CaseInsensitive)) + addWidget(kit); + } + + m_importWidget->setCurrentDirectory(Internal::importDirectory(m_projectPath)); + + updateVisibility(); + selectAtLeastOneKit(); + } +} + void TargetSetupPage::changeAllKitsSelections() { if (m_ui->allKitsCheckBox->checkState() == Qt::PartiallyChecked) diff --git a/src/plugins/projectexplorer/targetsetuppage.h b/src/plugins/projectexplorer/targetsetuppage.h index 0b8918a954e..122872cd369 100644 --- a/src/plugins/projectexplorer/targetsetuppage.h +++ b/src/plugins/projectexplorer/targetsetuppage.h @@ -89,6 +89,8 @@ public: void openOptions(); void changeAllKitsSelections(); + void kitFilterChanged(const QString &filterText); + private: void handleKitAddition(ProjectExplorer::Kit *k); void handleKitRemoval(ProjectExplorer::Kit *k); @@ -96,6 +98,7 @@ private: void updateVisibility(); void kitSelectionChanged(); + static QList sortedKitList(const Kit::Predicate &predicate); bool isUpdating() const; void selectAtLeastOneKit();