diff --git a/editor/tree_search.cpp b/editor/tree_search.cpp index 18fae15..8b3d0db 100644 --- a/editor/tree_search.cpp +++ b/editor/tree_search.cpp @@ -57,56 +57,21 @@ void TreeSearch::_clean_callable_cache() { callable_cache = new_callable_cache; } -// Makes all tree items invisible that don't match the following criteria: -// 1. is a matching tree_item -// 2. is a parent of a matching tree_item -// 3. is any descendant of a matching tree_item -void TreeSearch::_filter_tree(const String &p_search_mask) { - if (number_matches.size() == 0){ - return; +void TreeSearch::_filter_tree() { + ERR_FAIL_COND(!tree_reference); + _filter_tree(tree_reference->get_root(), false); +} + +void TreeSearch::_filter_tree(TreeItem * p_item, bool p_parent_matching) { + bool child_visibility = true; + bool visible = number_matches.has(p_item) | p_parent_matching; + + if (!visible){ + p_item->set_visible(visible); } - HashSet visible_as_parent; - HashSet visible_as_descendant; - - // Mark matching items and all their ancestors (1, 2) - for (int i = 0; i < matching_entries.size(); i++) { - TreeItem *cur_match = matching_entries[i]; - TreeItem *current = cur_match; - while (current != nullptr && !visible_as_parent.has(current)) { - visible_as_parent.insert(current); - current = current->get_parent(); - } - } - - // Mark matching items and all their descendants (1, 3) - for (int i = 0; i < matching_entries.size(); i++) { - TreeItem *cur_match = matching_entries[i]; - if (visible_as_descendant.has(cur_match)) { - continue; - } - // Descendents - Vector descendent_list = { cur_match }; - - for (int j = 0; j < descendent_list.size(); j++) { - TreeItem *descendent = descendent_list[j]; - if (visible_as_descendant.has(descendent)) { - continue; // Skip subtree if already processed - } - visible_as_descendant.insert(descendent); - - // Collect X-level descendents (bit clunky because godot doesn't return get_children as pointers) - for (int k = 0; k < descendent->get_child_count(); k++) { - TreeItem *child = descendent->get_child(k); - descendent_list.push_back(child); - } - } - } - - // Set visibility based on whether items are in either visibility set - for (int i = 0; i < ordered_tree_items.size(); i++) { - TreeItem *item = ordered_tree_items[i]; - bool is_visible = visible_as_parent.has(item) || visible_as_descendant.has(item); - item->set_visible(is_visible); + bool is_matching = _vector_has_bsearch(matching_entries, p_item); + for (int i = 0; i < p_item->get_child_count(); i++) { + _filter_tree(p_item->get_child(i), is_matching | p_parent_matching); } } @@ -468,7 +433,7 @@ void TreeSearch::update_search(Tree *p_tree) { _clear_filter(); _highlight_tree(); if (search_mode == TreeSearchMode::FILTER) { - _filter_tree(search_mask); + _filter_tree(); was_filtered_recently = true; } else if (was_filtered_recently) { _clear_filter(); diff --git a/editor/tree_search.h b/editor/tree_search.h index 0501514..fec49e1 100644 --- a/editor/tree_search.h +++ b/editor/tree_search.h @@ -69,7 +69,8 @@ private: void _clean_callable_cache(); // Update_search() calls these - void _filter_tree(const String &p_search_mask); + void _filter_tree(); + void _filter_tree(TreeItem *item, bool p_parent_matching); void _clear_filter(); void _highlight_tree(); @@ -147,4 +148,4 @@ public: }; #endif // TREE_SEARCH_H -#endif // ! TOOLS_ENABLED +#endif // ! TOOLS_ENABLED \ No newline at end of file