diff options
Diffstat (limited to 'editor/editor_help.cpp')
-rw-r--r-- | editor/editor_help.cpp | 224 |
1 files changed, 183 insertions, 41 deletions
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index f3be02a8c7..f9b104cdae 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -526,18 +526,7 @@ void EditorHelp::_unhandled_key_input(const Ref<InputEvent> &p_ev) { void EditorHelp::_search(const String &) { - if (search->get_text() == "") - return; - - String stext = search->get_text(); - bool keep = prev_search == stext; - - bool ret = class_desc->search(stext, keep); - if (!ret) { - class_desc->search(stext, false); - } - - prev_search = stext; + find_bar->search_next(); } void EditorHelp::_class_list_select(const String &p_select) { @@ -598,14 +587,6 @@ void EditorHelp::_class_desc_select(const String &p_select) { } void EditorHelp::_class_desc_input(const Ref<InputEvent> &p_input) { - - Ref<InputEventMouseButton> mb = p_input; - - if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == 1 && !mb->is_doubleclick()) { - class_desc->set_selection_enabled(false); - class_desc->set_selection_enabled(true); - } - set_focused(); } void EditorHelp::_add_type(const String &p_type, const String &p_enum) { @@ -1816,13 +1797,7 @@ void EditorHelp::scroll_to_section(int p_section_index) { void EditorHelp::popup_search() { - search_dialog->popup_centered(Size2(250, 80) * EDSCALE); - search->grab_focus(); -} - -void EditorHelp::_search_cbk() { - - _search(search->get_text()); + find_bar->popup_search(); } String EditorHelp::get_class() { @@ -1851,7 +1826,6 @@ void EditorHelp::_bind_methods() { ClassDB::bind_method("_request_help", &EditorHelp::_request_help); ClassDB::bind_method("_unhandled_key_input", &EditorHelp::_unhandled_key_input); ClassDB::bind_method("_search", &EditorHelp::_search); - ClassDB::bind_method("_search_cbk", &EditorHelp::_search_cbk); ClassDB::bind_method("_help_callback", &EditorHelp::_help_callback); ADD_SIGNAL(MethodInfo("go_to_help")); @@ -1863,6 +1837,10 @@ EditorHelp::EditorHelp() { EDITOR_DEF("text_editor/help/sort_functions_alphabetically", true); + find_bar = memnew(FindBar); + add_child(find_bar); + find_bar->hide(); + class_desc = memnew(RichTextLabel); add_child(class_desc); class_desc->set_v_size_flags(SIZE_EXPAND_FILL); @@ -1870,24 +1848,14 @@ EditorHelp::EditorHelp() { class_desc->connect("meta_clicked", this, "_class_desc_select"); class_desc->connect("gui_input", this, "_class_desc_input"); + find_bar->set_rich_text_label(class_desc); + class_desc->set_selection_enabled(true); scroll_locked = false; select_locked = false; - set_process_unhandled_key_input(true); + //set_process_unhandled_key_input(true); class_desc->hide(); - - search_dialog = memnew(ConfirmationDialog); - add_child(search_dialog); - VBoxContainer *search_vb = memnew(VBoxContainer); - search_dialog->add_child(search_vb); - - search = memnew(LineEdit); - search_dialog->register_text_enter(search); - search_vb->add_margin_child(TTR("Search Text"), search); - search_dialog->get_ok()->set_text(TTR("Find")); - search_dialog->connect("confirmed", this, "_search_cbk"); - search_dialog->set_hide_on_ok(false); } EditorHelp::~EditorHelp() { @@ -1964,3 +1932,177 @@ EditorHelpBit::EditorHelpBit() { rich_text->set_override_selected_font_color(false); set_custom_minimum_size(Size2(0, 70 * EDSCALE)); } + +FindBar::FindBar() { + + container = memnew(Control); + add_child(container); + + container->set_clip_contents(true); + container->set_h_size_flags(SIZE_EXPAND_FILL); + + hbc = memnew(HBoxContainer); + container->add_child(hbc); + + vbc_search_text = memnew(VBoxContainer); + hbc->add_child(vbc_search_text); + vbc_search_text->set_h_size_flags(SIZE_EXPAND_FILL); + hbc->set_anchor_and_margin(MARGIN_RIGHT, 1, 0); + + search_text = memnew(LineEdit); + vbc_search_text->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); + hbc->add_child(find_prev); + find_prev->set_focus_mode(FOCUS_NONE); + find_prev->connect("pressed", this, "_search_prev"); + + find_next = memnew(ToolButton); + hbc->add_child(find_next); + find_next->set_focus_mode(FOCUS_NONE); + find_next->connect("pressed", this, "_search_next"); + + error_label = memnew(Label); + hbc->add_child(error_label); + error_label->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor")); + + hide_button = memnew(TextureButton); + add_child(hide_button); + hide_button->set_focus_mode(FOCUS_NONE); + hide_button->set_expand(true); + hide_button->set_stretch_mode(TextureButton::STRETCH_KEEP_CENTERED); + hide_button->connect("pressed", this, "_hide_pressed"); +} + +void FindBar::popup_search() { + show(); + search_text->grab_focus(); + container->set_custom_minimum_size(Size2(0, hbc->get_size().height)); +} + +void FindBar::_notification(int p_what) { + + if (p_what == NOTIFICATION_READY) { + + find_prev->set_icon(get_icon("MoveUp", "EditorIcons")); + find_next->set_icon(get_icon("MoveDown", "EditorIcons")); + 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()); + } else if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { + + find_prev->set_icon(get_icon("MoveUp", "EditorIcons")); + find_next->set_icon(get_icon("MoveDown", "EditorIcons")); + 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()); + } +} + +void FindBar::_bind_methods() { + + ClassDB::bind_method("_unhandled_input", &FindBar::_unhandled_input); + + ClassDB::bind_method("_search_text_changed", &FindBar::_search_text_changed); + ClassDB::bind_method("_search_text_entered", &FindBar::_search_text_entered); + ClassDB::bind_method("_search_next", &FindBar::search_next); + ClassDB::bind_method("_search_prev", &FindBar::search_prev); + ClassDB::bind_method("_hide_pressed", &FindBar::_hide_bar); + + ADD_SIGNAL(MethodInfo("search")); +} + +void FindBar::set_rich_text_label(RichTextLabel *p_rich_text_label) { + + rich_text_label = p_rich_text_label; +} + +bool FindBar::search_next() { + + return _search(); +} + +bool FindBar::search_prev() { + + return _search(true); +} + +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); + if (!ret) { + ret = rich_text_label->search(stext, false, p_search_previous); + } + + prev_search = stext; + + if (ret) { + set_error(""); + } else { + set_error(stext.empty() ? "" : TTR("No Matches")); + } + + return ret; +} + +void FindBar::set_error(const String &p_label) { + + error_label->set_text(p_label); +} + +void FindBar::_hide_bar() { + + if (search_text->has_focus()) + rich_text_label->grab_focus(); + + hide(); +} + +void FindBar::_unhandled_input(const Ref<InputEvent> &p_event) { + + Ref<InputEventKey> k = p_event; + if (k.is_valid()) { + + if (k->is_pressed() && (rich_text_label->has_focus() || hbc->is_a_parent_of(get_focus_owner()))) { + + bool accepted = true; + + switch (k->get_scancode()) { + + case KEY_ESCAPE: { + + _hide_bar(); + } break; + default: { + + accepted = false; + } break; + } + + if (accepted) { + accept_event(); + } + } + } +} + +void FindBar::_search_text_changed(const String &p_text) { + + search_next(); +} + +void FindBar::_search_text_entered(const String &p_text) { + + search_next(); +} |