From a449ca6807deaa4088b2aaeeb4eba65358d83e89 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Tue, 31 Oct 2023 00:24:13 -0500 Subject: [PATCH] Fixed new line indenting logic --- .../sourceview/source_marks_events_mixin.py | 30 ++++++++++------ .../widgets/base/sourceview/source_view.py | 36 +++++++++++++------ 2 files changed, 45 insertions(+), 21 deletions(-) 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 dc4a3a7..a1916b2 100644 --- a/src/core/widgets/base/sourceview/source_marks_events_mixin.py +++ b/src/core/widgets/base/sourceview/source_marks_events_mixin.py @@ -11,7 +11,7 @@ from gi.repository import Gtk class MarkEventsMixin: - + def keyboard_insert_mark(self, target_iter = None, is_keyboard_insert = True): buffer = self.get_buffer() @@ -94,12 +94,19 @@ class MarkEventsMixin: self.end_user_action(buffer) def _new_line_on_multi_line_markers(self, buffer): - self.insert_indent_handler(buffer) + self.freeze_multi_line_insert = True + + iter = buffer.get_iter_at_mark( buffer.get_insert() ) + + self._base_indent(buffer, iter) + self.insert_indent_handler(buffer, iter) for mark in self._multi_insert_marks: iter = buffer.get_iter_at_mark(mark) + self._base_indent(buffer, iter) self.insert_indent_handler(buffer, iter) + self.freeze_multi_line_insert = False self.end_user_action(buffer) def insert_indent_handler(self, buffer, iter = None): @@ -107,17 +114,20 @@ class MarkEventsMixin: 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) + iter_copy.backward_sentence_start() + iter_copy.forward_sentence_end() + iter_copy.backward_char() + + _char = iter_copy.get_char() + if _char in ["{", ":"]: + self._indent_deeper(buffer, iter) return True - def _base_indent(self, buffer, iter, iter_copy): + def _base_indent(self, buffer, iter, iter_copy = None): + if not iter_copy: + iter_copy = iter.copy() + line_num = iter_copy.get_line() iter_copy = buffer.get_iter_at_line(line_num) diff --git a/src/core/widgets/base/sourceview/source_view.py b/src/core/widgets/base/sourceview/source_view.py index 1147b36..b390057 100644 --- a/src/core/widgets/base/sourceview/source_view.py +++ b/src/core/widgets/base/sourceview/source_view.py @@ -83,6 +83,7 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): self.connect("drag-data-received", self._on_drag_data_received) self.connect("key-press-event", self._key_press_event) + self.connect("key-release-event", self._key_release_event) self.connect("button-press-event", self._button_press_event) self.connect("scroll-event", self._scroll_event) @@ -182,21 +183,31 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): with buffer.freeze_notify(): GLib.idle_add(self._delete_on_multi_line_markers, *(buffer,)) - 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)) + def _key_release_event(self, widget, eve): + if self.freeze_multi_line_insert: return + + keyname = Gdk.keyval_name(eve.keyval) + modifiers = Gdk.ModifierType(eve.get_state() & ~Gdk.ModifierType.LOCK_MASK) + is_control = True if modifiers & Gdk.ModifierType.CONTROL_MASK else False + is_shift = True if modifiers & Gdk.ModifierType.SHIFT_MASK else False + buffer = self.get_buffer() + + if keyname in {"Return", "Enter"}: + if len(self._multi_insert_marks) > 0: + self.begin_user_action(buffer) + with buffer.freeze_notify(): + GLib.idle_add(self._new_line_on_multi_line_markers, *(buffer,)) + + return + + has_selection = buffer.get_has_selection() + if not has_selection: + return self.insert_indent_handler(buffer) def _button_press_event(self, widget = None, eve = None, user_data = None): if eve.type == Gdk.EventType.BUTTON_PRESS and eve.button == 1 : # l-click @@ -285,4 +296,7 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): except Exception as e: gfile = Gio.File.new_for_path(uri) - event_system.emit('create_view', (gfile,)) \ No newline at end of file + event_system.emit('create_view', (gfile,)) + + def get_filetype(self): + return self._current_filetype \ No newline at end of file