Compare commits

...

2 Commits

55 changed files with 167 additions and 81 deletions

View File

@@ -37,7 +37,7 @@ class Plugin(PluginCode):
] ]
) )
self.message_to("source_views", event) self.emit_to("source_views", event)
def run(self): def run(self):
... ...

View File

@@ -24,7 +24,7 @@ class Plugin(PluginCode):
binding = "<Shift><Control>h" binding = "<Shift><Control>h"
) )
self.message_to("source_views", event) self.emit_to("source_views", event)
def run(self): def run(self):
... ...

View File

@@ -33,7 +33,7 @@ class Plugin(PluginCode):
provider = self.provider, provider = self.provider,
language_ids = [] language_ids = []
) )
self.message_to("completion", event) self.emit_to("completion", event)
def run(self): def run(self):
... ...

View File

@@ -33,7 +33,7 @@ class Plugin(PluginCode):
provider = self.provider, provider = self.provider,
language_ids = [] language_ids = []
) )
self.message_to("completion", event) self.emit_to("completion", event)
def run(self): def run(self):
... ...

View File

@@ -33,7 +33,7 @@ class Plugin(PluginCode):
provider = self.provider, provider = self.provider,
language_ids = [] language_ids = []
) )
self.message_to("completion", event) self.emit_to("completion", event)
def run(self): def run(self):
... ...

View File

@@ -33,7 +33,7 @@ class Plugin(PluginCode):
provider = self.provider, provider = self.provider,
language_ids = [] language_ids = []
) )
self.message_to("completion", event) self.emit_to("completion", event)
def run(self): def run(self):
... ...

View File

@@ -25,7 +25,7 @@ class Plugin(PluginCode):
code_minimap.set_smini_view(event.view) code_minimap.set_smini_view(event.view)
def load(self): def load(self):
editors_container = self.requests_ui_element("editors-container") editors_container = self.request_ui_element("editors-container")
editors_container.add( code_minimap ) editors_container.add( code_minimap )
def run(self): def run(self):

View File

@@ -25,7 +25,7 @@ class Plugin(PluginCode):
info_bar_widget._set_info_labels(*event.info) info_bar_widget._set_info_labels(*event.info)
def load(self): def load(self):
header = self.requests_ui_element("header-container") header = self.request_ui_element("header-container")
header.add( info_bar_widget ) header.add( info_bar_widget )
def run(self): def run(self):

View File

@@ -21,7 +21,7 @@ class Plugin(PluginCode):
def load(self): def load(self):
tabs_controller = TabsController() tabs_controller = TabsController()
code_container = self.requests_ui_element("code-container") code_container = self.request_ui_element("code-container")
self.register_controller("tabs", tabs_controller) self.register_controller("tabs", tabs_controller)

View File

@@ -32,6 +32,7 @@ class TabWidget(Gtk.Box):
self.set_orientation(0) self.set_orientation(0)
self.set_hexpand(False) self.set_hexpand(False)
self.set_vexpand(False) self.set_vexpand(False)
self.set_can_focus(False)
self.set_size_request(-1, 12) self.set_size_request(-1, 12)
def _setup_signals(self): def _setup_signals(self):
@@ -43,6 +44,10 @@ class TabWidget(Gtk.Box):
self.close_bttn = Gtk.Button() self.close_bttn = Gtk.Button()
icon = Gtk.Image(stock = Gtk.STOCK_CLOSE) icon = Gtk.Image(stock = Gtk.STOCK_CLOSE)
self.event_box.set_can_focus(False)
self.label.set_can_focus(False)
self.close_bttn.set_can_focus(False)
self.event_box.set_above_child(True) self.event_box.set_above_child(True)
ctx = self.label.get_style_context() ctx = self.label.get_style_context()
ctx.add_class("tab-label") ctx.add_class("tab-label")

View File

@@ -22,7 +22,7 @@ class TabsController(ControllerBase):
super(TabsController, self).__init__() super(TabsController, self).__init__()
self.tabs_widget: TabsWidget = TabsWidget() self.tabs_widget: TabsWidget = TabsWidget()
self.tabs_widget.message = self.message self.tabs_widget.emit = self.emit
def _controller_message(self, event: Code_Event_Types.CodeEvent): def _controller_message(self, event: Code_Event_Types.CodeEvent):

View File

@@ -56,7 +56,7 @@ class TabsWidget(Gtk.Notebook):
buffer = file.buffer buffer = file.buffer
) )
self.message(event) self.emit(event)
def _switch_page(self, notebook, page_widget, page_num): def _switch_page(self, notebook, page_widget, page_num):
tab = self.get_tab_label(page_widget) tab = self.get_tab_label(page_widget)
@@ -65,7 +65,7 @@ class TabsWidget(Gtk.Notebook):
buffer = tab.file.buffer buffer = tab.file.buffer
) )
self.message(event) self.emit(event)
def _bind_tab_menu(self, tab, page_widget): def _bind_tab_menu(self, tab, page_widget):
def do_context_menu(tab, eve, page_widget): def do_context_menu(tab, eve, page_widget):

View File

@@ -21,7 +21,7 @@ class Plugin(PluginUI):
... ...
def load(self): def load(self):
ui_element = self.requests_ui_element("header-container") ui_element = self.request_ui_element("header-container")
ui_element.add( self.generate_plugin_element() ) ui_element.add( self.generate_plugin_element() )
def run(self): def run(self):

View File

@@ -21,7 +21,13 @@ class CompletionController(ControllerBase):
self._providers: dict[str, GtkSource.CompletionProvider] = {} self._providers: dict[str, GtkSource.CompletionProvider] = {}
def _controller_message(self, event: Code_Event_Types.CodeEvent): def _controller_message(self, event: Code_Event_Types.CodeEvent):
if isinstance(event, Code_Event_Types.RegisterProviderEvent): if isinstance(event, Code_Event_Types.RegisterCompleterEvent):
self.register_completer(event.completer)
elif isinstance(event, Code_Event_Types.UnregisterCompleterEvent):
self.unregister_completer(event.completer)
elif isinstance(event, Code_Event_Types.UnregisterProviderEvent):
self.unregister_provider(event.provider_name)
elif isinstance(event, Code_Event_Types.RegisterProviderEvent):
self.register_provider( self.register_provider(
event.provider_name, event.provider_name,
event.provider, event.provider,

View File

@@ -6,6 +6,8 @@
from libs.controllers.controller_base import ControllerBase from libs.controllers.controller_base import ControllerBase
from libs.event_factory import Event_Factory, Code_Event_Types from libs.event_factory import Event_Factory, Code_Event_Types
from libs.dto.states import SourceViewStates
from ...source_view import SourceView from ...source_view import SourceView
from .state_manager import SourceViewStateManager from .state_manager import SourceViewStateManager
@@ -25,7 +27,9 @@ class SourceViewsController(ControllerBase, list):
def _controller_message(self, event: Code_Event_Types.CodeEvent): def _controller_message(self, event: Code_Event_Types.CodeEvent):
if isinstance(event, Code_Event_Types.RemovedFileEvent): if isinstance(event, Code_Event_Types.CreateSourceViewEvent):
event.response = self.create_source_view(event.state)
elif isinstance(event, Code_Event_Types.RemovedFileEvent):
self._remove_file(event) self._remove_file(event)
elif isinstance(event, Code_Event_Types.RegisterCommandEvent): elif isinstance(event, Code_Event_Types.RegisterCommandEvent):
self._register_command(event) self._register_command(event)
@@ -74,8 +78,8 @@ class SourceViewsController(ControllerBase, list):
source_view.set_buffer(event.next_file.buffer) source_view.set_buffer(event.next_file.buffer)
def create_source_view(self): def create_source_view(self, state: SourceViewStates = SourceViewStates.INSERT):
source_view: SourceView = SourceView() source_view: SourceView = SourceView(state)
source_view.command = self._get_command_system() source_view.command = self._get_command_system()
source_view.command.set_data(source_view) source_view.command.set_data(source_view)
@@ -86,6 +90,7 @@ class SourceViewsController(ControllerBase, list):
def first_map_load(self): def first_map_load(self):
for source_view in self: for source_view in self:
if source_view.state == SourceViewStates.INDEPENDENT: continue
source_view.command.exec("new_file") source_view.command.exec("new_file")
if not source_view.sibling_left: continue if not source_view.sibling_left: continue
source_view.get_parent().hide() source_view.get_parent().hide()

View File

@@ -19,7 +19,8 @@ class SourceViewStateManager:
SourceViewStates.INSERT: SourceViewsInsertState(), SourceViewStates.INSERT: SourceViewsInsertState(),
SourceViewStates.MULTIINSERT: SourceViewsMultiInsertState(), SourceViewStates.MULTIINSERT: SourceViewsMultiInsertState(),
SourceViewStates.COMMAND: SourceViewsCommandState(), SourceViewStates.COMMAND: SourceViewsCommandState(),
SourceViewStates.READONLY: SourceViewsReadOnlyState() SourceViewStates.READONLY: SourceViewsReadOnlyState(),
SourceViewStates.INDEPENDENT: SourceViewsIndependentState()
} }

View File

@@ -3,6 +3,7 @@
""" """
from .source_view_insert_state import SourceViewsInsertState from .source_view_insert_state import SourceViewsInsertState
from .source_view_independent_state import SourceViewsIndependentState
from .source_view_multi_insert_state import SourceViewsMultiInsertState from .source_view_multi_insert_state import SourceViewsMultiInsertState
from .source_view_command_state import SourceViewsCommandState from .source_view_command_state import SourceViewsCommandState
from .source_view_read_only_state import SourceViewsReadOnlyState from .source_view_read_only_state import SourceViewsReadOnlyState

View File

@@ -44,7 +44,7 @@ class SourceViewsBaseState:
source_view.command.exec("update_info_bar") source_view.command.exec("update_info_bar")
def button_press_event(self, source_view, eve): def button_press_event(self, source_view, eve):
source_view.command.exec("update_info_bar") ...
def button_release_event(self, source_view, eve): def button_release_event(self, source_view, eve):
source_view.command.exec("update_info_bar") source_view.command.exec("update_info_bar")

View File

@@ -0,0 +1,16 @@
# Python imports
# Lib imports
# Application imports
from libs.event_factory import Event_Factory, Code_Event_Types
from libs.dto.states import SourceViewStates
from .source_view_base_state import SourceViewsBaseState
class SourceViewsIndependentState(SourceViewsBaseState):
def __init__(self):
super(SourceViewsIndependentState, self).__init__()

View File

@@ -76,6 +76,8 @@ class Window(Gtk.ApplicationWindow):
event_system.subscribe("load-interactive-debug", self._load_interactive_debug) event_system.subscribe("load-interactive-debug", self._load_interactive_debug)
def _load_widgets(self): def _load_widgets(self):
widget_registery.expose_object("main-window", self)
if settings_manager.is_debug(): if settings_manager.is_debug():
self.set_interactive_debugging(True) self.set_interactive_debugging(True)

View File

@@ -24,3 +24,6 @@ class EmitDispatcher:
def emit_to(self, controller: str, event: BaseEvent): def emit_to(self, controller: str, event: BaseEvent):
self.message_to(controller, event) self.message_to(controller, event)
def emit_to_selected(self, names: list[str], event: BaseEvent):
self.message_to_selected(names, event)

View File

@@ -4,7 +4,11 @@
from .code_event import CodeEvent from .code_event import CodeEvent
from .create_source_view_event import CreateSourceViewEvent
from .register_completer_event import RegisterCompleterEvent
from .unregister_completer_event import UnregisterCompleterEvent
from .register_provider_event import RegisterProviderEvent from .register_provider_event import RegisterProviderEvent
from .unregister_provider_event import UnregisterProviderEvent
from .register_command_event import RegisterCommandEvent from .register_command_event import RegisterCommandEvent
from .file_externally_modified_event import FileExternallyModifiedEvent from .file_externally_modified_event import FileExternallyModifiedEvent
from .file_externally_deleted_event import FileExternallyDeletedEvent from .file_externally_deleted_event import FileExternallyDeletedEvent

View File

@@ -0,0 +1,14 @@
# Python imports
from dataclasses import dataclass
# Lib imports
# Application imports
from .code_event import CodeEvent
from libs.dto.states.source_view_states import SourceViewStates
@dataclass
class CreateSourceViewEvent(CodeEvent):
state: SourceViewStates = SourceViewStates.INSERT

View File

@@ -0,0 +1,17 @@
# Python imports
from dataclasses import dataclass, field
# Lib imports
import gi
gi.require_version('GtkSource', '4')
from gi.repository import GtkSource
# Application imports
from .code_event import CodeEvent
@dataclass
class RegisterCompleterEvent(CodeEvent):
completer: GtkSource.Completion = None

View File

@@ -0,0 +1,17 @@
# Python imports
from dataclasses import dataclass
# Lib imports
import gi
gi.require_version('GtkSource', '4')
from gi.repository import GtkSource
# Application imports
from .code_event import CodeEvent
@dataclass
class UnregisterCompleterEvent(CodeEvent):
completer: GtkSource.Completion = None

View File

@@ -0,0 +1,13 @@
# Python imports
from dataclasses import dataclass
# Lib imports
# Application imports
from .code_event import CodeEvent
@dataclass
class UnregisterProviderEvent(CodeEvent):
provider_name: str = ""

View File

@@ -12,3 +12,4 @@ class SourceViewStates(Enum):
MULTIINSERT = 1 MULTIINSERT = 1
COMMAND = 2 COMMAND = 2
READONLY = 3 READONLY = 3
INDEPENDENT = 4

View File

@@ -56,8 +56,8 @@ class PluginsController(ControllerBase, PluginsControllerMixin, PluginReloadMixi
locations.append(path) locations.append(path)
for file in os.listdir(path): for file in os.listdir(path):
_path = os.path.join(path, file) _path = os.path.join(path, file)
if os.path.isdir(_path): if not os.path.isdir(_path): continue
self._collect_search_locations(_path, locations) self._collect_search_locations(_path, locations)
def _load_plugins( def _load_plugins(
self, self,
@@ -150,12 +150,10 @@ class PluginsController(ControllerBase, PluginsControllerMixin, PluginReloadMixi
def create_plugin_context(self): def create_plugin_context(self):
plugin_context: PluginContext = PluginContext() plugin_context: PluginContext = PluginContext()
plugin_context.requests_ui_element: callable = self.requests_ui_element plugin_context.request_ui_element: callable = self.request_ui_element
plugin_context.message: callable = self.message plugin_context.emit: callable = self.emit
plugin_context.message_to: callable = self.message_to plugin_context.emit_to: callable = self.emit_to
plugin_context.message_to_selected: callable = self.message_to_selected plugin_context.emit_to_selected: callable = self.emit_to_selected
plugin_context.emit: callable = event_system.emit
plugin_context.emit_and_await: callable = event_system.emit_and_await
plugin_context.register_controller: callable = self.register_controller plugin_context.register_controller: callable = self.register_controller
return plugin_context return plugin_context

View File

@@ -18,26 +18,21 @@ class PluginContext:
def __init__(self): def __init__(self):
super(PluginContext, self).__init__() super(PluginContext, self).__init__()
def requests_ui_element(self, element_id: str):
raise PluginContextException("Plugin Context 'requests_ui_element' must be overridden...")
def _controller_message(self, event: BaseEvent): def _controller_message(self, event: BaseEvent):
raise PluginContextException("Plugin Context '_controller_message' must be overridden...") raise PluginContextException("Plugin Context '_controller_message' must be overridden...")
def message(self, event: BaseEvent): def request_ui_element(self, element_id: str):
raise PluginContextException("Plugin Context 'message' must be overridden...") raise PluginContextException("Plugin Context 'request_ui_element' must be overridden...")
def message_to(self, name: str, event: BaseEvent): def emit(self, event: BaseEvent):
raise PluginContextException("Plugin Context 'message_to' must be overridden...")
def message_to_selected(self, names: list[str], event: BaseEvent):
raise PluginContextException("Plugin Context 'message_to_selected' must be overridden...")
def emit(self, event_type: str, data: tuple = ()):
raise PluginContextException("Plugin Context 'emit' must be overridden...") raise PluginContextException("Plugin Context 'emit' must be overridden...")
def emit_and_await(self, event_type: str, data: tuple = ()): def emit_to(self, name: str, event: BaseEvent):
raise PluginContextException("Plugin Context 'emit_and_await' must be overridden...") raise PluginContextException("Plugin Context 'emit_to' must be overridden...")
def emit_to_selected(self, names: list[str], event: BaseEvent):
raise PluginContextException("Plugin Context 'emit_to_selected' must be overridden...")
def register_controller(self, name: str, controller): def register_controller(self, name: str, controller):
raise PluginContextException("Plugin Context 'register_controller' must be overridden...") raise PluginContextException("Plugin Context 'register_controller' must be overridden...")

View File

@@ -30,20 +30,14 @@ class PluginBase:
def run(self): def run(self):
raise PluginBaseException("Plugin Base 'run' must be overriden by Plugin") raise PluginBaseException("Plugin Base 'run' must be overriden by Plugin")
def requests_ui_element(self, element_id: str): def request_ui_element(self, element_id: str):
raise PluginBaseException("Plugin Base 'requests_ui_element' must be overriden by Plugin") raise PluginBaseException("Plugin Base 'request_ui_element' must be overriden by Plugin")
def message(self, event: BaseEvent): def emit(self, event: BaseEvent):
raise PluginBaseException("Plugin Base 'message' must be overriden by Plugin")
def message_to(self, name: str, event: BaseEvent):
raise PluginBaseException("Plugin Base 'message_to' must be overriden by Plugin")
def message_to_selected(self, names: list[str], event: BaseEvent):
raise PluginBaseException("Plugin Base 'message_to_selected' must be overriden by Plugin")
def emit(self, event_type: str, data: tuple = ()):
raise PluginBaseException("Plugin Base 'emit' must be overriden by Plugin") raise PluginBaseException("Plugin Base 'emit' must be overriden by Plugin")
def emit_and_await(self, event_type: str, data: tuple = ()): def emit_to(self, name: str, event: BaseEvent):
raise PluginBaseException("Plugin Base 'emit_and_await' must be overriden by Plugin") raise PluginBaseException("Plugin Base 'emit_to' must be overriden by Plugin")
def emit_to_selected(self, names: list[str], event: BaseEvent):
raise PluginBaseException("Plugin Base 'emit_to_selected' must be overriden by Plugin")

View File

@@ -31,17 +31,17 @@ class PluginCode(PluginBase):
def run(self): def run(self):
raise PluginCodeException("Plugin Code 'run' must be overriden by Plugin") raise PluginCodeException("Plugin Code 'run' must be overriden by Plugin")
def requests_ui_element(self, element_id: str):
return self.plugin_context.requests_ui_element(element_id)
def message(self, event: BaseEvent):
return self.plugin_context.message(event)
def message_to(self, name: str, event: BaseEvent):
return self.plugin_context.message_to(name, event)
def message_to_selected(self, names: list[str], event: BaseEvent):
return self.plugin_context.message_to_selected(names, event)
def register_controller(self, name: str, controller): def register_controller(self, name: str, controller):
return self.plugin_context.register_controller(name, controller) return self.plugin_context.register_controller(name, controller)
def request_ui_element(self, element_id: str):
return self.plugin_context.request_ui_element(element_id)
def emit(self, event: BaseEvent):
return self.plugin_context.emit(event)
def emit_to(self, name: str, event: BaseEvent):
return self.plugin_context.emit_to(name, event)
def emit_to_selected(self, names: list[str], event: BaseEvent):
return self.plugin_context.emit_to_selected(names, event)

View File

@@ -31,20 +31,14 @@ class PluginUI(PluginBase):
def run(self): def run(self):
raise PluginCodeException("Plugin UI 'run' must be overriden by Plugin") raise PluginCodeException("Plugin UI 'run' must be overriden by Plugin")
def requests_ui_element(self, element_id: str): def request_ui_element(self, element_id: str):
return self.plugin_context.requests_ui_element(element_id) return self.plugin_context.request_ui_element(element_id)
def message(self, event: BaseEvent): def emit(self, event: BaseEvent):
return self.plugin_context.message(event) return self.plugin_context.emit(event)
def message_to(self, name: str, event: BaseEvent): def emit_to(self, name: str, event: BaseEvent):
return self.plugin_context.message_to(name, event) return self.plugin_context.emit_to(name, event)
def message_to_selected(self, names: list[str], event: BaseEvent): def emit_to_selected(self, names: list[str], event: BaseEvent):
return self.plugin_context.message_to_selected(names, event) return self.plugin_context.emit_to_selected(names, event)
def emit(self, event_type: str, data: tuple = ()):
self.plugin_context.emit(event_type, data)
def emit_and_await(self, event_type: str, data: tuple = ()):
self.plugin_context.emit_and_await(event_type, data)

View File

@@ -13,7 +13,7 @@ class InvalidPluginException(Exception):
class PluginsControllerMixin: class PluginsControllerMixin:
def requests_ui_element(self, target_id: str): def request_ui_element(self, target_id: str):
if not target_id in widget_registery.objects: if not target_id in widget_registery.objects:
raise InvalidPluginException('Unknown UI "target_id" given in requests.') raise InvalidPluginException('Unknown UI "target_id" given in requests.')