Compare commits

..

52 Commits

Author SHA1 Message Date
monxa debc0d5d75
Merge a83eebbdc7 into 760af804c0 2024-10-02 18:32:03 +02:00
Alexander Montag a83eebbdc7
Prune redundant and unify style of comments at TreeSearch(Panel) 2024-10-02 18:31:52 +02:00
Alexander Montag f00d1bfb40
TreeSearch: Clear filter only when really necessary. 2024-10-02 16:15:50 +00:00
Alexander Montag 88a617aa42
Adjust left spacer of TreeSearchPanel, remove right spacer 2024-10-02 18:08:32 +02:00
Alexander Montag a07b143d68
Don't filter if there are no matches (once again) 2024-10-02 16:29:06 +02:00
Alexander Montag b7b6312184
Address compiler warning 2024-10-02 13:20:06 +02:00
Alexander Montag ec6c4c3036
Add buttons for next/previous match
+ Add tooltips for buttons
2024-10-02 11:14:11 +00:00
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
Alexander Montag 146635126a
Refactor _filter_items again for readability 2024-10-01 18:13:00 +02:00
Alexander Montag 540bb585a8
Refactor tree filtering logic for correctness and efficiency 2024-10-01 17:09:18 +02:00
Alexander Montag 4f7996b1ea
Fix new filtering approach for TreeSearch 2024-10-01 01:44:16 +02:00
Alexander Montag 74cf9855a7
Fix tree filtering with new approach 2024-10-01 00:13:08 +02:00
Alexander Montag e6e1addbcb
Optimize TreeSearch::_filter_tree for performance 2024-09-30 19:23:49 +02:00
Alexander Montag 8d781da1a6
Replace c-strings with LW_NAME for signals in TreeSearch(Panel) 2024-09-30 19:08:25 +02:00
Alexander Montag 683834f58e
Drop `TreeSearchPanel::set_text`. 2024-09-30 14:22:23 +00:00
Alexander Montag 10c8f58ca9
Remember SearchInfo for each tab. Focus tree when *user* closes SearchPanel 2024-09-30 16:13:36 +02:00
Alexander Montag 20be87904a
Focus tree when search panel is closed 2024-09-29 21:47:38 +02:00
Alexander Montag e8de3adc50
Improve formatting of TreeSearch 2024-09-29 16:43:48 +00:00
Alexander Montag f7d546fc3c
Add one method-const qualifier to TreeSearchPanel 2024-09-29 16:26:18 +00:00
Alexander Montag 585d9663d6
Fix optimization through which the parent count is not drawn 2024-09-29 18:12:18 +02:00
Alexander Montag 5a66160bce
Add `const` qualifiers where possible 2024-09-29 15:57:13 +00:00
Alexander Montag 6200f61162
Fix descendent counter in TreeSearch 2024-09-29 16:48:57 +02:00
monxa e68e0236e9
Improve performance for TreeSearch (#1)
* Improve TreeSearch performance.

Experimental, hence this is on a different branch.

This commit vastly improves performance by not updating the tree
for search mask changes.

Relates to: https://github.com/limbonaut/limboai/pull/229

* Fix SearchTree overdraw after performance optimization

* Manage Performance optimizations: TreeSearch no. 2
- Carefully manage callable_cache
- Only clear filter when previously filtered
- Reintroduce sorting for ordered_tree_items

This commit addresses performance issues in TreeSearch and fixes
a critical bug where ordered_tree_items was not being sorted.
The bug was introduced during a merge with the main feature branch.

* Use queue_redraw as much as possible for Tree updates.

* Fix TreeSearch after performance considerations
2024-09-29 14:50:07 +02:00
Alexander Montag cb163ebc38 Improve readability of TreeSearch 2024-09-29 00:08:24 +00:00
Alexander Montag c909582480 TreeSearch(Panel): Align ordering .h <-> .cpp 2024-09-29 02:01:23 +02:00
Alexander Montag 68514e2e13 Add missing `break` statement - TreeSearch::notification 2024-09-28 20:04:43 +02:00
Alexander Montag acb2bcc901 Use LW_NAME in TreeSearch where appropriate 2024-09-28 17:45:17 +00:00
Alexander Montag a31b8b7520 Follow up: Move BUTTON_SETICON to THEME_CHANGED 2024-09-28 17:31:20 +00:00
Alexander Montag 62460496e4 Address set_text in THEME_CHANGED, address inconsistency 2024-09-28 19:11:59 +02:00
Alexander Montag cd85e6dd30 Initialize controls in constructor, bind emit callbacks without wrapper in TreeSearchPanel 2024-09-28 16:45:11 +00:00
Alexander Montag 3b73f24f33 Make TreeSearchMode member of TreeSearch 2024-09-28 17:58:42 +02:00
Alexander Montag 329e90dfc6 Rename TreeSearch::notify_item_edited
Also: Run clang-format. Remove comment.
2024-09-28 17:46:29 +02:00
Alexander Montag 84b2a60521 Adjust tooltips + misc-menu entry 2024-09-28 17:29:45 +02:00
Alexander Montag cc8f099d82 Improve TreeSearch performance; part1 2024-09-28 12:08:27 +00:00
Alexander Montag 380f80c2b3 Fix Editor scaling for TreeSearch 2024-09-27 18:33:14 +02:00
Alexander Montag ffe344d166 Make TreeSearch independent, remove unnecessary draw bind 2024-09-27 16:07:42 +00:00
Alexander Montag 9a1641e8ab Move TreeSearch::update_tree in TaskTree from update_tree
Catches all cases where the tree is modified. Also those, where for example the tab is switched.
2024-09-27 15:24:14 +00:00
Alexander Montag 47706e9480 Make TreeSearch::search_panel private and fix nulltpr 2024-09-27 17:08:04 +02:00
Alexander Montag 0fc11bf05b Make TreeSearch::_select_item consistent 2024-09-26 15:36:59 +00:00
Alexander Montag af15dde4c8 Simplify signals of TreeSearchPanel 2024-09-26 07:53:02 +02:00
Alexander Montag 1145ce0252 Clean up TreeSearch: Consistent p_params, -Destructor 2024-09-26 05:28:59 +00:00
Alexander Montag 8d29f16963 Fix filtering: Allow matching for root as ancestor 2024-09-25 19:47:28 +02:00
Alexander Montag b8259c6ee7 Address memory leak 2024-09-25 19:47:28 +02:00
Alexander Montag aed8892760 Fix regression from 62f8e: Select next item 2024-09-25 19:47:28 +02:00
Alexander Montag 8c323956e3 Unify highlight and filter, simplify ui 2024-09-25 19:47:28 +02:00
Alexander Montag 18a6bbeae6 Implement filtering for TreeSearch 2024-09-25 19:47:28 +02:00
Alexander Montag b4974bffd2 Run clang-format 2024-09-25 19:47:28 +02:00
Alexander Montag f523af2d13 Make TreeSearchPanel HFlowContainer 2024-09-25 19:47:28 +02:00
Alexander Montag a80b737319 Implement tree search: highlighting 2024-09-25 19:47:28 +02:00
Alexander Montag 7c4a462a69 Add ui for Tree search 2024-09-25 19:47:28 +02:00
2 changed files with 13 additions and 27 deletions

View File

@ -21,6 +21,7 @@
#include "core/math/math_funcs.h" #include "core/math/math_funcs.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/main/viewport.h" #include "scene/main/viewport.h"
#include "scene/resources/font.h" #include "scene/resources/font.h"
#include "scene/resources/style_box_flat.h" #include "scene/resources/style_box_flat.h"
@ -29,6 +30,7 @@
#ifdef LIMBOAI_GDEXTENSION #ifdef LIMBOAI_GDEXTENSION
#include <godot_cpp/classes/editor_interface.hpp> // for edge scale #include <godot_cpp/classes/editor_interface.hpp> // for edge scale
#include <godot_cpp/classes/font.hpp> #include <godot_cpp/classes/font.hpp>
#include <godot_cpp/classes/h_separator.hpp>
#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>
@ -63,7 +65,7 @@ void TreeSearch::_filter_tree() {
} }
void TreeSearch::_filter_tree(TreeItem *p_item, bool p_parent_matching) { void TreeSearch::_filter_tree(TreeItem *p_item, bool p_parent_matching) {
bool visible = (number_matches.has(p_item) && (number_matches.get(p_item) > 0)) || p_parent_matching; bool visible = number_matches.has(p_item) | p_parent_matching;
p_item->set_visible(visible); p_item->set_visible(visible);
@ -116,13 +118,13 @@ void TreeSearch::_highlight_tree_item(TreeItem *p_tree_item) {
} }
Callable draw_callback = callable_mp(this, &TreeSearch::_draw_highlight_item).bind(parent_draw_method); Callable draw_callback = callable_mp(this, &TreeSearch::_draw_highlight_item).bind(parent_draw_method);
callable_cache[p_tree_item] = draw_callback;
// This is necessary because of the modularity of this implementation. // This is necessary because of the modularity of this implementation.
// Cache render properties of entry. // Cache render properties of entry.
String cached_text = p_tree_item->get_text(0); String cached_text = p_tree_item->get_text(0);
Ref<Texture2D> cached_icon = p_tree_item->get_icon(0); Ref<Texture2D> cached_icon = p_tree_item->get_icon(0);
int cached_max_width = p_tree_item->get_icon_max_width(0); int cached_max_width = p_tree_item->get_icon_max_width(0);
callable_cache[p_tree_item] = draw_callback;
// This removes render properties in entry. // This removes render properties in entry.
p_tree_item->set_custom_draw_callback(0, draw_callback); p_tree_item->set_custom_draw_callback(0, draw_callback);
@ -134,7 +136,7 @@ void TreeSearch::_highlight_tree_item(TreeItem *p_tree_item) {
p_tree_item->set_icon_max_width(0, cached_max_width); p_tree_item->set_icon_max_width(0, cached_max_width);
} }
// Custom draw callback for highlighting (bind the parent_draw_method to this) // Custom draw callback for highlighting (bind the parent_drw_method to this)
void TreeSearch::_draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect, const Callable p_parent_draw_method) { void TreeSearch::_draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect, const Callable p_parent_draw_method) {
if (!p_tree_item) { if (!p_tree_item) {
return; return;
@ -237,30 +239,15 @@ void TreeSearch::_update_ordered_tree_items(TreeItem *p_tree_item) {
} }
void TreeSearch::_update_number_matches() { void TreeSearch::_update_number_matches() {
ERR_FAIL_COND(!tree_reference);
number_matches.clear(); number_matches.clear();
number_matches.reserve(ordered_tree_items.size()); for (int i = 0; i < matching_entries.size(); i++) {
TreeItem *item = matching_entries[i];
_update_number_matches(tree_reference->get_root()); while (item) {
} int previous_match_cnt = number_matches.has(item) ? number_matches.get(item) : 0;
number_matches[item] = previous_match_cnt + 1;
void TreeSearch::_update_number_matches(TreeItem *item) { item = item->get_parent();
for (int i = 0; i < item->get_child_count(); i++) {
TreeItem *child = item->get_child(i);
_update_number_matches(child);
} }
int count = _vector_has_bsearch(matching_entries, item) ? 1 : 0;
for (int i = 0; i < item->get_child_count(); i++) {
TreeItem *child = item->get_child(i);
count += number_matches.has(child) ? number_matches.get(child) : 0;
} }
if (count == 0) {
return;
}
number_matches[item] = count;
} }
String TreeSearch::_get_search_mask() const { String TreeSearch::_get_search_mask() const {

View File

@ -76,13 +76,12 @@ private:
void _highlight_tree(); void _highlight_tree();
void _highlight_tree_item(TreeItem *p_tree_item); void _highlight_tree_item(TreeItem *p_tree_item);
// Custom draw-Callback (bind inherited Callable). // custom draw-Callback (bind inherited Callable).
void _draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect, const Callable p_parent_draw_method); void _draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect, const Callable p_parent_draw_method);
void _update_matching_entries(const String &p_search_mask); void _update_matching_entries(const String &p_search_mask);
void _update_ordered_tree_items(TreeItem *p_tree_item); void _update_ordered_tree_items(TreeItem *p_tree_item);
void _update_number_matches(); void _update_number_matches();
void _update_number_matches(TreeItem *item);
void _find_matching_entries(TreeItem *p_tree_item, const String &p_search_mask, Vector<TreeItem *> &p_accum) const; void _find_matching_entries(TreeItem *p_tree_item, const String &p_search_mask, Vector<TreeItem *> &p_accum) const;
String _get_search_mask() const; String _get_search_mask() const;