From e96a808756944d1969837833966775475aa2b3f2 Mon Sep 17 00:00:00 2001 From: volzhs Date: Thu, 18 Jan 2018 08:52:17 +0900 Subject: [PATCH] Fix find/replace bar - make LineEdit resizable for find/replace - move replaced count/no match message to status bar - fix replaced n occuurence message is not displayed when n > 0 Fixes #15394 --- editor/code_editor.cpp | 146 +++++++++++++++++++++++------------------ editor/code_editor.h | 10 +-- 2 files changed, 87 insertions(+), 69 deletions(-) diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 061f6ccc33e..70334c2343b 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -90,10 +90,13 @@ void FindReplaceBar::_notification(int p_what) { hide_button->set_normal_texture(get_icon("Close", "EditorIcons")); hide_button->set_hover_texture(get_icon("Close", "EditorIcons")); hide_button->set_pressed_texture(get_icon("Close", "EditorIcons")); - + hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { set_process_unhandled_input(is_visible_in_tree()); + if (is_visible_in_tree()) { + call_deferred("_update_size"); + } } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { find_prev->set_icon(get_icon("MoveUp", "EditorIcons")); @@ -101,6 +104,7 @@ void FindReplaceBar::_notification(int p_what) { hide_button->set_normal_texture(get_icon("Close", "EditorIcons")); hide_button->set_hover_texture(get_icon("Close", "EditorIcons")); hide_button->set_pressed_texture(get_icon("Close", "EditorIcons")); + hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); } } @@ -109,7 +113,7 @@ void FindReplaceBar::_unhandled_input(const Ref &p_event) { Ref k = p_event; if (k.is_valid()) { - if (k->is_pressed() && (text_edit->has_focus() || text_vbc->is_a_parent_of(get_focus_owner()))) { + if (k->is_pressed() && (text_edit->has_focus() || vbc_lineedit->is_a_parent_of(get_focus_owner()))) { bool accepted = true; @@ -182,6 +186,7 @@ void FindReplaceBar::_replace() { void FindReplaceBar::_replace_all() { + text_edit->disconnect("text_changed", this, "_editor_text_changed"); // line as x so it gets priority in comparison, column as y Point2i orig_cursor(text_edit->cursor_get_line(), text_edit->cursor_get_column()); Point2i prev_match = Point2(-1, -1); @@ -255,6 +260,8 @@ void FindReplaceBar::_replace_all() { text_edit->set_v_scroll(vsval); set_error(vformat(TTR("Replaced %d occurrence(s)."), rc)); + + text_edit->call_deferred("connect", "text_changed", this, "_editor_text_changed"); } void FindReplaceBar::_get_search_from(int &r_line, int &r_col) { @@ -356,13 +363,13 @@ void FindReplaceBar::_hide_bar() { text_edit->set_search_text(""); result_line = -1; result_col = -1; - replace_hbc->hide(); - replace_options_hbc->hide(); + set_error(""); hide(); } void FindReplaceBar::_show_search() { + hide(); // to update size correctly show(); search_text->grab_focus(); @@ -375,21 +382,24 @@ void FindReplaceBar::_show_search() { search_text->set_cursor_position(search_text->get_text().length()); search_current(); } + call_deferred("_update_size"); } void FindReplaceBar::popup_search() { - replace_hbc->hide(); - replace_options_hbc->hide(); + replace_text->hide(); + hbc_button_replace->hide(); + hbc_option_replace->hide(); _show_search(); } void FindReplaceBar::popup_replace() { - if (!replace_hbc->is_visible_in_tree() || !replace_options_hbc->is_visible_in_tree()) { + if (!replace_text->is_visible_in_tree()) { replace_text->clear(); - replace_hbc->show(); - replace_options_hbc->show(); + replace_text->show(); + hbc_button_replace->show(); + hbc_option_replace->show(); } selection_only->set_pressed((text_edit->is_selection_active() && text_edit->get_selection_from_line() < text_edit->get_selection_to_line())); @@ -456,7 +466,7 @@ bool FindReplaceBar::is_selection_only() const { void FindReplaceBar::set_error(const String &p_label) { - error_label->set_text(p_label); + emit_signal("error", p_label); } void FindReplaceBar::set_text_edit(TextEdit *p_text_edit) { @@ -465,6 +475,11 @@ void FindReplaceBar::set_text_edit(TextEdit *p_text_edit) { text_edit->connect("text_changed", this, "_editor_text_changed"); } +void FindReplaceBar::_update_size() { + + container->set_custom_minimum_size(Size2(0, hbc->get_size().height)); +} + void FindReplaceBar::_bind_methods() { ClassDB::bind_method("_unhandled_input", &FindReplaceBar::_unhandled_input); @@ -480,101 +495,101 @@ void FindReplaceBar::_bind_methods() { ClassDB::bind_method("_replace_all_pressed", &FindReplaceBar::_replace_all); ClassDB::bind_method("_search_options_changed", &FindReplaceBar::_search_options_changed); ClassDB::bind_method("_hide_pressed", &FindReplaceBar::_hide_bar); + ClassDB::bind_method("_update_size", &FindReplaceBar::_update_size); ADD_SIGNAL(MethodInfo("search")); + ADD_SIGNAL(MethodInfo("error")); } FindReplaceBar::FindReplaceBar() { + container = memnew(Control); + add_child(container); + container->set_clip_contents(true); + container->set_h_size_flags(SIZE_EXPAND_FILL); + replace_all_mode = false; preserve_cursor = false; - text_vbc = memnew(VBoxContainer); - add_child(text_vbc); + hbc = memnew(HBoxContainer); + container->add_child(hbc); + hbc->set_anchor_and_margin(MARGIN_RIGHT, 1, 0); - HBoxContainer *search_hbc = memnew(HBoxContainer); - text_vbc->add_child(search_hbc); + vbc_lineedit = memnew(VBoxContainer); + hbc->add_child(vbc_lineedit); + vbc_lineedit->set_h_size_flags(SIZE_EXPAND_FILL); + VBoxContainer *vbc_button = memnew(VBoxContainer); + hbc->add_child(vbc_button); + VBoxContainer *vbc_option = memnew(VBoxContainer); + hbc->add_child(vbc_option); + HBoxContainer *hbc_button_search = memnew(HBoxContainer); + vbc_button->add_child(hbc_button_search); + hbc_button_replace = memnew(HBoxContainer); + vbc_button->add_child(hbc_button_replace); + + HBoxContainer *hbc_option_search = memnew(HBoxContainer); + vbc_option->add_child(hbc_option_search); + hbc_option_replace = memnew(HBoxContainer); + vbc_option->add_child(hbc_option_replace); + + // search toolbar search_text = memnew(LineEdit); - search_hbc->add_child(search_text); - search_text->set_custom_minimum_size(Size2(200, 0)); + vbc_lineedit->add_child(search_text); + search_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); search_text->connect("text_changed", this, "_search_text_changed"); search_text->connect("text_entered", this, "_search_text_entered"); find_prev = memnew(ToolButton); - search_hbc->add_child(find_prev); + hbc_button_search->add_child(find_prev); find_prev->set_focus_mode(FOCUS_NONE); find_prev->connect("pressed", this, "_search_prev"); find_next = memnew(ToolButton); - search_hbc->add_child(find_next); + hbc_button_search->add_child(find_next); find_next->set_focus_mode(FOCUS_NONE); find_next->connect("pressed", this, "_search_next"); - replace_hbc = memnew(HBoxContainer); - text_vbc->add_child(replace_hbc); - replace_hbc->hide(); - - replace_text = memnew(LineEdit); - replace_hbc->add_child(replace_text); - replace_text->set_custom_minimum_size(Size2(200, 0)); - replace_text->connect("text_entered", this, "_replace_text_entered"); - - replace = memnew(Button); - replace_hbc->add_child(replace); - replace->set_text(TTR("Replace")); - //replace->set_focus_mode(FOCUS_NONE); - replace->connect("pressed", this, "_replace_pressed"); - - replace_all = memnew(Button); - replace_hbc->add_child(replace_all); - replace_all->set_text(TTR("Replace All")); - //replace_all->set_focus_mode(FOCUS_NONE); - replace_all->connect("pressed", this, "_replace_all_pressed"); - - Control *spacer_split = memnew(Control); - spacer_split->set_custom_minimum_size(Size2(0, 1)); - text_vbc->add_child(spacer_split); - - VBoxContainer *options_vbc = memnew(VBoxContainer); - add_child(options_vbc); - options_vbc->set_h_size_flags(SIZE_EXPAND_FILL); - - HBoxContainer *search_options = memnew(HBoxContainer); - options_vbc->add_child(search_options); - case_sensitive = memnew(CheckBox); - search_options->add_child(case_sensitive); + hbc_option_search->add_child(case_sensitive); case_sensitive->set_text(TTR("Match Case")); case_sensitive->set_focus_mode(FOCUS_NONE); case_sensitive->connect("toggled", this, "_search_options_changed"); whole_words = memnew(CheckBox); - search_options->add_child(whole_words); + hbc_option_search->add_child(whole_words); whole_words->set_text(TTR("Whole Words")); whole_words->set_focus_mode(FOCUS_NONE); whole_words->connect("toggled", this, "_search_options_changed"); - error_label = memnew(Label); - search_options->add_child(error_label); - error_label->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor")); + // replace toolbar + replace_text = memnew(LineEdit); + vbc_lineedit->add_child(replace_text); + replace_text->set_custom_minimum_size(Size2(100 * EDSCALE, 0)); + replace_text->connect("text_entered", this, "_replace_text_entered"); - search_options->add_spacer(); + replace = memnew(Button); + hbc_button_replace->add_child(replace); + replace->set_text(TTR("Replace")); + replace->connect("pressed", this, "_replace_pressed"); - hide_button = memnew(TextureButton); - search_options->add_child(hide_button); - hide_button->set_focus_mode(FOCUS_NONE); - hide_button->connect("pressed", this, "_hide_pressed"); - - replace_options_hbc = memnew(HBoxContainer); - options_vbc->add_child(replace_options_hbc); - replace_options_hbc->hide(); + replace_all = memnew(Button); + hbc_button_replace->add_child(replace_all); + replace_all->set_text(TTR("Replace All")); + replace_all->connect("pressed", this, "_replace_all_pressed"); selection_only = memnew(CheckBox); - replace_options_hbc->add_child(selection_only); + hbc_option_replace->add_child(selection_only); selection_only->set_text(TTR("Selection Only")); selection_only->set_focus_mode(FOCUS_NONE); selection_only->connect("toggled", this, "_search_options_changed"); + + hide_button = memnew(TextureButton); + add_child(hide_button); + hide_button->set_focus_mode(FOCUS_NONE); + hide_button->connect("pressed", this, "_hide_pressed"); + hide_button->set_expand(true); + hide_button->set_stretch_mode(TextureButton::STRETCH_KEEP_CENTERED); } /*** CODE EDITOR ****/ @@ -859,6 +874,7 @@ CodeTextEditor::CodeTextEditor() { error->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor")); error->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts")); error->set_h_size_flags(SIZE_EXPAND_FILL); //required for it to display, given now it's clipping contents, do not touch + find_replace_bar->connect("error", error, "set_text"); status_bar->add_child(memnew(Label)); //to keep the height if the other labels are not visible diff --git a/editor/code_editor.h b/editor/code_editor.h index 2e6340acc01..db2e25b922b 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -63,12 +63,12 @@ class FindReplaceBar : public HBoxContainer { GDCLASS(FindReplaceBar, HBoxContainer); + Control *container; LineEdit *search_text; ToolButton *find_prev; ToolButton *find_next; CheckBox *case_sensitive; CheckBox *whole_words; - Label *error_label; TextureButton *hide_button; LineEdit *replace_text; @@ -76,9 +76,10 @@ class FindReplaceBar : public HBoxContainer { Button *replace_all; CheckBox *selection_only; - VBoxContainer *text_vbc; - HBoxContainer *replace_hbc; - HBoxContainer *replace_options_hbc; + HBoxContainer *hbc; + VBoxContainer *vbc_lineedit; + HBoxContainer *hbc_button_replace; + HBoxContainer *hbc_option_replace; TextEdit *text_edit; @@ -98,6 +99,7 @@ class FindReplaceBar : public HBoxContainer { void _search_text_changed(const String &p_text); void _search_text_entered(const String &p_text); void _replace_text_entered(const String &p_text); + void _update_size(); protected: void _notification(int p_what);