summaryrefslogtreecommitdiffstats
path: root/scene/gui/code_edit.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-06-27 17:08:23 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-06-27 17:08:23 +0200
commit3f4bcfeef1461bb7d2d043e9d32a346b8495394e (patch)
tree3cce6a677daa705788653d703e26218746da4e46 /scene/gui/code_edit.cpp
parentf662e0714773b49807ecf33fcbe620fc7dd3b9c7 (diff)
parenta7da814c6bbdf050f9aee78ebfa3120db1062fdb (diff)
downloadredot-engine-3f4bcfeef1461bb7d2d043e9d32a346b8495394e.tar.gz
Merge pull request #93607 from kitbdev/fix-text-edit-move-lines
CodeEdit: Fix move lines up/down viewport and selection issues
Diffstat (limited to 'scene/gui/code_edit.cpp')
-rw-r--r--scene/gui/code_edit.cpp56
1 files changed, 34 insertions, 22 deletions
diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp
index 0bdb487300..c3c4b1d3fb 100644
--- a/scene/gui/code_edit.cpp
+++ b/scene/gui/code_edit.cpp
@@ -2331,18 +2331,19 @@ void CodeEdit::move_lines_up() {
unfold_line(line);
swap_lines(line - 1, line);
}
- }
-
- // Fix selection if it ended at column 0, since it wasn't moved.
- for (int i = 0; i < get_caret_count(); i++) {
- if (has_selection(i) && get_selection_to_column(i) == 0 && get_selection_to_line(i) != 0) {
- if (is_caret_after_selection_origin(i)) {
- set_caret_line(get_caret_line(i) - 1, false, true, -1, i);
- } else {
- set_selection_origin_line(get_selection_origin_line(i) - 1, true, -1, i);
+ // Fix selection if the last one ends at column 0, since it wasn't moved.
+ for (int i = 0; i < get_caret_count(); i++) {
+ if (has_selection(i) && get_selection_to_column(i) == 0 && get_selection_to_line(i) == line_range.y + 1) {
+ if (is_caret_after_selection_origin(i)) {
+ set_caret_line(get_caret_line(i) - 1, false, true, -1, i);
+ } else {
+ set_selection_origin_line(get_selection_origin_line(i) - 1, true, -1, i);
+ }
+ break;
}
}
}
+ adjust_viewport_to_caret();
end_multicaret_edit();
end_complex_operation();
@@ -2352,30 +2353,41 @@ void CodeEdit::move_lines_down() {
begin_complex_operation();
begin_multicaret_edit();
- Vector<Point2i> line_ranges = get_line_ranges_from_carets();
-
- // Fix selection if it ended at column 0, since it won't be moved.
- for (int i = 0; i < get_caret_count(); i++) {
- if (has_selection(i) && get_selection_to_column(i) == 0 && get_selection_to_line(i) != get_line_count() - 1) {
- if (is_caret_after_selection_origin(i)) {
- set_caret_line(get_caret_line(i) + 1, false, true, -1, i);
- } else {
- set_selection_origin_line(get_selection_origin_line(i) + 1, true, -1, i);
- }
- }
- }
-
// Move lines down by swapping each line with the one below it.
+ Vector<Point2i> line_ranges = get_line_ranges_from_carets();
+ // Reverse in case line ranges are adjacent, if the first ends at column 0.
+ line_ranges.reverse();
for (Point2i line_range : line_ranges) {
if (line_range.y == get_line_count() - 1) {
continue;
}
+ // Fix selection if the last one ends at column 0, since it won't be moved.
+ bool selection_to_line_at_end = false;
+ for (int i = 0; i < get_caret_count(); i++) {
+ if (has_selection(i) && get_selection_to_column(i) == 0 && get_selection_to_line(i) == line_range.y + 1) {
+ selection_to_line_at_end = get_selection_to_line(i) == get_line_count() - 1;
+ if (selection_to_line_at_end) {
+ break;
+ }
+ if (is_caret_after_selection_origin(i)) {
+ set_caret_line(get_caret_line(i) + 1, false, true, -1, i);
+ } else {
+ set_selection_origin_line(get_selection_origin_line(i) + 1, true, -1, i);
+ }
+ break;
+ }
+ }
+ if (selection_to_line_at_end) {
+ continue;
+ }
+
unfold_line(line_range.y + 1);
for (int line = line_range.y; line >= line_range.x; line--) {
unfold_line(line);
swap_lines(line + 1, line);
}
}
+ adjust_viewport_to_caret();
end_multicaret_edit();
end_complex_operation();