Refactor code completion, container layouts, and webkit settings
- Renamed alt_provider.py file under words completer - Improve word completion matching logic with character validation - Change container orientations (header→vertical, left/right→horizontal) - Add separators to all container edges - Refactor webkit UI loading into separate load_url/load_context_base_path methods - Add comprehensive webkit browser-like settings
This commit is contained in:
@@ -32,8 +32,23 @@ class Provider(GtkSource.CompletionWords):
|
|||||||
return 'Words Completion'
|
return 'Words Completion'
|
||||||
|
|
||||||
def do_match(self, context):
|
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)
|
word = self.response_cache.get_word(context)
|
||||||
if not word or len(word) < 2: return False
|
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
|
return True
|
||||||
|
|
||||||
def do_get_priority(self):
|
def do_get_priority(self):
|
||||||
@@ -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):
|
||||||
|
...
|
||||||
@@ -18,7 +18,7 @@ class Provider(GObject.GObject, GtkSource.CompletionProvider):
|
|||||||
This is a Words Completion Provider.
|
This is a Words Completion Provider.
|
||||||
# NOTE: used information from here --> https://warroom.rsmus.com/do-that-auto-complete/
|
# NOTE: used information from here --> https://warroom.rsmus.com/do-that-auto-complete/
|
||||||
"""
|
"""
|
||||||
# __gtype_name__ = 'WordsCompletionProvider'
|
__gtype_name__ = 'WordsCompletionProvider'
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(Provider, self).__init__()
|
super(Provider, self).__init__()
|
||||||
@@ -37,6 +37,16 @@ class Provider(GObject.GObject, GtkSource.CompletionProvider):
|
|||||||
|
|
||||||
word = self.response_cache.get_word(context)
|
word = self.response_cache.get_word(context)
|
||||||
if not word or len(word) < 2: return False
|
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
|
return True
|
||||||
|
|
||||||
def do_get_priority(self):
|
def do_get_priority(self):
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
self.matchers[buffer] = set()
|
self.matchers[buffer] = set()
|
||||||
|
|
||||||
def load_into_set(self, buffer, new_words):
|
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):
|
def load_as_new_set(self, buffer, data):
|
||||||
self.matchers[buffer] = self.get_all_words(data)
|
self.matchers[buffer] = self.get_all_words(data)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from ..widgets.separator_widget import Separator
|
||||||
from .code.code_container import CodeContainer
|
from .code.code_container import CodeContainer
|
||||||
|
|
||||||
|
|
||||||
@@ -39,3 +40,5 @@ class FooterContainer(Gtk.Box):
|
|||||||
widget_registery.expose_object("footer-container", self)
|
widget_registery.expose_object("footer-container", self)
|
||||||
|
|
||||||
self.add( CodeContainer() )
|
self.add( CodeContainer() )
|
||||||
|
|
||||||
|
self.add( Separator("separator-footer", 0) )
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from ..widgets.separator_widget import Separator
|
||||||
from ..widgets.controls.open_files_button import OpenFilesButton
|
from ..widgets.controls.open_files_button import OpenFilesButton
|
||||||
from ..widgets.controls.transparency_scale import TransparencyScale
|
from ..widgets.controls.transparency_scale import TransparencyScale
|
||||||
|
|
||||||
@@ -27,7 +28,7 @@ class HeaderContainer(Gtk.Box):
|
|||||||
self.ctx = self.get_style_context()
|
self.ctx = self.get_style_context()
|
||||||
self.ctx.add_class("header-container")
|
self.ctx.add_class("header-container")
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||||
self.set_hexpand(True)
|
self.set_hexpand(True)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
@@ -42,6 +43,7 @@ class HeaderContainer(Gtk.Box):
|
|||||||
button = Gtk.Button(label = "Interactive Debug")
|
button = Gtk.Button(label = "Interactive Debug")
|
||||||
button.connect("clicked", self._interactive_debug)
|
button.connect("clicked", self._interactive_debug)
|
||||||
|
|
||||||
|
self.add( Separator("separator-header", 0) )
|
||||||
self.add( OpenFilesButton() )
|
self.add( OpenFilesButton() )
|
||||||
self.add( TransparencyScale() )
|
self.add( TransparencyScale() )
|
||||||
self.add(button)
|
self.add(button)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from ..widgets.separator_widget import Separator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +26,7 @@ class LeftContainer(Gtk.Box):
|
|||||||
self.ctx = self.get_style_context()
|
self.ctx = self.get_style_context()
|
||||||
self.ctx.add_class("left-container")
|
self.ctx.add_class("left-container")
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
||||||
self.set_vexpand(True)
|
self.set_vexpand(True)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
@@ -36,3 +37,5 @@ class LeftContainer(Gtk.Box):
|
|||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
widget_registery.expose_object("left-container", self)
|
widget_registery.expose_object("left-container", self)
|
||||||
|
|
||||||
|
self.add( Separator("separator-left", 1) )
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from ..widgets.separator_widget import Separator
|
||||||
from ..widgets.vte_widget import VteWidget
|
from ..widgets.vte_widget import VteWidget
|
||||||
|
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ class RightContainer(Gtk.Box):
|
|||||||
self.ctx = self.get_style_context()
|
self.ctx = self.get_style_context()
|
||||||
self.ctx.add_class("right-container")
|
self.ctx.add_class("right-container")
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
||||||
self.set_vexpand(True)
|
self.set_vexpand(True)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
@@ -40,3 +41,5 @@ class RightContainer(Gtk.Box):
|
|||||||
|
|
||||||
vte_widget = VteWidget()
|
vte_widget = VteWidget()
|
||||||
self.add( vte_widget )
|
self.add( vte_widget )
|
||||||
|
|
||||||
|
self.add( Separator("separator-right", 1) )
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ class WebkitUI(WebKit2.WebView):
|
|||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
self._load_view()
|
|
||||||
self._setup_content_manager()
|
self._setup_content_manager()
|
||||||
|
|
||||||
self.show_all()
|
self.show_all()
|
||||||
@@ -36,16 +35,6 @@ class WebkitUI(WebKit2.WebView):
|
|||||||
def _load_settings(self):
|
def _load_settings(self):
|
||||||
self.set_settings( WebkitUISettings() )
|
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):
|
def _setup_content_manager(self):
|
||||||
content_manager = self.get_user_content_manager()
|
content_manager = self.get_user_content_manager()
|
||||||
content_manager.connect("script-message-received", self._process_js_message)
|
content_manager.connect("script-message-received", self._process_js_message)
|
||||||
@@ -61,6 +50,22 @@ class WebkitUI(WebKit2.WebView):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.info(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):
|
def ui_message(self, message, mtype):
|
||||||
command = f"displayMessage('{message}', '{mtype}', '3')"
|
command = f"displayMessage('{message}', '{mtype}', '3')"
|
||||||
self.run_javascript(command, None, None)
|
self.run_javascript(command, None, None)
|
||||||
|
|||||||
@@ -39,5 +39,64 @@ class WebkitUISettings(WebKit2.Settings):
|
|||||||
self.set_enable_webaudio(True)
|
self.set_enable_webaudio(True)
|
||||||
self.set_enable_accelerated_2d_canvas(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)
|
||||||
|
|||||||
Reference in New Issue
Block a user