Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/fix toggle comment indent #25782

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions editor/code_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1095,6 +1095,79 @@ void CodeTextEditor::clone_lines_down() {
text_editor->update();
}

void CodeTextEditor::toggle_inline_comment(const String &delimiter) {
text_editor->begin_complex_operation();
if (text_editor->is_selection_active()) {
int begin = text_editor->get_selection_from_line();
int end = text_editor->get_selection_to_line();

// End of selection ends on the first column of the last line, ignore it.
if (text_editor->get_selection_to_column() == 0)
end -= 1;

int col_to = text_editor->get_selection_to_column();
int cursor_pos = text_editor->cursor_get_column();

// Check if all lines in the selected block are commented
bool is_commented = true;
for (int i = begin; i <= end; i++) {
if (!text_editor->get_line(i).begins_with(delimiter)) {
is_commented = false;
break;
}
}
for (int i = begin; i <= end; i++) {
String line_text = text_editor->get_line(i);

if (line_text.strip_edges().empty()) {
line_text = delimiter;
} else {
if (is_commented) {
line_text = line_text.substr(delimiter.length(), line_text.length());
} else {
line_text = delimiter + line_text;
}
}
text_editor->set_line(i, line_text);
}

// Adjust selection & cursor position.
int offset = (is_commented ? -1 : 1) * delimiter.length();
int col_from = text_editor->get_selection_from_column() > 0 ? text_editor->get_selection_from_column() + offset : 0;

if (is_commented && text_editor->cursor_get_column() == text_editor->get_line(text_editor->cursor_get_line()).length() + 1)
cursor_pos += 1;

if (text_editor->get_selection_to_column() != 0 && col_to != text_editor->get_line(text_editor->get_selection_to_line()).length() + 1)
col_to += offset;

if (text_editor->cursor_get_column() != 0)
cursor_pos += offset;

text_editor->select(begin, col_from, text_editor->get_selection_to_line(), col_to);
text_editor->cursor_set_column(cursor_pos);

} else {
int begin = text_editor->cursor_get_line();
String line_text = text_editor->get_line(begin);
int delimiter_length = delimiter.length();

int col = text_editor->cursor_get_column();
if (line_text.begins_with(delimiter)) {
line_text = line_text.substr(delimiter_length, line_text.length());
col -= delimiter_length;
} else {
line_text = delimiter + line_text;
col += delimiter_length;
}

text_editor->set_line(begin, line_text);
text_editor->cursor_set_column(col);
}
text_editor->end_complex_operation();
text_editor->update();
}

void CodeTextEditor::goto_line(int p_line) {
text_editor->deselect();
text_editor->unfold_line(p_line);
Expand Down
4 changes: 4 additions & 0 deletions editor/code_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,10 @@ class CodeTextEditor : public VBoxContainer {
void delete_lines();
void clone_lines_down();

/// Toggle inline comment on currently selected lines, or on current line if nothing is selected,
/// by adding or removing comment delimiter
void toggle_inline_comment(const String &delimiter);

void goto_line(int p_line);
void goto_line_selection(int p_line, int p_begin, int p_end);

Expand Down
106 changes: 20 additions & 86 deletions editor/plugins/script_text_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -800,92 +800,7 @@ void ScriptTextEditor::_edit_option(int p_op) {
} break;
case EDIT_TOGGLE_COMMENT: {

Ref<Script> scr = script;
if (scr.is_null())
return;

String delimiter = "#";
List<String> comment_delimiters;
scr->get_language()->get_comment_delimiters(&comment_delimiters);

for (List<String>::Element *E = comment_delimiters.front(); E; E = E->next()) {
String script_delimiter = E->get();
if (script_delimiter.find(" ") == -1) {
delimiter = script_delimiter;
break;
}
}

tx->begin_complex_operation();
if (tx->is_selection_active()) {
int begin = tx->get_selection_from_line();
int end = tx->get_selection_to_line();

// End of selection ends on the first column of the last line, ignore it.
if (tx->get_selection_to_column() == 0)
end -= 1;

int col_to = tx->get_selection_to_column();
int cursor_pos = tx->cursor_get_column();

// Check if all lines in the selected block are commented
bool is_commented = true;
for (int i = begin; i <= end; i++) {
if (!tx->get_line(i).begins_with(delimiter)) {
is_commented = false;
break;
}
}
for (int i = begin; i <= end; i++) {
String line_text = tx->get_line(i);

if (line_text.strip_edges().empty()) {
line_text = delimiter;
} else {
if (is_commented) {
line_text = line_text.substr(delimiter.length(), line_text.length());
} else {
line_text = delimiter + line_text;
}
}
tx->set_line(i, line_text);
}

// Adjust selection & cursor position.
int offset = is_commented ? -1 : 1;
int col_from = tx->get_selection_from_column() > 0 ? tx->get_selection_from_column() + offset : 0;

if (is_commented && tx->cursor_get_column() == tx->get_line(tx->cursor_get_line()).length() + 1)
cursor_pos += 1;

if (tx->get_selection_to_column() != 0 && col_to != tx->get_line(tx->get_selection_to_line()).length() + 1)
col_to += offset;

if (tx->cursor_get_column() != 0)
cursor_pos += offset;

tx->select(begin, col_from, tx->get_selection_to_line(), col_to);
tx->cursor_set_column(cursor_pos);

} else {
int begin = tx->cursor_get_line();
String line_text = tx->get_line(begin);

int col = tx->cursor_get_column();
if (line_text.begins_with(delimiter)) {
line_text = line_text.substr(delimiter.length(), line_text.length());
col -= 1;
} else {
line_text = delimiter + line_text;
col += 1;
}

tx->set_line(begin, line_text);
tx->cursor_set_column(col);
}
tx->end_complex_operation();
tx->update();

_edit_option_toggle_inline_comment();
} break;
case EDIT_COMPLETE: {

Expand Down Expand Up @@ -1072,6 +987,25 @@ void ScriptTextEditor::_edit_option(int p_op) {
}
}

void ScriptTextEditor::_edit_option_toggle_inline_comment() {
if (script.is_null())
return;

String delimiter = "#";
List<String> comment_delimiters;
script->get_language()->get_comment_delimiters(&comment_delimiters);

for (List<String>::Element *E = comment_delimiters.front(); E; E = E->next()) {
String script_delimiter = E->get();
if (script_delimiter.find(" ") == -1) {
delimiter = script_delimiter;
break;
}
}

code_editor->toggle_inline_comment(delimiter);
}

void ScriptTextEditor::add_syntax_highlighter(SyntaxHighlighter *p_highlighter) {
highlighters[p_highlighter->get_name()] = p_highlighter;
highlighter_menu->add_radio_check_item(p_highlighter->get_name());
Expand Down
1 change: 1 addition & 0 deletions editor/plugins/script_text_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ class ScriptTextEditor : public ScriptEditorBase {
void _change_syntax_highlighter(int p_idx);

void _edit_option(int p_op);
void _edit_option_toggle_inline_comment();
void _make_context_menu(bool p_selection, bool p_color, bool p_foldable, bool p_open_docs, bool p_goto_definition);
void _text_edit_gui_input(const Ref<InputEvent> &ev);
void _color_changed(const Color &p_color);
Expand Down
50 changes: 3 additions & 47 deletions editor/plugins/shader_editor_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,19 +244,19 @@ void ShaderEditor::_menu_option(int p_option) {
} break;
case EDIT_INDENT_LEFT: {

TextEdit *tx = shader_editor->get_text_edit();
if (shader.is_null())
return;

TextEdit *tx = shader_editor->get_text_edit();
tx->indent_left();

} break;
case EDIT_INDENT_RIGHT: {

TextEdit *tx = shader_editor->get_text_edit();
if (shader.is_null())
return;

TextEdit *tx = shader_editor->get_text_edit();
tx->indent_right();

} break;
Expand All @@ -268,54 +268,10 @@ void ShaderEditor::_menu_option(int p_option) {
} break;
case EDIT_TOGGLE_COMMENT: {

TextEdit *tx = shader_editor->get_text_edit();
if (shader.is_null())
return;

tx->begin_complex_operation();
if (tx->is_selection_active()) {
int begin = tx->get_selection_from_line();
int end = tx->get_selection_to_line();

// End of selection ends on the first column of the last line, ignore it.
if (tx->get_selection_to_column() == 0)
end -= 1;

// Check if all lines in the selected block are commented
bool is_commented = true;
for (int i = begin; i <= end; i++) {
if (!tx->get_line(i).begins_with("//")) {
is_commented = false;
break;
}
}
for (int i = begin; i <= end; i++) {
String line_text = tx->get_line(i);

if (line_text.strip_edges().empty()) {
line_text = "//";
} else {
if (is_commented) {
line_text = line_text.substr(2, line_text.length());
} else {
line_text = "//" + line_text;
}
}
tx->set_line(i, line_text);
}
} else {
int begin = tx->cursor_get_line();
String line_text = tx->get_line(begin);

if (line_text.begins_with("//"))
line_text = line_text.substr(2, line_text.length());
else
line_text = "//" + line_text;
tx->set_line(begin, line_text);
}
tx->end_complex_operation();
tx->update();
//tx->deselect();
shader_editor->toggle_inline_comment("//");

} break;
case EDIT_COMPLETE: {
Expand Down