From c86c33913835ac3348923fa590c9696de9ce8017 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Sat, 7 Oct 2023 14:51:12 -0500 Subject: [PATCH] Added code minimap; added DnD of text; initial multi mark insert inferastructure --- src/app.py | 1 + src/core/core_widget.py | 4 +- src/core/editors_container.py | 37 ++++++++++++++++-- .../base/notebook/editor_controller.py | 2 + .../widgets/base/notebook/editor_events.py | 4 ++ .../widgets/base/notebook/editor_notebook.py | 10 +++-- .../python_completion_provider.py | 2 +- .../widgets/base/sourceview/source_view.py | 27 +++++++++---- .../base/sourceview/source_view_events.py | 8 ++++ src/core/widgets/miniview_widget.py | 38 +++++++++++++++++++ .../usr/share/newton/key-bindings.json | 37 +++++++++--------- user_config/usr/share/newton/stylesheet.css | 15 +++++++- 12 files changed, 148 insertions(+), 37 deletions(-) create mode 100644 src/core/widgets/miniview_widget.py diff --git a/src/app.py b/src/app.py index d6a1010..2884083 100644 --- a/src/app.py +++ b/src/app.py @@ -8,6 +8,7 @@ from utils.ipc_server import IPCServer from core.window import Window + class AppLaunchException(Exception): ... diff --git a/src/core/core_widget.py b/src/core/core_widget.py index 12dceaa..03e7cb0 100644 --- a/src/core/core_widget.py +++ b/src/core/core_widget.py @@ -6,10 +6,10 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports +from .widgets.save_file_dialog import SaveFileDialog from .widgets.base.banner_controls import BannerControls from .editors_container import EditorsContainer from .widgets.base.general_info_widget import GeneralInfoWidget -from .widgets.save_file_dialog import SaveFileDialog @@ -37,4 +37,4 @@ class CoreWidget(Gtk.Box): SaveFileDialog() self.add(BannerControls()) GeneralInfoWidget() - self.add(EditorsContainer()) \ No newline at end of file + self.add(EditorsContainer()) diff --git a/src/core/editors_container.py b/src/core/editors_container.py index caec6fe..710b2a1 100644 --- a/src/core/editors_container.py +++ b/src/core/editors_container.py @@ -6,25 +6,27 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports +from .widgets.miniview_widget import MiniViewWidget from .widgets.base.notebook.editor_notebook import EditorNotebook -class EditorsContainer(Gtk.Paned): +class EditorsPaned(Gtk.Paned): def __init__(self): - super(EditorsContainer, self).__init__() + super(EditorsPaned, self).__init__() self._setup_styling() self._setup_signals() self._subscribe_to_events() self._load_widgets() - self.show() + self.show_all() def _setup_styling(self): self.set_wide_handle(True) self.set_vexpand(True) + self.set_hexpand(True) def _setup_signals(self): ... @@ -35,3 +37,32 @@ class EditorsContainer(Gtk.Paned): def _load_widgets(self): self.add1(EditorNotebook()) self.add2(EditorNotebook()) + + + + +class EditorsContainer(Gtk.Box): + def __init__(self): + super(EditorsContainer, self).__init__() + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_vexpand(True) + self.set_hexpand(True) + + def _setup_signals(self): + ... + + def _subscribe_to_events(self): + ... + + def _load_widgets(self): + self.add(EditorsPaned()) + self.add(MiniViewWidget()) diff --git a/src/core/widgets/base/notebook/editor_controller.py b/src/core/widgets/base/notebook/editor_controller.py index 5d9a640..9d4af23 100644 --- a/src/core/widgets/base/notebook/editor_controller.py +++ b/src/core/widgets/base/notebook/editor_controller.py @@ -41,6 +41,8 @@ class EditorControllerMixin: self.keyboard_move_tab_left(page_num) if action == "keyboard_move_tab_right": self.keyboard_move_tab_right(page_num) + if action == "keyboard_insert_mark": + self.keyboard_insert_mark(source_view) if action == "keyboard_move_tab_to_1": self.keyboard_move_tab_to_1(page_num) if action == "keyboard_move_tab_to_2": diff --git a/src/core/widgets/base/notebook/editor_events.py b/src/core/widgets/base/notebook/editor_events.py index 6835dde..b2a2783 100644 --- a/src/core/widgets/base/notebook/editor_events.py +++ b/src/core/widgets/base/notebook/editor_events.py @@ -65,6 +65,10 @@ class EditorEventsMixin: page_num = 0 if self.get_n_pages() - 1 == page_num else page_num + 1 self.set_current_page(page_num) + # NOTE: This feels bad man... + def keyboard_insert_mark(self, source_view): + source_view.keyboard_insert_mark() + def keyboard_move_tab_to_1(self, page_num): notebook = self.builder.get_object("notebook_1") if self.NAME == "notebook_1": diff --git a/src/core/widgets/base/notebook/editor_notebook.py b/src/core/widgets/base/notebook/editor_notebook.py index e282e7b..d6385ef 100644 --- a/src/core/widgets/base/notebook/editor_notebook.py +++ b/src/core/widgets/base/notebook/editor_notebook.py @@ -55,11 +55,8 @@ class EditorNotebook(EditorEventsMixin, EditorControllerMixin, Gtk.Notebook): def _setup_signals(self): self.connect("switch-page", self._switch_page_update) - # self.connect("button-press-event", self._dbl_click_create_view) - ... def _subscribe_to_events(self): - # event_system.subscribe("set_buffer_language", self.action_controller, *("set_buffer_language",)) event_system.subscribe("create_view", self._create_view) event_system.subscribe("set_buffer_style", self.action_controller) event_system.subscribe("set_buffer_language", self.action_controller) @@ -72,6 +69,7 @@ class EditorNotebook(EditorEventsMixin, EditorControllerMixin, Gtk.Notebook): event_system.subscribe("keyboard_next_tab", self._keyboard_next_tab) event_system.subscribe("keyboard_move_tab_left", self._keyboard_move_tab_left) event_system.subscribe("keyboard_move_tab_right", self._keyboard_move_tab_right) + event_system.subscribe("keyboard_insert_mark", self._keyboard_insert_mark) event_system.subscribe("keyboard_move_tab_to_1", self._keyboard_move_tab_to_1) event_system.subscribe("keyboard_move_tab_to_2", self._keyboard_move_tab_to_2) event_system.subscribe("keyboard_scale_up_text", self._keyboard_scale_up_text) @@ -118,6 +116,7 @@ class EditorNotebook(EditorEventsMixin, EditorControllerMixin, Gtk.Notebook): def _switch_page_update(self, notebook, page, page_num): source_view = page.get_source_view() gfile = source_view.get_current_file() + if not gfile: event_system.emit("set_path_label", ("",)) event_system.emit("set_file_type_label", (source_view._current_filetype,)) @@ -126,6 +125,8 @@ class EditorNotebook(EditorEventsMixin, EditorControllerMixin, Gtk.Notebook): source_view.update_cursor_position() source_view.set_bottom_labels(gfile) + event_system.emit(f"set_source_view", (source_view,)) + def _create_view(self, gfile = None, line: int = 0): if not self.is_editor_focused: # TODO: Find way to converge this return @@ -168,6 +169,9 @@ class EditorNotebook(EditorEventsMixin, EditorControllerMixin, Gtk.Notebook): def _keyboard_move_tab_right(self): self.action_controller("keyboard_move_tab_right") + def _keyboard_insert_mark(self): + self.action_controller("keyboard_insert_mark") + def _keyboard_move_tab_to_1(self): self.action_controller("keyboard_move_tab_to_1") diff --git a/src/core/widgets/base/sourceview/custom_completion_providers/python_completion_provider.py b/src/core/widgets/base/sourceview/custom_completion_providers/python_completion_provider.py index 950081b..2a94222 100644 --- a/src/core/widgets/base/sourceview/custom_completion_providers/python_completion_provider.py +++ b/src/core/widgets/base/sourceview/custom_completion_providers/python_completion_provider.py @@ -59,7 +59,7 @@ class PythonCompletionProvider(GObject.Object, GtkSource.CompletionProvider): return False ch = iter.get_char() - if not (ch in ('_', '.') or ch.isalnum()): + if not (ch in ('_', '.', ' ') or ch.isalnum()): return False return True diff --git a/src/core/widgets/base/sourceview/source_view.py b/src/core/widgets/base/sourceview/source_view.py index 95b93c2..9d41afc 100644 --- a/src/core/widgets/base/sourceview/source_view.py +++ b/src/core/widgets/base/sourceview/source_view.py @@ -7,6 +7,7 @@ gi.require_version('GtkSource', '4') gi.require_version('Gdk', '3.0') from gi.repository import Gtk from gi.repository import Gdk +from gi.repository import GLib from gi.repository import Gio from gi.repository import GtkSource @@ -40,6 +41,7 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): self._ignore_internal_change = False self._buffer = self.get_buffer() self._completion = self.get_completion() + self._insert_marks = [] self._setup_styling() self._setup_signals() @@ -72,6 +74,7 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): self.connect("focus", self._on_widget_focus) self._buffer.connect("mark-set", self._on_cursor_move) self._buffer.connect('changed', self._is_modified) + self._buffer.connect('insert-text', self._insert_text) def _subscribe_to_events(self): ... @@ -106,6 +109,15 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): self._is_changed = True self.update_cursor_position() + def _insert_text(self, text_buffer, location_itr, text_str, len_int): + with text_buffer.freeze_notify(): + for mark in self._insert_marks: + itr = text_buffer.get_iter_at_mark(mark) + print(itr) + + # GLib.idle_add(text_buffer.insert, *(itr, text_str, -1)) + text_buffer.insert(itr, text_str, -1) + def _on_widget_focus(self, widget, eve = None): target = self.get_parent().get_parent().NAME path = self._current_file if self._current_file else "" @@ -121,20 +133,19 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): if mark != buf.get_insert(): return self.update_cursor_position() + # NOTE: Not sure but this might not be efficient if the map reloads the same view. + event_system.emit(f"set_source_view", (self,)) + def _set_up_dnd(self): - WIDGET_TARGET_TYPE = 70 - URI_TARGET_TYPE = 80 - widget_target = Gtk.TargetEntry.new('dummy', Gtk.TargetFlags(0), WIDGET_TARGET_TYPE) + PLAIN_TEXT_TARGET_TYPE = 70 + URI_TARGET_TYPE = 80 + text_target = Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags(0), PLAIN_TEXT_TARGET_TYPE) uri_target = Gtk.TargetEntry.new('text/uri-list', Gtk.TargetFlags(0), URI_TARGET_TYPE) - targets = [ widget_target, uri_target ] + targets = [ text_target, uri_target ] self.drag_dest_set_target_list(targets) def _on_drag_data_received(self, widget, drag_context, x, y, data, info, time): if info == 70: - print(drag_context) - print(data) - print(info) - # detach_tab(child) return if info == 80: diff --git a/src/core/widgets/base/sourceview/source_view_events.py b/src/core/widgets/base/sourceview/source_view_events.py index 33aeec7..feda4e6 100644 --- a/src/core/widgets/base/sourceview/source_view_events.py +++ b/src/core/widgets/base/sourceview/source_view_events.py @@ -50,6 +50,14 @@ class SourceViewEventsMixin: event_system.emit("set_line_char_label", (f"{row}:{col}",)) + def keyboard_insert_mark(self): + iter = self._buffer.get_iter_at_mark( self._buffer.get_insert() ) + mark = Gtk.TextMark.new(name = None, left_gravity = False) + + self._buffer.add_mark(mark, iter) + self._insert_marks.append(mark) + mark.set_visible(True) + def got_to_line(self, line: int = 0): index = line - 1 buffer = self.get_buffer() diff --git a/src/core/widgets/miniview_widget.py b/src/core/widgets/miniview_widget.py new file mode 100644 index 0000000..214a0d7 --- /dev/null +++ b/src/core/widgets/miniview_widget.py @@ -0,0 +1,38 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('GtkSource', '4') +from gi.repository.GtkSource import Map + + +# Application imports + + + +class MiniViewWidget(Map): + def __init__(self): + super(MiniViewWidget, self).__init__() + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show_all() + + + def _setup_styling(self): + self.set_hexpand(False) + + def _setup_signals(self): + event_system.subscribe(f"set_source_view", self.set_source_view) + + def _subscribe_to_events(self): + ... + + def _load_widgets(self): + ... + + def set_source_view(self, source_view): + self.set_view(source_view) diff --git a/user_config/usr/share/newton/key-bindings.json b/user_config/usr/share/newton/key-bindings.json index 0040e24..0a19457 100644 --- a/user_config/usr/share/newton/key-bindings.json +++ b/user_config/usr/share/newton/key-bindings.json @@ -1,23 +1,24 @@ { "keybindings": { - "help" : "F1", - "open_terminal" : "F4", - "tggl_top_main_menubar" : "Alt_L", - "tear_down" : "q", - "toggle_highlight_line" : "h", - "open_files" : "o", - "keyboard_create_tab" : "t", - "keyboard_close_tab" : "w", - "keyboard_save_file" : "s", - "keyboard_save_file_as" : "s", - "keyboard_up" : "Up", - "keyboard_down" : "Down", - "keyboard_left" : "Left", - "keyboard_riht" : "Right", - "keyboard_move_tab_to_1" : "Down", - "keyboard_move_tab_to_2" : "Up", - "keyboard_move_tab_right" : "Right", - "keyboard_move_tab_left" : "Left", + "help" : "F1", + "open_terminal" : "F4", + "tggl_top_main_menubar" : "Alt_L", + "tear_down" : "q", + "toggle_highlight_line" : "h", + "open_files" : "o", + "keyboard_create_tab" : "t", + "keyboard_close_tab" : "w", + "keyboard_save_file" : "s", + "keyboard_insert_mark" : "m", + "keyboard_save_file_as" : "s", + "keyboard_up" : "Up", + "keyboard_down" : "Down", + "keyboard_left" : "Left", + "keyboard_riht" : "Right", + "keyboard_move_tab_to_1" : "Down", + "keyboard_move_tab_to_2" : "Up", + "keyboard_move_tab_right" : "Right", + "keyboard_move_tab_left" : "Left", "keyboard_next_tab" : "Up", "keyboard_prev_tab" : "Down", "keyboard_scale_up_text" : "equal", diff --git a/user_config/usr/share/newton/stylesheet.css b/user_config/usr/share/newton/stylesheet.css index 951e535..e175263 100644 --- a/user_config/usr/share/newton/stylesheet.css +++ b/user_config/usr/share/newton/stylesheet.css @@ -1,5 +1,16 @@ -/* Set fm to have transparent window */ * { background: rgba(39, 43, 52, 0.24); color: rgba(255, 255, 255, 1); -} \ No newline at end of file +} + +* selection { + background-color: rgba(0, 115, 115, 0.34); + /* Bergundy */ + /* background-color: rgba(116, 0, 0, 0.64); */ + color: rgba(255, 255, 255, 0.5); +} + + +.error_txt { color: rgb(170, 18, 18); } +.warning_txt { color: rgb(255, 168, 0); } +.success_txt { color: rgb(136, 204, 39); }