diff options
author | Aiden Storey <git@storey.dev> | 2024-01-12 00:32:13 -0500 |
---|---|---|
committer | Aiden Storey <git@storey.dev> | 2024-05-02 22:57:34 -0400 |
commit | b4c1634b52f619ca8987b67ecee2640310781aa7 (patch) | |
tree | 592faafc74fefb2dfb3e4a5ff4d8e63fb2e52513 /editor | |
parent | d4f726f3ef21cef3e7936b2c9770cdac6478b8ee (diff) | |
download | redot-engine-b4c1634b52f619ca8987b67ecee2640310781aa7.tar.gz |
Implement trim_final_newlines functionality
Diffstat (limited to 'editor')
-rw-r--r-- | editor/code_editor.cpp | 25 | ||||
-rw-r--r-- | editor/code_editor.h | 1 | ||||
-rw-r--r-- | editor/editor_settings.cpp | 1 | ||||
-rw-r--r-- | editor/plugins/script_editor_plugin.cpp | 18 | ||||
-rw-r--r-- | editor/plugins/script_editor_plugin.h | 2 | ||||
-rw-r--r-- | editor/plugins/script_text_editor.cpp | 9 | ||||
-rw-r--r-- | editor/plugins/script_text_editor.h | 2 | ||||
-rw-r--r-- | editor/plugins/shader_editor_plugin.cpp | 20 | ||||
-rw-r--r-- | editor/plugins/text_editor.cpp | 8 | ||||
-rw-r--r-- | editor/plugins/text_editor.h | 2 | ||||
-rw-r--r-- | editor/plugins/text_shader_editor.cpp | 9 | ||||
-rw-r--r-- | editor/plugins/text_shader_editor.h | 3 |
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(); |