From 4dfd0c1863fca80ddc35b6bcacf339077a0c4f54 Mon Sep 17 00:00:00 2001 From: Ignacio Etcheverry Date: Tue, 15 Mar 2016 13:02:38 +0100 Subject: TextEdit: Fix inconsistent copy, cut and paste behaviour --- scene/gui/text_edit.cpp | 126 ++++++++++++++++++------------------------------ 1 file changed, 46 insertions(+), 80 deletions(-) diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index e268375c8a..74f68b1313 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -2169,35 +2169,7 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { break; } - if (!selection.active){ - - String clipboard = text[cursor.line]; - OS::get_singleton()->set_clipboard(clipboard); - cursor_set_line(cursor.line); - cursor_set_column(0); - _remove_text(cursor.line,0,cursor.line,text[cursor.line].length()); - - backspace_at_cursor(); - update(); - cursor_set_line(cursor.line+1); - cut_copy_line = true; - - } - else - { - - String clipboard = _base_get_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - OS::get_singleton()->set_clipboard(clipboard); - - cursor_set_line(selection.from_line); - cursor_set_column(selection.from_column); - - _remove_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - selection.active=false; - selection.selecting_mode=Selection::MODE_NONE; - update(); - cut_copy_line = false; - } + cut(); } break; case KEY_C: { @@ -2207,16 +2179,8 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { break; } - if (!selection.active){ - String clipboard = _base_get_text(cursor.line,0,cursor.line,text[cursor.line].length()); - OS::get_singleton()->set_clipboard(clipboard); - cut_copy_line = true; - } - else{ - String clipboard = _base_get_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - OS::get_singleton()->set_clipboard(clipboard); - cut_copy_line = false; - } + copy(); + } break; case KEY_Z: { @@ -2237,25 +2201,8 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { break; } - String clipboard = OS::get_singleton()->get_clipboard(); - - if (selection.active) { - selection.active=false; - _remove_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - cursor_set_line(selection.from_line); - cursor_set_column(selection.from_column); - - } - else if (cut_copy_line) - { - cursor_set_column(0); - String ins="\n"; - clipboard += ins; - } - - _insert_text_at_cursor(clipboard); + paste(); - update(); } break; case KEY_SPACE: { #ifdef OSX_ENABLED @@ -3028,20 +2975,33 @@ void TextEdit::set_auto_indent(bool p_auto_indent) { void TextEdit::cut() { - if (!selection.active) - return; + if (!selection.active) { - String clipboard = _base_get_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - OS::get_singleton()->set_clipboard(clipboard); + String clipboard = text[cursor.line]; + OS::get_singleton()->set_clipboard(clipboard); + cursor_set_line(cursor.line); + cursor_set_column(0); + _remove_text(cursor.line,0,cursor.line,text[cursor.line].length()); - cursor_set_line(selection.from_line); - cursor_set_column(selection.from_column); + backspace_at_cursor(); + update(); + cursor_set_line(cursor.line+1); + cut_copy_line = true; - _remove_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - selection.active=false; - selection.selecting_mode=Selection::MODE_NONE; - update(); + } else { + + String clipboard = _base_get_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); + OS::get_singleton()->set_clipboard(clipboard); + + cursor_set_line(selection.from_line); + cursor_set_column(selection.from_column); + _remove_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); + selection.active=false; + selection.selecting_mode=Selection::MODE_NONE; + update(); + cut_copy_line = false; + } } void TextEdit::copy() { @@ -3049,32 +3009,38 @@ void TextEdit::copy() { if (!selection.active) return; - print_line("from line: "+itos(selection.from_line)); - print_line("from column: "+itos(selection.from_column)); - print_line("to line: "+itos(selection.to_line)); - print_line("to column: "+itos(selection.to_column)); - - String clipboard = _base_get_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - OS::get_singleton()->set_clipboard(clipboard); - + if (!selection.active) { + String clipboard = _base_get_text(cursor.line,0,cursor.line,text[cursor.line].length()); + OS::get_singleton()->set_clipboard(clipboard); + cut_copy_line = true; + } else { + String clipboard = _base_get_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); + OS::get_singleton()->set_clipboard(clipboard); + cut_copy_line = false; + } } + void TextEdit::paste() { + String clipboard = OS::get_singleton()->get_clipboard(); + if (selection.active) { + selection.active=false; + selection.selecting_mode=Selection::MODE_NONE; + _remove_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); cursor_set_line(selection.from_line); cursor_set_column(selection.from_column); - _remove_text(selection.from_line,selection.from_column,selection.to_line,selection.to_column); - selection.active=false; - selection.selecting_mode=Selection::MODE_NONE; + } else if (cut_copy_line) { + cursor_set_column(0); + String ins="\n"; + clipboard += ins; } - String clipboard = OS::get_singleton()->get_clipboard(); _insert_text_at_cursor(clipboard); update(); - } void TextEdit::select_all() { -- cgit v1.2.3 From fac027cb14a730c1d8cca080dad733663c287a2d Mon Sep 17 00:00:00 2001 From: Ignacio Etcheverry Date: Tue, 15 Mar 2016 13:03:38 +0100 Subject: LineEdit/TextEdit: Add Shift+Delete shortcut for cut --- scene/gui/line_edit.cpp | 5 +++++ scene/gui/text_edit.cpp | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 3953ef06a5..21dee62b38 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -274,6 +274,11 @@ void LineEdit::_input_event(InputEvent p_event) { } break; case KEY_DELETE: { + if (k.mod.shift && !k.mod.command && !k.mod.alt && editable) { + cut_text(); + break; + } + if (editable) { undo_text = text; if (selection.enabled) diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 74f68b1313..b80597560d 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1957,6 +1957,12 @@ void TextEdit::_input_event(const InputEvent& p_input_event) { if (readonly) break; + + if (k.mod.shift && !k.mod.command && !k.mod.alt) { + cut(); + break; + } + int curline_len = text[cursor.line].length(); if (cursor.line==text.size()-1 && cursor.column==curline_len) -- cgit v1.2.3