From 3db496d1eff99df36e99dcc53258498827f5a069 Mon Sep 17 00:00:00 2001 From: Trevor SANDY Date: Tue, 18 Apr 2023 00:59:12 +0200 Subject: [PATCH] Filter categories --- common/lc_partselectionwidget.cpp | 48 ++++++++++++++++++++++++++++++ common/lc_partselectionwidget.h | 4 +++ leocad.qrc | 1 + resources/filter.png | Bin 0 -> 1642 bytes 4 files changed, 53 insertions(+) create mode 100644 resources/filter.png diff --git a/common/lc_partselectionwidget.cpp b/common/lc_partselectionwidget.cpp index 4f984317..9b9efbc6 100644 --- a/common/lc_partselectionwidget.cpp +++ b/common/lc_partselectionwidget.cpp @@ -727,11 +727,29 @@ lcPartSelectionWidget::lcPartSelectionWidget(QWidget* Parent) mSplitter->setOrientation(Qt::Vertical); mSplitter->setChildrenCollapsible(false); + QWidget* CategoriesGroupWidget = new QWidget(mSplitter); + + QVBoxLayout* CategoriesLayout = new QVBoxLayout(); + CategoriesLayout->setContentsMargins(0, 0, 0, 0); + CategoriesGroupWidget->setLayout(CategoriesLayout); + + QHBoxLayout* FilterCategoriesLayout = new QHBoxLayout(); + FilterCategoriesLayout->setContentsMargins(0, 0, 6, 0); + CategoriesLayout->addLayout(FilterCategoriesLayout); + + mFilterCategoriesWidget = new QLineEdit(CategoriesGroupWidget); + mFilterCategoriesWidget->setPlaceholderText(tr("Filter Categories")); + mFilterCategoriesAction = mFilterCategoriesWidget->addAction(QIcon(":/resources/filter.png"), QLineEdit::TrailingPosition); + connect(mFilterCategoriesAction, SIGNAL(triggered()), this, SLOT(FilterCategoriesTriggered())); + FilterCategoriesLayout->addWidget(mFilterCategoriesWidget); + mCategoriesWidget = new QTreeWidget(mSplitter); mCategoriesWidget->setHeaderHidden(true); mCategoriesWidget->setUniformRowHeights(true); mCategoriesWidget->setRootIsDecorated(false); + CategoriesLayout->addWidget(mCategoriesWidget); + QWidget* PartsGroupWidget = new QWidget(mSplitter); QVBoxLayout* PartsLayout = new QVBoxLayout(); @@ -769,6 +787,7 @@ lcPartSelectionWidget::lcPartSelectionWidget(QWidget* Parent) connect(mPartsWidget->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(PartChanged(const QModelIndex&, const QModelIndex&))); connect(mFilterWidget, SIGNAL(textChanged(const QString&)), this, SLOT(FilterChanged(const QString&))); connect(mCategoriesWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(CategoryChanged(QTreeWidgetItem*, QTreeWidgetItem*))); + connect(mFilterCategoriesWidget, SIGNAL(textChanged(const QString&)), this, SLOT(FilterCategoriesChanged(const QString&))); LoadPartPalettes(); UpdateCategories(); @@ -855,6 +874,30 @@ void lcPartSelectionWidget::resizeEvent(QResizeEvent* Event) QWidget::resizeEvent(Event); } +void lcPartSelectionWidget::FilterCategoriesChanged(const QString& Text) +{ + if (mFilterCategoriesAction) + { + if (Text.isEmpty()) + mFilterCategoriesAction->setIcon(QIcon(":/resources/filter.png")); + else + mFilterCategoriesAction->setIcon(QIcon(":/resources/parts_cancel.png")); + } + + bool Hide = true; + mCategoriesWidget->setUpdatesEnabled(false); + for (int CategoryIdx = 0; CategoryIdx < mCategoriesWidget->topLevelItemCount(); CategoryIdx++) + { + QTreeWidgetItem* CategoryItem = mCategoriesWidget->topLevelItem(CategoryIdx); + Hide = false; + if (!CategoryItem->text(0).contains(Text, Qt::CaseInsensitive)) + Hide = true; + CategoryItem->setHidden(Hide); + } + mCategoriesWidget->setUpdatesEnabled(true); + mCategoriesWidget->update(); +} + void lcPartSelectionWidget::FilterChanged(const QString& Text) { if (mFilterAction) @@ -868,6 +911,11 @@ void lcPartSelectionWidget::FilterChanged(const QString& Text) mPartsWidget->GetListModel()->SetFilter(Text); } +void lcPartSelectionWidget::FilterCategoriesTriggered() +{ + mFilterCategoriesWidget->clear(); +} + void lcPartSelectionWidget::FilterTriggered() { mFilterWidget->clear(); diff --git a/common/lc_partselectionwidget.h b/common/lc_partselectionwidget.h index 6bba9189..1f97ab4b 100644 --- a/common/lc_partselectionwidget.h +++ b/common/lc_partselectionwidget.h @@ -230,7 +230,9 @@ public slots: protected slots: void DockLocationChanged(Qt::DockWidgetArea Area); void FilterChanged(const QString& Text); + void FilterCategoriesChanged(const QString& Text); void FilterTriggered(); + void FilterCategoriesTriggered(); void CategoryChanged(QTreeWidgetItem* Current, QTreeWidgetItem* Previous); void PartChanged(const QModelIndex& Current, const QModelIndex& Previous); void OptionsMenuAboutToShow(); @@ -244,6 +246,8 @@ protected: bool event(QEvent* Event) override; QTreeWidget* mCategoriesWidget; + QLineEdit* mFilterCategoriesWidget; + QAction* mFilterCategoriesAction; QLineEdit* mFilterWidget; QAction* mFilterAction; lcPartSelectionListView* mPartsWidget; diff --git a/leocad.qrc b/leocad.qrc index 0a3567ec..75d84a9d 100644 --- a/leocad.qrc +++ b/leocad.qrc @@ -78,6 +78,7 @@ resources/file_print.png resources/file_print_preview.png resources/file_save.png + resources/filter.png resources/time_first.png resources/time_last.png resources/time_next.png diff --git a/resources/filter.png b/resources/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..dc486c4401583131e9cd9ce18549a120840e0fbf GIT binary patch literal 1642 zcmV-w29^1VP)jFOf~ zTd2@L`4MnQi~VCQ-EK>}J3Bi+*K_a8mTjT1Z9;GM?A)2Td(L;x`Odj_8Rr~~F%%58 z^^-%}I8*Crx(14}hI1BU3ag=|cOFcB{NeFF#`p+0k282zJli^CeDV58dNV}}3jiov zKl=4$greWY%EFb^u_$U{rKqkbMM+3StW-xV8YZ0_9{pZw@I1N?w6VN02KqpuuT6%#K1@zgQF%!)42q!iT7GQf2~Pq(E=c07A`xu>xH!_i)c7AFotBthH*ZD zkftFqVZ(ufu&yH%(&(9va7c&-m8r~P8)y1cNM~(~n*Cc^7DK+}h>V(|JfhHh9m z-8&*ZzM3>)k|!Sd0*TQK-rc%t3U9SS26M?R4`Zf>ix%aPyijGB34}@j9G5&L zv0XTBFn7e*e!hME#A3@flb-&1}QpA5GE zq|qcVJ|`6Ds^G{?(E|~wU@|CNR*g=nD=hnb1h_kqG=A*3R{zyYEAiq=4Od283}rn0 zmvKRS!Z>~99O3|xE=k@L_5`6%DG*6U;)IB1jv_N*+SuK&N=EU^!+%2`Pa64tknaQK zG+*`9`}_CRKHX6N&XyHeMn%%vXQ5_+Pw|Qp1tu9zlR}fylg^Q1%f)!sA<5we85yIx zw``FHQI0Mwv5sW><_BaN_x*7hdTPLE`{wOkq_l@*JP$xbVj;#D&&oqv=#1DO2(2VjVeGUvm3-KR z=c+FcE-EE@Go1M6I+9l|lJV^`8ZWGZ+ik9ba}|P^n|2@Av;LW9>z}BtBGnveQDU;u z_ z&40ESt*7x^4INM@A!C^=HpV=h>b#6|?QJcyG4A)^yPmVAaAFb3hRq)z=Ho8spB*3L z+kc7k-jOt~`}BxVv>{ld7OPZ4@gpCJh#>6^8$NmIlgv1IA`cbq`7BZ}9fTzs4YmDX zhZN^OTW&(~-7JjH1;FHw#+_hqCrO#kOr?Bp0Ej{7)XD8voPOCH^~@~-yJ0b%QS6pg!F4=1=cVQgK)#cTzgQ(f oWYXf;I6F!gzZcw-@xK5A02AOnNFlAraR2}S07*qoM6N<$g4pH&>;M1& literal 0 HcmV?d00001