diff options
Diffstat (limited to 'scene/gui/text_edit.cpp')
-rw-r--r-- | scene/gui/text_edit.cpp | 54 |
1 files changed, 51 insertions, 3 deletions
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 7bfcd0843c..18c80ba9a3 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -39,6 +39,7 @@ #ifdef TOOLS_ENABLED #include "editor/editor_scale.h" +#include "editor_settings.h" #endif #define TAB_PIXELS @@ -918,6 +919,26 @@ void TextEdit::_notification(int p_what) { } } + int indent_level = get_indent_level(i); + if (draw_indent_guides && indent_level > 0) { +#ifdef TOOLS_ENABLED + int indent_size = EditorSettings::get_singleton()->get("text_editor/indent/size"); + float line_width = Math::round(EDSCALE); +#else + int indent_size = 4; + float line_width = 1.0; +#endif + int guides = 1 + (indent_level - 1) / indent_size; + + for (int guide = 0; guide < guides; guide++) { + draw_line( + Point2(guide * indent_size * cache.font->get_char_size(' ').width + char_margin, ofs_y), + Point2(guide * indent_size * cache.font->get_char_size(' ').width + char_margin, ofs_y + get_row_height()), + cache.indent_guide_color, + line_width); + } + } + if (line_wrap_index == 0) { // only do these if we are on the first wrapped part of a line @@ -1179,9 +1200,14 @@ void TextEdit::_notification(int p_what) { draw_rect(Rect2(char_ofs + char_margin + ofs_x, yofs + ascent + 2, w, line_width), in_selection && override_selected_font_color ? cache.font_selected_color : color); } - } else if (draw_tabs && str[j] == '\t') { + } else if (draw_tabs && (j > get_indent_level(i) || !draw_indent_guides) && str[j] == '\t') { + // If indent guides are enabled, only draw trailing or alignment tabs + // Otherwise, draw all tabs (including those used for indentation) int yofs = (get_row_height() - cache.tab_icon->get_height()) / 2; - cache.tab_icon->draw(ci, Point2(char_ofs + char_margin + ofs_x, ofs_y + yofs), in_selection && override_selected_font_color ? cache.font_selected_color : color); + cache.tab_icon->draw( + ci, + Point2(char_ofs + char_margin + ofs_x, ofs_y + yofs), + in_selection && override_selected_font_color ? cache.font_selected_color : color); } char_ofs += char_w; @@ -4264,6 +4290,7 @@ void TextEdit::_clear() { cursor.line_ofs = 0; cursor.wrap_ofs = 0; cursor.last_fit_x = 0; + selection.active = false; } void TextEdit::clear() { @@ -4332,6 +4359,7 @@ void TextEdit::_update_caches() { cache.font = get_font("font"); cache.caret_color = get_color("caret_color"); cache.caret_background_color = get_color("caret_background_color"); + cache.indent_guide_color = get_color("indent_guide_color"); cache.line_number_color = get_color("line_number_color"); cache.safe_line_number_color = get_color("safe_line_number_color"); cache.font_color = get_color("font_color"); @@ -5445,6 +5473,16 @@ int TextEdit::get_indent_size() { return indent_size; } +void TextEdit::set_draw_indent_guides(bool p_draw) { + + draw_indent_guides = p_draw; +} + +bool TextEdit::is_drawing_indent_guides() const { + + return draw_indent_guides; +} + void TextEdit::set_draw_tabs(bool p_draw) { draw_tabs = p_draw; @@ -5757,6 +5795,7 @@ void TextEdit::_update_completion_candidates() { completion_base = s; Vector<float> sim_cache; bool single_quote = s.begins_with("'"); + Vector<String> completion_options_casei; for (int i = 0; i < completion_strings.size(); i++) { if (single_quote && completion_strings[i].is_quoted()) { @@ -5765,9 +5804,13 @@ void TextEdit::_update_completion_candidates() { if (completion_strings[i].begins_with(s)) { completion_options.push_back(completion_strings[i]); + } else if (completion_strings[i].to_lower().begins_with(s.to_lower())) { + completion_options_casei.push_back(completion_strings[i]); } } + completion_options.append_array(completion_options_casei); + if (completion_options.size() == 0) { for (int i = 0; i < completion_strings.size(); i++) { if (s.is_subsequence_of(completion_strings[i])) { @@ -6039,7 +6082,10 @@ void TextEdit::menu_option(int p_option) { case MENU_UNDO: { undo(); } break; - }; + case MENU_REDO: { + redo(); + } + } } void TextEdit::set_select_identifiers_on_hover(bool p_enable) { @@ -6215,6 +6261,7 @@ void TextEdit::_bind_methods() { BIND_ENUM_CONSTANT(MENU_CLEAR); BIND_ENUM_CONSTANT(MENU_SELECT_ALL); BIND_ENUM_CONSTANT(MENU_UNDO); + BIND_ENUM_CONSTANT(MENU_REDO); BIND_ENUM_CONSTANT(MENU_MAX); GLOBAL_DEF("gui/timers/text_edit_idle_detect_sec", 3); @@ -6343,6 +6390,7 @@ TextEdit::TextEdit() { menu->add_item(RTR("Clear"), MENU_CLEAR); menu->add_separator(); menu->add_item(RTR("Undo"), MENU_UNDO, KEY_MASK_CMD | KEY_Z); + menu->add_item(RTR("Redo"), MENU_REDO, KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_Z); menu->connect("id_pressed", this, "menu_option"); } |