Skip to content

Commit b7af98e

Browse files
committed
Solve _update_number_matches recursively (O(n))
1 parent 55dd8dc commit b7af98e

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

editor/tree_search.cpp

+21-8
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ void TreeSearch::_filter_tree() {
6363
}
6464

6565
void TreeSearch::_filter_tree(TreeItem *p_item, bool p_parent_matching) {
66-
bool visible = number_matches.has(p_item) | p_parent_matching;
66+
bool visible = (number_matches.has(p_item) && (number_matches.get(p_item) > 0)) || p_parent_matching;
6767

6868
p_item->set_visible(visible);
6969

@@ -237,17 +237,30 @@ void TreeSearch::_update_ordered_tree_items(TreeItem *p_tree_item) {
237237
}
238238

239239
void TreeSearch::_update_number_matches() {
240+
ERR_FAIL_COND(!tree_reference);
241+
240242
number_matches.clear();
241243
number_matches.reserve(ordered_tree_items.size());
242244

243-
for (int i = 0; i < matching_entries.size(); i++) {
244-
TreeItem *item = matching_entries[i];
245-
while (item) {
246-
int previous_match_cnt = number_matches.has(item) ? number_matches.get(item) : 0;
247-
number_matches[item] = previous_match_cnt + 1;
248-
item = item->get_parent();
249-
}
245+
_update_number_matches(tree_reference->get_root());
246+
}
247+
248+
void TreeSearch::_update_number_matches(TreeItem *item) {
249+
for (int i = 0; i < item->get_child_count(); i++) {
250+
TreeItem *child = item->get_child(i);
251+
_update_number_matches(child);
250252
}
253+
int count = _vector_has_bsearch(matching_entries, item) ? 1 : 0;
254+
255+
for (int i = 0; i < item->get_child_count(); i++) {
256+
TreeItem *child = item->get_child(i);
257+
count += number_matches.has(child) ? number_matches.get(child) : 0;
258+
}
259+
if (count == 0) {
260+
return;
261+
}
262+
263+
number_matches[item] = count;
251264
}
252265

253266
String TreeSearch::_get_search_mask() const {

editor/tree_search.h

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class TreeSearch : public RefCounted {
8282
void _update_matching_entries(const String &p_search_mask);
8383
void _update_ordered_tree_items(TreeItem *p_tree_item);
8484
void _update_number_matches();
85+
void _update_number_matches(TreeItem *item);
8586

8687
void _find_matching_entries(TreeItem *p_tree_item, const String &p_search_mask, Vector<TreeItem *> &p_accum) const;
8788
String _get_search_mask() const;

0 commit comments

Comments
 (0)