From eb9e124df5e19ebfe0669c67b64108b6e81498b6 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Fri, 20 Feb 2026 00:15:46 -0600 Subject: [PATCH] =?UTF-8?q?Refactor=20code=20completion,=20container=20lay?= =?UTF-8?q?outs,=20and=20webkit=20settings=20-=20Renamed=20alt=5Fprovider.?= =?UTF-8?q?py=20file=20under=20words=20completer=20-=20Improve=20word=20co?= =?UTF-8?q?mpletion=20matching=20logic=20with=20character=20validation=20-?= =?UTF-8?q?=20Change=20container=20orientations=20(header=E2=86=92vertical?= =?UTF-8?q?,=20left/right=E2=86=92horizontal)=20-=20Add=20separators=20to?= =?UTF-8?q?=20all=20container=20edges=20-=20Refactor=20webkit=20UI=20loadi?= =?UTF-8?q?ng=20into=20separate=20load=5Furl/load=5Fcontext=5Fbase=5Fpath?= =?UTF-8?q?=20methods=20-=20Add=20comprehensive=20webkit=20browser-like=20?= =?UTF-8?q?settings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{alt_provider.py => default_provider.py} | 15 +++++ .../default_provider_response_cache.py | 29 +++++++++ .../completers/words_completer/provider.py | 12 +++- .../provider_response_cache.py | 3 +- src/core/containers/footer_container.py | 3 + src/core/containers/header_container.py | 4 +- src/core/containers/left_container.py | 5 +- src/core/containers/right_container.py | 7 ++- src/core/widgets/webkit/webkit_ui.py | 27 ++++---- src/libs/settings/other/webkit_ui_settings.py | 61 ++++++++++++++++++- 10 files changed, 148 insertions(+), 18 deletions(-) rename plugins/code/completers/words_completer/{alt_provider.py => default_provider.py} (70%) create mode 100644 plugins/code/completers/words_completer/default_provider_response_cache.py diff --git a/plugins/code/completers/words_completer/alt_provider.py b/plugins/code/completers/words_completer/default_provider.py similarity index 70% rename from plugins/code/completers/words_completer/alt_provider.py rename to plugins/code/completers/words_completer/default_provider.py index f4ede69..7b315dd 100644 --- a/plugins/code/completers/words_completer/alt_provider.py +++ b/plugins/code/completers/words_completer/default_provider.py @@ -32,8 +32,23 @@ class Provider(GtkSource.CompletionWords): return 'Words Completion' def do_match(self, context): + # Note: If provider is in interactive activation then need to check + # view focus as otherwise non focus views start trying to grab it. + completion = context.get_property("completion") + if not completion.get_view().has_focus(): return + word = self.response_cache.get_word(context) if not word or len(word) < 2: return False + + iter = self.response_cache.get_iter_correctly(context) + iter.backward_char() + ch = iter.get_char() + # NOTE: Look to re-add or apply supprting logic to use spaces + # As is it slows down the editor in certain contexts... + # if not (ch in ('_', '.', ' ') or ch.isalnum()): + if not (ch in ('_', '.') or ch.isalnum()): + return False + return True def do_get_priority(self): diff --git a/plugins/code/completers/words_completer/default_provider_response_cache.py b/plugins/code/completers/words_completer/default_provider_response_cache.py new file mode 100644 index 0000000..3efb546 --- /dev/null +++ b/plugins/code/completers/words_completer/default_provider_response_cache.py @@ -0,0 +1,29 @@ +# Python imports + +# Lib imports + +# Application imports +from libs.event_factory import Code_Event_Types + +from core.widgets.code.completion_providers.provider_response_cache_base import ProviderResponseCacheBase + + + +class ProviderResponseCache(ProviderResponseCacheBase): + def __init__(self): + super(ProviderResponseCache, self).__init__() + + self.matchers: dict = {} + + + def process_file_load(self, event: Code_Event_Types.AddedNewFileEvent): + ... + + def process_file_close(self, event: Code_Event_Types.RemovedFileEvent): + ... + + def process_file_save(self, event: Code_Event_Types.SavedFileEvent): + ... + + def process_file_change(self, event: Code_Event_Types.TextChangedEvent): + ... diff --git a/plugins/code/completers/words_completer/provider.py b/plugins/code/completers/words_completer/provider.py index 845acc8..70997b2 100644 --- a/plugins/code/completers/words_completer/provider.py +++ b/plugins/code/completers/words_completer/provider.py @@ -18,7 +18,7 @@ class Provider(GObject.GObject, GtkSource.CompletionProvider): This is a Words Completion Provider. # NOTE: used information from here --> https://warroom.rsmus.com/do-that-auto-complete/ """ - # __gtype_name__ = 'WordsCompletionProvider' + __gtype_name__ = 'WordsCompletionProvider' def __init__(self): super(Provider, self).__init__() @@ -37,6 +37,16 @@ class Provider(GObject.GObject, GtkSource.CompletionProvider): word = self.response_cache.get_word(context) if not word or len(word) < 2: return False + + iter = self.response_cache.get_iter_correctly(context) + iter.backward_char() + ch = iter.get_char() + # NOTE: Look to re-add or apply supprting logic to use spaces + # As is it slows down the editor in certain contexts... + # if not (ch in ('_', '.', ' ') or ch.isalnum()): + if not (ch in ('_', '.') or ch.isalnum()): + return False + return True def do_get_priority(self): diff --git a/plugins/code/completers/words_completer/provider_response_cache.py b/plugins/code/completers/words_completer/provider_response_cache.py index 5a55313..61648ad 100644 --- a/plugins/code/completers/words_completer/provider_response_cache.py +++ b/plugins/code/completers/words_completer/provider_response_cache.py @@ -90,7 +90,8 @@ class ProviderResponseCache(ProviderResponseCacheBase): self.matchers[buffer] = set() def load_into_set(self, buffer, new_words): - self.matchers[buffer].update(new_words) + # self.matchers[buffer].update(new_words) + self.matchers[buffer] = new_words def load_as_new_set(self, buffer, data): self.matchers[buffer] = self.get_all_words(data) diff --git a/src/core/containers/footer_container.py b/src/core/containers/footer_container.py index 1cfd25b..3a23064 100644 --- a/src/core/containers/footer_container.py +++ b/src/core/containers/footer_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 .code.code_container import CodeContainer @@ -39,3 +40,5 @@ class FooterContainer(Gtk.Box): widget_registery.expose_object("footer-container", self) self.add( CodeContainer() ) + + self.add( Separator("separator-footer", 0) ) diff --git a/src/core/containers/header_container.py b/src/core/containers/header_container.py index b554bdd..4e4902c 100644 --- a/src/core/containers/header_container.py +++ b/src/core/containers/header_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.controls.open_files_button import OpenFilesButton from ..widgets.controls.transparency_scale import TransparencyScale @@ -27,7 +28,7 @@ class HeaderContainer(Gtk.Box): self.ctx = self.get_style_context() self.ctx.add_class("header-container") - self.set_orientation(Gtk.Orientation.HORIZONTAL) + self.set_orientation(Gtk.Orientation.VERTICAL) self.set_hexpand(True) def _setup_signals(self): @@ -42,6 +43,7 @@ class HeaderContainer(Gtk.Box): button = Gtk.Button(label = "Interactive Debug") button.connect("clicked", self._interactive_debug) + self.add( Separator("separator-header", 0) ) self.add( OpenFilesButton() ) self.add( TransparencyScale() ) self.add(button) diff --git a/src/core/containers/left_container.py b/src/core/containers/left_container.py index 1efc156..80b1703 100644 --- a/src/core/containers/left_container.py +++ b/src/core/containers/left_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 @@ -25,7 +26,7 @@ class LeftContainer(Gtk.Box): self.ctx = self.get_style_context() self.ctx.add_class("left-container") - self.set_orientation(Gtk.Orientation.VERTICAL) + self.set_orientation(Gtk.Orientation.HORIZONTAL) self.set_vexpand(True) def _setup_signals(self): @@ -36,3 +37,5 @@ class LeftContainer(Gtk.Box): def _load_widgets(self): widget_registery.expose_object("left-container", self) + + self.add( Separator("separator-left", 1) ) diff --git a/src/core/containers/right_container.py b/src/core/containers/right_container.py index 532e8ac..090a924 100644 --- a/src/core/containers/right_container.py +++ b/src/core/containers/right_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.vte_widget import VteWidget @@ -26,7 +27,7 @@ class RightContainer(Gtk.Box): self.ctx = self.get_style_context() self.ctx.add_class("right-container") - self.set_orientation(Gtk.Orientation.VERTICAL) + self.set_orientation(Gtk.Orientation.HORIZONTAL) self.set_vexpand(True) def _setup_signals(self): @@ -39,4 +40,6 @@ class RightContainer(Gtk.Box): widget_registery.expose_object("right-container", self) vte_widget = VteWidget() - self.add( vte_widget ) \ No newline at end of file + self.add( vte_widget ) + + self.add( Separator("separator-right", 1) ) diff --git a/src/core/widgets/webkit/webkit_ui.py b/src/core/widgets/webkit/webkit_ui.py index 749a717..3d2ede1 100644 --- a/src/core/widgets/webkit/webkit_ui.py +++ b/src/core/widgets/webkit/webkit_ui.py @@ -19,7 +19,6 @@ class WebkitUI(WebKit2.WebView): self._setup_styling() self._subscribe_to_events() - self._load_view() self._setup_content_manager() self.show_all() @@ -36,16 +35,6 @@ class WebkitUI(WebKit2.WebView): def _load_settings(self): self.set_settings( WebkitUISettings() ) - def _load_view(self): - path = settings_manager.path_manager.get_context_path() - data = None - - with open(f"{path}/index.html", "r") as f: - data = f.read() - - self.load_html(content = data, base_uri = f"file://{path}/") - # self.load_uri("https://duckduckgo.com/") - def _setup_content_manager(self): content_manager = self.get_user_content_manager() content_manager.connect("script-message-received", self._process_js_message) @@ -61,6 +50,22 @@ class WebkitUI(WebKit2.WebView): except Exception as e: logger.info(e) + def load_url(self, url: str = ""): + if not url: + url = "https://duckduckgo.com/" + + self.load_uri(url) + + def load_context_base_path(self, path: str = ""): + if not path: + path = settings_manager.path_manager.get_context_path() + + data = None + with open(f"{path}/index.html", "r") as f: + data = f.read() + + self.load_html(content = data, base_uri = f"file://{path}") + def ui_message(self, message, mtype): command = f"displayMessage('{message}', '{mtype}', '3')" self.run_javascript(command, None, None) diff --git a/src/libs/settings/other/webkit_ui_settings.py b/src/libs/settings/other/webkit_ui_settings.py index 955860c..548dd2f 100644 --- a/src/libs/settings/other/webkit_ui_settings.py +++ b/src/libs/settings/other/webkit_ui_settings.py @@ -39,5 +39,64 @@ class WebkitUISettings(WebKit2.Settings): self.set_enable_webaudio(True) self.set_enable_accelerated_2d_canvas(True) - self.set_user_agent(f"Mozilla/5.0 (macOS, AArch64) {APP_NAME}/1.0 Chrome/140.0.0 AppleWebKit/537.36 Safari/537.36") + self.set_user_agent( + f"Mozilla/5.0 (macOS, AArch64) {APP_NAME}/1.0 Chrome/140.0.0 AppleWebKit/537.36 Safari/537.36" + ) + # Note: Most "browser" like setup I could think of. + def other_set_default_settings(self): + # Usability + self.set_property('enable-fullscreen', True) + self.set_property('print-backgrounds', True) + self.set_property('enable-frame-flattening', False) + self.set_property('enable-plugins', True) + self.set_property('enable-java', False) + self.set_property('enable-resizable-text-areas', True) + self.set_property('zoom-text-only', False) + self.set_property('enable-smooth-scrolling', True) + self.set_property('enable-back-forward-navigation-gestures', False) + self.set_property('media-playback-requires-user-gesture', False) + self.set_property('enable-tabs-to-links', True) + self.set_property('enable-caret-browsing', False) + + # Security + # self.set_property('user-agent', 'Mozilla/5.0 (X11; Generic; Linux x86-64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Safari/605.1.15') + self.set_property('user-agent', f"Mozilla/5.0 (macOS, AArch64) {APP_NAME}/1.0 Chrome/140.0.0 AppleWebKit/537.36 Safari/537.36") + self.set_property('enable-private-browsing', False) + self.set_property('enable-xss-auditor', True) + self.set_property('enable-hyperlink-auditing', False) + self.set_property('enable-site-specific-quirks', True) + self.set_property('enable-offline-web-application-cache', True) + self.set_property('enable-page-cache', True) + self.set_property('allow-modal-dialogs', True) + self.set_property('enable-html5-local-storage', True) + self.set_property('enable-html5-database', True) + self.set_property('allow-file-access-from-file-urls', True) + self.set_property('allow-universal-access-from-file-urls', False) + self.set_property('enable-dns-prefetching', False) + + # Media stuff + self.set_hardware_acceleration_policy(0) + # self.set_property('hardware-acceleration-policy', 'on-demand') + self.set_property('enable-webgl', True) + self.set_property('enable-webaudio', True) + self.set_property('enable-accelerated-2d-canvas', True) + self.set_property('auto-load-images', True) + self.set_property('enable-media-capabilities', True) + self.set_property('enable-media-stream', True) + self.set_property('enable-mediasource', True) + self.set_property('enable-encrypted-media', True) + self.set_property('media-playback-allows-inline', True) + + # JS + self.set_property('enable-javascript', True) + self.set_property('enable-javascript-markup', True) + self.set_property('javascript-can-access-clipboard', False) + self.set_property('javascript-can-open-windows-automatically', False) + + # Debugging + self.set_property('enable-developer-extras', False) + self.set_property('enable-write-console-messages-to-stdout', False) + self.set_property('draw-compositing-indicators', False) + self.set_property('enable-mock-capture-devices', False) + self.set_property('enable-spatial-navigation', False)