diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 91726bbb31c..3c86dfd6b63 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -797,6 +797,7 @@ FindReplaceBar::FindReplaceBar() { find_prev = memnew(Button); find_prev->set_flat(true); + find_prev->set_disabled(results_count < 1); find_prev->set_tooltip_text(TTR("Previous Match")); find_prev->set_accessibility_name(TTRC("Previous Match")); hbc_button_search->add_child(find_prev); @@ -805,6 +806,7 @@ FindReplaceBar::FindReplaceBar() { find_next = memnew(Button); find_next->set_flat(true); + find_next->set_disabled(results_count < 1); find_next->set_tooltip_text(TTR("Next Match")); find_next->set_accessibility_name(TTRC("Next Match")); hbc_button_search->add_child(find_next); diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index e69d6a8e0a9..a7838b4993c 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -4758,44 +4758,47 @@ EditorHelpHighlighter::~EditorHelpHighlighter() { FindBar::FindBar() { search_text = memnew(LineEdit); - search_text->set_accessibility_name(TTRC("Search help")); - add_child(search_text); search_text->set_keep_editing_on_text_submit(true); + add_child(search_text); + search_text->set_placeholder(TTR("Search")); + search_text->set_tooltip_text(TTR("Search")); + search_text->set_accessibility_name(TTRC("Search Documentation")); search_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); search_text->set_h_size_flags(SIZE_EXPAND_FILL); search_text->connect(SceneStringName(text_changed), callable_mp(this, &FindBar::_search_text_changed)); search_text->connect(SceneStringName(text_submitted), callable_mp(this, &FindBar::_search_text_submitted)); matches_label = memnew(Label); - matches_label->set_focus_mode(FOCUS_ACCESSIBILITY); add_child(matches_label); + matches_label->set_focus_mode(FOCUS_ACCESSIBILITY); matches_label->hide(); find_prev = memnew(Button); - find_prev->set_accessibility_name(TTRC("Find Previous")); find_prev->set_flat(true); + find_prev->set_disabled(results_count < 1); + find_prev->set_tooltip_text(TTR("Previous Match")); + find_prev->set_accessibility_name(TTRC("Previous Match")); add_child(find_prev); find_prev->set_focus_mode(FOCUS_NONE); find_prev->connect(SceneStringName(pressed), callable_mp(this, &FindBar::search_prev)); find_next = memnew(Button); - find_next->set_accessibility_name(TTRC("Find Next")); find_next->set_flat(true); + find_next->set_disabled(results_count < 1); + find_next->set_tooltip_text(TTR("Next Match")); + find_next->set_accessibility_name(TTRC("Next Match")); add_child(find_next); find_next->set_focus_mode(FOCUS_NONE); find_next->connect(SceneStringName(pressed), callable_mp(this, &FindBar::search_next)); - Control *space = memnew(Control); - add_child(space); - space->set_custom_minimum_size(Size2(4, 0) * EDSCALE); - - hide_button = memnew(TextureButton); - add_child(hide_button); + hide_button = memnew(Button); + hide_button->set_flat(true); + hide_button->set_tooltip_text(TTR("Hide")); hide_button->set_accessibility_name(TTRC("Hide")); hide_button->set_focus_mode(FOCUS_NONE); - hide_button->set_ignore_texture_size(true); - hide_button->set_stretch_mode(TextureButton::STRETCH_KEEP_CENTERED); hide_button->connect(SceneStringName(pressed), callable_mp(this, &FindBar::_hide_bar)); + hide_button->set_v_size_flags(SIZE_SHRINK_CENTER); + add_child(hide_button); } void FindBar::popup_search() { @@ -4820,10 +4823,7 @@ void FindBar::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { find_prev->set_button_icon(get_editor_theme_icon(SNAME("MoveUp"))); find_next->set_button_icon(get_editor_theme_icon(SNAME("MoveDown"))); - hide_button->set_texture_normal(get_editor_theme_icon(SNAME("Close"))); - hide_button->set_texture_hover(get_editor_theme_icon(SNAME("Close"))); - hide_button->set_texture_pressed(get_editor_theme_icon(SNAME("Close"))); - hide_button->set_custom_minimum_size(hide_button->get_texture_normal()->get_size()); + hide_button->set_button_icon(get_editor_theme_icon(SNAME("Close"))); matches_label->add_theme_color_override(SceneStringName(font_color), results_count > 0 ? get_theme_color(SceneStringName(font_color), SNAME("Label")) : get_theme_color(SNAME("error_color"), EditorStringName(Editor))); } break; @@ -4848,22 +4848,25 @@ bool FindBar::search_prev() { bool FindBar::_search(bool p_search_previous) { String stext = search_text->get_text(); bool keep = prev_search == stext; - bool ret = rich_text_label->search(stext, keep, p_search_previous); prev_search = stext; + if (!keep) { + results_count_to_current = 0; + } if (ret) { - _update_results_count(); + _update_results_count(p_search_previous); } else { results_count = 0; + results_count_to_current = 0; } _update_matches_label(); return ret; } -void FindBar::_update_results_count() { +void FindBar::_update_results_count(bool p_search_previous) { results_count = 0; String searched = search_text->get_text(); @@ -4884,6 +4887,13 @@ void FindBar::_update_results_count() { results_count++; from_pos = pos + searched.length(); } + + results_count_to_current += (p_search_previous) ? -1 : 1; + if (results_count_to_current > results_count) { + results_count_to_current = results_count_to_current - results_count; + } else if (results_count_to_current <= 0) { + results_count_to_current = results_count; + } } void FindBar::_update_matches_label() { @@ -4893,8 +4903,16 @@ void FindBar::_update_matches_label() { matches_label->show(); matches_label->add_theme_color_override(SceneStringName(font_color), results_count > 0 ? get_theme_color(SceneStringName(font_color), SNAME("Label")) : get_theme_color(SNAME("error_color"), EditorStringName(Editor))); - matches_label->set_text(vformat(results_count == 1 ? TTR("%d match.") : TTR("%d matches."), results_count)); + if (results_count == 0) { + matches_label->set_text(TTR("No match")); + } else if (results_count_to_current == 0) { + matches_label->set_text(vformat(TTRN("%d match", "%d matches", results_count), results_count)); + } else { + matches_label->set_text(vformat(TTRN("%d of %d match", "%d of %d matches", results_count), results_count_to_current, results_count)); + } } + find_prev->set_disabled(results_count < 1); + find_next->set_disabled(results_count < 1); } void FindBar::_hide_bar() { diff --git a/editor/editor_help.h b/editor/editor_help.h index a43acd8f47c..44fd2c49a84 100644 --- a/editor/editor_help.h +++ b/editor/editor_help.h @@ -47,12 +47,13 @@ class FindBar : public HBoxContainer { Button *find_prev = nullptr; Button *find_next = nullptr; Label *matches_label = nullptr; - TextureButton *hide_button = nullptr; - String prev_search; + Button *hide_button = nullptr; RichTextLabel *rich_text_label = nullptr; + String prev_search; int results_count = 0; + int results_count_to_current = 0; virtual void input(const Ref &p_event) override; @@ -61,7 +62,7 @@ class FindBar : public HBoxContainer { void _search_text_changed(const String &p_text); void _search_text_submitted(const String &p_text); - void _update_results_count(); + void _update_results_count(bool p_search_previous); void _update_matches_label(); protected: