From fcff9787638e73eac0802ff6abdba6061a569d81 Mon Sep 17 00:00:00 2001 From: Alfred Reinold Baudisch Date: Mon, 31 Oct 2022 16:55:47 +0100 Subject: Shortcut and Bind to Remove Secondary Carets Adds the bind `ui_text_remove_secondary_carets` to TextEdit, with ESC as the default shortcut. When the bind is performed, if the TextEdit has multiple carets, `remove_secondary_carets` is called and secondary carets are removed. This is useful when multiple selects are performed with `add_select_for_next_occurrence` #67644 or when multiple multiple carets are manually added, then it's possible to go back to a single caret with a shortcut. Closes #67991 --- core/input/input_map.cpp | 5 +++++ doc/classes/ProjectSettings.xml | 4 ++++ scene/gui/text_edit.cpp | 9 +++++++++ scene/gui/text_edit.h | 1 + 4 files changed, 19 insertions(+) diff --git a/core/input/input_map.cpp b/core/input/input_map.cpp index 233065fe8b..aebb9caa2f 100644 --- a/core/input/input_map.cpp +++ b/core/input/input_map.cpp @@ -342,6 +342,7 @@ static const _BuiltinActionDisplayName _builtin_action_display_names[] = { { "ui_text_select_all", TTRC("Select All") }, { "ui_text_select_word_under_caret", TTRC("Select Word Under Caret") }, { "ui_text_add_selection_for_next_occurrence", TTRC("Add Selection for Next Occurrence") }, + { "ui_text_remove_secondary_carets", TTRC("Remove Secondary Carets") }, { "ui_text_toggle_insert_mode", TTRC("Toggle Insert Mode") }, { "ui_text_submit", TTRC("Text Submitted") }, { "ui_graph_duplicate", TTRC("Duplicate Nodes") }, @@ -671,6 +672,10 @@ const HashMap>> &InputMap::get_builtins() { inputs.push_back(InputEventKey::create_reference(Key::D | KeyModifierMask::CMD_OR_CTRL)); default_builtin_cache.insert("ui_text_add_selection_for_next_occurrence", inputs); + inputs = List>(); + inputs.push_back(InputEventKey::create_reference(Key::ESCAPE)); + default_builtin_cache.insert("ui_text_remove_secondary_carets", inputs); + inputs = List>(); inputs.push_back(InputEventKey::create_reference(Key::INSERT)); default_builtin_cache.insert("ui_text_toggle_insert_mode", inputs); diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 925d4ec7c4..b31d324755 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -984,6 +984,10 @@ Default [InputEventAction] to insert a new line after the current one. [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. + + If multiple carets are currently active, clear additional carets and keep just one caret. + [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. + Default [InputEventAction] to scroll down one line of text. [b]Note:[/b] Default [code]ui_*[/code] actions cannot be removed as they are necessary for the internal logic of several [Control]s. The events assigned to the action can however be modified. diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 144aa2a1ef..cc9fc99b9c 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -2067,6 +2067,11 @@ void TextEdit::gui_input(const Ref &p_gui_input) { accept_event(); return; } + if (k->is_action("ui_text_remove_secondary_carets", true) && _should_remove_secondary_carets()) { + remove_secondary_carets(); + accept_event(); + return; + } if (k->is_action("ui_cut", true)) { cut(); accept_event(); @@ -2819,6 +2824,10 @@ void TextEdit::_move_caret_document_end(bool p_select) { } } +bool TextEdit::_should_remove_secondary_carets() { + return carets.size() > 1; +} + void TextEdit::_get_above_below_caret_line_column(int p_old_line, int p_old_wrap_index, int p_old_column, bool p_below, int &p_new_line, int &p_new_column, int p_last_fit_x) const { if (p_last_fit_x == -1) { p_last_fit_x = _get_column_x_offset_for_line(p_old_column, p_old_line, p_old_column); diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index 935f2a7ce8..263a36aba8 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -597,6 +597,7 @@ private: void _delete(bool p_word = false, bool p_all_to_right = false); void _move_caret_document_start(bool p_select); void _move_caret_document_end(bool p_select); + bool _should_remove_secondary_carets(); // Used in add_caret_at_carets void _get_above_below_caret_line_column(int p_old_line, int p_old_wrap_index, int p_old_column, bool p_below, int &p_new_line, int &p_new_column, int p_last_fit_x = -1) const; -- cgit v1.2.3