@@ -0,0 +1,23 | |||||
|
1 | #ifndef SCIQLOP_DATASOURCETREEWIDGETHELPER_H | |||
|
2 | #define SCIQLOP_DATASOURCETREEWIDGETHELPER_H | |||
|
3 | ||||
|
4 | #include <functional> | |||
|
5 | ||||
|
6 | class DataSourceTreeWidgetItem; | |||
|
7 | class QTreeWidget; | |||
|
8 | ||||
|
9 | class DataSourceTreeWidgetHelper { | |||
|
10 | public: | |||
|
11 | /// Signature of the function associated to the filtering action | |||
|
12 | using FilterFunction = std::function<bool(const DataSourceTreeWidgetItem &dataSourceItem)>; | |||
|
13 | ||||
|
14 | /** | |||
|
15 | * Filters a tree widget according to a function. If an item is valid according to this | |||
|
16 | * function, all of its ancestors and children are shown | |||
|
17 | * @param treeWidget the widget to filter | |||
|
18 | * @param fun the filter function | |||
|
19 | */ | |||
|
20 | static void filter(QTreeWidget &treeWidget, FilterFunction fun) noexcept; | |||
|
21 | }; | |||
|
22 | ||||
|
23 | #endif // SCIQLOP_DATASOURCETREEWIDGETHELPER_H |
@@ -0,0 +1,36 | |||||
|
1 | #include "DataSource/DataSourceTreeWidgetHelper.h" | |||
|
2 | #include "DataSource/DataSourceTreeWidgetItem.h" | |||
|
3 | ||||
|
4 | namespace { | |||
|
5 | ||||
|
6 | bool filterTreeItem(DataSourceTreeWidgetItem &treeItem, | |||
|
7 | DataSourceTreeWidgetHelper::FilterFunction fun, bool parentValid = false) | |||
|
8 | { | |||
|
9 | auto selfValid = parentValid || fun(treeItem); | |||
|
10 | ||||
|
11 | auto childValid = false; | |||
|
12 | auto childCount = treeItem.childCount(); | |||
|
13 | for (auto i = 0; i < childCount; ++i) { | |||
|
14 | if (auto childItem = dynamic_cast<DataSourceTreeWidgetItem *>(treeItem.child(i))) { | |||
|
15 | childValid |= filterTreeItem(*childItem, fun, selfValid); | |||
|
16 | } | |||
|
17 | } | |||
|
18 | ||||
|
19 | auto valid = selfValid || childValid; | |||
|
20 | ||||
|
21 | treeItem.setHidden(!valid); | |||
|
22 | ||||
|
23 | return valid; | |||
|
24 | } | |||
|
25 | ||||
|
26 | } // namespace | |||
|
27 | ||||
|
28 | void DataSourceTreeWidgetHelper::filter(QTreeWidget &treeWidget, FilterFunction fun) noexcept | |||
|
29 | { | |||
|
30 | auto itemCount = treeWidget.topLevelItemCount(); | |||
|
31 | for (auto i = 0; i < itemCount; ++i) { | |||
|
32 | if (auto item = dynamic_cast<DataSourceTreeWidgetItem *>(treeWidget.topLevelItem(i))) { | |||
|
33 | filterTreeItem(*item, fun); | |||
|
34 | } | |||
|
35 | } | |||
|
36 | } |
General Comments 0
You need to be logged in to leave comments.
Login now