Compare commits

...

3 Commits

Author SHA1 Message Date
Alexander Montag b53e470c60
Remove unused variable, clang-format 2024-10-01 23:22:32 +02:00
Alexander Montag c38e66d008
Remove unused include 2024-10-01 23:16:50 +02:00
Alexander Montag 709ecafb83
Use recursion in _filter_tree for readability 2024-10-01 23:15:57 +02:00
2 changed files with 17 additions and 54 deletions

View File

@ -19,7 +19,6 @@
#ifdef LIMBOAI_MODULE #ifdef LIMBOAI_MODULE
#include "core/math/math_funcs.h" #include "core/math/math_funcs.h"
#include "core/templates/hash_set.h"
#include "editor/editor_interface.h" #include "editor/editor_interface.h"
#include "editor/themes/editor_scale.h" #include "editor/themes/editor_scale.h"
#include "scene/gui/separator.h" #include "scene/gui/separator.h"
@ -35,7 +34,6 @@
#include <godot_cpp/classes/style_box_flat.hpp> #include <godot_cpp/classes/style_box_flat.hpp>
#include <godot_cpp/classes/viewport.hpp> #include <godot_cpp/classes/viewport.hpp>
#include <godot_cpp/core/math.hpp> #include <godot_cpp/core/math.hpp>
#include <godot_cpp/templates/hash_set.hpp>
#endif // LIMBOAI_GDEXTENSION #endif // LIMBOAI_GDEXTENSION
@ -57,56 +55,20 @@ void TreeSearch::_clean_callable_cache() {
callable_cache = new_callable_cache; callable_cache = new_callable_cache;
} }
// Makes all tree items invisible that don't match the following criteria: void TreeSearch::_filter_tree() {
// 1. is a matching tree_item ERR_FAIL_COND(!tree_reference);
// 2. is a parent of a matching tree_item _filter_tree(tree_reference->get_root(), false);
// 3. is any descendant of a matching tree_item
void TreeSearch::_filter_tree(const String &p_search_mask) {
if (number_matches.size() == 0){
return;
}
HashSet<TreeItem *> visible_as_parent;
HashSet<TreeItem *> 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) void TreeSearch::_filter_tree(TreeItem *p_item, bool p_parent_matching) {
for (int i = 0; i < matching_entries.size(); i++) { bool visible = number_matches.has(p_item) | p_parent_matching;
TreeItem *cur_match = matching_entries[i];
if (visible_as_descendant.has(cur_match)) {
continue;
}
// Descendents
Vector<TreeItem *> descendent_list = { cur_match };
for (int j = 0; j < descendent_list.size(); j++) { if (!visible) {
TreeItem *descendent = descendent_list[j]; p_item->set_visible(visible);
if (visible_as_descendant.has(descendent)) {
continue; // Skip subtree if already processed
} }
visible_as_descendant.insert(descendent); bool is_matching = _vector_has_bsearch(matching_entries, p_item);
for (int i = 0; i < p_item->get_child_count(); i++) {
// Collect X-level descendents (bit clunky because godot doesn't return get_children as pointers) _filter_tree(p_item->get_child(i), is_matching | p_parent_matching);
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);
} }
} }
@ -468,7 +430,7 @@ void TreeSearch::update_search(Tree *p_tree) {
_clear_filter(); _clear_filter();
_highlight_tree(); _highlight_tree();
if (search_mode == TreeSearchMode::FILTER) { if (search_mode == TreeSearchMode::FILTER) {
_filter_tree(search_mask); _filter_tree();
was_filtered_recently = true; was_filtered_recently = true;
} else if (was_filtered_recently) { } else if (was_filtered_recently) {
_clear_filter(); _clear_filter();

View File

@ -69,7 +69,8 @@ private:
void _clean_callable_cache(); void _clean_callable_cache();
// Update_search() calls these // 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 _clear_filter();
void _highlight_tree(); void _highlight_tree();