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 00000000..dc486c44 Binary files /dev/null and b/resources/filter.png differ