Compare commits
5 Commits
6c42ff7c7d
...
55d2d99d68
| Author | SHA1 | Date | |
|---|---|---|---|
| 55d2d99d68 | |||
| eb9e124df5 | |||
| 6714053776 | |||
| 69c8418a72 | |||
| d4dc972c6d |
@@ -6,8 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.base_event import BaseEvent
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
from libs.event_factory import Event_Factory
|
|
||||||
|
|
||||||
from plugins.plugin_types import PluginCode
|
from plugins.plugin_types import PluginCode
|
||||||
|
|
||||||
@@ -22,7 +21,7 @@ class Plugin(PluginCode):
|
|||||||
self.provider: Provider = None
|
self.provider: Provider = None
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: BaseEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
...
|
...
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
@@ -30,13 +30,13 @@ class Provider(GObject.GObject, GtkSource.CompletionProvider):
|
|||||||
return 'Example Code Completion'
|
return 'Example Code Completion'
|
||||||
|
|
||||||
def do_match(self, context):
|
def do_match(self, context):
|
||||||
# word = context.get_word()
|
# Note: If provider is in interactive activation then need to check
|
||||||
# if not word or len(word) < 2: return False
|
# 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
|
||||||
|
|
||||||
""" Get whether the provider match the context of completion detailed in context. """
|
|
||||||
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
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def do_get_priority(self):
|
def do_get_priority(self):
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
# Python imports
|
# Python imports
|
||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
import re
|
import re
|
||||||
|
|
||||||
# Lib imports
|
# Lib imports
|
||||||
@@ -21,6 +22,9 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ProviderResponseCache, self).__init__()
|
super(ProviderResponseCache, self).__init__()
|
||||||
|
|
||||||
|
# Note: Using asyncio.run causes a keyboard trap that prevents app
|
||||||
|
# closure from terminal. ThreadPoolExecutor seems to not have such issues...
|
||||||
|
self.executor = ThreadPoolExecutor(max_workers = 1)
|
||||||
self.matchers: dict = {
|
self.matchers: dict = {
|
||||||
"hello": {
|
"hello": {
|
||||||
"label": "Hello, World!",
|
"label": "Hello, World!",
|
||||||
@@ -6,8 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.base_event import BaseEvent
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
from libs.event_factory import Event_Factory
|
|
||||||
|
|
||||||
from plugins.plugin_types import PluginCode
|
from plugins.plugin_types import PluginCode
|
||||||
|
|
||||||
@@ -22,7 +21,7 @@ class Plugin(PluginCode):
|
|||||||
self.provider: Provider = None
|
self.provider: Provider = None
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: BaseEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
...
|
...
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
# Python imports
|
# Python imports
|
||||||
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
|
||||||
# Lib imports
|
# Lib imports
|
||||||
import gi
|
import gi
|
||||||
@@ -17,9 +18,13 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(ProviderResponseCache, self).__init__()
|
super(ProviderResponseCache, self).__init__()
|
||||||
|
|
||||||
|
self.executor = ThreadPoolExecutor(max_workers = 1)
|
||||||
|
self.matchers: dict = {}
|
||||||
|
|
||||||
|
|
||||||
def process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
def process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
||||||
...
|
buffer = event.file.buffer
|
||||||
|
self.executor.submit(self._handle_change, buffer)
|
||||||
|
|
||||||
def process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
def process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
||||||
...
|
...
|
||||||
@@ -28,8 +33,13 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
def process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
||||||
|
buffer = event.file.buffer
|
||||||
|
self.executor.submit(self._handle_change, buffer)
|
||||||
|
|
||||||
|
def _handle_change(self, buffer):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
def filter(self, word: str) -> list[dict]:
|
def filter(self, word: str) -> list[dict]:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
@@ -6,8 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.base_event import BaseEvent
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
from libs.event_factory import Event_Factory
|
|
||||||
|
|
||||||
from plugins.plugin_types import PluginCode
|
from plugins.plugin_types import PluginCode
|
||||||
|
|
||||||
@@ -22,7 +21,7 @@ class Plugin(PluginCode):
|
|||||||
self.provider: Provider = None
|
self.provider: Provider = None
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: BaseEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
...
|
...
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
@@ -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):
|
||||||
|
...
|
||||||
@@ -6,8 +6,7 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.base_event import BaseEvent
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
from libs.event_factory import Event_Factory
|
|
||||||
|
|
||||||
from plugins.plugin_types import PluginCode
|
from plugins.plugin_types import PluginCode
|
||||||
|
|
||||||
@@ -22,7 +21,7 @@ class Plugin(PluginCode):
|
|||||||
self.provider: Provider = None
|
self.provider: Provider = None
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: BaseEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
...
|
...
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
@@ -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__()
|
||||||
@@ -30,8 +30,23 @@ class Provider(GObject.GObject, GtkSource.CompletionProvider):
|
|||||||
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):
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Python imports
|
# Python imports
|
||||||
import asyncio
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
|
|
||||||
# Lib imports
|
# Lib imports
|
||||||
import gi
|
import gi
|
||||||
@@ -24,7 +24,8 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
|
|
||||||
def process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
def process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
||||||
buffer = event.file.buffer
|
buffer = event.file.buffer
|
||||||
asyncio.run( self._handle_change(buffer) )
|
with ThreadPoolExecutor(max_workers = 1) as executor:
|
||||||
|
executor.submit(self._handle_change, buffer)
|
||||||
|
|
||||||
def process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
def process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
||||||
self.matchers[event.file.buffer] = set()
|
self.matchers[event.file.buffer] = set()
|
||||||
@@ -35,9 +36,10 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
|
|
||||||
def process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
def process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
||||||
buffer = event.file.buffer
|
buffer = event.file.buffer
|
||||||
asyncio.run( self._handle_change(buffer) )
|
with ThreadPoolExecutor(max_workers = 1) as executor:
|
||||||
|
executor.submit(self._handle_change, buffer)
|
||||||
|
|
||||||
async def _handle_change(self, buffer):
|
def _handle_change(self, buffer):
|
||||||
start_itr = buffer.get_start_iter()
|
start_itr = buffer.get_start_iter()
|
||||||
end_itr = buffer.get_end_iter()
|
end_itr = buffer.get_end_iter()
|
||||||
data = buffer.get_text(start_itr, end_itr, False)
|
data = buffer.get_text(start_itr, end_itr, False)
|
||||||
@@ -67,6 +69,9 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
buffer = self.get_iter_correctly(context).get_buffer()
|
buffer = self.get_iter_correctly(context).get_buffer()
|
||||||
word = self.get_word(context).rstrip()
|
word = self.get_word(context).rstrip()
|
||||||
|
|
||||||
|
if not buffer in self.matchers:
|
||||||
|
self.matchers[buffer] = set()
|
||||||
|
|
||||||
response: list[dict] = []
|
response: list[dict] = []
|
||||||
for entry in self.matchers[buffer]:
|
for entry in self.matchers[buffer]:
|
||||||
if not entry.rstrip().startswith(word): continue
|
if not entry.rstrip().startswith(word): continue
|
||||||
@@ -81,12 +86,12 @@ class ProviderResponseCache(ProviderResponseCacheBase):
|
|||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
def load_empty_set(self, buffer):
|
def load_empty_set(self, buffer):
|
||||||
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)
|
||||||
@@ -8,11 +8,11 @@ from gi.repository import Gtk
|
|||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.base_event import BaseEvent
|
from libs.dto.base_event import BaseEvent
|
||||||
|
|
||||||
from plugins.plugin_base import PluginBase
|
from plugins.plugin_types import PluginUI
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Plugin(PluginBase):
|
class Plugin(PluginUI):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(Plugin, self).__init__()
|
super(Plugin, self).__init__()
|
||||||
|
|
||||||
@@ -21,14 +21,14 @@ class Plugin(PluginBase):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
ui_element = self.requests_ui_element("plugin_control_list")
|
ui_element = self.requests_ui_element("header-container")
|
||||||
ui_element.add( self.generate_plugin_element() )
|
ui_element.add( self.generate_plugin_element() )
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
def generate_plugin_element(self):
|
def generate_plugin_element(self):
|
||||||
button = Gtk.Button(label = self.name)
|
button = Gtk.Button(label = "Hello, World!")
|
||||||
|
|
||||||
button.connect("button-release-event", self.send_message)
|
button.connect("button-release-event", self.send_message)
|
||||||
button.show()
|
button.show()
|
||||||
@@ -36,6 +36,5 @@ class Plugin(PluginBase):
|
|||||||
return button
|
return button
|
||||||
|
|
||||||
def send_message(self, widget = None, eve = None):
|
def send_message(self, widget = None, eve = None):
|
||||||
message = "Hello, World!"
|
logger.info("Hello, World!")
|
||||||
self.emit("display_message", ("warning", message, None))
|
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ class Application:
|
|||||||
if ipc_server.is_ipc_alive:
|
if ipc_server.is_ipc_alive:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
logger.warning(f"{app_name} IPC Server Exists: Have sent path(s) to it and closing...")
|
logger.warning(f"{APP_NAME} IPC Server Exists: Have sent path(s) to it and closing...")
|
||||||
for arg in unknownargs + [args.new_tab,]:
|
for arg in unknownargs + [args.new_tab,]:
|
||||||
if os.path.isfile(arg):
|
if os.path.isfile(arg):
|
||||||
message = f"FILE|{arg}"
|
message = f"FILE|{arg}"
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ class BaseContainer(Gtk.Box):
|
|||||||
event_system.subscribe("remove-transparency", self._remove_transparency)
|
event_system.subscribe("remove-transparency", self._remove_transparency)
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("base-container", self)
|
||||||
|
|
||||||
self.add( HeaderContainer() )
|
self.add( HeaderContainer() )
|
||||||
self.add( BodyContainer() )
|
self.add( BodyContainer() )
|
||||||
self.add( FooterContainer() )
|
self.add( FooterContainer() )
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ class BodyContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("body-container", self)
|
||||||
|
|
||||||
self.add( LeftContainer() )
|
self.add( LeftContainer() )
|
||||||
self.add( CenterContainer() )
|
self.add( CenterContainer() )
|
||||||
self.add( RightContainer() )
|
self.add( RightContainer() )
|
||||||
@@ -38,8 +38,13 @@ class CenterContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("center-container", self)
|
||||||
|
|
||||||
glade_box = widget_registery.get_object("glade_box")
|
glade_box = widget_registery.get_object("glade_box")
|
||||||
button = Gtk.Button(label = "Click Me!")
|
button = Gtk.Button(label = "Click Me!")
|
||||||
|
webkit_ui = WebkitUI()
|
||||||
|
|
||||||
|
webkit_ui.load_context_base_path()
|
||||||
|
|
||||||
button.connect("clicked", self._hello_world)
|
button.connect("clicked", self._hello_world)
|
||||||
|
|
||||||
@@ -48,7 +53,7 @@ class CenterContainer(Gtk.Box):
|
|||||||
|
|
||||||
self.add(button)
|
self.add(button)
|
||||||
self.add(glade_box)
|
self.add(glade_box)
|
||||||
self.add( WebkitUI() )
|
self.add(webkit_ui)
|
||||||
|
|
||||||
def _hello_world(self, widget = None, eve = None):
|
def _hello_world(self, widget = None, eve = None):
|
||||||
logger.debug("Hello, World!")
|
logger.debug("Hello, World!")
|
||||||
@@ -43,15 +43,7 @@ class CodeContainer(Gtk.Box):
|
|||||||
self.add( self._create_editor_widget(code_base) )
|
self.add( self._create_editor_widget(code_base) )
|
||||||
|
|
||||||
def _create_tabs_widgets(self, code_base: CodeBase):
|
def _create_tabs_widgets(self, code_base: CodeBase):
|
||||||
scrolled_window = Gtk.ScrolledWindow()
|
return code_base.get_tabs_widget()
|
||||||
viewport = Gtk.Viewport()
|
|
||||||
|
|
||||||
scrolled_window.set_overlay_scrolling(False)
|
|
||||||
|
|
||||||
viewport.add( code_base.get_tabs_widget() )
|
|
||||||
scrolled_window.add( viewport )
|
|
||||||
|
|
||||||
return scrolled_window
|
|
||||||
|
|
||||||
def _create_editor_widget(self, code_base: CodeBase):
|
def _create_editor_widget(self, code_base: CodeBase):
|
||||||
editors_container = Gtk.Box()
|
editors_container = Gtk.Box()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ class FooterContainer(Gtk.Box):
|
|||||||
self.ctx = self.get_style_context()
|
self.ctx = self.get_style_context()
|
||||||
self.ctx.add_class("footer-container")
|
self.ctx.add_class("footer-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):
|
||||||
@@ -36,4 +37,8 @@ class FooterContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(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):
|
||||||
@@ -37,9 +38,12 @@ class HeaderContainer(Gtk.Box):
|
|||||||
event_system.subscribe("tggl-top-main-menubar", self.tggl_top_main_menubar)
|
event_system.subscribe("tggl-top-main-menubar", self.tggl_top_main_menubar)
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("header-container", self)
|
||||||
|
|
||||||
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):
|
||||||
@@ -35,4 +36,6 @@ class LeftContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(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):
|
||||||
@@ -36,5 +37,9 @@ class RightContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("right-container", self)
|
||||||
|
|
||||||
vte_widget = VteWidget()
|
vte_widget = VteWidget()
|
||||||
self.add( vte_widget )
|
self.add( vte_widget )
|
||||||
|
|
||||||
|
self.add( Separator("separator-right", 1) )
|
||||||
|
|||||||
@@ -24,9 +24,13 @@ class CodeBase:
|
|||||||
self.controller_manager: ControllerManager = ControllerManager()
|
self.controller_manager: ControllerManager = ControllerManager()
|
||||||
self.miniview_widget: MiniViewWidget = MiniViewWidget()
|
self.miniview_widget: MiniViewWidget = MiniViewWidget()
|
||||||
|
|
||||||
|
self._subscribe_to_events()
|
||||||
self._load_controllers()
|
self._load_controllers()
|
||||||
|
|
||||||
|
|
||||||
|
def _subscribe_to_events(self):
|
||||||
|
event_system.subscribe("handle-file", self._load_ipc_file)
|
||||||
|
|
||||||
def _load_controllers(self):
|
def _load_controllers(self):
|
||||||
files_controller = FilesController()
|
files_controller = FilesController()
|
||||||
tabs_controller = TabsController()
|
tabs_controller = TabsController()
|
||||||
@@ -59,3 +63,8 @@ class CodeBase:
|
|||||||
|
|
||||||
def first_map_load(self):
|
def first_map_load(self):
|
||||||
self.controller_manager["source_views"].first_map_load()
|
self.controller_manager["source_views"].first_map_load()
|
||||||
|
|
||||||
|
def _load_ipc_file(self, fpath: str):
|
||||||
|
active_view = self.controller_manager["source_views"].signal_mapper.active_view
|
||||||
|
uris = [ f"file://{fpath}" ]
|
||||||
|
active_view._on_uri_data_received(uris)
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ class CommandSystem:
|
|||||||
method = getattr(commands, command)
|
method = getattr(commands, command)
|
||||||
return method.execute(*args)
|
return method.execute(*args)
|
||||||
|
|
||||||
|
def add_command(self, command_name: str, command: callable):
|
||||||
|
setattr(commands, command_name, command)
|
||||||
|
|
||||||
|
|
||||||
def emit(self, event: Code_Event_Types.CodeEvent):
|
def emit(self, event: Code_Event_Types.CodeEvent):
|
||||||
""" Monkey patch 'emit' from command controller... """
|
""" Monkey patch 'emit' from command controller... """
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ __all__ = []
|
|||||||
|
|
||||||
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
|
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
|
||||||
module = importlib.import_module(f"{__name__}.{module_name}")
|
module = importlib.import_module(f"{__name__}.{module_name}")
|
||||||
globals()[module_name] = module # Add module to package namespace
|
# globals()[module_name] = module # Add module to package namespace
|
||||||
__all__.append(module_name)
|
__all__.append(module_name)
|
||||||
|
|
||||||
del pkgutil
|
del pkgutil
|
||||||
|
|||||||
@@ -18,11 +18,6 @@ def execute(
|
|||||||
uri: str
|
uri: str
|
||||||
):
|
):
|
||||||
logger.debug("Command: DnD Load File To Buffer")
|
logger.debug("Command: DnD Load File To Buffer")
|
||||||
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
if not file.ftype == "buffer":
|
|
||||||
file = view.command.new_file(view)
|
file = view.command.new_file(view)
|
||||||
|
|
||||||
gfile = Gio.File.new_for_uri(uri)
|
gfile = Gio.File.new_for_uri(uri)
|
||||||
@@ -31,4 +26,5 @@ def execute(
|
|||||||
(view, gfile, file)
|
(view, gfile, file)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
view.set_buffer(file.buffer)
|
||||||
update_info_bar_if_focused(view.command, view)
|
update_info_bar_if_focused(view.command, view)
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ def execute(
|
|||||||
):
|
):
|
||||||
logger.debug("Command: Update Info Bar")
|
logger.debug("Command: Update Info Bar")
|
||||||
file = view.command.get_file(view)
|
file = view.command.get_file(view)
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
if not file: return
|
if not file: return
|
||||||
|
|
||||||
|
buffer = file.buffer
|
||||||
iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
||||||
line = iter.get_line() + 1
|
line = iter.get_line() + 1
|
||||||
column = iter.get_line_offset()
|
column = iter.get_line_offset()
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import gi
|
|||||||
gi.require_version('GtkSource', '4')
|
gi.require_version('GtkSource', '4')
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
from gi.repository import GtkSource
|
||||||
|
from gi.repository import Pango
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
|
||||||
@@ -18,6 +19,9 @@ def execute(
|
|||||||
|
|
||||||
ctx = view.get_style_context()
|
ctx = view.get_style_context()
|
||||||
if view.zoom_level < 99:
|
if view.zoom_level < 99:
|
||||||
ctx.remove_class(f"px{view.zoom_level}")
|
|
||||||
view.zoom_level += 1
|
view.zoom_level += 1
|
||||||
ctx.add_class(f"px{view.zoom_level}")
|
|
||||||
|
font_desc = \
|
||||||
|
Pango.FontDescription(f"Monospace {view.zoom_level}")
|
||||||
|
|
||||||
|
view.modify_font(font_desc)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import gi
|
|||||||
gi.require_version('GtkSource', '4')
|
gi.require_version('GtkSource', '4')
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
from gi.repository import GtkSource
|
||||||
|
from gi.repository import Pango
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
|
||||||
@@ -18,6 +19,9 @@ def execute(
|
|||||||
|
|
||||||
ctx = view.get_style_context()
|
ctx = view.get_style_context()
|
||||||
if view.zoom_level > 1:
|
if view.zoom_level > 1:
|
||||||
ctx.remove_class(f"px{view.zoom_level}")
|
|
||||||
view.zoom_level -= 1
|
view.zoom_level -= 1
|
||||||
ctx.add_class(f"px{view.zoom_level}")
|
|
||||||
|
font_desc = \
|
||||||
|
Pango.FontDescription(f"Monospace {view.zoom_level}")
|
||||||
|
|
||||||
|
view.modify_font(font_desc)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from gi.repository import Gtk
|
|||||||
from gi.repository import GtkSource
|
from gi.repository import GtkSource
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from libs.event_factory import Code_Event_Types
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -26,16 +27,16 @@ class ProviderResponseCacheBase:
|
|||||||
self._icon_theme = Gtk.IconTheme.get_default()
|
self._icon_theme = Gtk.IconTheme.get_default()
|
||||||
|
|
||||||
|
|
||||||
def process_file_load(self, buffer: GtkSource.Buffer):
|
def process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_load' not implemented...")
|
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_load' not implemented...")
|
||||||
|
|
||||||
def process_file_close(self, buffer: GtkSource.Buffer):
|
def process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_close' not implemented...")
|
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_close' not implemented...")
|
||||||
|
|
||||||
def process_file_save(self, buffer: GtkSource.Buffer):
|
def process_file_save(self, event: Code_Event_Types.SavedFileEvent):
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_save' not implemented...")
|
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_save' not implemented...")
|
||||||
|
|
||||||
def process_file_change(self, buffer: GtkSource.Buffer):
|
def process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_change' not implemented...")
|
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_change' not implemented...")
|
||||||
|
|
||||||
def filter(self, word: str) -> list[dict]:
|
def filter(self, word: str) -> list[dict]:
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ class CommandsController(ControllerBase, list):
|
|||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
if isinstance(event, Code_Event_Types.GetCommandSystemEvent):
|
if isinstance(event, Code_Event_Types.GetNewCommandSystemEvent):
|
||||||
event.response = self.get_command_system()
|
event.response = self.get_new_command_system()
|
||||||
|
|
||||||
def get_command_system(self):
|
def get_new_command_system(self):
|
||||||
command_system = CommandSystem()
|
command_system = CommandSystem()
|
||||||
command_system.emit = self.emit
|
command_system.emit = self.emit
|
||||||
command_system.emit_to = self.emit_to
|
command_system.emit_to = self.emit_to
|
||||||
|
|||||||
@@ -68,6 +68,8 @@ class CompletionController(ControllerBase):
|
|||||||
|
|
||||||
def provider_process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
def provider_process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
||||||
for provider in self._providers.values():
|
for provider in self._providers.values():
|
||||||
|
# if provider.get_name() == "Words Completion":
|
||||||
|
# provider.register(event.file.buffer)
|
||||||
provider.response_cache.process_file_load(event)
|
provider.response_cache.process_file_load(event)
|
||||||
|
|
||||||
def provider_process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
def provider_process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
||||||
|
|||||||
@@ -20,14 +20,12 @@ class TabsController(ControllerBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(TabsController, self).__init__()
|
super(TabsController, self).__init__()
|
||||||
|
|
||||||
self.active_view: SourceView = None
|
|
||||||
self.tabs_widget: TabsWidget = TabsWidget()
|
self.tabs_widget: TabsWidget = TabsWidget()
|
||||||
self.tabs_widget.message = self.message
|
self.tabs_widget.message = self.message
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
if isinstance(event, Code_Event_Types.FocusedViewEvent):
|
if isinstance(event, Code_Event_Types.FocusedViewEvent):
|
||||||
self.active_view = event.view
|
|
||||||
self.tabs_widget.view_changed(
|
self.tabs_widget.view_changed(
|
||||||
event.view.get_buffer()
|
event.view.get_buffer()
|
||||||
)
|
)
|
||||||
@@ -53,13 +51,12 @@ class TabsController(ControllerBase):
|
|||||||
break
|
break
|
||||||
|
|
||||||
def add_tab(self, event: Code_Event_Types.AddedNewFileEvent):
|
def add_tab(self, event: Code_Event_Types.AddedNewFileEvent):
|
||||||
box = Gtk.Separator()
|
|
||||||
tab = TabWidget()
|
tab = TabWidget()
|
||||||
|
|
||||||
tab.file = event.file
|
tab.file = event.file
|
||||||
|
|
||||||
tab.label.set_label(event.file.fname)
|
tab.label.set_label(event.file.fname)
|
||||||
|
|
||||||
self.tabs_widget.append_page(box, tab)
|
self.tabs_widget.append_page(Gtk.Separator(), tab)
|
||||||
tab.show_all()
|
tab.show_all()
|
||||||
|
|
||||||
def remove_tab(self, event: Code_Event_Types.RemovedFileEvent):
|
def remove_tab(self, event: Code_Event_Types.RemovedFileEvent):
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ class SourceViewsController(ControllerBase, list):
|
|||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
if isinstance(event, Code_Event_Types.RemovedFileEvent):
|
if isinstance(event, Code_Event_Types.RemovedFileEvent):
|
||||||
self._remove_file(event)
|
self._remove_file(event)
|
||||||
|
elif isinstance(event, Code_Event_Types.RegisterCommandEvent):
|
||||||
|
self. _register_command(event)
|
||||||
|
|
||||||
if not self.signal_mapper.active_view: return
|
if not self.signal_mapper.active_view: return
|
||||||
|
|
||||||
@@ -40,8 +42,22 @@ class SourceViewsController(ControllerBase, list):
|
|||||||
elif isinstance(event, Code_Event_Types.TextInsertedEvent):
|
elif isinstance(event, Code_Event_Types.TextInsertedEvent):
|
||||||
self.signal_mapper.insert_text(event.file, event.text)
|
self.signal_mapper.insert_text(event.file, event.text)
|
||||||
|
|
||||||
|
def _register_command(self, event: Code_Event_Types.RegisterCommandEvent):
|
||||||
|
self.state_manager.key_mapper.map_command(
|
||||||
|
event.command_name,
|
||||||
|
{
|
||||||
|
f"{event.binding_mode}": event.binding
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
for view in self:
|
||||||
|
view.command.add_command(
|
||||||
|
event.command_name,
|
||||||
|
event.command
|
||||||
|
)
|
||||||
|
|
||||||
def _get_command_system(self):
|
def _get_command_system(self):
|
||||||
event = Event_Factory.create_event("get_command_system")
|
event = Event_Factory.create_event("get_new_command_system")
|
||||||
self.message_to("commands", event)
|
self.message_to("commands", event)
|
||||||
command = event.response
|
command = event.response
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from ...key_mapper import KeyMapper
|
|||||||
from .states import *
|
from .states import *
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewStateManager:
|
class SourceViewStateManager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.key_mapper: KeyMapper = KeyMapper()
|
self.key_mapper: KeyMapper = KeyMapper()
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
|
|||||||
end_itr.forward_word_end()
|
end_itr.forward_word_end()
|
||||||
|
|
||||||
buffer.delete(start_itr, end_itr)
|
buffer.delete(start_itr, end_itr)
|
||||||
buffer.insert(end_itr, text, -1)
|
buffer.insert(start_itr, text, -1)
|
||||||
|
|
||||||
buffer.end_user_action()
|
buffer.end_user_action()
|
||||||
buffer.unblock_insert_after_signal()
|
buffer.unblock_insert_after_signal()
|
||||||
|
|||||||
@@ -70,10 +70,15 @@ class KeyMapper:
|
|||||||
|
|
||||||
with open(bindings_file, 'r') as f:
|
with open(bindings_file, 'r') as f:
|
||||||
data = json.load(f)["keybindings"]
|
data = json.load(f)["keybindings"]
|
||||||
|
|
||||||
for command in data:
|
for command in data:
|
||||||
press_state = "held" if "held" in data[command] else "released"
|
self.map_command( command, data[command] )
|
||||||
keyname = data[command][press_state]
|
|
||||||
|
def re_map(self):
|
||||||
|
self.states = copy.deepcopy(self._map)
|
||||||
|
|
||||||
|
def map_command(self, command, entry):
|
||||||
|
press_state = "held" if "held" in entry else "released"
|
||||||
|
keyname = entry[press_state]
|
||||||
|
|
||||||
state = NoKeyState
|
state = NoKeyState
|
||||||
if "<Control>" in keyname:
|
if "<Control>" in keyname:
|
||||||
@@ -90,9 +95,6 @@ class KeyMapper:
|
|||||||
|
|
||||||
getattr(self.states[state], press_state)[keyname] = command
|
getattr(self.states[state], press_state)[keyname] = command
|
||||||
|
|
||||||
def re_map(self):
|
|
||||||
self.states = copy.deepcopy(self._map)
|
|
||||||
|
|
||||||
def _key_press_event(self, eve):
|
def _key_press_event(self, eve):
|
||||||
keyname = Gdk.keyval_name(eve.keyval).lower()
|
keyname = Gdk.keyval_name(eve.keyval).lower()
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
import gi
|
import gi
|
||||||
gi.require_version('GtkSource', '4')
|
gi.require_version('GtkSource', '4')
|
||||||
from gi.repository.GtkSource import Map
|
from gi.repository.GtkSource import Map
|
||||||
|
from gi.repository import Pango
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
|
||||||
@@ -25,6 +25,7 @@ class MiniViewWidget(Map):
|
|||||||
ctx.add_class("mini-view")
|
ctx.add_class("mini-view")
|
||||||
|
|
||||||
self.set_hexpand(False)
|
self.set_hexpand(False)
|
||||||
|
self._set_font_desc()
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
@@ -35,5 +36,13 @@ class MiniViewWidget(Map):
|
|||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
def _set_font_desc(self):
|
||||||
|
default_font = 'Monospace 1'
|
||||||
|
desc = Pango.FontDescription(default_font)
|
||||||
|
|
||||||
|
desc.set_size(Pango.SCALE) # Set size to 1pt
|
||||||
|
desc.set_family('BuilderBlocks,' + desc.get_family())
|
||||||
|
self.set_property('font-desc', desc)
|
||||||
|
|
||||||
def set_smini_view(self, source_view):
|
def set_smini_view(self, source_view):
|
||||||
self.set_view(source_view)
|
self.set_view(source_view)
|
||||||
@@ -13,9 +13,14 @@ class SourceBuffer(GtkSource.Buffer):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(SourceBuffer, self).__init__()
|
super(SourceBuffer, self).__init__()
|
||||||
|
|
||||||
|
self._handler_ids = []
|
||||||
self.is_processing_completion: bool = False
|
self.is_processing_completion: bool = False
|
||||||
|
|
||||||
self._handler_ids = []
|
self.create_tag(
|
||||||
|
"search-highlight",
|
||||||
|
background = "yellow",
|
||||||
|
foreground = "black"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def set_signals(
|
def set_signals(
|
||||||
|
|||||||
@@ -43,10 +43,29 @@ class SourceFile(GtkSource.File):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _changed(self, buffer: SourceBuffer):
|
def _changed(self, buffer: SourceBuffer):
|
||||||
event = Event_Factory.create_event("text_changed", buffer = buffer)
|
self.check_file_on_disk()
|
||||||
event.file = self
|
|
||||||
|
event = Event_Factory.create_event(
|
||||||
|
"text_changed",
|
||||||
|
file = self,
|
||||||
|
buffer = buffer
|
||||||
|
)
|
||||||
self.emit(event)
|
self.emit(event)
|
||||||
|
|
||||||
|
if self.is_deleted():
|
||||||
|
print("deleted")
|
||||||
|
# event = Event_Factory.create_event("file_deleted", buffer = buffer)
|
||||||
|
# event.file = self
|
||||||
|
# self.emit(event)
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.is_externally_modified():
|
||||||
|
print("is_externally_modified")
|
||||||
|
# event = Event_Factory.create_event("file_externally_modified", buffer = buffer)
|
||||||
|
# event.file = self
|
||||||
|
# self.emit(event)
|
||||||
|
return
|
||||||
|
|
||||||
def _insert_text(
|
def _insert_text(
|
||||||
self,
|
self,
|
||||||
buffer: SourceBuffer,
|
buffer: SourceBuffer,
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ class SourceView(GtkSource.View, SourceViewDnDMixin):
|
|||||||
ctx = self.get_style_context()
|
ctx = self.get_style_context()
|
||||||
|
|
||||||
ctx.add_class("source-view")
|
ctx.add_class("source-view")
|
||||||
ctx.add_class(f"px{self.zoom_level}")
|
|
||||||
|
|
||||||
self.set_vexpand(True)
|
self.set_vexpand(True)
|
||||||
self.set_bottom_margin(800)
|
self.set_bottom_margin(800)
|
||||||
@@ -59,6 +58,7 @@ class SourceView(GtkSource.View, SourceViewDnDMixin):
|
|||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
self.connect("drag-data-received", self._on_drag_data_received)
|
self.connect("drag-data-received", self._on_drag_data_received)
|
||||||
|
self.connect("populate-popup", self._on_populate_popup)
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
...
|
...
|
||||||
@@ -76,6 +76,37 @@ class SourceView(GtkSource.View, SourceViewDnDMixin):
|
|||||||
|
|
||||||
self._set_up_dnd()
|
self._set_up_dnd()
|
||||||
|
|
||||||
|
def _on_populate_popup(self, view, menu):
|
||||||
|
buffer = self.get_buffer()
|
||||||
|
language = buffer.get_language()
|
||||||
|
|
||||||
|
if language.get_id() == "json":
|
||||||
|
self._load_prettify_json(view, menu)
|
||||||
|
|
||||||
|
menu.show_all()
|
||||||
|
|
||||||
|
def _load_prettify_json(self, view, menu):
|
||||||
|
menu.append( Gtk.SeparatorMenuItem() )
|
||||||
|
|
||||||
|
def on_prettify_json(menuitem):
|
||||||
|
import json
|
||||||
|
|
||||||
|
buffer = self.get_buffer()
|
||||||
|
start_itr, \
|
||||||
|
end_itr = buffer.get_start_iter(), buffer.get_end_iter()
|
||||||
|
data = buffer.get_text(start_itr, end_itr, False)
|
||||||
|
text = json.dumps(json.loads(data), separators = (',', ':'), indent = 4)
|
||||||
|
|
||||||
|
buffer.begin_user_action()
|
||||||
|
buffer.delete(start_itr, end_itr)
|
||||||
|
buffer.insert(start_itr, text)
|
||||||
|
buffer.end_user_action()
|
||||||
|
|
||||||
|
item = Gtk.MenuItem(label = "Prettify JSON")
|
||||||
|
item.connect("activate", on_prettify_json)
|
||||||
|
menu.append(item)
|
||||||
|
|
||||||
|
|
||||||
def clear_temp_cut_buffer_delayed(self):
|
def clear_temp_cut_buffer_delayed(self):
|
||||||
if self._cut_temp_timeout_id:
|
if self._cut_temp_timeout_id:
|
||||||
GLib.source_remove(self._cut_temp_timeout_id)
|
GLib.source_remove(self._cut_temp_timeout_id)
|
||||||
|
|||||||
@@ -15,7 +15,11 @@ class TabWidget(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(TabWidget, self).__init__()
|
super(TabWidget, self).__init__()
|
||||||
|
|
||||||
|
self.file = None
|
||||||
|
|
||||||
self._close_tab = None
|
self._close_tab = None
|
||||||
|
self._handler_id = None
|
||||||
|
self._eve_handler_id = None
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
@@ -33,13 +37,15 @@ class TabWidget(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
self.event_box = Gtk.EventBox()
|
||||||
self.label = Gtk.Label()
|
self.label = Gtk.Label()
|
||||||
self.close_btn = Gtk.Button()
|
self.close_bttn = Gtk.Button()
|
||||||
icon = Gtk.Image(stock = Gtk.STOCK_CLOSE)
|
icon = Gtk.Image(stock = Gtk.STOCK_CLOSE)
|
||||||
|
|
||||||
|
self.event_box.set_above_child(True)
|
||||||
ctx = self.label.get_style_context()
|
ctx = self.label.get_style_context()
|
||||||
ctx.add_class("tab-label")
|
ctx.add_class("tab-label")
|
||||||
ctx = self.close_btn.get_style_context()
|
ctx = self.close_bttn.get_style_context()
|
||||||
ctx.add_class("tab-close-bttn")
|
ctx.add_class("tab-close-bttn")
|
||||||
|
|
||||||
self.label.set_xalign(0.0)
|
self.label.set_xalign(0.0)
|
||||||
@@ -47,14 +53,16 @@ class TabWidget(Gtk.Box):
|
|||||||
self.label.set_margin_right(25)
|
self.label.set_margin_right(25)
|
||||||
self.label.set_hexpand(True)
|
self.label.set_hexpand(True)
|
||||||
|
|
||||||
self.close_btn.add(icon)
|
self.close_bttn.add(icon)
|
||||||
self.add(self.label)
|
self.event_box.add(self.label)
|
||||||
self.add(self.close_btn)
|
self.add(self.event_box)
|
||||||
|
self.add(self.close_bttn)
|
||||||
|
|
||||||
self.show_all()
|
self.show_all()
|
||||||
|
|
||||||
def clear_signals_and_data(self):
|
def clear_signals_and_data(self):
|
||||||
self.close_btn.disconnect(self._handler_id)
|
self.close_bttn.disconnect(self._handler_id)
|
||||||
|
self.event_box.disconnect(self._eve_handler_id)
|
||||||
self._close_tab = None
|
self._close_tab = None
|
||||||
self._handler_id = None
|
self._handler_id = None
|
||||||
|
|
||||||
@@ -64,8 +72,8 @@ class TabWidget(Gtk.Box):
|
|||||||
child.destroy()
|
child.destroy()
|
||||||
|
|
||||||
def set_close_signal(self, callback):
|
def set_close_signal(self, callback):
|
||||||
self._handler_id = self.close_btn.connect(
|
self._handler_id = self.close_bttn.connect(
|
||||||
'button-release-event',
|
'clicked',
|
||||||
callback,
|
callback,
|
||||||
self.file
|
self.file
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
import gi
|
import gi
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
|
gi.require_version('Gdk', '3.0')
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
from gi.repository import Gdk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
@@ -23,7 +25,7 @@ class TabsWidget(Gtk.Notebook):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
...
|
self.set_scrollable(True)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
self.connect("page-added", self._page_added)
|
self.connect("page-added", self._page_added)
|
||||||
@@ -40,14 +42,16 @@ class TabsWidget(Gtk.Notebook):
|
|||||||
tab = self.get_tab_label(page_widget)
|
tab = self.get_tab_label(page_widget)
|
||||||
tab.set_close_signal(self._close_tab)
|
tab.set_close_signal(self._close_tab)
|
||||||
|
|
||||||
|
self._bind_tab_menu(tab, page_widget)
|
||||||
|
|
||||||
page_widget.show()
|
page_widget.show()
|
||||||
self.set_tab_detachable(page_widget, True)
|
self.set_tab_detachable(page_widget, True)
|
||||||
self.set_tab_reorderable(page_widget, True)
|
self.set_tab_reorderable(page_widget, True)
|
||||||
|
|
||||||
def _close_tab(self, tab, eve, file):
|
def _close_tab(self, button, file):
|
||||||
event = Event_Factory.create_event(
|
event = Event_Factory.create_event(
|
||||||
"remove_file",
|
"remove_file",
|
||||||
buffer = tab.get_parent().file.buffer
|
buffer = file.buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
self.message(event)
|
self.message(event)
|
||||||
@@ -73,3 +77,77 @@ class TabsWidget(Gtk.Notebook):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.handler_unblock(self.switch_page_id)
|
self.handler_unblock(self.switch_page_id)
|
||||||
|
|
||||||
|
def _bind_tab_menu(self, tab, page_widget):
|
||||||
|
def do_context_menu(tab, eve, page_widget):
|
||||||
|
if eve.type == Gdk.EventType.BUTTON_RELEASE and eve.button == 3: # r-click
|
||||||
|
menu = self.create_menu(page_widget)
|
||||||
|
menu.popup_at_pointer(eve)
|
||||||
|
|
||||||
|
tab._eve_handler_id = \
|
||||||
|
tab.event_box.connect(
|
||||||
|
"button-release-event",
|
||||||
|
do_context_menu,
|
||||||
|
page_widget
|
||||||
|
)
|
||||||
|
|
||||||
|
def create_menu(self, page_widget) -> Gtk.Menu:
|
||||||
|
context_menu = Gtk.Menu()
|
||||||
|
|
||||||
|
close_item = Gtk.MenuItem(label = "Close Tab")
|
||||||
|
close_left_item = Gtk.MenuItem(label = "Close Tabs Left")
|
||||||
|
close_right_item = Gtk.MenuItem(label = "Close Tabs Right")
|
||||||
|
close_other_item = Gtk.MenuItem(label = "Close Other Tabs")
|
||||||
|
close_all_item = Gtk.MenuItem(label = "Close All Tabs")
|
||||||
|
|
||||||
|
close_item.connect("activate", self.close_item, page_widget)
|
||||||
|
close_left_item.connect("activate", self.close_left_items, page_widget)
|
||||||
|
close_right_item.connect("activate", self.close_right_items, page_widget)
|
||||||
|
close_other_item.connect("activate", self.close_other_items, page_widget)
|
||||||
|
close_all_item.connect("activate", self.close_all_items, page_widget)
|
||||||
|
|
||||||
|
context_menu.append(close_item)
|
||||||
|
context_menu.append(close_left_item)
|
||||||
|
context_menu.append(close_right_item)
|
||||||
|
context_menu.append(close_other_item)
|
||||||
|
context_menu.append(close_all_item)
|
||||||
|
|
||||||
|
context_menu.show_all()
|
||||||
|
|
||||||
|
return context_menu
|
||||||
|
|
||||||
|
|
||||||
|
def close_item(self, menu_item, page_widget):
|
||||||
|
tab = self.get_tab_label(page_widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|
||||||
|
def close_left_items(self, menu_item, page_widget):
|
||||||
|
children = self.get_children()
|
||||||
|
i = children.index(page_widget)
|
||||||
|
|
||||||
|
if i == 0: return
|
||||||
|
|
||||||
|
for widget in children[ : i]:
|
||||||
|
tab = self.get_tab_label(widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|
||||||
|
def close_right_items(self, menu_item, page_widget):
|
||||||
|
children = self.get_children()
|
||||||
|
i = children.index(page_widget) + 1
|
||||||
|
|
||||||
|
if i == len(children): return
|
||||||
|
|
||||||
|
for widget in children[i : ]:
|
||||||
|
tab = self.get_tab_label(widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|
||||||
|
def close_other_items(self, menu_item, page_widget):
|
||||||
|
self.close_left_items(menu_item, page_widget)
|
||||||
|
self.close_right_items(menu_item, page_widget)
|
||||||
|
|
||||||
|
def close_all_items(self, menu_item, page_widget):
|
||||||
|
children = self.get_children()
|
||||||
|
|
||||||
|
for widget in children[ : ]:
|
||||||
|
tab = self.get_tab_label(widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class VteWidget(Vte.Terminal):
|
|||||||
ctx.add_class("vte-widget")
|
ctx.add_class("vte-widget")
|
||||||
|
|
||||||
self.set_clear_background(False)
|
self.set_clear_background(False)
|
||||||
|
self.set_hexpand(True)
|
||||||
self.set_enable_sixel(True)
|
self.set_enable_sixel(True)
|
||||||
self.set_cursor_shape( Vte.CursorShape.IBEAM )
|
self.set_cursor_shape( Vte.CursorShape.IBEAM )
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -5,8 +5,9 @@
|
|||||||
|
|
||||||
from .code_event import CodeEvent
|
from .code_event import CodeEvent
|
||||||
from .register_provider_event import RegisterProviderEvent
|
from .register_provider_event import RegisterProviderEvent
|
||||||
|
from .register_command_event import RegisterCommandEvent
|
||||||
|
|
||||||
from .get_command_system_event import GetCommandSystemEvent
|
from .get_new_command_system_event import GetNewCommandSystemEvent
|
||||||
from .request_completion_event import RequestCompletionEvent
|
from .request_completion_event import RequestCompletionEvent
|
||||||
from .cursor_moved_event import CursorMovedEvent
|
from .cursor_moved_event import CursorMovedEvent
|
||||||
from .modified_changed_event import ModifiedChangedEvent
|
from .modified_changed_event import ModifiedChangedEvent
|
||||||
|
|||||||
@@ -9,5 +9,5 @@ from .code_event import CodeEvent
|
|||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class GetCommandSystemEvent(CodeEvent):
|
class GetNewCommandSystemEvent(CodeEvent):
|
||||||
...
|
...
|
||||||
20
src/libs/dto/code/register_command_event.py
Normal file
20
src/libs/dto/code/register_command_event.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
import gi
|
||||||
|
gi.require_version('GtkSource', '4')
|
||||||
|
|
||||||
|
from gi.repository import GtkSource
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from ..base_event import BaseEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RegisterCommandEvent(BaseEvent):
|
||||||
|
command_name: str = ""
|
||||||
|
command: callable = None
|
||||||
|
binding_mode: str = ""
|
||||||
|
binding: str = ""
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -14,10 +14,7 @@ class InvalidPluginException(Exception):
|
|||||||
class PluginsControllerMixin:
|
class PluginsControllerMixin:
|
||||||
|
|
||||||
def requests_ui_element(self, target_id: str):
|
def requests_ui_element(self, target_id: str):
|
||||||
builder = settings_manager.get_builder()
|
if not target_id in widget_registery.objects:
|
||||||
ui_target = builder.get_object(target_id)
|
raise InvalidPluginException('Unknown UI "target_id" given in requests.')
|
||||||
|
|
||||||
if not ui_target:
|
return widget_registery.objects[target_id]
|
||||||
raise InvalidPluginException('Unknown "target_id" given in requests.')
|
|
||||||
|
|
||||||
return ui_target
|
|
||||||
|
|||||||
@@ -1,21 +1,47 @@
|
|||||||
/* ---- Overrides ---- */
|
/* ==============================
|
||||||
|
Light Blue-Grey Glass Theme
|
||||||
|
============================== */
|
||||||
|
|
||||||
|
/* -------- Color Variables -------- */
|
||||||
|
@define-color bg_glass rgba(30, 36, 46, 0.65);
|
||||||
|
@define-color bg_soft rgba(45, 52, 64, 0.55);
|
||||||
|
@define-color accent_blue #6fa8dc;
|
||||||
|
@define-color accent_blue_transparent rgba(111, 168, 220, 0.64);
|
||||||
|
@define-color accent_orange #ffa500;
|
||||||
|
@define-color accent_red #c84646;
|
||||||
|
@define-color accent_green #88cc27;
|
||||||
|
@define-color text_primary #e6edf3;
|
||||||
|
@define-color text_dim rgba(230, 237, 243, 0.7);
|
||||||
|
@define-color border_soft rgba(255, 255, 255, 0.08);
|
||||||
|
|
||||||
|
|
||||||
|
/* -------- Text Selection -------- */
|
||||||
text selection {
|
text selection {
|
||||||
background-color: #44475a;
|
background-color: @accent_blue_transparent;
|
||||||
color: #FFA500;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---- Make most desired things base transparent ---- */
|
|
||||||
|
/* -------- Transparent Base Areas -------- */
|
||||||
popover,
|
popover,
|
||||||
popover > box,
|
popover > box,
|
||||||
notebook,
|
notebook,
|
||||||
header,
|
header,
|
||||||
stack {
|
stack,
|
||||||
background: rgba(0, 0, 0, 0.0);
|
.main-window,
|
||||||
color: rgba(255, 255, 255, 1);
|
.base-container,
|
||||||
|
.body-container,
|
||||||
|
.center-container,
|
||||||
|
.header-container,
|
||||||
|
.footer-container,
|
||||||
|
.left-container,
|
||||||
|
.right-container {
|
||||||
|
background: transparent;
|
||||||
|
color: @text_primary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The scrolled window itself */
|
/* -------- Scrollable Areas -------- */
|
||||||
scrolledwindow,
|
scrolledwindow,
|
||||||
scrolledwindow viewport,
|
scrolledwindow viewport,
|
||||||
textview,
|
textview,
|
||||||
@@ -23,249 +49,120 @@ textview text {
|
|||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollbar {
|
|
||||||
background-color: #2a2a2a;
|
/* -------- Borders -------- */
|
||||||
|
border {
|
||||||
|
background: @bg_glass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------- Scrollbar Styling -------- */
|
||||||
|
scrollbar {
|
||||||
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The track */
|
|
||||||
scrollbar trough {
|
scrollbar trough {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
/*background-color: #2a2a2a;*/
|
border-radius: 8px;
|
||||||
border-radius: 6px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The draggable handle */
|
|
||||||
scrollbar slider {
|
scrollbar slider {
|
||||||
background-color: #555;
|
background-color: rgba(255, 255, 255, 0.18);
|
||||||
border-radius: 6px;
|
border-radius: 8px;
|
||||||
min-width: 10px;
|
min-width: 10px;
|
||||||
min-height: 10px;
|
min-height: 10px;
|
||||||
|
transition: 120ms ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollbar slider:hover {
|
scrollbar slider:hover {
|
||||||
background-color: #777;
|
background-color: rgba(255, 255, 255, 0.30);
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollbar slider:active {
|
scrollbar slider:active {
|
||||||
background-color: #999;
|
background-color: @accent_blue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
border {
|
/* -------- Mini View -------- */
|
||||||
background: rgba(39, 43, 52, 0.84);
|
|
||||||
}
|
|
||||||
|
|
||||||
tab {
|
|
||||||
color: rgba(255, 255, 255, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
tab:checked {
|
|
||||||
border-bottom-color: rgba(125, 125, 125, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.main-window,
|
|
||||||
.base-container,
|
|
||||||
.body-container,
|
|
||||||
.center-container,
|
|
||||||
.header-container,
|
|
||||||
.footer-container,
|
|
||||||
.left-containerm,
|
|
||||||
.right-container {
|
|
||||||
background: rgba(0, 0, 0, 0.0);
|
|
||||||
color: rgba(255, 255, 255, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* the mini view container of text */
|
|
||||||
.mini-view > text {
|
.mini-view > text {
|
||||||
background: rgba(39, 43, 52, 0.64);
|
background: @bg_soft;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draggable overlay of the miniview */
|
|
||||||
.mini-view > * {
|
.mini-view > * {
|
||||||
background-color: rgba(124, 124, 124, 0.34);
|
background-color: rgba(255, 255, 255, 0.08);
|
||||||
color: rgba(255, 255, 255, 1);
|
color: @text_primary;
|
||||||
font-size: 1px;
|
font-size: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------- Layout Adjustments -------- */
|
||||||
.base-container {
|
.base-container {
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------- Focus State -------- */
|
||||||
.source-view-focused {
|
.source-view-focused {
|
||||||
border-style: solid;
|
border: 1px solid @accent_blue;
|
||||||
border-color: white;
|
|
||||||
border-width: 0.05em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-widget {
|
|
||||||
padding-left: 0.2em;
|
|
||||||
padding-right: 0.2em;
|
|
||||||
margin-right: 0.8em;
|
|
||||||
|
|
||||||
border-top-style: solid;
|
|
||||||
border-top-color: rgba(255, 255, 255, 0.64);
|
|
||||||
border-top-width: 2px;
|
|
||||||
|
|
||||||
border-left-style: solid;
|
|
||||||
border-left-color: rgba(255, 255, 255, 0.64);
|
|
||||||
border-left-width: 2px;
|
|
||||||
|
|
||||||
border-right-style: solid;
|
|
||||||
border-right-color: rgba(255, 255, 255, 0.64);
|
|
||||||
border-right-width: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/* -------- Tabs -------- */
|
||||||
.tab-label {
|
.tab-label {
|
||||||
margin-left: 2em;
|
margin-left: 2em;
|
||||||
margin-right: 2em;
|
margin-right: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-close-bttn {
|
.tab-close-bttn {
|
||||||
background: rgba(116, 0, 0, 0.64);
|
background: rgba(200, 70, 70, 0.35);
|
||||||
border-color: rgba(0, 0, 0, 0.64);
|
border: 1px solid rgba(0, 0, 0, 0.4);
|
||||||
color: rgba(255, 255, 255, 0.64);
|
color: #ffffff;
|
||||||
border-style: solid;
|
transition: 120ms ease-in-out;
|
||||||
border-width: 1px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab-close-bttn:hover {
|
.tab-close-bttn:hover {
|
||||||
background: rgba(256, 0, 0, 0.64);
|
background: @accent_red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------- File States -------- */
|
||||||
.file-changed {
|
.file-changed {
|
||||||
color: rgba(255, 168, 0, 0.64);
|
color: @accent_orange;
|
||||||
}
|
}
|
||||||
|
|
||||||
.file-deleted {
|
.file-deleted {
|
||||||
color: rgba(255, 0, 0, 0.64);
|
color: @accent_red;
|
||||||
}
|
}
|
||||||
|
|
||||||
.error-txt { color: rgb(170, 18, 18); }
|
|
||||||
.warning-txt { color: rgb(255, 168, 0); }
|
/* -------- Search States -------- */
|
||||||
.success-txt { color: rgb(136, 204, 39); }
|
.searching,
|
||||||
|
.search-success,
|
||||||
|
.search-fail {
|
||||||
|
border: 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.searching {
|
||||||
|
border-color: @accent_blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-success {
|
||||||
|
background: rgba(136, 204, 39, 0.15);
|
||||||
|
border-color: @accent_green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-fail {
|
||||||
|
background: rgba(200, 70, 70, 0.15);
|
||||||
|
border-color: @accent_red;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------- Message Colors -------- */
|
||||||
|
.error-txt { color: @accent_red; }
|
||||||
|
.warning-txt { color: @accent_orange; }
|
||||||
|
.success-txt { color: @accent_green; }
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
Need these because updating buffer with get_tag_table and tags updates minimap to the same size due to its mapping structure...
|
|
||||||
I've tried initial looks at:
|
|
||||||
https://github.com/johnfactotum/gedit-restore-minimap
|
|
||||||
which is re-adding minimap to gedit and they just used the below code snippit which still didn't work for me.
|
|
||||||
|
|
||||||
desc = Pango.FontDescription(default_font)
|
|
||||||
desc.set_size(Pango.SCALE) # set size to 1pt
|
|
||||||
desc.set_family('BuilderBlocks,' + desc.get_family())
|
|
||||||
self.source_map.set_property('font-desc', desc)
|
|
||||||
|
|
||||||
So now we do this monstrocity until I can figure out what is needed to make something better work.
|
|
||||||
|
|
||||||
*/
|
|
||||||
.px1 { font-size: 1px; }
|
|
||||||
.px2 { font-size: 2px; }
|
|
||||||
.px3 { font-size: 3px; }
|
|
||||||
.px4 { font-size: 4px; }
|
|
||||||
.px5 { font-size: 5px; }
|
|
||||||
.px6 { font-size: 6px; }
|
|
||||||
.px7 { font-size: 7px; }
|
|
||||||
.px8 { font-size: 8px; }
|
|
||||||
.px9 { font-size: 9px; }
|
|
||||||
.px10 { font-size: 10px; }
|
|
||||||
.px11 { font-size: 11px; }
|
|
||||||
.px12 { font-size: 12px; }
|
|
||||||
.px13 { font-size: 13px; }
|
|
||||||
.px14 { font-size: 14px; }
|
|
||||||
.px15 { font-size: 15px; }
|
|
||||||
.px16 { font-size: 16px; }
|
|
||||||
.px17 { font-size: 17px; }
|
|
||||||
.px18 { font-size: 18px; }
|
|
||||||
.px19 { font-size: 19px; }
|
|
||||||
.px20 { font-size: 20px; }
|
|
||||||
.px21 { font-size: 21px; }
|
|
||||||
.px22 { font-size: 22px; }
|
|
||||||
.px23 { font-size: 23px; }
|
|
||||||
.px24 { font-size: 24px; }
|
|
||||||
.px25 { font-size: 25px; }
|
|
||||||
.px26 { font-size: 26px; }
|
|
||||||
.px27 { font-size: 27px; }
|
|
||||||
.px28 { font-size: 28px; }
|
|
||||||
.px29 { font-size: 29px; }
|
|
||||||
.px30 { font-size: 30px; }
|
|
||||||
.px31 { font-size: 31px; }
|
|
||||||
.px32 { font-size: 32px; }
|
|
||||||
.px33 { font-size: 33px; }
|
|
||||||
.px34 { font-size: 34px; }
|
|
||||||
.px35 { font-size: 35px; }
|
|
||||||
.px36 { font-size: 36px; }
|
|
||||||
.px37 { font-size: 37px; }
|
|
||||||
.px38 { font-size: 38px; }
|
|
||||||
.px39 { font-size: 39px; }
|
|
||||||
.px40 { font-size: 40px; }
|
|
||||||
.px41 { font-size: 41px; }
|
|
||||||
.px42 { font-size: 42px; }
|
|
||||||
.px43 { font-size: 43px; }
|
|
||||||
.px44 { font-size: 44px; }
|
|
||||||
.px45 { font-size: 45px; }
|
|
||||||
.px46 { font-size: 46px; }
|
|
||||||
.px47 { font-size: 47px; }
|
|
||||||
.px48 { font-size: 48px; }
|
|
||||||
.px49 { font-size: 49px; }
|
|
||||||
.px50 { font-size: 50px; }
|
|
||||||
.px51 { font-size: 51px; }
|
|
||||||
.px52 { font-size: 52px; }
|
|
||||||
.px53 { font-size: 53px; }
|
|
||||||
.px54 { font-size: 54px; }
|
|
||||||
.px55 { font-size: 55px; }
|
|
||||||
.px56 { font-size: 56px; }
|
|
||||||
.px57 { font-size: 57px; }
|
|
||||||
.px58 { font-size: 58px; }
|
|
||||||
.px59 { font-size: 59px; }
|
|
||||||
.px60 { font-size: 60px; }
|
|
||||||
.px61 { font-size: 61px; }
|
|
||||||
.px62 { font-size: 62px; }
|
|
||||||
.px63 { font-size: 63px; }
|
|
||||||
.px64 { font-size: 64px; }
|
|
||||||
.px65 { font-size: 65px; }
|
|
||||||
.px66 { font-size: 66px; }
|
|
||||||
.px67 { font-size: 67px; }
|
|
||||||
.px68 { font-size: 68px; }
|
|
||||||
.px69 { font-size: 69px; }
|
|
||||||
.px70 { font-size: 70px; }
|
|
||||||
.px71 { font-size: 71px; }
|
|
||||||
.px72 { font-size: 72px; }
|
|
||||||
.px73 { font-size: 73px; }
|
|
||||||
.px74 { font-size: 74px; }
|
|
||||||
.px75 { font-size: 75px; }
|
|
||||||
.px76 { font-size: 76px; }
|
|
||||||
.px77 { font-size: 77px; }
|
|
||||||
.px78 { font-size: 78px; }
|
|
||||||
.px79 { font-size: 79px; }
|
|
||||||
.px80 { font-size: 80px; }
|
|
||||||
.px81 { font-size: 81px; }
|
|
||||||
.px82 { font-size: 82px; }
|
|
||||||
.px83 { font-size: 83px; }
|
|
||||||
.px84 { font-size: 84px; }
|
|
||||||
.px85 { font-size: 85px; }
|
|
||||||
.px86 { font-size: 86px; }
|
|
||||||
.px87 { font-size: 87px; }
|
|
||||||
.px88 { font-size: 88px; }
|
|
||||||
.px89 { font-size: 89px; }
|
|
||||||
.px90 { font-size: 90px; }
|
|
||||||
.px91 { font-size: 91px; }
|
|
||||||
.px92 { font-size: 92px; }
|
|
||||||
.px93 { font-size: 93px; }
|
|
||||||
.px94 { font-size: 94px; }
|
|
||||||
.px95 { font-size: 95px; }
|
|
||||||
.px96 { font-size: 96px; }
|
|
||||||
.px97 { font-size: 97px; }
|
|
||||||
.px98 { font-size: 98px; }
|
|
||||||
.px99 { font-size: 99px; }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.mw_transparency_1 { background: rgba(39, 43, 52, 0.1); }
|
.mw_transparency_1 { background: rgba(39, 43, 52, 0.1); }
|
||||||
|
|||||||
Reference in New Issue
Block a user