summaryrefslogtreecommitdiffstats
path: root/editor
diff options
context:
space:
mode:
authorAiden Storey <git@storey.dev>2024-01-12 00:32:13 -0500
committerAiden Storey <git@storey.dev>2024-05-02 22:57:34 -0400
commitb4c1634b52f619ca8987b67ecee2640310781aa7 (patch)
tree592faafc74fefb2dfb3e4a5ff4d8e63fb2e52513 /editor
parentd4f726f3ef21cef3e7936b2c9770cdac6478b8ee (diff)
downloadredot-engine-b4c1634b52f619ca8987b67ecee2640310781aa7.tar.gz
Implement trim_final_newlines functionality
Diffstat (limited to 'editor')
-rw-r--r--editor/code_editor.cpp25
-rw-r--r--editor/code_editor.h1
-rw-r--r--editor/editor_settings.cpp1
-rw-r--r--editor/plugins/script_editor_plugin.cpp18
-rw-r--r--editor/plugins/script_editor_plugin.h2
-rw-r--r--editor/plugins/script_text_editor.cpp9
-rw-r--r--editor/plugins/script_text_editor.h2
-rw-r--r--editor/plugins/shader_editor_plugin.cpp20
-rw-r--r--editor/plugins/text_editor.cpp8
-rw-r--r--editor/plugins/text_editor.h2
-rw-r--r--editor/plugins/text_shader_editor.cpp9
-rw-r--r--editor/plugins/text_shader_editor.h3
12 files changed, 96 insertions, 4 deletions
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index cfeb495690..1d47658266 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -1123,6 +1123,31 @@ void CodeTextEditor::trim_trailing_whitespace() {
}
}
+void CodeTextEditor::trim_final_newlines() {
+ int final_line = text_editor->get_line_count() - 1;
+ int check_line = final_line;
+
+ String line = text_editor->get_line(check_line);
+
+ while (line.is_empty() && check_line > -1) {
+ --check_line;
+
+ line = text_editor->get_line(check_line);
+ }
+
+ ++check_line;
+
+ if (check_line < final_line) {
+ text_editor->begin_complex_operation();
+
+ text_editor->remove_text(check_line, 0, final_line, 0);
+
+ text_editor->merge_overlapping_carets();
+ text_editor->end_complex_operation();
+ text_editor->queue_redraw();
+ }
+}
+
void CodeTextEditor::insert_final_newline() {
int final_line = text_editor->get_line_count() - 1;
String line = text_editor->get_line(final_line);
diff --git a/editor/code_editor.h b/editor/code_editor.h
index 75a2a68d58..af33a3fac8 100644
--- a/editor/code_editor.h
+++ b/editor/code_editor.h
@@ -224,6 +224,7 @@ protected:
public:
void trim_trailing_whitespace();
+ void trim_final_newlines();
void insert_final_newline();
enum CaseStyle {
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index 752b060513..dbc697e2b6 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -647,6 +647,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
// Behavior: Files
_initial_set("text_editor/behavior/files/trim_trailing_whitespace_on_save", false);
+ _initial_set("text_editor/behavior/files/trim_final_newlines_on_save", true);
_initial_set("text_editor/behavior/files/autosave_interval_secs", 0);
_initial_set("text_editor/behavior/files/restore_scripts_on_load", true);
_initial_set("text_editor/behavior/files/convert_indent_on_save", true);
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index c48af90622..459a93c449 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -1007,6 +1007,10 @@ void ScriptEditor::_resave_scripts(const String &p_str) {
se->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ se->trim_final_newlines();
+ }
+
se->insert_final_newline();
if (convert_indent_on_save) {
@@ -1387,6 +1391,10 @@ void ScriptEditor::_menu_option(int p_option) {
current->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ current->trim_final_newlines();
+ }
+
current->insert_final_newline();
if (convert_indent_on_save) {
@@ -2567,6 +2575,10 @@ void ScriptEditor::save_current_script() {
current->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ current->trim_final_newlines();
+ }
+
current->insert_final_newline();
if (convert_indent_on_save) {
@@ -2611,6 +2623,10 @@ void ScriptEditor::save_all_scripts() {
se->trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ se->trim_final_newlines();
+ }
+
se->insert_final_newline();
if (!se->is_unsaved()) {
@@ -2848,6 +2864,7 @@ void ScriptEditor::_apply_editor_settings() {
}
trim_trailing_whitespace_on_save = EDITOR_GET("text_editor/behavior/files/trim_trailing_whitespace_on_save");
+ trim_final_newlines_on_save = EDITOR_GET("text_editor/behavior/files/trim_final_newlines_on_save");
convert_indent_on_save = EDITOR_GET("text_editor/behavior/files/convert_indent_on_save");
members_overview_enabled = EDITOR_GET("text_editor/script_list/show_members_overview");
@@ -4265,6 +4282,7 @@ ScriptEditor::ScriptEditor(WindowWrapper *p_wrapper) {
edit_pass = 0;
trim_trailing_whitespace_on_save = EDITOR_GET("text_editor/behavior/files/trim_trailing_whitespace_on_save");
+ trim_final_newlines_on_save = EDITOR_GET("text_editor/behavior/files/trim_final_newlines_on_save");
convert_indent_on_save = EDITOR_GET("text_editor/behavior/files/convert_indent_on_save");
ScriptServer::edit_request_func = _open_script_request;
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index e6bb8f14a9..53af4c8dad 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -174,6 +174,7 @@ public:
virtual void set_executing_line(int p_line) = 0;
virtual void clear_executing_line() = 0;
virtual void trim_trailing_whitespace() = 0;
+ virtual void trim_final_newlines() = 0;
virtual void insert_final_newline() = 0;
virtual void convert_indent() = 0;
virtual void ensure_focus() = 0;
@@ -408,6 +409,7 @@ class ScriptEditor : public PanelContainer {
bool open_textfile_after_create = true;
bool trim_trailing_whitespace_on_save;
+ bool trim_final_newlines_on_save;
bool convert_indent_on_save;
bool external_editor_active;
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index 561edcf8bf..cf102eaa0f 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -431,6 +431,10 @@ void ScriptTextEditor::trim_trailing_whitespace() {
code_editor->trim_trailing_whitespace();
}
+void ScriptTextEditor::trim_final_newlines() {
+ code_editor->trim_final_newlines();
+}
+
void ScriptTextEditor::insert_final_newline() {
code_editor->insert_final_newline();
}
@@ -1427,6 +1431,9 @@ void ScriptTextEditor::_edit_option(int p_op) {
case EDIT_TRIM_TRAILING_WHITESAPCE: {
trim_trailing_whitespace();
} break;
+ case EDIT_TRIM_FINAL_NEWLINES: {
+ trim_final_newlines();
+ } break;
case EDIT_CONVERT_INDENT_TO_SPACES: {
code_editor->set_indent_using_spaces(true);
convert_indent();
@@ -2299,6 +2306,7 @@ void ScriptTextEditor::_enable_code_editor() {
edit_menu->get_popup()->add_separator();
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("ui_text_completion_query"), EDIT_COMPLETE);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_final_newlines"), EDIT_TRIM_FINAL_NEWLINES);
{
PopupMenu *sub_menu = memnew(PopupMenu);
sub_menu->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES);
@@ -2484,6 +2492,7 @@ void ScriptTextEditor::register_editor() {
ED_SHORTCUT("script_text_editor/evaluate_selection", TTR("Evaluate Selection"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::E);
ED_SHORTCUT("script_text_editor/toggle_word_wrap", TTR("Toggle Word Wrap"), KeyModifierMask::ALT | Key::Z);
ED_SHORTCUT("script_text_editor/trim_trailing_whitespace", TTR("Trim Trailing Whitespace"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::ALT | Key::T);
+ ED_SHORTCUT("script_text_editor/trim_final_newlines", TTR("Trim Final Newlines"), Key::NONE);
ED_SHORTCUT("script_text_editor/convert_indent_to_spaces", TTR("Convert Indent to Spaces"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::Y);
ED_SHORTCUT("script_text_editor/convert_indent_to_tabs", TTR("Convert Indent to Tabs"), KeyModifierMask::CMD_OR_CTRL | KeyModifierMask::SHIFT | Key::I);
ED_SHORTCUT("script_text_editor/auto_indent", TTR("Auto Indent"), KeyModifierMask::CMD_OR_CTRL | Key::I);
diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h
index de89fe458c..8c2ec1561b 100644
--- a/editor/plugins/script_text_editor.h
+++ b/editor/plugins/script_text_editor.h
@@ -118,6 +118,7 @@ class ScriptTextEditor : public ScriptEditorBase {
EDIT_COMPLETE,
EDIT_AUTO_INDENT,
EDIT_TRIM_TRAILING_WHITESAPCE,
+ EDIT_TRIM_FINAL_NEWLINES,
EDIT_CONVERT_INDENT_TO_SPACES,
EDIT_CONVERT_INDENT_TO_TABS,
EDIT_TOGGLE_COMMENT,
@@ -228,6 +229,7 @@ public:
virtual Variant get_navigation_state() override;
virtual void ensure_focus() override;
virtual void trim_trailing_whitespace() override;
+ virtual void trim_final_newlines() override;
virtual void insert_final_newline() override;
virtual void convert_indent() override;
virtual void tag_saved_version() override;
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
index 222d010a7a..a83f95f680 100644
--- a/editor/plugins/shader_editor_plugin.cpp
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -436,8 +436,14 @@ void ShaderEditorPlugin::_menu_item_pressed(int p_index) {
int index = shader_tabs->get_current_tab();
ERR_FAIL_INDEX(index, shader_tabs->get_tab_count());
TextShaderEditor *editor = edited_shaders[index].shader_editor;
- if (editor && editor->get_trim_trailing_whitespace_on_save()) {
- editor->trim_trailing_whitespace();
+ if (editor) {
+ if (editor->get_trim_trailing_whitespace_on_save()) {
+ editor->trim_trailing_whitespace();
+ }
+
+ if (editor->get_trim_final_newlines_on_save()) {
+ editor->trim_final_newlines();
+ }
}
if (edited_shaders[index].shader.is_valid()) {
EditorNode::get_singleton()->save_resource(edited_shaders[index].shader);
@@ -452,8 +458,14 @@ void ShaderEditorPlugin::_menu_item_pressed(int p_index) {
int index = shader_tabs->get_current_tab();
ERR_FAIL_INDEX(index, shader_tabs->get_tab_count());
TextShaderEditor *editor = edited_shaders[index].shader_editor;
- if (editor && editor->get_trim_trailing_whitespace_on_save()) {
- editor->trim_trailing_whitespace();
+ if (editor) {
+ if (editor->get_trim_trailing_whitespace_on_save()) {
+ editor->trim_trailing_whitespace();
+ }
+
+ if (editor->get_trim_final_newlines_on_save()) {
+ editor->trim_final_newlines();
+ }
}
String path;
if (edited_shaders[index].shader.is_valid()) {
diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp
index e19d9d933a..a4d70c6cbd 100644
--- a/editor/plugins/text_editor.cpp
+++ b/editor/plugins/text_editor.cpp
@@ -288,6 +288,10 @@ void TextEditor::trim_trailing_whitespace() {
code_editor->trim_trailing_whitespace();
}
+void TextEditor::trim_final_newlines() {
+ code_editor->trim_final_newlines();
+}
+
void TextEditor::insert_final_newline() {
code_editor->insert_final_newline();
}
@@ -414,6 +418,9 @@ void TextEditor::_edit_option(int p_op) {
case EDIT_TRIM_TRAILING_WHITESAPCE: {
trim_trailing_whitespace();
} break;
+ case EDIT_TRIM_FINAL_NEWLINES: {
+ trim_final_newlines();
+ } break;
case EDIT_CONVERT_INDENT_TO_SPACES: {
code_editor->set_indent_using_spaces(true);
convert_indent();
@@ -641,6 +648,7 @@ TextEditor::TextEditor() {
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/duplicate_lines"), EDIT_DUPLICATE_LINES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/toggle_word_wrap"), EDIT_TOGGLE_WORD_WRAP);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_trailing_whitespace"), EDIT_TRIM_TRAILING_WHITESAPCE);
+ edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/trim_final_newlines"), EDIT_TRIM_FINAL_NEWLINES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_spaces"), EDIT_CONVERT_INDENT_TO_SPACES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/convert_indent_to_tabs"), EDIT_CONVERT_INDENT_TO_TABS);
diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h
index 38fddc45df..268e5c32b4 100644
--- a/editor/plugins/text_editor.h
+++ b/editor/plugins/text_editor.h
@@ -63,6 +63,7 @@ private:
EDIT_PASTE,
EDIT_SELECT_ALL,
EDIT_TRIM_TRAILING_WHITESAPCE,
+ EDIT_TRIM_FINAL_NEWLINES,
EDIT_CONVERT_INDENT_TO_SPACES,
EDIT_CONVERT_INDENT_TO_TABS,
EDIT_MOVE_LINE_UP,
@@ -133,6 +134,7 @@ public:
virtual void set_executing_line(int p_line) override;
virtual void clear_executing_line() override;
virtual void trim_trailing_whitespace() override;
+ virtual void trim_final_newlines() override;
virtual void insert_final_newline() override;
virtual void convert_indent() override;
virtual void ensure_focus() override;
diff --git a/editor/plugins/text_shader_editor.cpp b/editor/plugins/text_shader_editor.cpp
index 83a1700306..dd34a6dd69 100644
--- a/editor/plugins/text_shader_editor.cpp
+++ b/editor/plugins/text_shader_editor.cpp
@@ -756,6 +756,7 @@ void TextShaderEditor::_apply_editor_settings() {
code_editor->update_editor_settings();
trim_trailing_whitespace_on_save = EDITOR_GET("text_editor/behavior/files/trim_trailing_whitespace_on_save");
+ trim_final_newlines_on_save = EDITOR_GET("text_editor/behavior/files/trim_final_newlines_on_save");
}
void TextShaderEditor::_show_warnings_panel(bool p_show) {
@@ -920,6 +921,10 @@ void TextShaderEditor::save_external_data(const String &p_str) {
trim_trailing_whitespace();
}
+ if (trim_final_newlines_on_save) {
+ trim_final_newlines();
+ }
+
apply_shaders();
Ref<Shader> edited_shader = code_editor->get_edited_shader();
@@ -946,6 +951,10 @@ void TextShaderEditor::trim_trailing_whitespace() {
code_editor->trim_trailing_whitespace();
}
+void TextShaderEditor::trim_final_newlines() {
+ code_editor->trim_final_newlines();
+}
+
void TextShaderEditor::validate_script() {
code_editor->_validate_script();
}
diff --git a/editor/plugins/text_shader_editor.h b/editor/plugins/text_shader_editor.h
index be16148744..483ef2b4f1 100644
--- a/editor/plugins/text_shader_editor.h
+++ b/editor/plugins/text_shader_editor.h
@@ -176,6 +176,7 @@ class TextShaderEditor : public MarginContainer {
uint32_t dependencies_version = 0xFFFFFFFF;
bool trim_trailing_whitespace_on_save;
+ bool trim_final_newlines_on_save;
protected:
void _notification(int p_what);
@@ -189,6 +190,7 @@ protected:
public:
bool was_compilation_successful() const { return compilation_success; }
bool get_trim_trailing_whitespace_on_save() const { return trim_trailing_whitespace_on_save; }
+ bool get_trim_final_newlines_on_save() const { return trim_final_newlines_on_save; }
void apply_shaders();
void ensure_select_current();
void edit(const Ref<Shader> &p_shader);
@@ -196,6 +198,7 @@ public:
void goto_line_selection(int p_line, int p_begin, int p_end);
void save_external_data(const String &p_str = "");
void trim_trailing_whitespace();
+ void trim_final_newlines();
void validate_script();
bool is_unsaved() const;
void tag_saved_version();