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