From d90ed2fdc87633703007e612d78845e5495961b4 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Sat, 28 Oct 2023 20:18:50 -0500 Subject: [PATCH] Added deep indent on : or { ending lines plus regular indent for multi insert --- src/core/containers/editors_container.py | 4 +- .../base/notebook/editor_controller.py | 5 ++- .../widgets/base/notebook/editor_notebook.py | 2 +- .../sourceview/source_marks_events_mixin.py | 45 ++++++++++++++++++- .../widgets/base/sourceview/source_view.py | 25 ++++++++--- .../base/sourceview/source_view_events.py | 2 +- 6 files changed, 70 insertions(+), 13 deletions(-) diff --git a/src/core/containers/editors_container.py b/src/core/containers/editors_container.py index 0b2b0d0..a81e904 100644 --- a/src/core/containers/editors_container.py +++ b/src/core/containers/editors_container.py @@ -6,6 +6,7 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports +from ..widgets.separator_widget import Separator from ..widgets.miniview_widget import MiniViewWidget from ..widgets.base.notebook.editor_notebook import EditorNotebook @@ -38,7 +39,6 @@ class EditorsPaned(Gtk.Paned): - class EditorsContainer(Gtk.Box): def __init__(self): super(EditorsContainer, self).__init__() @@ -61,5 +61,7 @@ class EditorsContainer(Gtk.Box): ... def _load_widgets(self): + self.add(Separator("separator_left")) self.add(EditorsPaned()) + self.add(Separator("separator_right")) self.add(MiniViewWidget()) \ No newline at end of file diff --git a/src/core/widgets/base/notebook/editor_controller.py b/src/core/widgets/base/notebook/editor_controller.py index 93d894b..c5e678c 100644 --- a/src/core/widgets/base/notebook/editor_controller.py +++ b/src/core/widgets/base/notebook/editor_controller.py @@ -59,6 +59,7 @@ class EditorControllerMixin: if action == "set_buffer_style": self.set_buffer_style(source_view, query) if action == "save_file": - source_view.save_file() + return source_view.save_file() if action == "save_file_as": - source_view.save_file_as() + return source_view.save_file_as() + diff --git a/src/core/widgets/base/notebook/editor_notebook.py b/src/core/widgets/base/notebook/editor_notebook.py index a795f7f..fbf49b6 100644 --- a/src/core/widgets/base/notebook/editor_notebook.py +++ b/src/core/widgets/base/notebook/editor_notebook.py @@ -214,4 +214,4 @@ class EditorNotebook(EditorEventsMixin, EditorControllerMixin, Gtk.Notebook): self.action_controller("save_file") def _keyboard_save_file_as(self): - self.action_controller("save_file_as") + self.action_controller("save_file_as") \ No newline at end of file diff --git a/src/core/widgets/base/sourceview/source_marks_events_mixin.py b/src/core/widgets/base/sourceview/source_marks_events_mixin.py index 2c8bf92..dc4a3a7 100644 --- a/src/core/widgets/base/sourceview/source_marks_events_mixin.py +++ b/src/core/widgets/base/sourceview/source_marks_events_mixin.py @@ -92,6 +92,49 @@ class MarkEventsMixin: buffer.backspace(iter, interactive = True, default_editable = True) self.end_user_action(buffer) + + def _new_line_on_multi_line_markers(self, buffer): + self.insert_indent_handler(buffer) + + for mark in self._multi_insert_marks: + iter = buffer.get_iter_at_mark(mark) + self.insert_indent_handler(buffer, iter) + + self.end_user_action(buffer) + + def insert_indent_handler(self, buffer, iter = None): + if not iter: + iter = buffer.get_iter_at_mark( buffer.get_insert() ) + + iter_copy = iter.copy() + iter_moved = iter_copy.backward_char() + + if iter_moved: + _char = iter_copy.get_char() + self._base_indent(buffer, iter, iter_copy) + if _char in ["{", ":"]: + self._indent_deeper(buffer, iter) + + return True + + def _base_indent(self, buffer, iter, iter_copy): + line_num = iter_copy.get_line() + iter_copy = buffer.get_iter_at_line(line_num) + + spaces = "" + _char = iter_copy.get_char() + while _char == " ": + spaces += " " + iter_copy.forward_char() + _char = iter_copy.get_char() + + buffer.insert(iter, f"\n{spaces}") + + + def _indent_deeper(self, buffer, iter): + buffer.insert(iter, " ") + + def begin_user_action(self, buffer): if len(self._multi_insert_marks) > 0: @@ -101,4 +144,4 @@ class MarkEventsMixin: def end_user_action(self, buffer): if len(self._multi_insert_marks) > 0: buffer.end_user_action() - self.freeze_multi_line_insert = False + self.freeze_multi_line_insert = False \ No newline at end of file diff --git a/src/core/widgets/base/sourceview/source_view.py b/src/core/widgets/base/sourceview/source_view.py index 75236ee..1147b36 100644 --- a/src/core/widgets/base/sourceview/source_view.py +++ b/src/core/widgets/base/sourceview/source_view.py @@ -160,9 +160,6 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): is_alt = True if modifiers & Gdk.ModifierType.MOD1_MASK else False if is_control: - if keyname in [ "slash", "Up", "Down", "z" ]: - return True - if is_shift: if keyname in [ "z", "Up", "Down", "Left", "Right" ]: # NOTE: For now do like so for completion sake above. @@ -171,17 +168,31 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): return True + if keyname in [ "slash", "Up", "Down", "z" ]: + return True + if is_alt: if keyname in [ "Up", "Down", "Left", "Right" ]: return True - if keyname == "BackSpace": - if len(self._multi_insert_marks) > 0: + + if len(self._multi_insert_marks) > 0: + if keyname == "BackSpace": self.begin_user_action(buffer) with buffer.freeze_notify(): GLib.idle_add(self._delete_on_multi_line_markers, *(buffer,)) - return True + if keyname in {"Return", "Enter"}: + self.begin_user_action(buffer) + with buffer.freeze_notify(): + GLib.idle_add(self._new_line_on_multi_line_markers, *(buffer,)) + else: + ... + + return True + + if keyname in {"Return", "Enter"}: + return self.insert_indent_handler(buffer) # NOTE: if a plugin recieves the call and handles, it will be the final decider for propigation return event_system.emit_and_await("autopairs", (keyname, is_control, is_alt, is_shift)) @@ -274,4 +285,4 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): except Exception as e: gfile = Gio.File.new_for_path(uri) - event_system.emit('create_view', (gfile,)) + event_system.emit('create_view', (gfile,)) \ No newline at end of file diff --git a/src/core/widgets/base/sourceview/source_view_events.py b/src/core/widgets/base/sourceview/source_view_events.py index ed4f317..c6c1921 100644 --- a/src/core/widgets/base/sourceview/source_view_events.py +++ b/src/core/widgets/base/sourceview/source_view_events.py @@ -114,4 +114,4 @@ class SourceViewEventsMixin(MarkEventsMixin, FileEventsMixin): if not gfile: return event_system.emit("set_bottom_labels", (gfile, None, self._current_filetype, None)) - self.update_cursor_position() + self.update_cursor_position() \ No newline at end of file