Compare commits
2 Commits
356818b98c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| ff27fbdf6c | |||
| 619fae8a20 |
@@ -10,19 +10,19 @@ class Manifest:
|
|||||||
author: str = "John Doe"
|
author: str = "John Doe"
|
||||||
version: str = "0.0.1"
|
version: str = "0.0.1"
|
||||||
support: str = ""
|
support: str = ""
|
||||||
pre_launch: bool = False
|
|
||||||
requests: {} = {
|
requests: {} = {
|
||||||
'pass_ui_objects': ["plugin_control_list"],
|
'pass_ui_objects': ["plugin_control_list"],
|
||||||
'pass_events': True,
|
'pass_events': "true",
|
||||||
'bind_keys': []
|
'bind_keys': []
|
||||||
}
|
}
|
||||||
|
pre_launch: bool = False
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Requests
|
### Requests
|
||||||
```
|
```
|
||||||
requests: {} = {
|
requests: {} = {
|
||||||
'pass_events': true, # If empty or not present will be ignored.
|
'pass_events': "true", # If empty or not present will be ignored.
|
||||||
"pass_ui_objects": [""], # Request reference to a UI component. Will be passed back as array to plugin.
|
"pass_ui_objects": [""], # Request reference to a UI component. Will be passed back as array to plugin.
|
||||||
'bind_keys': [f"{name}||send_message:<Control>f"],
|
'bind_keys': [f"{name}||send_message:<Control>f"],
|
||||||
f"{name}||do_save:<Control>s"] # Bind keys with method and key pare using list. Must pass "name" like shown with delimiter to its right.
|
f"{name}||do_save:<Control>s"] # Bind keys with method and key pare using list. Must pass "name" like shown with delimiter to its right.
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
{
|
{
|
||||||
|
"manifest": {
|
||||||
"name": "Example Plugin",
|
"name": "Example Plugin",
|
||||||
"author": "John Doe",
|
"author": "John Doe",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"support": "",
|
"support": "",
|
||||||
"requests": {
|
"requests": {
|
||||||
|
"ui_target": "plugin_control_list",
|
||||||
|
"pass_events": "true",
|
||||||
"bind_keys": ["Example Plugin||send_message:<Control>f"]
|
"bind_keys": ["Example Plugin||send_message:<Control>f"]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
# Python imports
|
# Python imports
|
||||||
|
import os
|
||||||
|
import threading
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
|
||||||
# Lib imports
|
# Lib imports
|
||||||
import gi
|
import gi
|
||||||
@@ -6,36 +10,42 @@ 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 plugins.plugin_base import PluginBase
|
from plugins.plugin_base import PluginBase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# NOTE: Threads WILL NOT die with parent's destruction.
|
||||||
|
def threaded(fn):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=False).start()
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
# NOTE: Threads WILL die with parent's destruction.
|
||||||
|
def daemon_threaded(fn):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start()
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Plugin(PluginBase):
|
class Plugin(PluginBase):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(Plugin, self).__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
self.name = "Example Plugin" # NOTE: Need to remove after establishing private bidirectional 1-1 message bus
|
||||||
|
# where self.name should not be needed for message comms
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: BaseEvent):
|
def generate_reference_ui_element(self):
|
||||||
...
|
button = Gtk.Button(label=self.name)
|
||||||
|
button.connect("button-release-event", self.send_message)
|
||||||
def load(self):
|
return button
|
||||||
ui_element = self.requests_ui_element("plugin_control_list")
|
|
||||||
ui_element.add( self.generate_plugin_element() )
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
def generate_plugin_element(self):
|
def send_message(self, widget=None, eve=None):
|
||||||
button = Gtk.Button(label = self.name)
|
|
||||||
|
|
||||||
button.connect("button-release-event", self.send_message)
|
|
||||||
button.show()
|
|
||||||
|
|
||||||
return button
|
|
||||||
|
|
||||||
def send_message(self, widget = None, eve = None):
|
|
||||||
message = "Hello, World!"
|
message = "Hello, World!"
|
||||||
self.emit("display_message", ("warning", message, None))
|
event_system.emit("display_message", ("warning", message, None))
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"reportDuplicateImport": true,
|
"reportDuplicateImport": true,
|
||||||
"executionEnvironments": [
|
"executionEnvironments": [
|
||||||
{
|
{
|
||||||
"root": "./src/"
|
"root": "./src/versions/solarfm-0.0.1/solarfm"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"venvPath": ".",
|
"venvPath": ".",
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ import sys
|
|||||||
# Application imports
|
# Application imports
|
||||||
# from libs.db import DB
|
# from libs.db import DB
|
||||||
from libs.event_system import EventSystem
|
from libs.event_system import EventSystem
|
||||||
|
from libs.endpoint_registry import EndpointRegistry
|
||||||
from libs.keybindings import Keybindings
|
from libs.keybindings import Keybindings
|
||||||
from libs.logger import Logger
|
from libs.logger import Logger
|
||||||
from libs.settings.manager import SettingsManager
|
from libs.settings.manager import SettingsManager
|
||||||
from libs.widget_registery import WidgetRegisteryController
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -34,8 +34,12 @@ def daemon_threaded_wrapper(fn):
|
|||||||
|
|
||||||
def call_chain_wrapper(fn):
|
def call_chain_wrapper(fn):
|
||||||
def wrapper(*args, **kwargs):
|
def wrapper(*args, **kwargs):
|
||||||
|
print()
|
||||||
|
print()
|
||||||
for line in traceback.format_stack():
|
for line in traceback.format_stack():
|
||||||
print( line.strip() )
|
print( line.strip() )
|
||||||
|
print()
|
||||||
|
print()
|
||||||
|
|
||||||
return fn(*args, **kwargs)
|
return fn(*args, **kwargs)
|
||||||
return wrapper
|
return wrapper
|
||||||
@@ -47,16 +51,17 @@ builtins.APP_NAME = "<change_me>"
|
|||||||
|
|
||||||
builtins.keybindings = Keybindings()
|
builtins.keybindings = Keybindings()
|
||||||
builtins.event_system = EventSystem()
|
builtins.event_system = EventSystem()
|
||||||
|
builtins.endpoint_registry = EndpointRegistry()
|
||||||
builtins.settings_manager = SettingsManager()
|
builtins.settings_manager = SettingsManager()
|
||||||
builtins.widget_registery = WidgetRegisteryController()
|
|
||||||
# builtins.db = DB()
|
# builtins.db = DB()
|
||||||
|
|
||||||
settings_manager.load_settings()
|
settings_manager.load_settings()
|
||||||
|
|
||||||
|
builtins.settings = settings_manager.settings
|
||||||
builtins.logger = Logger(
|
builtins.logger = Logger(
|
||||||
settings_manager.path_manager.get_home_config_path(), \
|
settings_manager.get_home_config_path(), \
|
||||||
_ch_log_lvl = settings_manager.settings.debugging.ch_log_lvl, \
|
_ch_log_lvl = settings.debugging.ch_log_lvl, \
|
||||||
_fh_log_lvl = settings_manager.settings.debugging.fh_log_lvl
|
_fh_log_lvl = settings.debugging.fh_log_lvl
|
||||||
).get_logger()
|
).get_logger()
|
||||||
|
|
||||||
builtins.threaded = threaded_wrapper
|
builtins.threaded = threaded_wrapper
|
||||||
|
|||||||
27
src/app.py
27
src/app.py
@@ -23,14 +23,13 @@ class Application:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(Application, self).__init__()
|
super(Application, self).__init__()
|
||||||
|
|
||||||
|
if not settings_manager.is_trace_debug():
|
||||||
|
self.load_ipc()
|
||||||
|
|
||||||
self.setup_debug_hook()
|
self.setup_debug_hook()
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
if not settings_manager.is_trace_debug():
|
|
||||||
if not self.load_ipc():
|
|
||||||
return
|
|
||||||
|
|
||||||
win = Window()
|
win = Window()
|
||||||
win.start()
|
win.start()
|
||||||
|
|
||||||
@@ -40,31 +39,23 @@ class Application:
|
|||||||
ipc_server = IPCServer()
|
ipc_server = IPCServer()
|
||||||
|
|
||||||
self.ipc_realization_check(ipc_server)
|
self.ipc_realization_check(ipc_server)
|
||||||
if ipc_server.is_ipc_alive:
|
if not ipc_server.is_ipc_alive:
|
||||||
return True
|
|
||||||
|
|
||||||
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}"
|
||||||
ipc_server.send_ipc_message(message)
|
ipc_server.send_ipc_message(message)
|
||||||
|
|
||||||
if os.path.isdir(arg):
|
raise AppLaunchException(f"{APP_NAME} IPC Server Exists: Have sent path(s) to it and closing...")
|
||||||
message = f"DIR|{arg}"
|
|
||||||
ipc_server.send_ipc_message(message)
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def ipc_realization_check(self, ipc_server):
|
def ipc_realization_check(self, ipc_server):
|
||||||
try:
|
try:
|
||||||
ipc_server.create_ipc_listener()
|
ipc_server.create_ipc_listener()
|
||||||
except (OSError, PermissionError) as e:
|
except Exception:
|
||||||
logger.info(f"IPC listener creation failed: {e}, falling back to test message")
|
|
||||||
ipc_server.send_test_ipc_message()
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Unexpected IPC setup error: {e}")
|
|
||||||
ipc_server.send_test_ipc_message()
|
ipc_server.send_test_ipc_message()
|
||||||
|
|
||||||
|
with suppress(Exception):
|
||||||
|
ipc_server.create_ipc_listener()
|
||||||
|
|
||||||
def setup_debug_hook(self):
|
def setup_debug_hook(self):
|
||||||
# Typically: ValueError: signal only works in main thread
|
# Typically: ValueError: signal only works in main thread
|
||||||
with suppress(ValueError):
|
with suppress(ValueError):
|
||||||
|
|||||||
33
src/core/builder_wrapper.py
Normal file
33
src/core/builder_wrapper.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
import gi
|
||||||
|
gi.require_version('Gtk', '3.0')
|
||||||
|
from gi.repository import Gtk
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class BuilderWrapper(Gtk.Builder):
|
||||||
|
"""docstring for BuilderWrapper."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(BuilderWrapper, self).__init__()
|
||||||
|
|
||||||
|
self.objects = {}
|
||||||
|
|
||||||
|
def get_object(self, id: str, use_gtk: bool = True) -> any:
|
||||||
|
if not use_gtk:
|
||||||
|
return self.objects[id]
|
||||||
|
|
||||||
|
return super(BuilderWrapper, self).get_object(id)
|
||||||
|
|
||||||
|
def expose_object(self, id: str, object: any, use_gtk: bool = True) -> None:
|
||||||
|
if not use_gtk:
|
||||||
|
self.objects[id] = object
|
||||||
|
else:
|
||||||
|
super(BuilderWrapper, self).expose_object(id, object)
|
||||||
|
|
||||||
|
def dereference_object(self, id: str) -> None:
|
||||||
|
del self.objects[id]
|
||||||
@@ -16,6 +16,8 @@ class BaseContainer(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(BaseContainer, self).__init__()
|
super(BaseContainer, self).__init__()
|
||||||
|
|
||||||
|
self.ctx = self.get_style_context()
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
@@ -25,10 +27,8 @@ class BaseContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("base-container")
|
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||||
|
self.ctx.add_class("base-container")
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
@@ -38,12 +38,12 @@ 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):
|
||||||
self.add( HeaderContainer() )
|
self.add(HeaderContainer())
|
||||||
self.add( BodyContainer() )
|
self.add(BodyContainer())
|
||||||
self.add( FooterContainer() )
|
self.add(FooterContainer())
|
||||||
|
|
||||||
def _update_transparency(self):
|
def _update_transparency(self):
|
||||||
self.ctx.add_class(f"mw_transparency_{settings_manager.settings.theming.transparency}")
|
self.ctx.add_class(f"mw_transparency_{settings.theming.transparency}")
|
||||||
|
|
||||||
def _remove_transparency(self):
|
def _remove_transparency(self):
|
||||||
self.ctx.remove_class(f"mw_transparency_{settings_manager.settings.theming.transparency}")
|
self.ctx.remove_class(f"mw_transparency_{settings.theming.transparency}")
|
||||||
@@ -16,6 +16,8 @@ class BodyContainer(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(BodyContainer, self).__init__()
|
super(BodyContainer, self).__init__()
|
||||||
|
|
||||||
|
self.ctx = self.get_style_context()
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
@@ -25,10 +27,8 @@ class BodyContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("body-container")
|
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
||||||
|
self.ctx.add_class("body-container")
|
||||||
self.set_homogeneous(True)
|
self.set_homogeneous(True)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
@@ -37,7 +37,8 @@ class BodyContainer(Gtk.Box):
|
|||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
self.add( LeftContainer() )
|
self.add(LeftContainer())
|
||||||
self.add( CenterContainer() )
|
self.add(CenterContainer())
|
||||||
self.add( RightContainer() )
|
self.add(RightContainer())
|
||||||
@@ -14,6 +14,7 @@ class CenterContainer(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(CenterContainer, self).__init__()
|
super(CenterContainer, self).__init__()
|
||||||
|
|
||||||
|
self._builder = settings_manager.get_builder()
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
@@ -24,13 +25,14 @@ class CenterContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("center-container")
|
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||||
|
|
||||||
self.set_hexpand(True)
|
self.set_hexpand(True)
|
||||||
self.set_vexpand(True)
|
self.set_vexpand(True)
|
||||||
|
|
||||||
|
ctx = self.get_style_context()
|
||||||
|
ctx.add_class("center-container")
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
@@ -38,7 +40,7 @@ class CenterContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
glade_box = widget_registery.get_object("glade_box")
|
glade_box = self._builder.get_object("glade_box")
|
||||||
button = Gtk.Button(label = "Click Me!")
|
button = Gtk.Button(label = "Click Me!")
|
||||||
|
|
||||||
button.connect("clicked", self._hello_world)
|
button.connect("clicked", self._hello_world)
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
"""
|
|
||||||
Containers Package
|
|
||||||
"""
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ...widgets.code.code_base import CodeBase
|
|
||||||
|
|
||||||
from ...widgets.separator_widget import Separator
|
|
||||||
from ...widgets.code.mini_view_widget import MiniViewWidget
|
|
||||||
|
|
||||||
from .editors_container import EditorsContainer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CodeContainer(Gtk.Box):
|
|
||||||
def __init__(self):
|
|
||||||
super(CodeContainer, self).__init__()
|
|
||||||
|
|
||||||
self._setup_styling()
|
|
||||||
self._setup_signals()
|
|
||||||
self._subscribe_to_events()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
|
||||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
code_base = CodeBase()
|
|
||||||
|
|
||||||
self.add( self._create_tabs_widgets(code_base) )
|
|
||||||
self.add( self._create_editor_widget(code_base) )
|
|
||||||
|
|
||||||
def _create_tabs_widgets(self, code_base: CodeBase):
|
|
||||||
scrolled_window = Gtk.ScrolledWindow()
|
|
||||||
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):
|
|
||||||
editors_container = Gtk.Box()
|
|
||||||
|
|
||||||
editors_container.add( Separator("separator_left") )
|
|
||||||
editors_container.add( EditorsContainer(code_base) )
|
|
||||||
editors_container.add( Separator("separator_right") )
|
|
||||||
editors_container.add( code_base.get_mini_view_widget() )
|
|
||||||
|
|
||||||
return editors_container
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from gi.repository import GLib
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class EditorsContainer(Gtk.Paned):
|
|
||||||
def __init__(self, code_base: any):
|
|
||||||
super(EditorsContainer, self).__init__()
|
|
||||||
|
|
||||||
self.code_base = code_base
|
|
||||||
|
|
||||||
self._setup_styling()
|
|
||||||
self._setup_signals()
|
|
||||||
self._subscribe_to_events()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("paned-editors-container")
|
|
||||||
|
|
||||||
self.set_hexpand(True)
|
|
||||||
self.set_vexpand(True)
|
|
||||||
self.set_wide_handle(True)
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
self.map_id = self.connect("map", self._init_map)
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
self.scrolled_win1, \
|
|
||||||
self.scrolled_win2 = self._create_views()
|
|
||||||
|
|
||||||
self.pack1( self.scrolled_win1, True, True )
|
|
||||||
self.pack2( self.scrolled_win2, True, True )
|
|
||||||
|
|
||||||
def _create_views(self):
|
|
||||||
scrolled_win1 = Gtk.ScrolledWindow()
|
|
||||||
scrolled_win2 = Gtk.ScrolledWindow()
|
|
||||||
|
|
||||||
source_view1 = self.code_base.create_source_view()
|
|
||||||
source_view2 = self.code_base.create_source_view()
|
|
||||||
|
|
||||||
source_view1.sibling_right = source_view2
|
|
||||||
source_view2.sibling_left = source_view1
|
|
||||||
|
|
||||||
scrolled_win1.add( source_view1 )
|
|
||||||
scrolled_win2.add( source_view2 )
|
|
||||||
|
|
||||||
return scrolled_win1, scrolled_win2
|
|
||||||
|
|
||||||
def _init_map(self, view):
|
|
||||||
def _first_show_init():
|
|
||||||
self.disconnect(self.map_id)
|
|
||||||
del self.map_id
|
|
||||||
|
|
||||||
self.code_base.first_map_load()
|
|
||||||
|
|
||||||
del self.code_base
|
|
||||||
return False
|
|
||||||
|
|
||||||
GLib.timeout_add(100, _first_show_init)
|
|
||||||
@@ -6,7 +6,6 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from .code.code_container import CodeContainer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -14,6 +13,8 @@ class FooterContainer(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(FooterContainer, self).__init__()
|
super(FooterContainer, self).__init__()
|
||||||
|
|
||||||
|
self.ctx = self.get_style_context()
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
@@ -23,17 +24,18 @@ class FooterContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("footer-container")
|
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
||||||
|
|
||||||
self.set_hexpand(True)
|
self.set_hexpand(True)
|
||||||
|
|
||||||
|
self.ctx.add_class("footer-container")
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
self.add( CodeContainer() )
|
...
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ class HeaderContainer(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(HeaderContainer, self).__init__()
|
super(HeaderContainer, self).__init__()
|
||||||
|
|
||||||
|
self.ctx = self.get_style_context()
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
@@ -24,18 +26,19 @@ class HeaderContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("header-container")
|
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
self.set_orientation(Gtk.Orientation.HORIZONTAL)
|
||||||
|
|
||||||
self.set_hexpand(True)
|
self.set_hexpand(True)
|
||||||
|
|
||||||
|
self.ctx.add_class("header-container")
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
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):
|
||||||
button = Gtk.Button(label = "Interactive Debug")
|
button = Gtk.Button(label = "Interactive Debug")
|
||||||
button.connect("clicked", self._interactive_debug)
|
button.connect("clicked", self._interactive_debug)
|
||||||
|
|||||||
@@ -22,12 +22,13 @@ class LeftContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("left-container")
|
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||||
|
|
||||||
self.set_vexpand(True)
|
self.set_vexpand(True)
|
||||||
|
|
||||||
|
ctx = self.get_style_context()
|
||||||
|
ctx.add_class("left-container")
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|||||||
@@ -23,12 +23,13 @@ class RightContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.ctx = self.get_style_context()
|
|
||||||
self.ctx.add_class("right-container")
|
|
||||||
|
|
||||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||||
|
|
||||||
self.set_vexpand(True)
|
self.set_vexpand(True)
|
||||||
|
|
||||||
|
ctx = self.get_style_context()
|
||||||
|
ctx.add_class("right-container")
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|||||||
@@ -6,48 +6,33 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from plugins import plugins_controller
|
|
||||||
|
|
||||||
from libs.mixins.ipc_signals_mixin import IPCSignalsMixin
|
from libs.mixins.ipc_signals_mixin import IPCSignalsMixin
|
||||||
from libs.mixins.keyboard_signals_mixin import KeyboardSignalsMixin
|
from libs.mixins.keyboard_signals_mixin import KeyboardSignalsMixin
|
||||||
|
|
||||||
from ..containers.base_container import BaseContainer
|
from ..containers.base_container import BaseContainer
|
||||||
|
|
||||||
from .base_controller_mixin import BaseControllerMixin
|
from .base_controller_data import BaseControllerData
|
||||||
from .bridge_controller import BridgeController
|
from .bridge_controller import BridgeController
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BaseController(IPCSignalsMixin, KeyboardSignalsMixin, BaseControllerMixin):
|
class BaseController(IPCSignalsMixin, KeyboardSignalsMixin, BaseControllerData):
|
||||||
""" docstring for BaseController. """
|
""" docstring for BaseController. """
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
self._setup_controller_data()
|
self._setup_controller_data()
|
||||||
|
|
||||||
self._load_plugins(is_pre = True)
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
self._load_controllers()
|
self._load_controllers()
|
||||||
self._load_plugins(is_pre = False)
|
self._load_plugins_and_files()
|
||||||
self._load_files()
|
|
||||||
|
|
||||||
logger.info(f"Made it past {self.__class__} loading...")
|
logger.info(f"Made it past {self.__class__} loading...")
|
||||||
settings_manager.set_end_load_time()
|
settings_manager.set_end_load_time()
|
||||||
settings_manager.log_load_time()
|
settings_manager.log_load_time()
|
||||||
|
|
||||||
|
|
||||||
def _setup_controller_data(self):
|
|
||||||
self.window = settings_manager.get_main_window()
|
|
||||||
self.base_container = BaseContainer()
|
|
||||||
self.plugins_controller = plugins_controller
|
|
||||||
|
|
||||||
widget_registery.expose_object("main_window", self.window)
|
|
||||||
settings_manager.register_signals_to_builder([self, self.base_container])
|
|
||||||
|
|
||||||
self._collect_files_dirs()
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
@@ -65,22 +50,23 @@ class BaseController(IPCSignalsMixin, KeyboardSignalsMixin, BaseControllerMixin)
|
|||||||
def _load_controllers(self):
|
def _load_controllers(self):
|
||||||
BridgeController()
|
BridgeController()
|
||||||
|
|
||||||
def _load_plugins(self, is_pre: bool):
|
def _load_plugins_and_files(self):
|
||||||
args, unknownargs = settings_manager.get_starting_args()
|
args, unknownargs = settings_manager.get_starting_args()
|
||||||
if args.no_plugins == "true": return
|
if args.no_plugins == "false":
|
||||||
|
|
||||||
if is_pre:
|
|
||||||
self.plugins_controller.pre_launch_plugins()
|
self.plugins_controller.pre_launch_plugins()
|
||||||
return
|
|
||||||
|
|
||||||
if not is_pre:
|
|
||||||
self.plugins_controller.post_launch_plugins()
|
self.plugins_controller.post_launch_plugins()
|
||||||
return
|
|
||||||
|
|
||||||
def _load_files(self):
|
|
||||||
for file in settings_manager.get_starting_files():
|
for file in settings_manager.get_starting_files():
|
||||||
event_system.emit("post-file-to-ipc", file)
|
event_system.emit("post-file-to-ipc", file)
|
||||||
|
|
||||||
def _tggl_top_main_menubar(self):
|
def _tggl_top_main_menubar(self):
|
||||||
logger.debug("_tggl_top_main_menubar > stub...")
|
logger.debug("_tggl_top_main_menubar > stub...")
|
||||||
|
|
||||||
|
def _load_glade_file(self):
|
||||||
|
self.builder.add_from_file( settings_manager.get_glade_file() )
|
||||||
|
self.builder.expose_object("main_window", self.window)
|
||||||
|
|
||||||
|
settings_manager.set_builder(self.builder)
|
||||||
|
self.base_container = BaseContainer()
|
||||||
|
|
||||||
|
settings_manager.register_signals_to_builder([self, self.base_container])
|
||||||
@@ -6,11 +6,28 @@ from shutil import which
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from plugins.plugins_controller import PluginsController
|
||||||
|
from ..builder_wrapper import BuilderWrapper
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class BaseControllerMixin:
|
class BaseControllerData:
|
||||||
''' BaseControllerMixin contains most of the state of the app at ay given time. It also has some support methods. '''
|
''' BaseControllerData contains most of the state of the app at ay given time. It also has some support methods. '''
|
||||||
|
|
||||||
|
def _setup_controller_data(self) -> None:
|
||||||
|
self.window = settings_manager.get_main_window()
|
||||||
|
self.builder = BuilderWrapper()
|
||||||
|
self.plugins_controller = PluginsController()
|
||||||
|
|
||||||
|
self.base_container = None
|
||||||
|
self.was_midified_key = False
|
||||||
|
self.ctrl_down = False
|
||||||
|
self.shift_down = False
|
||||||
|
self.alt_down = False
|
||||||
|
|
||||||
|
self._collect_files_dirs()
|
||||||
|
self._load_glade_file()
|
||||||
|
|
||||||
|
|
||||||
def _collect_files_dirs(self):
|
def _collect_files_dirs(self):
|
||||||
args, \
|
args, \
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Package
|
|
||||||
"""
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from plugins import plugins_controller
|
|
||||||
|
|
||||||
from libs.controllers.controller_manager import ControllerManager
|
|
||||||
|
|
||||||
from .controllers.files_controller import FilesController
|
|
||||||
from .controllers.tabs_controller import TabsController
|
|
||||||
from .controllers.commands_controller import CommandsController
|
|
||||||
from .controllers.completion_controller import CompletionController
|
|
||||||
from .controllers.views.source_views_controller import SourceViewsController
|
|
||||||
|
|
||||||
from .mini_view_widget import MiniViewWidget
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CodeBase:
|
|
||||||
def __init__(self):
|
|
||||||
super(CodeBase, self).__init__()
|
|
||||||
|
|
||||||
self.controller_manager: ControllerManager = ControllerManager()
|
|
||||||
self.miniview_widget: MiniViewWidget = MiniViewWidget()
|
|
||||||
|
|
||||||
self._load_controllers()
|
|
||||||
|
|
||||||
|
|
||||||
def _load_controllers(self):
|
|
||||||
files_controller = FilesController()
|
|
||||||
tabs_controller = TabsController()
|
|
||||||
commands_controller = CommandsController()
|
|
||||||
completion_controller = CompletionController()
|
|
||||||
source_views_controller = SourceViewsController()
|
|
||||||
|
|
||||||
# self.controller_manager.register_controller("base", self)
|
|
||||||
self.controller_manager.register_controller("files", files_controller)
|
|
||||||
self.controller_manager.register_controller("tabs", tabs_controller)
|
|
||||||
self.controller_manager.register_controller("commands", commands_controller)
|
|
||||||
self.controller_manager.register_controller("completion", completion_controller)
|
|
||||||
self.controller_manager.register_controller("source_views", source_views_controller)
|
|
||||||
self.controller_manager.register_controller("plugins", plugins_controller)
|
|
||||||
self.controller_manager.register_controller("widgets", widget_registery)
|
|
||||||
|
|
||||||
def get_tabs_widget(self):
|
|
||||||
return self.controller_manager["tabs"].get_tabs_widget()
|
|
||||||
|
|
||||||
def get_mini_view_widget(self):
|
|
||||||
return self.miniview_widget
|
|
||||||
|
|
||||||
def create_source_view(self):
|
|
||||||
source_view = self.controller_manager["source_views"].create_source_view()
|
|
||||||
self.controller_manager["completion"].register_completer(
|
|
||||||
source_view.get_completion()
|
|
||||||
)
|
|
||||||
|
|
||||||
return source_view
|
|
||||||
|
|
||||||
def first_map_load(self):
|
|
||||||
self.controller_manager["source_views"].first_map_load()
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Command System Package
|
|
||||||
"""
|
|
||||||
|
|
||||||
from .command_system import CommandSystem
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def set_language_and_style(view, file):
|
|
||||||
language = view.language_manager.guess_language(file.fname, None)
|
|
||||||
file.ftype = "buffer" if not language else language
|
|
||||||
file.buffer.set_language(language)
|
|
||||||
file.buffer.set_style_scheme(view.syntax_theme)
|
|
||||||
|
|
||||||
return language
|
|
||||||
|
|
||||||
def update_info_bar_if_focused(command_system, view: GtkSource):
|
|
||||||
has_focus = command_system.exec("has_focus")
|
|
||||||
if has_focus:
|
|
||||||
command_system.exec("update_info_bar")
|
|
||||||
|
|
||||||
def get_file_and_buffer(view: GtkSource):
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
return file, buffer
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from ..source_view import SourceView
|
|
||||||
|
|
||||||
from . import commands
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CommandSystem:
|
|
||||||
def __init__(self):
|
|
||||||
super(CommandSystem, self).__init__()
|
|
||||||
|
|
||||||
self.data: list = ()
|
|
||||||
|
|
||||||
|
|
||||||
def set_data(self, *args, **kwargs):
|
|
||||||
self.data = (args, kwargs)
|
|
||||||
|
|
||||||
def exec(self, command: str) -> any:
|
|
||||||
if not hasattr(commands, command): return
|
|
||||||
method = getattr(commands, command)
|
|
||||||
|
|
||||||
args, kwargs = self.data
|
|
||||||
if kwargs:
|
|
||||||
return method.execute(*args, kwargs)
|
|
||||||
else:
|
|
||||||
return method.execute(*args)
|
|
||||||
|
|
||||||
def exec_with_args(self, command: str, args: list) -> any:
|
|
||||||
if not hasattr(commands, command): return
|
|
||||||
|
|
||||||
method = getattr(commands, command)
|
|
||||||
return method.execute(*args)
|
|
||||||
|
|
||||||
|
|
||||||
def emit(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
""" Monkey patch 'emit' from command controller... """
|
|
||||||
...
|
|
||||||
|
|
||||||
def emit_to(self, controller: str, event: Code_Event_Types.CodeEvent):
|
|
||||||
""" Monkey patch 'emit_to' from command controller... """
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
def get_file(self, view: SourceView):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"get_file",
|
|
||||||
view = view,
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
)
|
|
||||||
|
|
||||||
self.emit_to("files", event)
|
|
||||||
|
|
||||||
return event.response
|
|
||||||
|
|
||||||
def get_swap_file(self, view: SourceView):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"get_swap_file",
|
|
||||||
view = view,
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
)
|
|
||||||
|
|
||||||
self.emit_to("files", event)
|
|
||||||
|
|
||||||
return event.response
|
|
||||||
|
|
||||||
def new_file(self, view: SourceView):
|
|
||||||
event = Event_Factory.create_event("add_new_file", view = view)
|
|
||||||
|
|
||||||
self.emit_to("files", event)
|
|
||||||
|
|
||||||
return event.response
|
|
||||||
|
|
||||||
def remove_file(self, view: SourceView):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"removed_file",
|
|
||||||
view = view,
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
)
|
|
||||||
|
|
||||||
self.emit_to("files", event)
|
|
||||||
|
|
||||||
return event.response
|
|
||||||
|
|
||||||
def request_completion(self, view: SourceView):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"request_completion",
|
|
||||||
view = view,
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
)
|
|
||||||
|
|
||||||
self.emit_to("completion", event)
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Commands Package
|
|
||||||
"""
|
|
||||||
|
|
||||||
import pkgutil
|
|
||||||
import importlib
|
|
||||||
|
|
||||||
__all__ = []
|
|
||||||
|
|
||||||
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
|
|
||||||
module = importlib.import_module(f"{__name__}.{module_name}")
|
|
||||||
globals()[module_name] = module # Add module to package namespace
|
|
||||||
__all__.append(module_name)
|
|
||||||
|
|
||||||
del pkgutil
|
|
||||||
del importlib
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Buffer Redo")
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
undo_manager = buffer.get_undo_manager()
|
|
||||||
|
|
||||||
if undo_manager.can_redo():
|
|
||||||
buffer.redo()
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Buffer Undo")
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
undo_manager = buffer.get_undo_manager()
|
|
||||||
|
|
||||||
if undo_manager.can_undo():
|
|
||||||
buffer.undo()
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..command_helpers import update_info_bar_if_focused
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Close File")
|
|
||||||
view.command.remove_file(view)
|
|
||||||
update_info_bar_if_focused(view.command, view)
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Cut to Temp Buffer")
|
|
||||||
|
|
||||||
view.clear_temp_cut_buffer_delayed()
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
itr = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
start_itr = itr.copy()
|
|
||||||
end_itr = itr.copy()
|
|
||||||
start_line = itr.get_line() + 1
|
|
||||||
start_char = itr.get_line_offset()
|
|
||||||
|
|
||||||
start_itr.backward_visible_line()
|
|
||||||
start_itr.forward_line()
|
|
||||||
end_itr.forward_line()
|
|
||||||
|
|
||||||
line_str = buffer.get_slice(start_itr, end_itr, True)
|
|
||||||
view._cut_buffer += f"{line_str}"
|
|
||||||
buffer.delete(start_itr, end_itr)
|
|
||||||
|
|
||||||
view.set_temp_cut_buffer_delayed()
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
from gi.repository import Gio
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..command_helpers import update_info_bar_if_focused
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
uri: str
|
|
||||||
):
|
|
||||||
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)
|
|
||||||
|
|
||||||
gfile = Gio.File.new_for_uri(uri)
|
|
||||||
view.command.exec_with_args(
|
|
||||||
"load_file",
|
|
||||||
(view, gfile, file)
|
|
||||||
)
|
|
||||||
|
|
||||||
update_info_bar_if_focused(view.command, view)
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
from gi.repository import Gio
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
uris: list = []
|
|
||||||
):
|
|
||||||
logger.debug("Command: DnD Load Files")
|
|
||||||
for uri in uris:
|
|
||||||
try:
|
|
||||||
gfile = Gio.File.new_for_uri(uri)
|
|
||||||
except Exception as e:
|
|
||||||
gfile = Gio.File.new_for_path(uri)
|
|
||||||
|
|
||||||
view.command.exec_with_args("load_file", (view, gfile))
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Duplicate Line")
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
|
|
||||||
if not buffer.get_has_selection():
|
|
||||||
had_selection = False
|
|
||||||
itr = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
start_itr = itr.copy()
|
|
||||||
end_itr = itr.copy()
|
|
||||||
start_line = itr.get_line() + 1
|
|
||||||
start_char = itr.get_line_offset()
|
|
||||||
else:
|
|
||||||
had_selection = True
|
|
||||||
start_itr, end_itr = buffer.get_selection_bounds()
|
|
||||||
sline = start_itr.get_line()
|
|
||||||
eline = end_itr.get_line()
|
|
||||||
start_line = eline + 1
|
|
||||||
start_char = start_itr.get_line_offset()
|
|
||||||
end_char = end_itr.get_line_offset()
|
|
||||||
range_line_size = eline - sline
|
|
||||||
|
|
||||||
start_itr.backward_visible_line()
|
|
||||||
start_itr.forward_line()
|
|
||||||
end_itr.forward_line()
|
|
||||||
end_itr.backward_char()
|
|
||||||
|
|
||||||
line_str = buffer.get_slice(start_itr, end_itr, True)
|
|
||||||
end_itr.forward_char()
|
|
||||||
buffer.insert(end_itr, f"{line_str}\n", -1)
|
|
||||||
|
|
||||||
if not had_selection:
|
|
||||||
new_itr = buffer.get_iter_at_line_offset(start_line, start_char)
|
|
||||||
buffer.place_cursor(new_itr)
|
|
||||||
else:
|
|
||||||
new_itr = buffer.get_iter_at_line_offset(start_line, start_char)
|
|
||||||
new_end_itr = buffer.get_iter_at_line_offset((start_line + range_line_size), end_char)
|
|
||||||
buffer.select_range(new_itr, new_end_itr)
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Focus Left Sibling")
|
|
||||||
if not view.sibling_left: return
|
|
||||||
view.sibling_left.grab_focus()
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Focus Right Sibling")
|
|
||||||
if not view.sibling_right: return
|
|
||||||
view.sibling_right.grab_focus()
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Get Current File")
|
|
||||||
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
|
|
||||||
return file
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Get File Type")
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
return file.ftype
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Get Text")
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
start_itr, end_itr = buffer.get_bounds()
|
|
||||||
return buffer.get_text(start_itr, end_itr, True)
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Go-To")
|
|
||||||
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
gfile = file.get_location()
|
|
||||||
uri = gfile.get_uri()
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
line = iter.get_line()
|
|
||||||
offset = iter.get_line_offset()
|
|
||||||
|
|
||||||
event_system.emit(
|
|
||||||
"textDocument/definition",
|
|
||||||
(view, file.ftype, uri, line, offset,)
|
|
||||||
)
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Has Focus")
|
|
||||||
ctx = view.get_parent().get_style_context()
|
|
||||||
return ctx.has_class("source-view-focused")
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Line Down")
|
|
||||||
view.emit("move-lines", True)
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Line Up")
|
|
||||||
view.emit("move-lines", False)
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
from gi.repository import Gio
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ...source_file import SourceFile
|
|
||||||
from ..command_helpers import set_language_and_style
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
gfile: Gio.File,
|
|
||||||
file: SourceFile = None,
|
|
||||||
):
|
|
||||||
logger.debug("Command: Load File")
|
|
||||||
if not file:
|
|
||||||
file = view.command.new_file(view)
|
|
||||||
|
|
||||||
file.load_path(gfile)
|
|
||||||
|
|
||||||
set_language_and_style(view, file)
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
from gi.repository import Gio
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
):
|
|
||||||
logger.debug("Command: Load Start File(s)")
|
|
||||||
|
|
||||||
starting_files = settings_manager.get_starting_files()
|
|
||||||
|
|
||||||
if len(starting_files) == 0: return
|
|
||||||
|
|
||||||
file = starting_files.pop()
|
|
||||||
file = file.replace("FILE|", "")
|
|
||||||
gfile = Gio.File.new_for_path(file)
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
|
|
||||||
view.command.exec_with_args(
|
|
||||||
"load_file",
|
|
||||||
(view, gfile, file)
|
|
||||||
)
|
|
||||||
|
|
||||||
if len(starting_files) == 0: return
|
|
||||||
|
|
||||||
for file in starting_files:
|
|
||||||
file = file.replace("FILE|", "")
|
|
||||||
gfile = Gio.File.new_for_path(file)
|
|
||||||
|
|
||||||
view.command.exec_with_args("load_file", (view, gfile))
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Move To Left Sibling")
|
|
||||||
if not view.sibling_left: return
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
popped_file, next_file = view.command.get_swap_file(view)
|
|
||||||
|
|
||||||
view.sibling_left.set_buffer(buffer)
|
|
||||||
view.sibling_left.grab_focus()
|
|
||||||
|
|
||||||
if next_file:
|
|
||||||
view.set_buffer(next_file.buffer)
|
|
||||||
else:
|
|
||||||
view.command.exec("new_file")
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Move To Right Sibling")
|
|
||||||
if not view.sibling_right: return
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
popped_file, next_file = view.command.get_swap_file(view)
|
|
||||||
|
|
||||||
view.sibling_right.set_buffer(buffer)
|
|
||||||
view.sibling_right.grab_focus()
|
|
||||||
|
|
||||||
if next_file:
|
|
||||||
view.set_buffer(next_file.buffer)
|
|
||||||
else:
|
|
||||||
view.command.exec("new_file")
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..command_helpers import set_language_and_style, update_info_bar_if_focused
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: New File")
|
|
||||||
|
|
||||||
file = view.command.new_file(view)
|
|
||||||
set_language_and_style(view, file)
|
|
||||||
|
|
||||||
view.set_buffer(file.buffer)
|
|
||||||
|
|
||||||
update_info_bar_if_focused(view.command, view)
|
|
||||||
return file
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..command_helpers import update_info_bar_if_focused
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Open File(s)")
|
|
||||||
gfiles = event_system.emit_and_await("open-files")
|
|
||||||
if not gfiles: return
|
|
||||||
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
if file.ftype == "buffer":
|
|
||||||
gfile = gfiles.pop()
|
|
||||||
view.command.exec_with_args("load_file", (view, gfile, file))
|
|
||||||
view.set_buffer(file.buffer)
|
|
||||||
update_info_bar_if_focused(view.command, view)
|
|
||||||
|
|
||||||
for i, gfile in enumerate(gfiles):
|
|
||||||
view.command.exec_with_args("load_file", (view, gfile))
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GLib
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Paste Temp Buffer")
|
|
||||||
|
|
||||||
view.clear_temp_cut_buffer_delayed()
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
itr = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
insert_itr = itr.copy()
|
|
||||||
|
|
||||||
buffer.insert(insert_itr, view._cut_buffer, -1)
|
|
||||||
|
|
||||||
view.set_temp_cut_buffer_delayed()
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..command_helpers import set_language_and_style
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Save File")
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
if file.ftype == "buffer":
|
|
||||||
file.save_as()
|
|
||||||
set_language_and_style(view, file)
|
|
||||||
return
|
|
||||||
|
|
||||||
file.save()
|
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..command_helpers import set_language_and_style, update_info_bar_if_focused
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.info("Command: Save File As")
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
file.save_as()
|
|
||||||
|
|
||||||
set_language_and_style(view, file)
|
|
||||||
|
|
||||||
update_info_bar_if_focused(view.command, view)
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ...source_file import SourceFile
|
|
||||||
from ..command_helpers import update_info_bar_if_focused
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
file: SourceFile
|
|
||||||
):
|
|
||||||
logger.debug("Command: Set Buffer")
|
|
||||||
|
|
||||||
if not file:
|
|
||||||
view.command.new_file(view)
|
|
||||||
return
|
|
||||||
|
|
||||||
view.set_buffer(file.buffer)
|
|
||||||
|
|
||||||
update_info_bar_if_focused(view.command, view)
|
|
||||||
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
language: str
|
|
||||||
):
|
|
||||||
logger.debug("Command: Set Buffer Language")
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
buffer.set_language(
|
|
||||||
view.language_manager.get_language(language)
|
|
||||||
)
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
style: str
|
|
||||||
):
|
|
||||||
logger.debug("Command: Set Buffer Style")
|
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
buffer.set_style_scheme(
|
|
||||||
view.style_scheme_manager.get_scheme(style)
|
|
||||||
)
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Set Focus Border")
|
|
||||||
ctx = view.get_parent().get_style_context()
|
|
||||||
ctx.add_class("source-view-focused")
|
|
||||||
|
|
||||||
if view.sibling_right:
|
|
||||||
ctx = view.sibling_right.get_parent().get_style_context()
|
|
||||||
elif view.sibling_left:
|
|
||||||
ctx = view.sibling_left.get_parent().get_style_context()
|
|
||||||
|
|
||||||
ctx.remove_class("source-view-focused")
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
):
|
|
||||||
logger.debug("Command: Set MiniView")
|
|
||||||
event_system.emit("set-mini-view", (view,))
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Show Completion")
|
|
||||||
completer = view.get_completion()
|
|
||||||
providers = completer.get_providers()
|
|
||||||
|
|
||||||
if not providers:
|
|
||||||
view.command.request_completion(view)
|
|
||||||
return
|
|
||||||
|
|
||||||
completer.start(
|
|
||||||
providers,
|
|
||||||
completer.create_context()
|
|
||||||
)
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View,
|
|
||||||
):
|
|
||||||
logger.debug("Command: Update Info Bar")
|
|
||||||
file = view.command.get_file(view)
|
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
if not file: return
|
|
||||||
|
|
||||||
iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
line = iter.get_line() + 1
|
|
||||||
column = iter.get_line_offset()
|
|
||||||
ftype = file.ftype.get_id() if hasattr(file.ftype, "get_id") else file.ftype
|
|
||||||
|
|
||||||
event_system.emit(
|
|
||||||
"set-info-labels",
|
|
||||||
(file.fpath, f"{line}:{column}", ftype, file.encoding)
|
|
||||||
)
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Zoom In")
|
|
||||||
|
|
||||||
ctx = view.get_style_context()
|
|
||||||
if view.zoom_level < 99:
|
|
||||||
ctx.remove_class(f"px{view.zoom_level}")
|
|
||||||
view.zoom_level += 1
|
|
||||||
ctx.add_class(f"px{view.zoom_level}")
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
|
||||||
view: GtkSource.View = None
|
|
||||||
):
|
|
||||||
logger.debug("Command: Zoom Out")
|
|
||||||
|
|
||||||
ctx = view.get_style_context()
|
|
||||||
if view.zoom_level > 1:
|
|
||||||
ctx.remove_class(f"px{view.zoom_level}")
|
|
||||||
view.zoom_level -= 1
|
|
||||||
ctx.add_class(f"px{view.zoom_level}")
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Completion Providers Package
|
|
||||||
"""
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
import re
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GObject
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ProviderResponseCacheException(Exception):
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ProviderResponseCacheBase:
|
|
||||||
def __init__(self):
|
|
||||||
super(ProviderResponseCacheBase, self).__init__()
|
|
||||||
|
|
||||||
self._icon_theme = Gtk.IconTheme.get_default()
|
|
||||||
|
|
||||||
|
|
||||||
def process_file_load(self, buffer: GtkSource.Buffer):
|
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_load' not implemented...")
|
|
||||||
|
|
||||||
def process_file_close(self, buffer: GtkSource.Buffer):
|
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_close' not implemented...")
|
|
||||||
|
|
||||||
def process_file_save(self, buffer: GtkSource.Buffer):
|
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_file_save' not implemented...")
|
|
||||||
|
|
||||||
def process_file_change(self, buffer: GtkSource.Buffer):
|
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'process_change' not implemented...")
|
|
||||||
|
|
||||||
def filter(self, word: str):
|
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'filter' not implemented...")
|
|
||||||
|
|
||||||
def filter_with_context(self, context: GtkSource.CompletionContext):
|
|
||||||
raise ProviderResponseCacheException("ProviderResponseCacheBase 'filter_with_context' not implemented...")
|
|
||||||
|
|
||||||
|
|
||||||
def create_completion_item(
|
|
||||||
self,
|
|
||||||
label: str = "",
|
|
||||||
text: str = "",
|
|
||||||
info: str = "",
|
|
||||||
completion: any = None
|
|
||||||
):
|
|
||||||
if not label or not text: return
|
|
||||||
|
|
||||||
comp_item = GtkSource.CompletionItem.new()
|
|
||||||
comp_item.set_label(label)
|
|
||||||
comp_item.set_text(text)
|
|
||||||
|
|
||||||
if info:
|
|
||||||
comp_item.set_info(info)
|
|
||||||
# comp_item.set_markup(f"<h3>{info}</h3>")
|
|
||||||
|
|
||||||
if completion:
|
|
||||||
comp_item.set_icon(
|
|
||||||
self.get_icon_for_type(completion.type)
|
|
||||||
)
|
|
||||||
|
|
||||||
return comp_item
|
|
||||||
|
|
||||||
def get_word(self, context):
|
|
||||||
start_iter = context.get_iter()
|
|
||||||
end_iter = None
|
|
||||||
|
|
||||||
if not isinstance(start_iter, Gtk.TextIter):
|
|
||||||
_, start_iter = context.get_iter()
|
|
||||||
end_iter = start_iter.copy()
|
|
||||||
|
|
||||||
if not start_iter.starts_word():
|
|
||||||
start_iter.backward_word_start()
|
|
||||||
|
|
||||||
end_iter.forward_word_end()
|
|
||||||
|
|
||||||
buffer = start_iter.get_buffer()
|
|
||||||
|
|
||||||
return buffer.get_text(start_iter, end_iter, False)
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Controllers Package
|
|
||||||
"""
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.controllers.controller_base import ControllerBase
|
|
||||||
|
|
||||||
from libs.event_factory import Code_Event_Types
|
|
||||||
|
|
||||||
from ..command_system import CommandSystem
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CommandsController(ControllerBase, list):
|
|
||||||
def __init__(self):
|
|
||||||
super(CommandsController, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
if isinstance(event, Code_Event_Types.GetCommandSystemEvent):
|
|
||||||
event.response = self.get_command_system()
|
|
||||||
|
|
||||||
def get_command_system(self):
|
|
||||||
command_system = CommandSystem()
|
|
||||||
command_system.emit = self.emit
|
|
||||||
command_system.emit_to = self.emit_to
|
|
||||||
|
|
||||||
self.append(command_system)
|
|
||||||
|
|
||||||
return command_system
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import GLib
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.controllers.controller_base import ControllerBase
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CompletionController(ControllerBase):
|
|
||||||
def __init__(self):
|
|
||||||
super(CompletionController, self).__init__()
|
|
||||||
|
|
||||||
self.words_provider = GtkSource.CompletionWords.new("words", None)
|
|
||||||
self.words_provider.props.activation = GtkSource.CompletionActivation.INTERACTIVE
|
|
||||||
|
|
||||||
self._completers: list[GtkSource.Completion] = []
|
|
||||||
self._providers: dict[str, GtkSource.CompletionProvider] = {}
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
if isinstance(event, Code_Event_Types.RegisterProviderEvent):
|
|
||||||
self.register_provider(
|
|
||||||
event.provider_name,
|
|
||||||
event.provider,
|
|
||||||
event.language_ids
|
|
||||||
)
|
|
||||||
elif isinstance(event, Code_Event_Types.AddedNewFileEvent):
|
|
||||||
self.provider_process_file_load(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.RemovedFileEvent):
|
|
||||||
self.provider_process_file_close(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.SavedFileEvent):
|
|
||||||
self.provider_process_file_save(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.TextChangedEvent):
|
|
||||||
self.provider_process_file_change(event)
|
|
||||||
# elif isinstance(event, Code_Event_Types.RequestCompletionEvent):
|
|
||||||
# self.request_unbound_completion( event.view.get_completion() )
|
|
||||||
|
|
||||||
|
|
||||||
def register_completer(self, completer: GtkSource.Completion):
|
|
||||||
self._completers.append(completer)
|
|
||||||
|
|
||||||
completer.add_provider(self.words_provider)
|
|
||||||
for provider in self._providers.values():
|
|
||||||
completer.add_provider(provider)
|
|
||||||
|
|
||||||
def register_provider(
|
|
||||||
self,
|
|
||||||
provider_name: str,
|
|
||||||
provider: GtkSource.CompletionProvider,
|
|
||||||
language_ids: list = []
|
|
||||||
):
|
|
||||||
self._providers[provider_name] = provider
|
|
||||||
|
|
||||||
for completer in self._completers:
|
|
||||||
completer.add_provider(provider)
|
|
||||||
|
|
||||||
def unregister_provider(self, provider_name: str):
|
|
||||||
provider = self._providers[provider_name]
|
|
||||||
del self._providers[provider_name]
|
|
||||||
|
|
||||||
for completer in self._completers:
|
|
||||||
completer.remove_provider(provider)
|
|
||||||
|
|
||||||
def provider_process_file_load(self, event: Code_Event_Types.AddedNewFileEvent):
|
|
||||||
self.words_provider.register(event.file.buffer)
|
|
||||||
|
|
||||||
for provider in self._providers.values():
|
|
||||||
provider.response_cache.process_file_load(event)
|
|
||||||
|
|
||||||
def provider_process_file_close(self, event: Code_Event_Types.RemovedFileEvent):
|
|
||||||
self.words_provider.unregister(event.file.buffer)
|
|
||||||
|
|
||||||
for provider in self._providers.values():
|
|
||||||
provider.response_cache.process_file_close(event)
|
|
||||||
|
|
||||||
def provider_process_file_save(self, event: Code_Event_Types.SavedFileEvent):
|
|
||||||
for provider in self._providers.values():
|
|
||||||
provider.response_cache.process_file_save(event)
|
|
||||||
|
|
||||||
def provider_process_file_change(self, event: Code_Event_Types.TextChangedEvent):
|
|
||||||
for provider in self._providers.values():
|
|
||||||
provider.response_cache.process_file_change(event)
|
|
||||||
|
|
||||||
def request_unbound_completion(self, completer: GtkSource.Completion):
|
|
||||||
completer.start(
|
|
||||||
[ *self._providers.values() ],
|
|
||||||
completer.create_context()
|
|
||||||
)
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.controllers.controller_base import ControllerBase
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from ..source_file import SourceFile
|
|
||||||
from ..source_buffer import SourceBuffer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class FilesController(ControllerBase, list):
|
|
||||||
def __init__(self):
|
|
||||||
super(FilesController, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
if isinstance(event, Code_Event_Types.AddNewFileEvent):
|
|
||||||
self.new_file(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.SwapFileEvent):
|
|
||||||
self.swap_file(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.PopFileEvent):
|
|
||||||
self.pop_file(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.RemoveFileEvent):
|
|
||||||
self.remove_file(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.GetFileEvent):
|
|
||||||
self.get_file(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.GetSwapFileEvent):
|
|
||||||
self.get_swap_file(event)
|
|
||||||
|
|
||||||
def get_file(self, event: Code_Event_Types.GetFileEvent):
|
|
||||||
if not event.buffer: return
|
|
||||||
|
|
||||||
for file in self:
|
|
||||||
if not event.buffer == file.buffer: continue
|
|
||||||
|
|
||||||
event.response = file
|
|
||||||
|
|
||||||
return file
|
|
||||||
|
|
||||||
def get_swap_file(self, event: Code_Event_Types.GetSwapFileEvent):
|
|
||||||
if not event.buffer: return
|
|
||||||
|
|
||||||
for i, file in enumerate(self):
|
|
||||||
if not event.buffer == file.buffer: continue
|
|
||||||
|
|
||||||
j = self.next_index(i)
|
|
||||||
next_file = self[j]
|
|
||||||
swapped_file = self[j] if not j == -1 else None
|
|
||||||
|
|
||||||
event.response = [swapped_file, next_file]
|
|
||||||
|
|
||||||
return swapped_file, next_file
|
|
||||||
|
|
||||||
def new_file(self, event: Code_Event_Types.AddNewFileEvent):
|
|
||||||
file = SourceFile()
|
|
||||||
file.emit = self.emit
|
|
||||||
file.emit_to = self.emit_to
|
|
||||||
|
|
||||||
event.response = file
|
|
||||||
|
|
||||||
eve = Event_Factory.create_event(
|
|
||||||
"added_new_file",
|
|
||||||
view = event.view,
|
|
||||||
file = file
|
|
||||||
)
|
|
||||||
self.message(eve)
|
|
||||||
|
|
||||||
self.append(file)
|
|
||||||
|
|
||||||
return file
|
|
||||||
|
|
||||||
def swap_file(self, event: Code_Event_Types.GetSwapFileEvent):
|
|
||||||
if not event.buffer: return
|
|
||||||
|
|
||||||
for i, file in enumerate(self):
|
|
||||||
if not event.buffer == file.buffer: continue
|
|
||||||
|
|
||||||
j = self.next_index(i)
|
|
||||||
next_file = self[j]
|
|
||||||
swapped_file = self[j] if not j == -1 else None
|
|
||||||
|
|
||||||
event.response = [swapped_file, next_file]
|
|
||||||
|
|
||||||
return swapped_file, next_file
|
|
||||||
|
|
||||||
def pop_file(self, event: Code_Event_Types.PopFileEvent):
|
|
||||||
if not event.buffer: return
|
|
||||||
|
|
||||||
for i, file in enumerate(self):
|
|
||||||
if not event.buffer == file.buffer: continue
|
|
||||||
|
|
||||||
j = self.next_index(i)
|
|
||||||
next_file = self[j] if not j == -1 else None
|
|
||||||
popped_file = self.pop(i)
|
|
||||||
|
|
||||||
event.response = [popped_file, next_file]
|
|
||||||
|
|
||||||
eve = Event_Factory.create_event(
|
|
||||||
"popped_file",
|
|
||||||
view = view,
|
|
||||||
file = popped_file,
|
|
||||||
next_file = next_file
|
|
||||||
)
|
|
||||||
self.message(eve)
|
|
||||||
|
|
||||||
return popped_file, next_file
|
|
||||||
|
|
||||||
def remove_file(self, event: Code_Event_Types.RemoveFileEvent):
|
|
||||||
if not event.buffer: return
|
|
||||||
|
|
||||||
for i, file in enumerate(self):
|
|
||||||
if not event.buffer == file.buffer: continue
|
|
||||||
|
|
||||||
j = self.next_index(i)
|
|
||||||
next_file = self[j] if not j == -1 else None
|
|
||||||
|
|
||||||
event.response = next_file
|
|
||||||
|
|
||||||
eve = Event_Factory.create_event(
|
|
||||||
"removed_file",
|
|
||||||
view = event.view,
|
|
||||||
ignore_focus = True,
|
|
||||||
file = file,
|
|
||||||
next_file = next_file
|
|
||||||
)
|
|
||||||
self.message(eve)
|
|
||||||
|
|
||||||
self.remove(file)
|
|
||||||
file.close()
|
|
||||||
|
|
||||||
return next_file
|
|
||||||
|
|
||||||
def next_index(self, i):
|
|
||||||
size = len(self)
|
|
||||||
|
|
||||||
if (i == 0) & (size >= 2):
|
|
||||||
j = i + 1
|
|
||||||
elif (i == (size - 1)) & (size >= 2):
|
|
||||||
j = i - 1
|
|
||||||
elif (size - 1) == 0:
|
|
||||||
j = -1
|
|
||||||
else:
|
|
||||||
j = i + 1
|
|
||||||
|
|
||||||
return j
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.controllers.controller_base import ControllerBase
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from ..tabs_widget import TabsWidget
|
|
||||||
from ..tab_widget import TabWidget
|
|
||||||
|
|
||||||
from ..source_view import SourceView
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TabsController(ControllerBase):
|
|
||||||
def __init__(self):
|
|
||||||
super(TabsController, self).__init__()
|
|
||||||
|
|
||||||
self.active_view: SourceView = None
|
|
||||||
self.tabs_widget: TabsWidget = TabsWidget()
|
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
if isinstance(event, Code_Event_Types.FocusedViewEvent):
|
|
||||||
self.active_view = event.view
|
|
||||||
elif isinstance(event, Code_Event_Types.FilePathSetEvent):
|
|
||||||
self.update_tab_label(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.AddedNewFileEvent):
|
|
||||||
self.add_tab(event)
|
|
||||||
elif isinstance(event, Code_Event_Types.PoppedFileEvent):
|
|
||||||
...
|
|
||||||
elif isinstance(event, Code_Event_Types.RemovedFileEvent):
|
|
||||||
self.remove_tab(event)
|
|
||||||
|
|
||||||
def get_tabs_widget(self):
|
|
||||||
return self.tabs_widget
|
|
||||||
|
|
||||||
def update_tab_label(self, event: Code_Event_Types.FilePathSetEvent):
|
|
||||||
for tab in self.tabs_widget.get_children():
|
|
||||||
if not event.file == tab.file: continue
|
|
||||||
tab.label.set_label(event.file.fname)
|
|
||||||
break
|
|
||||||
|
|
||||||
def add_tab(self, event: Code_Event_Types.AddedNewFileEvent):
|
|
||||||
def set_active_tab(tab, eve, file):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"set_active_file",
|
|
||||||
buffer = tab.get_parent().file.buffer
|
|
||||||
)
|
|
||||||
|
|
||||||
self.active_view.set_buffer(
|
|
||||||
tab.get_parent().file.buffer
|
|
||||||
)
|
|
||||||
|
|
||||||
self.message(event)
|
|
||||||
|
|
||||||
def close_tab(tab, eve, file):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"remove_file",
|
|
||||||
buffer = tab.get_parent().file.buffer
|
|
||||||
)
|
|
||||||
|
|
||||||
self.message(event)
|
|
||||||
|
|
||||||
tab = TabWidget()
|
|
||||||
tab.file = event.file
|
|
||||||
tab.label.set_label(event.file.fname)
|
|
||||||
tab.set_select_signal(set_active_tab)
|
|
||||||
tab.set_close_signal(close_tab)
|
|
||||||
|
|
||||||
self.tabs_widget.add(tab)
|
|
||||||
tab.show()
|
|
||||||
|
|
||||||
def remove_tab(self, event: Code_Event_Types.RemovedFileEvent):
|
|
||||||
for tab in self.tabs_widget.get_children():
|
|
||||||
if not event.file == tab.file: continue
|
|
||||||
|
|
||||||
tab.clear_signals_and_data()
|
|
||||||
tab.run_dispose()
|
|
||||||
tab.destroy()
|
|
||||||
|
|
||||||
del tab
|
|
||||||
break
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Controllers Package
|
|
||||||
"""
|
|
||||||
|
|
||||||
from .state_manager import SourceViewStateManager
|
|
||||||
from .signal_mapper import SourceViewSignalMapper
|
|
||||||
from .source_views_controller import SourceViewsController
|
|
||||||
|
|
||||||
# State imports
|
|
||||||
from .states import *
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ...source_view import SourceView
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewSignalMapper:
|
|
||||||
def __init__(self):
|
|
||||||
self.active_view: SourceView = None
|
|
||||||
|
|
||||||
|
|
||||||
def bind_emit(self, emit: callable):
|
|
||||||
self.emit = emit
|
|
||||||
|
|
||||||
def set_state_manager(self, state_manager):
|
|
||||||
self.state_manager = state_manager
|
|
||||||
|
|
||||||
def connect_signals(self, source_view: SourceView):
|
|
||||||
signal_mappings = self._get_signal_mappings()
|
|
||||||
for signal, handler in signal_mappings.items():
|
|
||||||
source_view.connect(signal, handler)
|
|
||||||
|
|
||||||
def disconnect_signals(self, source_view: SourceView):
|
|
||||||
signal_mappings = self._get_signal_mappings()
|
|
||||||
for signal, handler in signal_mappings.items():
|
|
||||||
source_view.disconnect_by_func(handler)
|
|
||||||
|
|
||||||
def insert_text(self, file, string: str):
|
|
||||||
return self.state_manager.handle_insert_text(self.active_view, file, string)
|
|
||||||
|
|
||||||
def _get_signal_mappings(self):
|
|
||||||
return {
|
|
||||||
"focus-in-event": self._focus_in_event,
|
|
||||||
"move-cursor": self._move_cursor,
|
|
||||||
"key-press-event": self._key_press_event,
|
|
||||||
"key-release-event": self._key_release_event,
|
|
||||||
"button-press-event": self._button_press_event,
|
|
||||||
"button-release-event": self._button_release_event
|
|
||||||
}
|
|
||||||
|
|
||||||
def _focus_in_event(self, source_view: SourceView, eve):
|
|
||||||
self.active_view = source_view
|
|
||||||
return self.state_manager.handle_focus_in_event(source_view, eve, self.emit)
|
|
||||||
|
|
||||||
def _move_cursor(self, source_view: SourceView, step, count, extend_selection):
|
|
||||||
return self.state_manager.handle_move_cursor(
|
|
||||||
source_view, step, count, extend_selection, self.emit
|
|
||||||
)
|
|
||||||
|
|
||||||
def _button_press_event(self, source_view: SourceView, eve):
|
|
||||||
return self.state_manager.handle_button_press_event(source_view, eve)
|
|
||||||
|
|
||||||
def _button_release_event(self, source_view: SourceView, eve):
|
|
||||||
return self.state_manager.handle_button_release_event(source_view, eve)
|
|
||||||
|
|
||||||
def _key_press_event(self, source_view: SourceView, eve):
|
|
||||||
return self.state_manager.handle_key_press_event(source_view, eve)
|
|
||||||
|
|
||||||
def _key_release_event(self, source_view: SourceView, eve):
|
|
||||||
return self.state_manager.handle_key_release_event(source_view, eve)
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.controllers.controller_base import ControllerBase
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from ...source_view import SourceView
|
|
||||||
|
|
||||||
from .state_manager import SourceViewStateManager
|
|
||||||
from .signal_mapper import SourceViewSignalMapper
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewsController(ControllerBase, list):
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceViewsController, self).__init__()
|
|
||||||
|
|
||||||
self.state_manager: SourceViewStateManager = SourceViewStateManager()
|
|
||||||
self.signal_mapper: SourceViewSignalMapper = SourceViewSignalMapper()
|
|
||||||
|
|
||||||
self.signal_mapper.bind_emit(self.emit)
|
|
||||||
self.signal_mapper.set_state_manager(self.state_manager)
|
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
if isinstance(event, Code_Event_Types.RemovedFileEvent):
|
|
||||||
self._remove_file(event)
|
|
||||||
|
|
||||||
if not self.signal_mapper.active_view: return
|
|
||||||
|
|
||||||
if isinstance(event, Code_Event_Types.TextChangedEvent):
|
|
||||||
if not self.signal_mapper.active_view: return
|
|
||||||
self.signal_mapper.active_view.command.exec("update_info_bar")
|
|
||||||
elif isinstance(event, Code_Event_Types.TextChangedEvent):
|
|
||||||
self.signal_mapper.active_view.command.exec("update_info_bar")
|
|
||||||
elif isinstance(event, Code_Event_Types.TextInsertedEvent):
|
|
||||||
self.signal_mapper.insert_text(event.file, event.text)
|
|
||||||
|
|
||||||
def _get_command_system(self):
|
|
||||||
event = Event_Factory.create_event("get_command_system")
|
|
||||||
self.message_to("commands", event)
|
|
||||||
command = event.response
|
|
||||||
|
|
||||||
del event
|
|
||||||
return command
|
|
||||||
|
|
||||||
def _remove_file(self, event: Code_Event_Types.RemovedFileEvent):
|
|
||||||
for source_view in self:
|
|
||||||
if not event.file.buffer == source_view.get_buffer(): continue
|
|
||||||
if not event.next_file:
|
|
||||||
source_view.command.exec("new_file")
|
|
||||||
continue
|
|
||||||
|
|
||||||
source_view.set_buffer(event.next_file.buffer)
|
|
||||||
|
|
||||||
def create_source_view(self):
|
|
||||||
source_view: SourceView = SourceView()
|
|
||||||
source_view.command = self._get_command_system()
|
|
||||||
source_view.command.set_data(source_view)
|
|
||||||
|
|
||||||
self.signal_mapper.connect_signals(source_view)
|
|
||||||
|
|
||||||
self.append(source_view)
|
|
||||||
return source_view
|
|
||||||
|
|
||||||
def first_map_load(self):
|
|
||||||
for source_view in self:
|
|
||||||
source_view.command.exec("new_file")
|
|
||||||
|
|
||||||
source_view = self[0]
|
|
||||||
source_view.grab_focus()
|
|
||||||
source_view.command.exec("load_start_files")
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.dto.states import SourceViewStates
|
|
||||||
|
|
||||||
from ...key_mapper import KeyMapper
|
|
||||||
|
|
||||||
from .states import *
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewStateManager:
|
|
||||||
def __init__(self):
|
|
||||||
self.key_mapper: KeyMapper = KeyMapper()
|
|
||||||
|
|
||||||
self.states: dict = {
|
|
||||||
SourceViewStates.INSERT: SourceViewsInsertState(),
|
|
||||||
SourceViewStates.MULTIINSERT: SourceViewsMultiInsertState(),
|
|
||||||
SourceViewStates.COMMAND: SourceViewsCommandState(),
|
|
||||||
SourceViewStates.READONLY: SourceViewsReadOnlyState()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def handle_focus_in_event(self, source_view, eve, emit):
|
|
||||||
return self.states[source_view.state].focus_in_event(source_view, eve, emit)
|
|
||||||
|
|
||||||
def handle_insert_text(self, source_view, file, text):
|
|
||||||
return self.states[source_view.state].insert_text(file, text)
|
|
||||||
|
|
||||||
def handle_move_cursor(self, source_view, step, count, extend_selection, emit):
|
|
||||||
return self.states[source_view.state].move_cursor(
|
|
||||||
source_view, step, count, extend_selection, emit
|
|
||||||
)
|
|
||||||
|
|
||||||
def handle_button_press_event(self, source_view, eve):
|
|
||||||
return self.states[source_view.state].button_press_event(source_view, eve)
|
|
||||||
|
|
||||||
def handle_button_release_event(self, source_view, eve):
|
|
||||||
# Handle state transitions (multi-insert toggling)
|
|
||||||
self._handle_multi_insert_toggle(source_view, eve)
|
|
||||||
|
|
||||||
return self.states[source_view.state].button_release_event(source_view, eve)
|
|
||||||
|
|
||||||
def handle_key_press_event(self, source_view, eve):
|
|
||||||
return self.states[source_view.state].key_press_event(
|
|
||||||
source_view, eve, self.key_mapper
|
|
||||||
)
|
|
||||||
|
|
||||||
def handle_key_release_event(self, source_view, eve):
|
|
||||||
return self.states[source_view.state].key_release_event(
|
|
||||||
source_view, eve, self.key_mapper
|
|
||||||
)
|
|
||||||
|
|
||||||
def _handle_multi_insert_toggle(self, source_view, eve):
|
|
||||||
is_control = self.key_mapper.is_control(eve)
|
|
||||||
if is_control and not source_view.state == SourceViewStates.MULTIINSERT:
|
|
||||||
logger.debug("Entered Multi-Insert Mode...")
|
|
||||||
source_view.state = SourceViewStates.MULTIINSERT
|
|
||||||
|
|
||||||
if not is_control and source_view.state == SourceViewStates.MULTIINSERT:
|
|
||||||
logger.debug("Entered Regular Insert Mode...")
|
|
||||||
self.states[source_view.state].clear_markers(source_view)
|
|
||||||
|
|
||||||
source_view.state = SourceViewStates.INSERT
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Controllers Views States Package
|
|
||||||
"""
|
|
||||||
|
|
||||||
from .source_view_insert_state import SourceViewsInsertState
|
|
||||||
from .source_view_multi_insert_state import SourceViewsMultiInsertState
|
|
||||||
from .source_view_command_state import SourceViewsCommandState
|
|
||||||
from .source_view_read_only_state import SourceViewsReadOnlyState
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from libs.dto.states import SourceViewStates
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewsCommandState:
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceViewsCommandState, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def focus_in_event(self, source_view, eve, emit):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def move_cursor(self, source_view, step, count, extend_selection, emit):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def insert_text(self, file, text):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def button_press_event(self, source_view, eve):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def button_release_event(self, source_view, eve):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def key_press_event(self, source_view, eve, key_mapper):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def key_release_event(self, source_view, eve, key_mapper):
|
|
||||||
return True
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from libs.dto.states import SourceViewStates
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewsInsertState:
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceViewsInsertState, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def focus_in_event(self, source_view, eve, emit):
|
|
||||||
source_view.command.exec("set_miniview")
|
|
||||||
source_view.command.exec("set_focus_border")
|
|
||||||
source_view.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
event = Event_Factory.create_event("focused_view", view = source_view)
|
|
||||||
emit(event)
|
|
||||||
|
|
||||||
def insert_text(self, file, text):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def move_cursor(self, source_view, step, count, extend_selection, emit):
|
|
||||||
buffer = source_view.get_buffer()
|
|
||||||
itr = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
line = itr.get_line()
|
|
||||||
char = itr.get_line_offset()
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"cursor_moved",
|
|
||||||
view = source_view,
|
|
||||||
buffer = buffer,
|
|
||||||
line = line,
|
|
||||||
char = char
|
|
||||||
)
|
|
||||||
|
|
||||||
emit(event)
|
|
||||||
|
|
||||||
source_view.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def button_press_event(self, source_view, eve):
|
|
||||||
source_view.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def button_release_event(self, source_view, eve):
|
|
||||||
source_view.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def key_press_event(self, source_view, eve, key_mapper):
|
|
||||||
command = key_mapper._key_press_event(eve)
|
|
||||||
is_future = key_mapper._key_release_event(eve)
|
|
||||||
|
|
||||||
if is_future: return True
|
|
||||||
if not command: return False
|
|
||||||
|
|
||||||
source_view.command.exec(command)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def key_release_event(self, source_view, eve, key_mapper):
|
|
||||||
command = key_mapper._key_release_event(eve)
|
|
||||||
is_past = key_mapper._key_press_event(eve)
|
|
||||||
|
|
||||||
if is_past: return True
|
|
||||||
if not command: return False
|
|
||||||
|
|
||||||
source_view.command.exec(command)
|
|
||||||
|
|
||||||
return True
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
from libs.dto.states import SourceViewStates, MoveDirection, CursorAction
|
|
||||||
|
|
||||||
from ....mixins.source_mark_events_mixin import MarkEventsMixin
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewsMultiInsertState(MarkEventsMixin):
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceViewsMultiInsertState, self).__init__()
|
|
||||||
|
|
||||||
self.cursor_action: CursorAction = 0
|
|
||||||
self.move_direction: MoveDirection = 0
|
|
||||||
self.insert_markers: list = []
|
|
||||||
|
|
||||||
|
|
||||||
def focus_in_event(self, source_view, eve, emit):
|
|
||||||
source_view.command.exec("set_miniview")
|
|
||||||
source_view.command.exec("set_focus_border")
|
|
||||||
source_view.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
event = Event_Factory.create_event("focused_view", view = source_view)
|
|
||||||
emit(event)
|
|
||||||
|
|
||||||
def insert_text(self, file, text):
|
|
||||||
if not self.insert_markers: return False
|
|
||||||
|
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
# freeze buffer and insert to each mark (if any)
|
|
||||||
buffer.block_insert_after_signal()
|
|
||||||
buffer.begin_user_action()
|
|
||||||
|
|
||||||
with buffer.freeze_notify():
|
|
||||||
for mark in self.insert_markers:
|
|
||||||
itr = buffer.get_iter_at_mark(mark)
|
|
||||||
buffer.insert(itr, text, -1)
|
|
||||||
|
|
||||||
buffer.end_user_action()
|
|
||||||
buffer.unblock_insert_after_signal()
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def move_cursor(self, source_view, step, count, extend_selection, emit):
|
|
||||||
buffer = source_view.get_buffer()
|
|
||||||
|
|
||||||
self._process_move_direction(buffer)
|
|
||||||
self._signal_cursor_moved(source_view, emit)
|
|
||||||
source_view.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def button_press_event(self, source_view, eve):
|
|
||||||
source_view.command.exec("update_info_bar")
|
|
||||||
return True
|
|
||||||
|
|
||||||
def button_release_event(self, source_view, eve):
|
|
||||||
buffer = source_view.get_buffer()
|
|
||||||
insert_iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
data = source_view.window_to_buffer_coords(
|
|
||||||
Gtk.TextWindowType.TEXT,
|
|
||||||
eve.x,
|
|
||||||
eve.y
|
|
||||||
)
|
|
||||||
is_over_text, \
|
|
||||||
target_iter, \
|
|
||||||
is_trailing = source_view.get_iter_at_position(data.buffer_x, data.buffer_y)
|
|
||||||
|
|
||||||
if not is_over_text:
|
|
||||||
# NOTE: Trying to put at very end of line if not over text (aka, clicking right of text)
|
|
||||||
target_iter.forward_visible_line()
|
|
||||||
target_iter.backward_char()
|
|
||||||
|
|
||||||
self._insert_mark(insert_iter, target_iter, buffer)
|
|
||||||
|
|
||||||
def key_press_event(self, source_view, eve, key_mapper):
|
|
||||||
char = key_mapper.get_raw_keyname(eve)
|
|
||||||
|
|
||||||
for action in CursorAction:
|
|
||||||
if not action.name == char.upper(): continue
|
|
||||||
self.cursor_action = action.value
|
|
||||||
self._process_cursor_action(source_view.get_buffer())
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
for direction in MoveDirection:
|
|
||||||
if not direction.name == char.upper(): continue
|
|
||||||
self.move_direction = direction.value
|
|
||||||
return False
|
|
||||||
|
|
||||||
is_future = key_mapper._key_release_event(eve)
|
|
||||||
if is_future: return False
|
|
||||||
|
|
||||||
command = key_mapper._key_press_event(eve)
|
|
||||||
if not command: return False
|
|
||||||
|
|
||||||
source_view.command.exec(command)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def key_release_event(self, source_view, eve, key_mapper):
|
|
||||||
command = key_mapper._key_release_event(eve)
|
|
||||||
is_past = key_mapper._key_press_event(eve)
|
|
||||||
|
|
||||||
if is_past: return False
|
|
||||||
if not command: return False
|
|
||||||
|
|
||||||
source_view.command.exec(command)
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _signal_cursor_moved(self, source_view, emit):
|
|
||||||
buffer = source_view.get_buffer()
|
|
||||||
itr = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
line = itr.get_line()
|
|
||||||
char = itr.get_line_offset()
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"cursor_moved",
|
|
||||||
view = source_view,
|
|
||||||
buffer = buffer,
|
|
||||||
line = line,
|
|
||||||
char = char
|
|
||||||
)
|
|
||||||
|
|
||||||
emit(event)
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from libs.dto.states import SourceViewStates
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewsReadOnlyState:
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceViewsReadOnlyState, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def focus_in_event(self, source_view, eve, emit):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def move_cursor(self, source_view, step, count, extend_selection, emit):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def insert_text(self, file, text):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def button_press_event(self, source_view, eve):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def button_release_event(self, source_view, eve):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def key_press_event(self, source_view, eve, key_mapper):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def key_release_event(self, source_view, eve, key_mapper):
|
|
||||||
return True
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from gi.repository import Pango
|
|
||||||
from gi.repository import Gio
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class InfoBarWidget(Gtk.Box):
|
|
||||||
""" docstring for InfoBarWidget. """
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super(InfoBarWidget, self).__init__()
|
|
||||||
|
|
||||||
self._setup_styling()
|
|
||||||
self._setup_signals()
|
|
||||||
self._subscribe_to_events()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
|
||||||
self.set_margin_start(25)
|
|
||||||
self.set_margin_end(25)
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
|
||||||
event_system.subscribe("set-info-labels", self._set_info_labels)
|
|
||||||
event_system.subscribe("set-path-label", self._set_path_label)
|
|
||||||
event_system.subscribe("set-encoding-label", self._set_encoding_label)
|
|
||||||
event_system.subscribe("set-line-char-label", self._set_line_char_label)
|
|
||||||
event_system.subscribe("set-file-type-label", self._set_file_type_label)
|
|
||||||
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
self.path_label = Gtk.Label(label = "...")
|
|
||||||
self.line_char_label = Gtk.Label(label = "1:0")
|
|
||||||
self.encoding_label = Gtk.Label(label = "utf-8")
|
|
||||||
self.file_type_label = Gtk.Label(label = "buffer")
|
|
||||||
|
|
||||||
self.add(self.path_label)
|
|
||||||
self.add(self.line_char_label)
|
|
||||||
self.add(self.encoding_label)
|
|
||||||
self.add(self.file_type_label)
|
|
||||||
|
|
||||||
self.path_label.set_hexpand(True)
|
|
||||||
self.path_label.set_ellipsize(Pango.EllipsizeMode.START)
|
|
||||||
self.path_label.set_single_line_mode(True)
|
|
||||||
self.path_label.set_max_width_chars(48)
|
|
||||||
|
|
||||||
self.line_char_label.set_hexpand(True)
|
|
||||||
self.encoding_label.set_hexpand(True)
|
|
||||||
self.file_type_label.set_hexpand(True)
|
|
||||||
|
|
||||||
def _set_info_labels(
|
|
||||||
self,
|
|
||||||
path: Gio.File or str = None,
|
|
||||||
line_char: str = None,
|
|
||||||
file_type: str = None,
|
|
||||||
encoding_type: str = None
|
|
||||||
):
|
|
||||||
self._set_path_label(path)
|
|
||||||
self._set_line_char_label(line_char)
|
|
||||||
self._set_file_type_label(file_type)
|
|
||||||
self._set_encoding_label(encoding_type)
|
|
||||||
|
|
||||||
def _set_path_label(self, gfile: Gio.File or str = "..."):
|
|
||||||
gfile = "" if not gfile else gfile
|
|
||||||
|
|
||||||
if isinstance(gfile, str):
|
|
||||||
self.path_label.set_text( gfile )
|
|
||||||
self.path_label.set_tooltip_text( gfile )
|
|
||||||
else:
|
|
||||||
self.path_label.set_text( gfile.get_path() )
|
|
||||||
self.path_label.set_tooltip_text( gfile.get_path() )
|
|
||||||
|
|
||||||
def _set_line_char_label(self, line_char = "1:1"):
|
|
||||||
line_char = "1:1" if not line_char else line_char
|
|
||||||
|
|
||||||
self.line_char_label.set_text(line_char)
|
|
||||||
|
|
||||||
def _set_file_type_label(self, file_type = "buffer"):
|
|
||||||
file_type = "buffer" if not file_type else file_type
|
|
||||||
|
|
||||||
self.file_type_label.set_text(file_type)
|
|
||||||
|
|
||||||
def _set_encoding_label(self, encoding_type = "utf-8"):
|
|
||||||
encoding_type = "utf-8" if not encoding_type else encoding_type
|
|
||||||
|
|
||||||
self.encoding_label.set_text(encoding_type)
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
import copy
|
|
||||||
import json
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gdk', '3.0')
|
|
||||||
from gi.repository import Gdk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class NoKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
class CtrlKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
class ShiftKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
class AltKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
class CtrlShiftKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
class CtrlAltKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
class AltShiftKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
class CtrlShiftAltKeyState:
|
|
||||||
held: dict = {}
|
|
||||||
released: dict = {}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class KeyMapper:
|
|
||||||
def __init__(self):
|
|
||||||
super(KeyMapper, self).__init__()
|
|
||||||
|
|
||||||
self.state = NoKeyState
|
|
||||||
self._map = {
|
|
||||||
NoKeyState: NoKeyState(),
|
|
||||||
NoKeyState | CtrlKeyState : CtrlKeyState(),
|
|
||||||
NoKeyState | ShiftKeyState: ShiftKeyState(),
|
|
||||||
NoKeyState | AltKeyState : AltKeyState(),
|
|
||||||
NoKeyState | CtrlKeyState | ShiftKeyState : CtrlShiftKeyState(),
|
|
||||||
NoKeyState | CtrlKeyState | AltKeyState : CtrlAltKeyState(),
|
|
||||||
NoKeyState | AltKeyState | ShiftKeyState : AltShiftKeyState(),
|
|
||||||
NoKeyState | CtrlKeyState | ShiftKeyState | AltKeyState: CtrlShiftAltKeyState(),
|
|
||||||
}
|
|
||||||
|
|
||||||
self.load_map()
|
|
||||||
|
|
||||||
|
|
||||||
def load_map(self):
|
|
||||||
self.states = copy.deepcopy(self._map)
|
|
||||||
bindings_file = f"{settings_manager.path_manager.get_home_config_path()}/code-key-bindings.json"
|
|
||||||
|
|
||||||
with open(bindings_file, 'r') as f:
|
|
||||||
data = json.load(f)["keybindings"]
|
|
||||||
|
|
||||||
for command in data:
|
|
||||||
press_state = "held" if "held" in data[command] else "released"
|
|
||||||
keyname = data[command][press_state]
|
|
||||||
|
|
||||||
state = NoKeyState
|
|
||||||
if "<Control>" in keyname:
|
|
||||||
state = state | CtrlKeyState
|
|
||||||
if "<Shift>" in keyname:
|
|
||||||
state = state | ShiftKeyState
|
|
||||||
if "<Alt>" in keyname:
|
|
||||||
state = state | AltKeyState
|
|
||||||
|
|
||||||
keyname = keyname.replace("<Control>", "") \
|
|
||||||
.replace("<Shift>", "") \
|
|
||||||
.replace("<Alt>", "") \
|
|
||||||
.lower()
|
|
||||||
|
|
||||||
getattr(self.states[state], press_state)[keyname] = command
|
|
||||||
|
|
||||||
def re_map(self):
|
|
||||||
self.states = copy.deepcopy(self._map)
|
|
||||||
|
|
||||||
def _key_press_event(self, eve):
|
|
||||||
keyname = Gdk.keyval_name(eve.keyval).lower()
|
|
||||||
|
|
||||||
self._set_key_state(eve)
|
|
||||||
if keyname in self.states[self.state].held:
|
|
||||||
return self.states[self.state].held[keyname]
|
|
||||||
|
|
||||||
def _key_release_event(self, eve):
|
|
||||||
keyname = Gdk.keyval_name(eve.keyval).lower()
|
|
||||||
|
|
||||||
self._set_key_state(eve)
|
|
||||||
if keyname in self.states[self.state].released:
|
|
||||||
return self.states[self.state].released[keyname]
|
|
||||||
|
|
||||||
def _set_key_state(self, eve):
|
|
||||||
modifiers = Gdk.ModifierType(eve.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
|
||||||
is_control = True if modifiers & Gdk.ModifierType.CONTROL_MASK else False
|
|
||||||
is_shift = True if modifiers & Gdk.ModifierType.SHIFT_MASK else False
|
|
||||||
|
|
||||||
try:
|
|
||||||
is_alt = True if modifiers & Gdk.ModifierType.ALT_MASK else False
|
|
||||||
except Exception:
|
|
||||||
is_alt = True if modifiers & Gdk.ModifierType.MOD1_MASK else False
|
|
||||||
|
|
||||||
self.state = NoKeyState
|
|
||||||
if is_control:
|
|
||||||
self.state = self.state | CtrlKeyState
|
|
||||||
if is_shift:
|
|
||||||
self.state = self.state | ShiftKeyState
|
|
||||||
if is_alt:
|
|
||||||
self.state = self.state | AltKeyState
|
|
||||||
|
|
||||||
def is_control(self, eve):
|
|
||||||
modifiers = Gdk.ModifierType(eve.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
|
||||||
return True if modifiers & Gdk.ModifierType.CONTROL_MASK else False
|
|
||||||
|
|
||||||
def is_shift(self, eve):
|
|
||||||
modifiers = Gdk.ModifierType(eve.get_state() & ~Gdk.ModifierType.LOCK_MASK)
|
|
||||||
return True if modifiers & Gdk.ModifierType.SHIFT_MASK else False
|
|
||||||
|
|
||||||
def get_raw_keyname(self, eve):
|
|
||||||
return Gdk.keyval_name(eve.keyval)
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
from gi.repository.GtkSource import Map
|
|
||||||
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MiniViewWidget(Map):
|
|
||||||
def __init__(self):
|
|
||||||
super(MiniViewWidget, self).__init__()
|
|
||||||
|
|
||||||
self._setup_styling()
|
|
||||||
self._setup_signals()
|
|
||||||
self._subscribe_to_events()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
|
||||||
ctx = self.get_style_context()
|
|
||||||
ctx.add_class("mini-view")
|
|
||||||
|
|
||||||
self.set_hexpand(False)
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
|
||||||
event_system.subscribe(f"set-mini-view", self.set_smini_view)
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def set_smini_view(self, source_view):
|
|
||||||
self.set_view(source_view)
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
"""
|
|
||||||
Code Mixins Package
|
|
||||||
"""
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
import random
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.dto.states import SourceViewStates, MoveDirection, CursorAction
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MarkEventsMixin:
|
|
||||||
def clear_markers(self, source_view):
|
|
||||||
buffer = source_view.get_buffer()
|
|
||||||
|
|
||||||
for mark in self.insert_markers:
|
|
||||||
mark.set_visible(False)
|
|
||||||
buffer.delete_mark(mark)
|
|
||||||
|
|
||||||
self.insert_markers.clear()
|
|
||||||
|
|
||||||
def _insert_mark(self, insert_iter, target_iter, buffer):
|
|
||||||
mark_found = self._check_for_insert_marks(target_iter, buffer)
|
|
||||||
|
|
||||||
if mark_found: return
|
|
||||||
|
|
||||||
random_bits = random.getrandbits(128)
|
|
||||||
hash = "%032x" % random_bits
|
|
||||||
|
|
||||||
mark = Gtk.TextMark.new(
|
|
||||||
name = f"multi_insert_{hash}",
|
|
||||||
left_gravity = False
|
|
||||||
)
|
|
||||||
|
|
||||||
buffer.add_mark(mark, target_iter)
|
|
||||||
mark.set_visible(True)
|
|
||||||
self.insert_markers.append(mark)
|
|
||||||
|
|
||||||
|
|
||||||
def _check_for_insert_marks(self, target_iter, buffer):
|
|
||||||
marks = target_iter.get_marks()
|
|
||||||
|
|
||||||
for mark in marks:
|
|
||||||
if mark in self.insert_markers[:]:
|
|
||||||
mark.set_visible(False)
|
|
||||||
self.insert_markers.remove(mark)
|
|
||||||
buffer.delete_mark(mark)
|
|
||||||
return True
|
|
||||||
|
|
||||||
insert_itr = buffer.get_iter_at_mark( buffer.get_insert() )
|
|
||||||
if target_iter.equal(insert_itr): return True
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _process_cursor_action(self, buffer):
|
|
||||||
if not self.insert_markers: return
|
|
||||||
if self.cursor_action == CursorAction.NONE.value: return
|
|
||||||
|
|
||||||
action = self.cursor_action
|
|
||||||
for mark in self.insert_markers:
|
|
||||||
itr = buffer.get_iter_at_mark(mark)
|
|
||||||
|
|
||||||
if action == CursorAction.BACKSPACE.value:
|
|
||||||
buffer.backspace(itr, interactive = True, default_editable = True)
|
|
||||||
elif action == CursorAction.DELETE.value:
|
|
||||||
itr.forward_char()
|
|
||||||
buffer.backspace(itr, interactive = True, default_editable = True)
|
|
||||||
elif action == CursorAction.ENTER.value:
|
|
||||||
...
|
|
||||||
|
|
||||||
self.cursor_action = CursorAction.NONE.value
|
|
||||||
|
|
||||||
def _process_move_direction(self, buffer):
|
|
||||||
if not self.insert_markers: return
|
|
||||||
if self.move_direction == MoveDirection.NONE.value: return
|
|
||||||
|
|
||||||
direction = self.move_direction
|
|
||||||
for mark in self.insert_markers:
|
|
||||||
itr = buffer.get_iter_at_mark(mark)
|
|
||||||
|
|
||||||
if direction == MoveDirection.UP.value:
|
|
||||||
new_line = itr.get_line() - 1
|
|
||||||
new_itr = buffer.get_iter_at_line_offset(
|
|
||||||
new_line,
|
|
||||||
itr.get_line_index()
|
|
||||||
)
|
|
||||||
|
|
||||||
elif direction == MoveDirection.DOWN.value:
|
|
||||||
new_line = itr.get_line() + 1
|
|
||||||
new_itr = buffer.get_iter_at_line_offset(
|
|
||||||
new_line,
|
|
||||||
itr.get_line_index()
|
|
||||||
)
|
|
||||||
elif direction == MoveDirection.LEFT.value:
|
|
||||||
if not itr.backward_char(): break
|
|
||||||
new_itr = itr
|
|
||||||
elif direction == MoveDirection.RIGHT.value:
|
|
||||||
if not itr.forward_char(): break
|
|
||||||
new_itr = itr
|
|
||||||
else:
|
|
||||||
continue
|
|
||||||
|
|
||||||
buffer.move_mark_by_name(mark.get_name(), new_itr)
|
|
||||||
|
|
||||||
self.move_direction = MoveDirection.NONE
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewDnDMixin:
|
|
||||||
|
|
||||||
def _set_up_dnd(self):
|
|
||||||
PLAIN_TEXT_TARGET_TYPE = 70
|
|
||||||
URI_TARGET_TYPE = 80
|
|
||||||
text_target = Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags(0), PLAIN_TEXT_TARGET_TYPE)
|
|
||||||
uri_target = Gtk.TargetEntry.new('text/uri-list', Gtk.TargetFlags(0), URI_TARGET_TYPE)
|
|
||||||
targets = [ text_target, uri_target ]
|
|
||||||
|
|
||||||
self.drag_dest_set_target_list(targets)
|
|
||||||
|
|
||||||
def _on_drag_data_received(self, widget, drag_context, x, y, data, info, time):
|
|
||||||
if info == 70: return
|
|
||||||
|
|
||||||
if info == 80:
|
|
||||||
uris = data.get_uris()
|
|
||||||
|
|
||||||
if len(uris) == 0:
|
|
||||||
uris = data.get_text().split("\n")
|
|
||||||
|
|
||||||
self._on_uri_data_received(uris)
|
|
||||||
|
|
||||||
def _on_uri_data_received(self, uris: []):
|
|
||||||
uri = uris.pop(0)
|
|
||||||
self.command.exec_with_args("dnd_load_file_to_buffer", (self, uri))
|
|
||||||
|
|
||||||
if len(uris) == 0: return
|
|
||||||
|
|
||||||
self.command.exec_with_args("dnd_load_files", (self, uris))
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceBuffer(GtkSource.Buffer):
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceBuffer, self).__init__()
|
|
||||||
|
|
||||||
self._handler_ids = []
|
|
||||||
|
|
||||||
|
|
||||||
def set_signals(
|
|
||||||
self,
|
|
||||||
_changed,
|
|
||||||
_mark_set,
|
|
||||||
_insert_text,
|
|
||||||
_after_insert_text,
|
|
||||||
_modified_changed,
|
|
||||||
):
|
|
||||||
|
|
||||||
self._handler_ids = [
|
|
||||||
self.connect("changed", _changed),
|
|
||||||
self.connect("mark-set", _mark_set),
|
|
||||||
self.connect("insert-text", _insert_text),
|
|
||||||
self.connect_after("insert-text", _after_insert_text),
|
|
||||||
self.connect("modified-changed", _modified_changed)
|
|
||||||
]
|
|
||||||
|
|
||||||
def block_changed_signal(self):
|
|
||||||
self.handler_block(self._handler_ids[0])
|
|
||||||
|
|
||||||
def block_insert_after_signal(self):
|
|
||||||
self.handler_block(self._handler_ids[3])
|
|
||||||
|
|
||||||
def block_modified_changed_signal(self):
|
|
||||||
self.handler_block(self._handler_ids[4])
|
|
||||||
|
|
||||||
def unblock_changed_signal(self):
|
|
||||||
self.handler_unblock(self._handler_ids[0])
|
|
||||||
|
|
||||||
def unblock_insert_after_signal(self):
|
|
||||||
self.handler_unblock(self._handler_ids[3])
|
|
||||||
|
|
||||||
def unblock_modified_changed_signal(self):
|
|
||||||
self.handler_unblock(self._handler_ids[4])
|
|
||||||
|
|
||||||
def clear_signals(self):
|
|
||||||
for handle_id in self._handler_ids:
|
|
||||||
self.disconnect(handle_id)
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
for handle_id in self._handler_ids:
|
|
||||||
self.disconnect(handle_id)
|
|
||||||
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
import os
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from gi.repository import GLib
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
from gi.repository import Gio
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
|
||||||
|
|
||||||
from .source_buffer import SourceBuffer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceFile(GtkSource.File):
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceFile, self).__init__()
|
|
||||||
|
|
||||||
self.encoding: str = "UTF-8"
|
|
||||||
self.fname: str = "buffer"
|
|
||||||
self.fpath: str = "buffer"
|
|
||||||
self.ftype: str = "buffer"
|
|
||||||
|
|
||||||
self.buffer: SourceBuffer = SourceBuffer()
|
|
||||||
|
|
||||||
self._set_signals()
|
|
||||||
|
|
||||||
|
|
||||||
def _set_signals(self):
|
|
||||||
self.buffer.set_signals(
|
|
||||||
self._changed,
|
|
||||||
self._mark_set,
|
|
||||||
self._insert_text,
|
|
||||||
self._after_insert_text,
|
|
||||||
self._modified_changed
|
|
||||||
)
|
|
||||||
|
|
||||||
def _changed(self, buffer: SourceBuffer):
|
|
||||||
event = Event_Factory.create_event("text_changed", buffer = buffer)
|
|
||||||
event.file = self
|
|
||||||
self.emit(event)
|
|
||||||
|
|
||||||
def _insert_text(
|
|
||||||
self,
|
|
||||||
buffer: SourceBuffer,
|
|
||||||
location: Gtk.TextIter,
|
|
||||||
text: str, length: int
|
|
||||||
):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _after_insert_text(
|
|
||||||
self,
|
|
||||||
buffer: SourceBuffer,
|
|
||||||
location: Gtk.TextIter,
|
|
||||||
text: str, length: int
|
|
||||||
):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"text_inserted",
|
|
||||||
file = self,
|
|
||||||
buffer = self.buffer,
|
|
||||||
location = location,
|
|
||||||
text = text,
|
|
||||||
length = length
|
|
||||||
)
|
|
||||||
|
|
||||||
# Note: 'idle_add' needed b/c markers don't get thir positions
|
|
||||||
# updated relative to the initial insert.
|
|
||||||
# If not used, seg faults galor during multi insert.
|
|
||||||
GLib.idle_add(self.emit, event)
|
|
||||||
|
|
||||||
def _mark_set(
|
|
||||||
self,
|
|
||||||
buffer: SourceBuffer,
|
|
||||||
location: Gtk.TextIter,
|
|
||||||
mark: Gtk.TextMark
|
|
||||||
):
|
|
||||||
# event = Event_Factory.create_event(
|
|
||||||
# "mark_set",
|
|
||||||
# file = self, buffer = buffer
|
|
||||||
# )
|
|
||||||
|
|
||||||
# self.emit(event)
|
|
||||||
...
|
|
||||||
|
|
||||||
def _modified_changed(self, buffer: SourceBuffer):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"modified_changed",
|
|
||||||
file = self, buffer = buffer
|
|
||||||
)
|
|
||||||
|
|
||||||
self.emit(event)
|
|
||||||
|
|
||||||
def _write_file(self, gfile: Gio.File):
|
|
||||||
if not gfile: return
|
|
||||||
|
|
||||||
with open(gfile.get_path(), 'w') as f:
|
|
||||||
start_itr, end_itr = self.buffer.get_bounds()
|
|
||||||
text = self.buffer.get_text(start_itr, end_itr, True)
|
|
||||||
|
|
||||||
f.write(text)
|
|
||||||
|
|
||||||
return gfile
|
|
||||||
|
|
||||||
|
|
||||||
def load_path(self, gfile: Gio.File):
|
|
||||||
if not gfile: return
|
|
||||||
|
|
||||||
self.set_path(gfile)
|
|
||||||
data = gfile.load_bytes()[0].get_data().decode("UTF-8")
|
|
||||||
undo_manager = self.buffer.get_undo_manager()
|
|
||||||
|
|
||||||
undo_manager.begin_not_undoable_action()
|
|
||||||
self.buffer.insert_at_cursor(data)
|
|
||||||
undo_manager.end_not_undoable_action()
|
|
||||||
|
|
||||||
def set_path(self, gfile: Gio.File):
|
|
||||||
if not gfile: return
|
|
||||||
self.set_location(gfile)
|
|
||||||
|
|
||||||
self.fpath = gfile.get_path()
|
|
||||||
self.fname = gfile.get_basename()
|
|
||||||
|
|
||||||
event = Event_Factory.create_event("file_path_set", file = self)
|
|
||||||
self.emit(event)
|
|
||||||
|
|
||||||
def save(self):
|
|
||||||
event = Event_Factory.create_event(
|
|
||||||
"saved_file",
|
|
||||||
file = self, buffer = self.buffer
|
|
||||||
)
|
|
||||||
|
|
||||||
self.emit(event)
|
|
||||||
self._write_file( self.get_location() )
|
|
||||||
|
|
||||||
def save_as(self):
|
|
||||||
file = event_system.emit_and_await("save-file-dialog")
|
|
||||||
if not file: return
|
|
||||||
|
|
||||||
self._write_file(file)
|
|
||||||
self.set_path(file)
|
|
||||||
|
|
||||||
return file
|
|
||||||
|
|
||||||
def close(self):
|
|
||||||
del self.buffer
|
|
||||||
|
|
||||||
def emit(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
...
|
|
||||||
|
|
||||||
def emit_to(self, controller: str, event: Code_Event_Types.CodeEvent):
|
|
||||||
...
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
gi.require_version('GtkSource', '4')
|
|
||||||
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from gi.repository import GLib
|
|
||||||
from gi.repository import GtkSource
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.dto.states import SourceViewStates
|
|
||||||
|
|
||||||
from .mixins.source_view_dnd_mixin import SourceViewDnDMixin
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceView(GtkSource.View, SourceViewDnDMixin):
|
|
||||||
def __init__(self, state: SourceViewStates = SourceViewStates.INSERT):
|
|
||||||
super(SourceView, self).__init__()
|
|
||||||
|
|
||||||
self.state = state
|
|
||||||
|
|
||||||
self._cut_temp_timeout_id = None
|
|
||||||
self._cut_buffer = ""
|
|
||||||
|
|
||||||
self.sibling_right = None
|
|
||||||
self.sibling_left = None
|
|
||||||
|
|
||||||
self._setup_styles()
|
|
||||||
self._setup_signals()
|
|
||||||
self._subscribe_to_events()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styles(self):
|
|
||||||
self.zoom_level = settings_manager.settings.theming.default_zoom
|
|
||||||
ctx = self.get_style_context()
|
|
||||||
|
|
||||||
ctx.add_class("source-view")
|
|
||||||
ctx.add_class(f"px{self.zoom_level}")
|
|
||||||
|
|
||||||
self.set_vexpand(True)
|
|
||||||
self.set_bottom_margin(800)
|
|
||||||
|
|
||||||
self.set_show_line_marks(True)
|
|
||||||
self.set_show_line_numbers(True)
|
|
||||||
self.set_smart_backspace(True)
|
|
||||||
self.set_indent_on_tab(True)
|
|
||||||
self.set_insert_spaces_instead_of_tabs(True)
|
|
||||||
self.set_auto_indent(True)
|
|
||||||
self.set_monospace(True)
|
|
||||||
self.set_tab_width(4)
|
|
||||||
self.set_show_right_margin(True)
|
|
||||||
self.set_right_margin_position(80)
|
|
||||||
self.set_background_pattern(0) # 0 = None, 1 = Grid
|
|
||||||
self.set_highlight_current_line(True)
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
self.connect("drag-data-received", self._on_drag_data_received)
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
self.language_manager = GtkSource.LanguageManager()
|
|
||||||
self.style_scheme_manager = GtkSource.StyleSchemeManager()
|
|
||||||
|
|
||||||
self.style_scheme_manager.append_search_path(
|
|
||||||
f"{settings_manager.path_manager.get_home_config_path()}/code_styles"
|
|
||||||
)
|
|
||||||
self.syntax_theme = self.style_scheme_manager.get_scheme(
|
|
||||||
f"{settings_manager.settings.theming.syntax_theme}"
|
|
||||||
)
|
|
||||||
|
|
||||||
self._set_up_dnd()
|
|
||||||
|
|
||||||
def clear_temp_cut_buffer_delayed(self):
|
|
||||||
if self._cut_temp_timeout_id:
|
|
||||||
GLib.source_remove(self._cut_temp_timeout_id)
|
|
||||||
|
|
||||||
def set_temp_cut_buffer_delayed(self):
|
|
||||||
def clear_temp_buffer():
|
|
||||||
self._cut_buffer = ""
|
|
||||||
self._cut_temp_timeout_id = None
|
|
||||||
return False
|
|
||||||
|
|
||||||
self._cut_temp_timeout_id = GLib.timeout_add(15000, clear_temp_buffer)
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TabWidget(Gtk.Box):
|
|
||||||
def __init__(self):
|
|
||||||
super(TabWidget, self).__init__()
|
|
||||||
|
|
||||||
self.file = None
|
|
||||||
|
|
||||||
self._setup_styling()
|
|
||||||
self._setup_signals()
|
|
||||||
self._subscribe_to_events()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
self.show_all()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
|
||||||
ctx = self.get_style_context()
|
|
||||||
ctx.add_class("tab-widget")
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
self._label_eve_box = Gtk.EventBox()
|
|
||||||
self.label = Gtk.Label(label = "")
|
|
||||||
self.close_btn = Gtk.Button(label = "X")
|
|
||||||
|
|
||||||
ctx = self.label.get_style_context()
|
|
||||||
ctx.add_class("tab-label")
|
|
||||||
ctx = self.close_btn.get_style_context()
|
|
||||||
ctx.add_class("tab-close-bttn")
|
|
||||||
|
|
||||||
self.label.set_hexpand(True)
|
|
||||||
|
|
||||||
self._label_eve_box.add(self.label)
|
|
||||||
self.add(self._label_eve_box)
|
|
||||||
self.add(self.close_btn)
|
|
||||||
|
|
||||||
def clear_signals_and_data(self):
|
|
||||||
del self.file
|
|
||||||
self._label_eve_box.disconnect(self._label_eve_box_id)
|
|
||||||
self.close_btn.disconnect(self.close_btn_id)
|
|
||||||
|
|
||||||
def set_select_signal(self, callback):
|
|
||||||
self._label_eve_box_id = self._label_eve_box.connect('button-release-event', callback, self.file)
|
|
||||||
|
|
||||||
def set_close_signal(self, callback):
|
|
||||||
self.close_btn_id = self.close_btn.connect('button-release-event', callback, self.file)
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.event_factory import Code_Event_Types
|
|
||||||
|
|
||||||
from .source_view import SourceView
|
|
||||||
from .source_file import SourceFile
|
|
||||||
|
|
||||||
from .tab_widget import TabWidget
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TabsWidget(Gtk.ButtonBox):
|
|
||||||
def __init__(self):
|
|
||||||
super(TabsWidget, self).__init__()
|
|
||||||
|
|
||||||
self._setup_styling()
|
|
||||||
self._setup_signals()
|
|
||||||
self._subscribe_to_events()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
|
||||||
self.set_layout(Gtk.ButtonBoxStyle.CENTER)
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def add_tab(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
"""Add a tab widget for the given file event."""
|
|
||||||
if not hasattr(self, 'tabs'):
|
|
||||||
return
|
|
||||||
|
|
||||||
tab = TabWidget()
|
|
||||||
tab.file = event.file
|
|
||||||
|
|
||||||
tab.label.set_label(event.file.fname)
|
|
||||||
|
|
||||||
def select_signal(widget, eve, file):
|
|
||||||
self.code_base.active_view.command.exec_with_args(
|
|
||||||
"set_buffer",
|
|
||||||
(self.code_base.active_view, file)
|
|
||||||
)
|
|
||||||
|
|
||||||
def close_signal(widget, eve, file):
|
|
||||||
self.code_base.files_controller.remove_file(file.buffer)
|
|
||||||
|
|
||||||
tab.set_select_signal(select_signal)
|
|
||||||
tab.set_close_signal(close_signal)
|
|
||||||
|
|
||||||
self.tabs.add(tab)
|
|
||||||
|
|
||||||
def remove_tab(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
"""Remove a tab widget for the given file event."""
|
|
||||||
if not hasattr(self, 'tabs'):
|
|
||||||
return
|
|
||||||
|
|
||||||
for child in self.tabs.get_children():
|
|
||||||
if not child.file == event.file: continue
|
|
||||||
|
|
||||||
self.tabs.remove(child)
|
|
||||||
child.clear_signals_and_data()
|
|
||||||
del child
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def update_tab_label(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
"""Update tab label for the given file event."""
|
|
||||||
if not hasattr(self, 'tabs'):
|
|
||||||
return
|
|
||||||
|
|
||||||
for tab in self.tabs.get_children():
|
|
||||||
if not tab.file == event.file: continue
|
|
||||||
tab.label.set_label(event.file.fname)
|
|
||||||
|
|
||||||
return
|
|
||||||
@@ -35,7 +35,7 @@ class OpenFilesButton(Gtk.Button):
|
|||||||
self.connect("button-release-event", self._open_files)
|
self.connect("button-release-event", self._open_files)
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
event_system.subscribe("open-files", self._open_files)
|
event_system.subscribe("open_files", self._open_files)
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
...
|
...
|
||||||
|
|||||||
@@ -38,11 +38,11 @@ class TransparencyScale(Gtk.Scale):
|
|||||||
adjust = self.get_adjustment()
|
adjust = self.get_adjustment()
|
||||||
adjust.set_lower(0)
|
adjust.set_lower(0)
|
||||||
adjust.set_upper(100)
|
adjust.set_upper(100)
|
||||||
adjust.set_value(settings_manager.settings.theming.transparency)
|
adjust.set_value(settings.theming.transparency)
|
||||||
adjust.set_step_increment(1.0)
|
adjust.set_step_increment(1.0)
|
||||||
|
|
||||||
def _update_transparency(self, range):
|
def _update_transparency(self, range):
|
||||||
event_system.emit("remove-transparency")
|
event_system.emit("remove-transparency")
|
||||||
tp = int(range.get_value())
|
tp = int(range.get_value())
|
||||||
settings_manager.settings.theming.transparency = tp
|
settings.theming.transparency = tp
|
||||||
event_system.emit("update-transparency")
|
event_system.emit("update-transparency")
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
gi.require_version('Gtk', '3.0')
|
|
||||||
from gi.repository import Gtk
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Separator(Gtk.Separator):
|
|
||||||
def __init__(self, id: str = None, ORIENTATION: int = 0):
|
|
||||||
super(Separator, self).__init__()
|
|
||||||
|
|
||||||
if id:
|
|
||||||
widget_registery.expose_object(id, self)
|
|
||||||
|
|
||||||
self.ORIENTATION = ORIENTATION
|
|
||||||
self._setup_styling()
|
|
||||||
self._setup_signals()
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
self.show()
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
|
||||||
# HORIZONTAL = 0, VERTICAL = 1
|
|
||||||
self.set_orientation(self.ORIENTATION)
|
|
||||||
|
|
||||||
|
|
||||||
def _setup_signals(self):
|
|
||||||
...
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
...
|
|
||||||
@@ -12,6 +12,7 @@ from gi.repository import GLib
|
|||||||
from gi.repository import Vte
|
from gi.repository import Vte
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from libs.dto.event import Event
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -58,29 +59,27 @@ class VteWidget(Vte.Terminal):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _do_session_spawn(self):
|
def _do_session_spawn(self):
|
||||||
env = [
|
|
||||||
"DISPLAY=:0",
|
|
||||||
"LC_ALL=C",
|
|
||||||
"TERM='xterm-256color'",
|
|
||||||
f"HOME='{settings_manager.path_manager.get_home_path()}'",
|
|
||||||
"XDG_RUNTIME_DIR='/run/user/1000'",
|
|
||||||
f"XAUTHORITY='{settings_manager.path_manager.get_home_path()}/.Xauthority'",
|
|
||||||
"HISTFILE=/dev/null",
|
|
||||||
"HISTSIZE=0",
|
|
||||||
"HISTFILESIZE=0",
|
|
||||||
"PS1=\\h@\\u \\W -->: ",
|
|
||||||
]
|
|
||||||
|
|
||||||
self.spawn_sync(
|
self.spawn_sync(
|
||||||
Vte.PtyFlags.DEFAULT,
|
Vte.PtyFlags.DEFAULT,
|
||||||
settings_manager.path_manager.get_home_path(),
|
settings_manager.get_home_path(),
|
||||||
["/bin/bash"],
|
["/bin/bash"],
|
||||||
env,
|
[],
|
||||||
GLib.SpawnFlags.DEFAULT,
|
GLib.SpawnFlags.DEFAULT,
|
||||||
None, None,
|
None, None,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Note: '-->:' is used as a delimiter to split on to get command actual.
|
||||||
|
# !!! DO NOT REMOVE UNLESS CODE UPDATED ACCORDINGLY !!!
|
||||||
startup_cmds = [
|
startup_cmds = [
|
||||||
|
"env -i /bin/bash --noprofile --norc\n",
|
||||||
|
"export TERM='xterm-256color'\n",
|
||||||
|
"export LC_ALL=C\n",
|
||||||
|
"export XDG_RUNTIME_DIR='/run/user/1000'\n",
|
||||||
|
"export DISPLAY=:0\n",
|
||||||
|
f"export XAUTHORITY='{settings_manager.get_home_path()}/.Xauthority'\n",
|
||||||
|
f"\nexport HOME='{settings_manager.get_home_path()}'\n",
|
||||||
|
"export PS1='\\h@\\u \\W -->: '\n",
|
||||||
|
"clear\n"
|
||||||
]
|
]
|
||||||
|
|
||||||
for i in startup_cmds:
|
for i in startup_cmds:
|
||||||
@@ -94,9 +93,6 @@ class VteWidget(Vte.Terminal):
|
|||||||
if not text.encode() == "\r".encode(): return
|
if not text.encode() == "\r".encode(): return
|
||||||
|
|
||||||
text, attributes = self.get_text()
|
text, attributes = self.get_text()
|
||||||
|
|
||||||
if not text: return
|
|
||||||
|
|
||||||
lines = text.strip().splitlines()
|
lines = text.strip().splitlines()
|
||||||
command_ran = None
|
command_ran = None
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from gi.repository import WebKit2
|
|||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.settings.other.webkit_ui_settings import WebkitUISettings
|
from libs.settings.other.webkit_ui_settings import WebkitUISettings
|
||||||
from libs.dto.base_event import BaseEvent
|
from libs.dto.event import Event
|
||||||
|
|
||||||
|
|
||||||
class WebkitUI(WebKit2.WebView):
|
class WebkitUI(WebKit2.WebView):
|
||||||
@@ -37,14 +37,13 @@ class WebkitUI(WebKit2.WebView):
|
|||||||
self.set_settings( WebkitUISettings() )
|
self.set_settings( WebkitUISettings() )
|
||||||
|
|
||||||
def _load_view(self):
|
def _load_view(self):
|
||||||
path = settings_manager.path_manager.get_context_path()
|
path = settings_manager.get_context_path()
|
||||||
data = None
|
data = None
|
||||||
|
|
||||||
with open(f"{path}/index.html", "r") as f:
|
with open(f"{path}/index.html", "r") as f:
|
||||||
data = f.read()
|
data = f.read()
|
||||||
|
|
||||||
self.load_html(content = data, base_uri = f"file://{path}/")
|
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()
|
||||||
@@ -56,7 +55,7 @@ class WebkitUI(WebKit2.WebView):
|
|||||||
message = js_value.to_string()
|
message = js_value.to_string()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
event = BaseEvent( **json.loads(message) )
|
event = Event( **json.loads(message) )
|
||||||
event_system.emit("handle-bridge-event", (event,))
|
event_system.emit("handle-bridge-event", (event,))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.info(e)
|
logger.info(e)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ from core.controllers.base_controller import BaseController
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerStartException(Exception):
|
class ControllerStartExceptiom(Exception):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ class Window(Gtk.ApplicationWindow):
|
|||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.set_title(f"{APP_NAME}")
|
self.set_title(f"{APP_NAME}")
|
||||||
self.set_icon_from_file( settings_manager.path_manager.get_window_icon() )
|
self.set_icon_from_file( settings_manager.get_window_icon() )
|
||||||
self.set_decorated(True)
|
self.set_decorated(True)
|
||||||
self.set_skip_pager_hint(False)
|
self.set_skip_pager_hint(False)
|
||||||
self.set_skip_taskbar_hint(False)
|
self.set_skip_taskbar_hint(False)
|
||||||
@@ -62,7 +62,7 @@ class Window(Gtk.ApplicationWindow):
|
|||||||
|
|
||||||
ctx = self.get_style_context()
|
ctx = self.get_style_context()
|
||||||
ctx.add_class("main-window")
|
ctx.add_class("main-window")
|
||||||
ctx.add_class(f"mw_transparency_{settings_manager.settings.theming.transparency}")
|
ctx.add_class(f"mw_transparency_{settings.theming.transparency}")
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
self.connect("focus-in-event", self._on_focus_in_event)
|
self.connect("focus-in-event", self._on_focus_in_event)
|
||||||
@@ -96,12 +96,12 @@ class Window(Gtk.ApplicationWindow):
|
|||||||
return 'X11'
|
return 'X11'
|
||||||
|
|
||||||
def _set_size_constraints(self):
|
def _set_size_constraints(self):
|
||||||
_window_x = settings_manager.settings.config.main_window_x
|
_window_x = settings.config.main_window_x
|
||||||
_window_y = settings_manager.settings.config.main_window_y
|
_window_y = settings.config.main_window_y
|
||||||
_min_width = settings_manager.settings.config.main_window_min_width
|
_min_width = settings.config.main_window_min_width
|
||||||
_min_height = settings_manager.settings.config.main_window_min_height
|
_min_height = settings.config.main_window_min_height
|
||||||
_width = settings_manager.settings.config.main_window_width
|
_width = settings.config.main_window_width
|
||||||
_height = settings_manager.settings.config.main_window_height
|
_height = settings.config.main_window_height
|
||||||
|
|
||||||
self.move(_window_x, _window_y - 28)
|
self.move(_window_x, _window_y - 28)
|
||||||
self.set_size_request(_min_width, _min_height)
|
self.set_size_request(_min_width, _min_height)
|
||||||
@@ -111,15 +111,16 @@ class Window(Gtk.ApplicationWindow):
|
|||||||
screen = self.get_screen()
|
screen = self.get_screen()
|
||||||
visual = screen.get_rgba_visual()
|
visual = screen.get_rgba_visual()
|
||||||
|
|
||||||
if visual and screen.is_composited() and settings_manager.settings.config.make_transparent == 0:
|
if visual and screen.is_composited() and settings.config.make_transparent == 0:
|
||||||
self.set_visual(visual)
|
self.set_visual(visual)
|
||||||
self.set_app_paintable(True)
|
self.set_app_paintable(True)
|
||||||
# self.connect("draw", self._area_draw)
|
# self.connect("draw", self._area_draw)
|
||||||
|
|
||||||
# bind css file
|
# bind css file
|
||||||
cssProvider = Gtk.CssProvider()
|
cssProvider = Gtk.CssProvider()
|
||||||
|
cssProvider.load_from_path( settings_manager.get_css_file() )
|
||||||
|
screen = Gdk.Screen.get_default()
|
||||||
styleContext = Gtk.StyleContext()
|
styleContext = Gtk.StyleContext()
|
||||||
cssProvider.load_from_path( settings_manager.path_manager.get_css_file() )
|
|
||||||
styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER)
|
styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER)
|
||||||
|
|
||||||
def _area_draw(self, widget: Gtk.ApplicationWindow, cr: cairo.Context) -> None:
|
def _area_draw(self, widget: Gtk.ApplicationWindow, cr: cairo.Context) -> None:
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
"""
|
|
||||||
Libs Controllers Package
|
|
||||||
"""
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..singleton import Singleton
|
|
||||||
|
|
||||||
from ..dto.base_event import BaseEvent
|
|
||||||
|
|
||||||
from .emit_dispatcher import EmitDispatcher
|
|
||||||
from .controller_context import ControllerContext
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerBaseException(Exception):
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerBase(Singleton, EmitDispatcher):
|
|
||||||
def __init__(self):
|
|
||||||
super(ControllerBase, self).__init__()
|
|
||||||
|
|
||||||
self.controller_context: ControllerContext = None
|
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: BaseEvent):
|
|
||||||
raise ControllerBaseException("Controller Base '_controller_message' must be overridden...")
|
|
||||||
|
|
||||||
def set_controller_context(self, controller_context: ControllerContext):
|
|
||||||
self.controller_context = controller_context
|
|
||||||
|
|
||||||
def message(self, event: BaseEvent):
|
|
||||||
return self.controller_context.message(event)
|
|
||||||
|
|
||||||
def message_to(self, name: str, event: BaseEvent):
|
|
||||||
return self.controller_context.message_to(name, event)
|
|
||||||
|
|
||||||
def message_to_selected(self, names: list[str], event: BaseEvent):
|
|
||||||
for name in names:
|
|
||||||
self.controller_context.message_to_selected(name, event)
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..dto.base_event import BaseEvent
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerContextException(Exception):
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerContext:
|
|
||||||
def __init__(self):
|
|
||||||
super(ControllerContext, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def message(self, event: BaseEvent):
|
|
||||||
raise ControllerContextException("Controller Context 'message' must be overriden by Controller Manager...")
|
|
||||||
|
|
||||||
def message_to(self, name: str, event: BaseEvent):
|
|
||||||
raise ControllerContextException("Controller Context 'message_to' must be overriden by Controller Manager...")
|
|
||||||
|
|
||||||
def message_to_selected(self, name: list, event: BaseEvent):
|
|
||||||
raise ControllerContextException("Controller Context 'message_to_selected' must be overriden by Controller Manager...")
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..singleton import Singleton
|
|
||||||
from ..event_factory import Code_Event_Types
|
|
||||||
|
|
||||||
from .controller_base import ControllerBase
|
|
||||||
from .controller_context import ControllerContext
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerManagerException(Exception):
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ControllerManager(Singleton, dict):
|
|
||||||
def __init__(self):
|
|
||||||
super(ControllerManager, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def _crete_controller_context(self) -> ControllerContext:
|
|
||||||
controller_context = ControllerContext()
|
|
||||||
controller_context.message_to = self.message_to
|
|
||||||
controller_context.message = self.message
|
|
||||||
|
|
||||||
return controller_context
|
|
||||||
|
|
||||||
def register_controller(self, name: str, controller: ControllerBase):
|
|
||||||
if not name or controller == None:
|
|
||||||
raise ControllerManagerException("Must pass in a 'name' and 'controller'...")
|
|
||||||
|
|
||||||
if name in self.keys():
|
|
||||||
raise ControllerManagerException(f"Can't bind controller to registered name of '{name}'...")
|
|
||||||
|
|
||||||
controller.set_controller_context( self._crete_controller_context() )
|
|
||||||
|
|
||||||
self[name] = controller
|
|
||||||
|
|
||||||
def get_controllers_key_list(self) -> list[str]:
|
|
||||||
return self.keys()
|
|
||||||
|
|
||||||
def message_to(self, name: str, event: Code_Event_Types.CodeEvent):
|
|
||||||
self[name]._controller_message(event)
|
|
||||||
|
|
||||||
def message(self, event: Code_Event_Types.CodeEvent):
|
|
||||||
for key in self.keys():
|
|
||||||
self[key]._controller_message(event)
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from ..dto.base_event import BaseEvent
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class EmitDispatcher:
|
|
||||||
def __init__(self):
|
|
||||||
super(EmitDispatcher, self).__init__()
|
|
||||||
|
|
||||||
|
|
||||||
def emit(self, event: BaseEvent):
|
|
||||||
self.message(event)
|
|
||||||
|
|
||||||
def emit_to(self, controller: str, event: BaseEvent):
|
|
||||||
self.message_to(controller, event)
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Libs DB Package
|
DB Package
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from .models import User
|
from .models import User
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Libs DTO(s) Package
|
Dasta Class Package
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from .base_event import BaseEvent
|
from .event import Event
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
from dataclasses import dataclass, field
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(slots = True)
|
|
||||||
class BaseEvent:
|
|
||||||
topic: str = None
|
|
||||||
content: any = None
|
|
||||||
raw_content: any = None
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user