Allow unindent without selection

This commit is contained in:
kobewi 2023-01-18 17:05:15 +01:00
parent e514e3732a
commit b427d3585c
4 changed files with 19 additions and 85 deletions

View File

@ -132,12 +132,6 @@
Perform an indent as if the user activated the "ui_text_indent" action. Perform an indent as if the user activated the "ui_text_indent" action.
</description> </description>
</method> </method>
<method name="do_unindent">
<return type="void" />
<description>
Perform an unindent as if the user activated the "ui_text_unindent" action.
</description>
</method>
<method name="fold_all_lines"> <method name="fold_all_lines">
<return type="void" /> <return type="void" />
<description> <description>
@ -423,7 +417,7 @@
<method name="unindent_lines"> <method name="unindent_lines">
<return type="void" /> <return type="void" />
<description> <description>
Unindents selected lines, or in the case of no selection the caret line by one. Unindents selected lines, or in the case of no selection the caret line by one. Same as performing "ui_text_unindent" action.
</description> </description>
</method> </method>
<method name="update_code_completion_options"> <method name="update_code_completion_options">

View File

@ -548,7 +548,7 @@ void CodeEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
} }
if (k->is_action("ui_text_dedent", true)) { if (k->is_action("ui_text_dedent", true)) {
do_unindent(); unindent_lines();
accept_event(); accept_event();
return; return;
} }
@ -898,50 +898,6 @@ void CodeEdit::indent_lines() {
end_complex_operation(); end_complex_operation();
} }
void CodeEdit::do_unindent() {
if (!is_editable()) {
return;
}
int cc = get_caret_column();
if (has_selection() || cc <= 0) {
unindent_lines();
return;
}
begin_complex_operation();
Vector<int> caret_edit_order = get_caret_index_edit_order();
for (const int &c : caret_edit_order) {
int cl = get_caret_line(c);
const String &line = get_line(cl);
if (line[cc - 1] == '\t') {
remove_text(cl, cc - 1, cl, cc);
set_caret_column(MAX(0, cc - 1), c == 0, c);
adjust_carets_after_edit(c, cl, cc, cl, cc - 1);
continue;
}
if (line[cc - 1] != ' ') {
continue;
}
int spaces_to_remove = _calculate_spaces_till_next_left_indent(cc);
if (spaces_to_remove > 0) {
for (int i = 1; i <= spaces_to_remove; i++) {
if (line[cc - i] != ' ') {
spaces_to_remove = i - 1;
break;
}
}
remove_text(cl, cc - spaces_to_remove, cl, cc);
set_caret_column(MAX(0, cc - spaces_to_remove), c == 0, c);
}
}
end_complex_operation();
}
void CodeEdit::unindent_lines() { void CodeEdit::unindent_lines() {
if (!is_editable()) { if (!is_editable()) {
return; return;
@ -2204,7 +2160,6 @@ void CodeEdit::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_auto_indent_prefixes"), &CodeEdit::get_auto_indent_prefixes); ClassDB::bind_method(D_METHOD("get_auto_indent_prefixes"), &CodeEdit::get_auto_indent_prefixes);
ClassDB::bind_method(D_METHOD("do_indent"), &CodeEdit::do_indent); ClassDB::bind_method(D_METHOD("do_indent"), &CodeEdit::do_indent);
ClassDB::bind_method(D_METHOD("do_unindent"), &CodeEdit::do_unindent);
ClassDB::bind_method(D_METHOD("indent_lines"), &CodeEdit::indent_lines); ClassDB::bind_method(D_METHOD("indent_lines"), &CodeEdit::indent_lines);
ClassDB::bind_method(D_METHOD("unindent_lines"), &CodeEdit::unindent_lines); ClassDB::bind_method(D_METHOD("unindent_lines"), &CodeEdit::unindent_lines);

View File

@ -289,7 +289,6 @@ public:
TypedArray<String> get_auto_indent_prefixes() const; TypedArray<String> get_auto_indent_prefixes() const;
void do_indent(); void do_indent();
void do_unindent();
void indent_lines(); void indent_lines();
void unindent_lines(); void unindent_lines();

View File

@ -1954,7 +1954,7 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
code_edit->set_editable(false); code_edit->set_editable(false);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\t"); CHECK(code_edit->get_line(0) == "\t");
code_edit->unindent_lines(); code_edit->unindent_lines();
@ -1963,16 +1963,9 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
code_edit->set_editable(true); code_edit->set_editable(true);
/* Simple unindent. */ /* Simple unindent. */
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == ""); CHECK(code_edit->get_line(0) == "");
/* Should inindent inplace. */
code_edit->set_text("");
code_edit->insert_text_at_caret("test\t");
code_edit->do_unindent();
CHECK(code_edit->get_line(0) == "test");
/* Backspace does a simple unindent. */ /* Backspace does a simple unindent. */
code_edit->set_text(""); code_edit->set_text("");
code_edit->insert_text_at_caret("\t"); code_edit->insert_text_at_caret("\t");
@ -1987,7 +1980,7 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
/* Caret on col zero unindent line. */ /* Caret on col zero unindent line. */
code_edit->set_text("\t\ttest"); code_edit->set_text("\t\ttest");
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest"); CHECK(code_edit->get_line(0) == "\ttest");
/* Check input action. */ /* Check input action. */
@ -1998,34 +1991,34 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
/* Selection does entire line. */ /* Selection does entire line. */
code_edit->set_text("\t\ttest"); code_edit->set_text("\t\ttest");
code_edit->select_all(); code_edit->select_all();
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "\ttest"); CHECK(code_edit->get_line(0) == "\ttest");
/* Handles multiple lines. */ /* Handles multiple lines. */
code_edit->set_text("\ttest\n\ttext"); code_edit->set_text("\ttest\n\ttext");
code_edit->select_all(); code_edit->select_all();
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "text"); CHECK(code_edit->get_line(1) == "text");
/* Do not unindent line if last col is zero. */ /* Do not unindent line if last col is zero. */
code_edit->set_text("\ttest\n\ttext"); code_edit->set_text("\ttest\n\ttext");
code_edit->select(0, 0, 1, 0); code_edit->select(0, 0, 1, 0);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "\ttext"); CHECK(code_edit->get_line(1) == "\ttext");
/* Unindent even if last column of first line. */ /* Unindent even if last column of first line. */
code_edit->set_text("\ttest\n\ttext"); code_edit->set_text("\ttest\n\ttext");
code_edit->select(0, 5, 1, 1); code_edit->select(0, 5, 1, 1);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "text"); CHECK(code_edit->get_line(1) == "text");
/* Check selection is adjusted. */ /* Check selection is adjusted. */
code_edit->set_text("\ttest"); code_edit->set_text("\ttest");
code_edit->select(0, 1, 0, 2); code_edit->select(0, 1, 0, 2);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_selection_from_column() == 0); CHECK(code_edit->get_selection_from_column() == 0);
CHECK(code_edit->get_selection_to_column() == 1); CHECK(code_edit->get_selection_to_column() == 1);
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");
@ -2041,7 +2034,7 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
code_edit->set_editable(false); code_edit->set_editable(false);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " "); CHECK(code_edit->get_line(0) == " ");
code_edit->unindent_lines(); code_edit->unindent_lines();
@ -2050,16 +2043,9 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
code_edit->set_editable(true); code_edit->set_editable(true);
/* Simple unindent. */ /* Simple unindent. */
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == ""); CHECK(code_edit->get_line(0) == "");
/* Should inindent inplace. */
code_edit->set_text("");
code_edit->insert_text_at_caret("test ");
code_edit->do_unindent();
CHECK(code_edit->get_line(0) == "test");
/* Backspace does a simple unindent. */ /* Backspace does a simple unindent. */
code_edit->set_text(""); code_edit->set_text("");
code_edit->insert_text_at_caret(" "); code_edit->insert_text_at_caret(" ");
@ -2080,12 +2066,12 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
/* Caret on col zero unindent line. */ /* Caret on col zero unindent line. */
code_edit->set_text(" test"); code_edit->set_text(" test");
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test"); CHECK(code_edit->get_line(0) == " test");
/* Only as far as needed */ /* Only as far as needed */
code_edit->set_text(" test"); code_edit->set_text(" test");
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test"); CHECK(code_edit->get_line(0) == " test");
/* Check input action. */ /* Check input action. */
@ -2096,34 +2082,34 @@ TEST_CASE("[SceneTree][CodeEdit] indent") {
/* Selection does entire line. */ /* Selection does entire line. */
code_edit->set_text(" test"); code_edit->set_text(" test");
code_edit->select_all(); code_edit->select_all();
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == " test"); CHECK(code_edit->get_line(0) == " test");
/* Handles multiple lines. */ /* Handles multiple lines. */
code_edit->set_text(" test\n text"); code_edit->set_text(" test\n text");
code_edit->select_all(); code_edit->select_all();
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "text"); CHECK(code_edit->get_line(1) == "text");
/* Do not unindent line if last col is zero. */ /* Do not unindent line if last col is zero. */
code_edit->set_text(" test\n text"); code_edit->set_text(" test\n text");
code_edit->select(0, 0, 1, 0); code_edit->select(0, 0, 1, 0);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == " text"); CHECK(code_edit->get_line(1) == " text");
/* Unindent even if last column of first line. */ /* Unindent even if last column of first line. */
code_edit->set_text(" test\n text"); code_edit->set_text(" test\n text");
code_edit->select(0, 5, 1, 1); code_edit->select(0, 5, 1, 1);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");
CHECK(code_edit->get_line(1) == "text"); CHECK(code_edit->get_line(1) == "text");
/* Check selection is adjusted. */ /* Check selection is adjusted. */
code_edit->set_text(" test"); code_edit->set_text(" test");
code_edit->select(0, 4, 0, 5); code_edit->select(0, 4, 0, 5);
code_edit->do_unindent(); code_edit->unindent_lines();
CHECK(code_edit->get_selection_from_column() == 0); CHECK(code_edit->get_selection_from_column() == 0);
CHECK(code_edit->get_selection_to_column() == 1); CHECK(code_edit->get_selection_to_column() == 1);
CHECK(code_edit->get_line(0) == "test"); CHECK(code_edit->get_line(0) == "test");