From 480bdbd3af2abe97a9a9ef7379351d60aff65296 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 13 Sep 2021 04:20:29 +0300 Subject: [PATCH] Add search field for Android Sdk Manager The list of packages from the sdk manager can be too much to look at and search manually, thus a search field is very convenient to have here. The search is very simple, include any package that contains the search word into the result. Change-Id: Id222841162739d49562ad11bb0f3152041614ebc Reviewed-by: Alessandro Portale --- .../android/androidsdkmanagerwidget.cpp | 26 +++++++++++- .../android/androidsdkmanagerwidget.ui | 41 +++++++++---------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index c4598351536..c576571d32c 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -59,10 +59,12 @@ public: PackageFilterModel(AndroidSdkModel* sdkModel); void setAcceptedPackageState(AndroidSdkPackage::PackageState state); + void setAcceptedSearchPackage(const QString &text); bool filterAcceptsRow(int source_row, const QModelIndex &sourceParent) const override; private: AndroidSdkPackage::PackageState m_packageState = AndroidSdkPackage::AnyValidState; + QString m_searchText; }; AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config, @@ -129,6 +131,15 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config, } }); + m_ui->searchField->setPlaceholderText("Filter"); + connect(m_ui->searchField, &QLineEdit::textChanged, [this, proxyModel](const QString &text) { + const bool isExpanded = m_ui->expandCheck->isChecked(); + proxyModel->setAcceptedSearchPackage(text); + m_sdkModel->resetSelection(); + // It is more convenient to expand the view with the results + m_ui->expandCheck->setChecked(!text.isEmpty()); + }); + connect(m_ui->applySelectionButton, &QPushButton::clicked, this, &AndroidSdkManagerWidget::onApplyButton); connect(m_ui->cancelButton, &QPushButton::clicked, this, @@ -469,6 +480,12 @@ void PackageFilterModel::setAcceptedPackageState(AndroidSdkPackage::PackageState invalidateFilter(); } +void PackageFilterModel::setAcceptedSearchPackage(const QString &name) +{ + m_searchText = name; + invalidateFilter(); +} + bool PackageFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { QModelIndex srcIndex = sourceModel()->index(sourceRow, 0, sourceParent); @@ -479,19 +496,24 @@ bool PackageFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sour return (AndroidSdkPackage::PackageState)i.data(AndroidSdkModel::PackageStateRole).toInt(); }; + auto packageFound = [this](const QModelIndex& i) { + return i.data(AndroidSdkModel::packageNameColumn).toString() + .contains(m_searchText, Qt::CaseInsensitive); + }; + bool showTopLevel = false; if (!sourceParent.isValid()) { // Top Level items for (int row = 0; row < sourceModel()->rowCount(srcIndex); ++row) { QModelIndex childIndex = sourceModel()->index(row, 0, srcIndex); - if (m_packageState & packageState(childIndex)) { + if ((m_packageState & packageState(childIndex) && packageFound(childIndex))) { showTopLevel = true; break; } } } - return showTopLevel || (packageState(srcIndex) & m_packageState); + return showTopLevel || (packageState(srcIndex) & m_packageState) && packageFound(srcIndex); } OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, diff --git a/src/plugins/android/androidsdkmanagerwidget.ui b/src/plugins/android/androidsdkmanagerwidget.ui index e49f7a792ef..3baa968402a 100644 --- a/src/plugins/android/androidsdkmanagerwidget.ui +++ b/src/plugins/android/androidsdkmanagerwidget.ui @@ -51,27 +51,7 @@ 4 - - - - - - - 0 - 0 - - - - Expand All - - - true - - - - - - + 20 @@ -81,7 +61,7 @@ - + @@ -149,6 +129,16 @@ + + + + + + + Expand All + + + @@ -234,6 +224,13 @@ + + + Utils::FancyLineEdit + QLineEdit +
utils/fancylineedit.h
+
+
packagesView showAllRadio