From e6834e37ce758d4650d17d7d9d0422c0776cc5df Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Thu, 23 Mar 2023 22:56:20 -0500 Subject: [PATCH] Added word completion and simplistic custom completion example --- src/__builtins__.py | 2 +- .../custom_completion_providers/__init__.py | 3 + .../py_provider.py | 70 ++++++++++++++++++ .../widgets/base/sourceview/source_view.py | 20 +++-- user_config/bin/{newton_editor => newton} | 4 +- .../{newton_editor.desktop => newton.desktop} | 10 +-- .../Main_Window.glade | 0 .../icons/archive.png | Bin .../{newton_editor => newton}/icons/audio.png | Bin .../{newton_editor => newton}/icons/bin.png | Bin .../{newton_editor => newton}/icons/brain.png | Bin .../{newton_editor => newton}/icons/dir.png | Bin .../{newton_editor => newton}/icons/doc.png | Bin .../{newton_editor => newton}/icons/image.png | Bin .../icons/newton-64x64.png} | Bin .../icons/newton.png} | Bin .../{newton_editor => newton}/icons/pdf.png | Bin .../icons/presentation.png | Bin .../icons/spreadsheet.png | Bin .../{newton_editor => newton}/icons/text.png | Bin .../{newton_editor => newton}/icons/trash.png | Bin .../{newton_editor => newton}/icons/video.png | Bin .../{newton_editor => newton}/icons/web.png | Bin .../key-bindings.json | 0 .../{newton_editor => newton}/settings.json | 0 .../{newton_editor => newton}/stylesheet.css | 0 .../ui_widgets/about_ui.glade | 0 .../ui_widgets/bottom_status_info_ui.glade | 0 .../ui_widgets/save_load_ui.glade | 0 29 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 src/core/widgets/base/sourceview/custom_completion_providers/__init__.py create mode 100644 src/core/widgets/base/sourceview/custom_completion_providers/py_provider.py rename user_config/bin/{newton_editor => newton} (83%) rename user_config/usr/applications/{newton_editor.desktop => newton.desktop} (57%) rename user_config/usr/share/{newton_editor => newton}/Main_Window.glade (100%) rename user_config/usr/share/{newton_editor => newton}/icons/archive.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/audio.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/bin.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/brain.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/dir.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/doc.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/image.png (100%) rename user_config/usr/share/{newton_editor/icons/newton_editor-64x64.png => newton/icons/newton-64x64.png} (100%) rename user_config/usr/share/{newton_editor/icons/newton_editor.png => newton/icons/newton.png} (100%) rename user_config/usr/share/{newton_editor => newton}/icons/pdf.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/presentation.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/spreadsheet.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/text.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/trash.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/video.png (100%) rename user_config/usr/share/{newton_editor => newton}/icons/web.png (100%) rename user_config/usr/share/{newton_editor => newton}/key-bindings.json (100%) rename user_config/usr/share/{newton_editor => newton}/settings.json (100%) rename user_config/usr/share/{newton_editor => newton}/stylesheet.css (100%) rename user_config/usr/share/{newton_editor => newton}/ui_widgets/about_ui.glade (100%) rename user_config/usr/share/{newton_editor => newton}/ui_widgets/bottom_status_info_ui.glade (100%) rename user_config/usr/share/{newton_editor => newton}/ui_widgets/save_load_ui.glade (100%) diff --git a/src/__builtins__.py b/src/__builtins__.py index c3d7782..7a39e53 100644 --- a/src/__builtins__.py +++ b/src/__builtins__.py @@ -29,7 +29,7 @@ def daemon_threaded_wrapper(fn): # NOTE: Just reminding myself we can add to builtins two different ways... # __builtins__.update({"event_system": Builtins()}) -builtins.app_name = "Newton_Editor" +builtins.app_name = "Newton" builtins.keybindings = Keybindings() builtins.event_system = EventSystem() builtins.endpoint_registry = EndpointRegistry() diff --git a/src/core/widgets/base/sourceview/custom_completion_providers/__init__.py b/src/core/widgets/base/sourceview/custom_completion_providers/__init__.py new file mode 100644 index 0000000..fdff2e4 --- /dev/null +++ b/src/core/widgets/base/sourceview/custom_completion_providers/__init__.py @@ -0,0 +1,3 @@ +""" + Custom Completion Providers Module +""" diff --git a/src/core/widgets/base/sourceview/custom_completion_providers/py_provider.py b/src/core/widgets/base/sourceview/custom_completion_providers/py_provider.py new file mode 100644 index 0000000..9a9e772 --- /dev/null +++ b/src/core/widgets/base/sourceview/custom_completion_providers/py_provider.py @@ -0,0 +1,70 @@ +# Python imports +import re + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +gi.require_version('GtkSource', '4') + +from gi.repository import Gtk +from gi.repository import GtkSource +from gi.repository import GObject + +# Application imports + + + +class PythonProvider(GObject.GObject, GtkSource.CompletionProvider): + """ + This is a custom Completion Provider for Python. + # NOTE: used information from here --> https://warroom.rsmus.com/do-that-auto-complete/ + """ + + def do_get_name(self): + """ Returns: a new string containing the name of the provider. """ + return 'PythonProvider' + + def do_match(self, context): + """ Get whether the provider match the context of completion detailed in context. """ + # NOTE: True for debugging but context needs to normally get checked for actual usage needs. + # TODO: Fix me + return True + + def do_populate(self, context): + """ + In this instance, it will do 2 things: + 1) always provide Hello World! (Not ideal but an option so its in the example) + 2) Utilizes the Gtk.TextIter from the TextBuffer to determine if there is a jinja + example of '{{ custom.' if so it will provide you with the options of foo and bar. + If selected it will insert foo }} or bar }}, completing your syntax... + + PLEASE NOTE the GtkTextIter Logic and regex are really rough and should be adjusted and tuned + """ + + proposals = [ + # GtkSource.CompletionItem(label='Hello World!', text = 'Hello World!', icon = None, info = None) # NOTE: Always proposed... + ] + + # Gtk Versions differ on get_iter responses... + end_iter = context.get_iter() + if not isinstance(end_iter, Gtk.TextIter): + _, end_iter = context.get_iter() + + if end_iter: + buf = end_iter.get_buffer() + mov_iter = end_iter.copy() + if mov_iter.backward_search('{{', Gtk.TextSearchFlags.VISIBLE_ONLY): + mov_iter, _ = mov_iter.backward_search('{{', Gtk.TextSearchFlags.VISIBLE_ONLY) + left_text = buf.get_text(mov_iter, end_iter, True) + else: + left_text = '' + + if re.match(r'.*\{\{\s*custom\.$', left_text): + proposals.append( + GtkSource.CompletionItem(label='foo', text='foo }}') # optionally proposed based on left search via regex + ) + proposals.append( + GtkSource.CompletionItem(label='bar', text='bar }}') # optionally proposed based on left search via regex + ) + + context.add_proposals(self, proposals, True) diff --git a/src/core/widgets/base/sourceview/source_view.py b/src/core/widgets/base/sourceview/source_view.py index 57003ec..e7d7545 100644 --- a/src/core/widgets/base/sourceview/source_view.py +++ b/src/core/widgets/base/sourceview/source_view.py @@ -12,6 +12,7 @@ from gi.repository import GtkSource # Application imports from .source_view_events import SourceViewEventsMixin +from .custom_completion_providers.py_provider import PythonProvider @@ -33,6 +34,7 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): self._current_filename: str = "" self._file_loader = None self._buffer = self.get_buffer() + self._completion = self.get_completion() self._file_filter_text = Gtk.FileFilter() self._file_filter_text.set_name("Text Files") @@ -76,8 +78,13 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): self.connect("drag-data-received", self._on_drag_data_received) self._buffer.connect("mark-set", self._on_cursor_move) self._buffer.connect('changed', self._is_modified) - # self.completion.add_provider(srcCompleteonSnippets) - # self.completion.add_provider(srcCompleteonWords) + + word_completion = GtkSource.CompletionWords.new("word_completion") + word_completion.register(self._buffer) + self._completion.add_provider(word_completion) + + py_provider = PythonProvider() + self._completion.add_provider(py_provider) def _subscribe_to_events(self): ... @@ -188,7 +195,7 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): if self._current_filename == "": dlg.set_current_name("new.txt") else: - dlg.set_current_folder(self._current_file.get_parent()) + dlg.set_current_folder(self._current_file.get_parent().get_path()) dlg.set_current_name(self._current_filename) response = dlg.run() @@ -212,7 +219,8 @@ class SourceView(SourceViewEventsMixin, GtkSource.View): f.write(text) f.close() - if self._current_filename == "" and save_as: - self.open_file(gfile) + if (self._current_filename == "" and save_as) or \ + (self._current_filename != "" and not save_as): + self.open_file(gfile) else: - event_system.emit("create_view", (None, None, gfile,)) + event_system.emit("create_view", (None, None, gfile,)) \ No newline at end of file diff --git a/user_config/bin/newton_editor b/user_config/bin/newton similarity index 83% rename from user_config/bin/newton_editor rename to user_config/bin/newton index 3e34fe8..9626164 100755 --- a/user_config/bin/newton_editor +++ b/user_config/bin/newton @@ -19,11 +19,11 @@ function main() { # NOTE: Remove if you want to pass file(s) besides directories... if [ ! -d "${path}" ]; then - echo "Newton Editor: Path given not a directory..." + echo "Newton: Path given not a directory..." exit 1 fi cd "/opt/" - python /opt/newton_editor.zip "$@" + python /opt/newton.zip "$@" } main "$@"; diff --git a/user_config/usr/applications/newton_editor.desktop b/user_config/usr/applications/newton.desktop similarity index 57% rename from user_config/usr/applications/newton_editor.desktop rename to user_config/usr/applications/newton.desktop index eb68352..00f8ede 100755 --- a/user_config/usr/applications/newton_editor.desktop +++ b/user_config/usr/applications/newton.desktop @@ -1,9 +1,9 @@ [Desktop Entry] -Name=Newton Editor -GenericName=Code IDE -Comment=General purpose IDE -Exec=/bin/newton_editor %F -Icon=/usr/share/newton_editor/icons/newton_editor.png +Name=Newton +GenericName=Text editor and mini IDE +Comment=General purpose text editor and IDE +Exec=/bin/newton %F +Icon=/usr/share/newton/icons/newton.png Type=Application StartupNotify=true Categories=GNOME;GTK;Utility;TextEditor;Development; diff --git a/user_config/usr/share/newton_editor/Main_Window.glade b/user_config/usr/share/newton/Main_Window.glade similarity index 100% rename from user_config/usr/share/newton_editor/Main_Window.glade rename to user_config/usr/share/newton/Main_Window.glade diff --git a/user_config/usr/share/newton_editor/icons/archive.png b/user_config/usr/share/newton/icons/archive.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/archive.png rename to user_config/usr/share/newton/icons/archive.png diff --git a/user_config/usr/share/newton_editor/icons/audio.png b/user_config/usr/share/newton/icons/audio.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/audio.png rename to user_config/usr/share/newton/icons/audio.png diff --git a/user_config/usr/share/newton_editor/icons/bin.png b/user_config/usr/share/newton/icons/bin.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/bin.png rename to user_config/usr/share/newton/icons/bin.png diff --git a/user_config/usr/share/newton_editor/icons/brain.png b/user_config/usr/share/newton/icons/brain.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/brain.png rename to user_config/usr/share/newton/icons/brain.png diff --git a/user_config/usr/share/newton_editor/icons/dir.png b/user_config/usr/share/newton/icons/dir.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/dir.png rename to user_config/usr/share/newton/icons/dir.png diff --git a/user_config/usr/share/newton_editor/icons/doc.png b/user_config/usr/share/newton/icons/doc.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/doc.png rename to user_config/usr/share/newton/icons/doc.png diff --git a/user_config/usr/share/newton_editor/icons/image.png b/user_config/usr/share/newton/icons/image.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/image.png rename to user_config/usr/share/newton/icons/image.png diff --git a/user_config/usr/share/newton_editor/icons/newton_editor-64x64.png b/user_config/usr/share/newton/icons/newton-64x64.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/newton_editor-64x64.png rename to user_config/usr/share/newton/icons/newton-64x64.png diff --git a/user_config/usr/share/newton_editor/icons/newton_editor.png b/user_config/usr/share/newton/icons/newton.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/newton_editor.png rename to user_config/usr/share/newton/icons/newton.png diff --git a/user_config/usr/share/newton_editor/icons/pdf.png b/user_config/usr/share/newton/icons/pdf.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/pdf.png rename to user_config/usr/share/newton/icons/pdf.png diff --git a/user_config/usr/share/newton_editor/icons/presentation.png b/user_config/usr/share/newton/icons/presentation.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/presentation.png rename to user_config/usr/share/newton/icons/presentation.png diff --git a/user_config/usr/share/newton_editor/icons/spreadsheet.png b/user_config/usr/share/newton/icons/spreadsheet.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/spreadsheet.png rename to user_config/usr/share/newton/icons/spreadsheet.png diff --git a/user_config/usr/share/newton_editor/icons/text.png b/user_config/usr/share/newton/icons/text.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/text.png rename to user_config/usr/share/newton/icons/text.png diff --git a/user_config/usr/share/newton_editor/icons/trash.png b/user_config/usr/share/newton/icons/trash.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/trash.png rename to user_config/usr/share/newton/icons/trash.png diff --git a/user_config/usr/share/newton_editor/icons/video.png b/user_config/usr/share/newton/icons/video.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/video.png rename to user_config/usr/share/newton/icons/video.png diff --git a/user_config/usr/share/newton_editor/icons/web.png b/user_config/usr/share/newton/icons/web.png similarity index 100% rename from user_config/usr/share/newton_editor/icons/web.png rename to user_config/usr/share/newton/icons/web.png diff --git a/user_config/usr/share/newton_editor/key-bindings.json b/user_config/usr/share/newton/key-bindings.json similarity index 100% rename from user_config/usr/share/newton_editor/key-bindings.json rename to user_config/usr/share/newton/key-bindings.json diff --git a/user_config/usr/share/newton_editor/settings.json b/user_config/usr/share/newton/settings.json similarity index 100% rename from user_config/usr/share/newton_editor/settings.json rename to user_config/usr/share/newton/settings.json diff --git a/user_config/usr/share/newton_editor/stylesheet.css b/user_config/usr/share/newton/stylesheet.css similarity index 100% rename from user_config/usr/share/newton_editor/stylesheet.css rename to user_config/usr/share/newton/stylesheet.css diff --git a/user_config/usr/share/newton_editor/ui_widgets/about_ui.glade b/user_config/usr/share/newton/ui_widgets/about_ui.glade similarity index 100% rename from user_config/usr/share/newton_editor/ui_widgets/about_ui.glade rename to user_config/usr/share/newton/ui_widgets/about_ui.glade diff --git a/user_config/usr/share/newton_editor/ui_widgets/bottom_status_info_ui.glade b/user_config/usr/share/newton/ui_widgets/bottom_status_info_ui.glade similarity index 100% rename from user_config/usr/share/newton_editor/ui_widgets/bottom_status_info_ui.glade rename to user_config/usr/share/newton/ui_widgets/bottom_status_info_ui.glade diff --git a/user_config/usr/share/newton_editor/ui_widgets/save_load_ui.glade b/user_config/usr/share/newton/ui_widgets/save_load_ui.glade similarity index 100% rename from user_config/usr/share/newton_editor/ui_widgets/save_load_ui.glade rename to user_config/usr/share/newton/ui_widgets/save_load_ui.glade