Add buttons for next/previous match
+ Add tooltips for buttons
This commit is contained in:
parent
b53e470c60
commit
ec6c4c3036
|
@ -348,10 +348,55 @@ void TreeSearch::_select_first_match() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TreeSearch::_select_last_match() {
|
||||||
|
if (matching_entries.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = ordered_tree_items.size() - 1; i >= 0; i--) {
|
||||||
|
TreeItem *item = ordered_tree_items[i];
|
||||||
|
if (!_vector_has_bsearch(matching_entries, item)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_select_item(item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TreeSearch::_select_previous_match() {
|
||||||
|
if (matching_entries.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TreeItem *selected = tree_reference->get_selected();
|
||||||
|
if (!selected) {
|
||||||
|
_select_last_match();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// find [selected_idx] among ordered_tree_items
|
||||||
|
int selected_idx;
|
||||||
|
for (int i = ordered_tree_items.size() - 1; i >= 0; i--) {
|
||||||
|
if (ordered_tree_items[i] == selected) {
|
||||||
|
selected_idx = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// find first entry before [selected_idx].
|
||||||
|
for (int i = MIN(ordered_tree_items.size() - 1, selected_idx) - 1; i >= 0; i--) {
|
||||||
|
TreeItem *item = ordered_tree_items[i];
|
||||||
|
if (_vector_has_bsearch(matching_entries, item)) {
|
||||||
|
_select_item(item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// wrap around.
|
||||||
|
_select_last_match();
|
||||||
|
}
|
||||||
|
|
||||||
void TreeSearch::_select_next_match() {
|
void TreeSearch::_select_next_match() {
|
||||||
if (matching_entries.size() == 0) {
|
if (matching_entries.size() == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TreeItem *selected = tree_reference->get_selected();
|
TreeItem *selected = tree_reference->get_selected();
|
||||||
if (!selected) {
|
if (!selected) {
|
||||||
_select_first_match();
|
_select_first_match();
|
||||||
|
@ -359,7 +404,7 @@ void TreeSearch::_select_next_match() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// find [selected_idx] among ordered_tree_items
|
// find [selected_idx] among ordered_tree_items
|
||||||
int selected_idx = -1;
|
int selected_idx;
|
||||||
for (int i = 0; i < ordered_tree_items.size(); i++) {
|
for (int i = 0; i < ordered_tree_items.size(); i++) {
|
||||||
if (ordered_tree_items[i] == selected) {
|
if (ordered_tree_items[i] == selected) {
|
||||||
selected_idx = i;
|
selected_idx = i;
|
||||||
|
@ -443,6 +488,7 @@ TreeSearch::TreeSearch(TreeSearchPanel *p_search_panel) {
|
||||||
search_panel = p_search_panel;
|
search_panel = p_search_panel;
|
||||||
search_panel->connect(LW_NAME(text_submitted), callable_mp(this, &TreeSearch::_select_next_match));
|
search_panel->connect(LW_NAME(text_submitted), callable_mp(this, &TreeSearch::_select_next_match));
|
||||||
search_panel->connect(LW_NAME(Close), callable_mp(this, &TreeSearch::_on_search_panel_closed));
|
search_panel->connect(LW_NAME(Close), callable_mp(this, &TreeSearch::_on_search_panel_closed));
|
||||||
|
search_panel->connect("select_previous_match", callable_mp(this, &TreeSearch::_select_previous_match));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* !TreeSearch */
|
/* !TreeSearch */
|
||||||
|
@ -453,11 +499,19 @@ void TreeSearchPanel::_initialize_controls() {
|
||||||
line_edit_search = memnew(LineEdit);
|
line_edit_search = memnew(LineEdit);
|
||||||
check_button_filter_highlight = memnew(CheckBox);
|
check_button_filter_highlight = memnew(CheckBox);
|
||||||
close_button = memnew(Button);
|
close_button = memnew(Button);
|
||||||
|
find_next_button = memnew(Button);
|
||||||
|
find_prev_button = memnew(Button);
|
||||||
label_filter = memnew(Label);
|
label_filter = memnew(Label);
|
||||||
|
|
||||||
line_edit_search->set_placeholder(TTR("Search tree"));
|
line_edit_search->set_placeholder(TTR("Search tree"));
|
||||||
|
|
||||||
close_button->set_theme_type_variation(LW_NAME(FlatButton));
|
close_button->set_theme_type_variation(LW_NAME(FlatButton));
|
||||||
|
find_next_button->set_theme_type_variation(LW_NAME(FlatButton));
|
||||||
|
find_prev_button->set_theme_type_variation(LW_NAME(FlatButton));
|
||||||
|
|
||||||
|
close_button->set_tooltip_text("Hide");
|
||||||
|
find_next_button->set_tooltip_text("Next Match");
|
||||||
|
find_prev_button->set_tooltip_text("Previous Match");
|
||||||
|
|
||||||
// positioning and sizing
|
// positioning and sizing
|
||||||
set_anchors_and_offsets_preset(LayoutPreset::PRESET_BOTTOM_WIDE);
|
set_anchors_and_offsets_preset(LayoutPreset::PRESET_BOTTOM_WIDE);
|
||||||
|
@ -467,6 +521,8 @@ void TreeSearchPanel::_initialize_controls() {
|
||||||
|
|
||||||
_add_spacer(0.25); // otherwise the lineedits expand margin touches the left border.
|
_add_spacer(0.25); // otherwise the lineedits expand margin touches the left border.
|
||||||
add_child(line_edit_search);
|
add_child(line_edit_search);
|
||||||
|
add_child(find_prev_button);
|
||||||
|
add_child(find_next_button);
|
||||||
_add_spacer(0.25);
|
_add_spacer(0.25);
|
||||||
|
|
||||||
add_child(check_button_filter_highlight);
|
add_child(check_button_filter_highlight);
|
||||||
|
@ -489,10 +545,13 @@ void TreeSearchPanel::_notification(int p_what) {
|
||||||
// close callbacks
|
// close callbacks
|
||||||
close_button->connect(LW_NAME(pressed), Callable(this, LW_NAME(set_visible)).bind(false));
|
close_button->connect(LW_NAME(pressed), Callable(this, LW_NAME(set_visible)).bind(false));
|
||||||
close_button->connect(LW_NAME(pressed), Callable(this, LW_NAME(emit_signal)).bind(LW_NAME(Close)));
|
close_button->connect(LW_NAME(pressed), Callable(this, LW_NAME(emit_signal)).bind(LW_NAME(Close)));
|
||||||
close_button->set_shortcut(LW_GET_SHORTCUT("limbo_ai/hide_tree_search"));
|
close_button->set_shortcut(LW_GET_SHORTCUT("limbo_ai/hide_tree_search")); // TODO: use internal shortcut.
|
||||||
// search callbacks
|
// search callbacks
|
||||||
Callable c_update_requested = Callable(this, LW_NAME(emit_signal)).bind("update_requested");
|
Callable c_update_requested = Callable(this, LW_NAME(emit_signal)).bind("update_requested");
|
||||||
Callable c_text_submitted = Callable((Object *)this, LW_NAME(emit_signal)).bind(LW_NAME(text_submitted));
|
Callable c_text_submitted = Callable(this, LW_NAME(emit_signal)).bind(LW_NAME(text_submitted));
|
||||||
|
Callable c_select_previous_match = Callable(this, LW_NAME(emit_signal)).bind("select_previous_match");
|
||||||
|
find_next_button->connect(LW_NAME(pressed), c_text_submitted);
|
||||||
|
find_prev_button->connect(LW_NAME(pressed), c_select_previous_match);
|
||||||
|
|
||||||
line_edit_search->connect(LW_NAME(text_changed), c_update_requested.unbind(1));
|
line_edit_search->connect(LW_NAME(text_changed), c_update_requested.unbind(1));
|
||||||
check_button_filter_highlight->connect(LW_NAME(pressed), c_update_requested);
|
check_button_filter_highlight->connect(LW_NAME(pressed), c_update_requested);
|
||||||
|
@ -501,6 +560,8 @@ void TreeSearchPanel::_notification(int p_what) {
|
||||||
}
|
}
|
||||||
case NOTIFICATION_THEME_CHANGED: {
|
case NOTIFICATION_THEME_CHANGED: {
|
||||||
BUTTON_SET_ICON(close_button, get_theme_icon(LW_NAME(Close), LW_NAME(EditorIcons)));
|
BUTTON_SET_ICON(close_button, get_theme_icon(LW_NAME(Close), LW_NAME(EditorIcons)));
|
||||||
|
BUTTON_SET_ICON(find_prev_button, get_theme_icon("MoveUp", LW_NAME(EditorIcons)));
|
||||||
|
BUTTON_SET_ICON(find_next_button, get_theme_icon("MoveDown", LW_NAME(EditorIcons)));
|
||||||
label_filter->set_text(TTR("Filter"));
|
label_filter->set_text(TTR("Filter"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -510,6 +571,7 @@ void TreeSearchPanel::_notification(int p_what) {
|
||||||
void TreeSearchPanel::_bind_methods() {
|
void TreeSearchPanel::_bind_methods() {
|
||||||
ADD_SIGNAL(MethodInfo("update_requested"));
|
ADD_SIGNAL(MethodInfo("update_requested"));
|
||||||
ADD_SIGNAL(MethodInfo(LW_NAME(text_submitted)));
|
ADD_SIGNAL(MethodInfo(LW_NAME(text_submitted)));
|
||||||
|
ADD_SIGNAL(MethodInfo("select_previous_match"));
|
||||||
ADD_SIGNAL(MethodInfo(LW_NAME(Close)));
|
ADD_SIGNAL(MethodInfo(LW_NAME(Close)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,9 @@ private:
|
||||||
|
|
||||||
void _select_item(TreeItem *p_item);
|
void _select_item(TreeItem *p_item);
|
||||||
void _select_first_match();
|
void _select_first_match();
|
||||||
|
void _select_last_match();
|
||||||
|
|
||||||
|
void _select_previous_match();
|
||||||
void _select_next_match();
|
void _select_next_match();
|
||||||
|
|
||||||
void _on_search_panel_closed();
|
void _on_search_panel_closed();
|
||||||
|
@ -127,6 +130,8 @@ class TreeSearchPanel : public HFlowContainer {
|
||||||
private:
|
private:
|
||||||
Button *toggle_button_filter_highlight;
|
Button *toggle_button_filter_highlight;
|
||||||
Button *close_button;
|
Button *close_button;
|
||||||
|
Button *find_next_button;
|
||||||
|
Button *find_prev_button;
|
||||||
Label *label_filter;
|
Label *label_filter;
|
||||||
LineEdit *line_edit_search;
|
LineEdit *line_edit_search;
|
||||||
CheckBox *check_button_filter_highlight;
|
CheckBox *check_button_filter_highlight;
|
||||||
|
|
Loading…
Reference in New Issue