Refactor controller architecture and multi-insert state

- Rename ControllerContext to ControllerMessageBus for clarity
- Switch ControllerBase to use SingletonRaised
- Replace MarkEventsMixin with MarkerManager for multi-cursor editing
- Add populate_popup event support for source view context menus
- Remove unused swap file events
- Moved JSON prettify feature to plugin
- Fix event name: "removed_file" -> "remove_file"
This commit is contained in:
2026-02-28 01:10:28 -06:00
parent b724d41f6c
commit 1447a68fb0
28 changed files with 561 additions and 395 deletions

View File

@@ -3,12 +3,12 @@
# Lib imports
# Application imports
from ..singleton import Singleton
from ..singleton_raised import SingletonRaised
from ..dto.base_event import BaseEvent
from .emit_dispatcher import EmitDispatcher
from .controller_context import ControllerContext
from .controller_message_bus import ControllerMessageBus
@@ -17,28 +17,28 @@ class ControllerBaseException(Exception):
class ControllerBase(Singleton, EmitDispatcher):
class ControllerBase(SingletonRaised, EmitDispatcher):
def __init__(self):
super(ControllerBase, self).__init__()
self.controller_context: ControllerContext = None
self.controller_message_bus: ControllerMessageBus = 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 set_controller_message_bus(self, controller_message_bus: ControllerMessageBus):
self.controller_message_bus = controller_message_bus
def message(self, event: BaseEvent):
return self.controller_context.message(event)
return self.controller_message_bus.message(event)
def message_to(self, name: str, event: BaseEvent):
return self.controller_context.message_to(name, event)
return self.controller_message_bus.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)
self.controller_message_bus.message_to_selected(name, event)
def register_controller(self, name: str, controller):
self.controller_context.register_controller(name, controller)
self.controller_message_bus.register_controller(name, controller)

View File

@@ -1,30 +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...")
def register_controller(self, name: str, controller):
raise ControllerContextException("Controller Context 'register_controller' must be overriden by Controller Manager...")

View File

@@ -7,7 +7,7 @@ from ..singleton import Singleton
from ..event_factory import Code_Event_Types
from .controller_base import ControllerBase
from .controller_context import ControllerContext
from .controller_message_bus import ControllerMessageBus
@@ -17,17 +17,26 @@ class ControllerManagerException(Exception):
class ControllerManager(Singleton, dict):
"""
ControllerManager registers controllers by key/value pair.
It binds the message bus methods methods each controller has
due to extending ControllerBase.
"""
def __init__(self):
super(ControllerManager, self).__init__()
self.message_bus: ControllerMessageBus \
= self._crete_controller_message_bus()
def _crete_controller_context(self) -> ControllerContext:
controller_context = ControllerContext()
controller_context.message_to = self.message_to
controller_context.message = self.message
controller_context.register_controller = self.register_controller
return controller_context
def _crete_controller_message_bus(self) -> ControllerMessageBus:
controller_message_bus = ControllerMessageBus()
controller_message_bus.message_to = self.message_to
controller_message_bus.message = self.message
controller_message_bus.register_controller = self.register_controller
return controller_message_bus
def register_controller(self, name: str, controller: ControllerBase):
if not name or controller == None:
@@ -38,7 +47,7 @@ class ControllerManager(Singleton, dict):
f"Can't bind controller to existing registered name of '{name}'..."
)
controller.set_controller_context( self._crete_controller_context() )
controller.set_controller_message_bus( self.message_bus )
self[name] = controller

View File

@@ -0,0 +1,30 @@
# Python imports
# Lib imports
# Application imports
from ..dto.base_event import BaseEvent
class ControllerMessageBusException(Exception):
...
class ControllerMessageBus:
def __init__(self):
super(ControllerMessageBus, self).__init__()
def message(self, event: BaseEvent):
raise ControllerMessageBusException("Controller Message Bus 'message' must be overriden by Controller Manager...")
def message_to(self, name: str, event: BaseEvent):
raise ControllerMessageBusException("Controller Message Bus 'message_to' must be overriden by Controller Manager...")
def message_to_selected(self, name: list, event: BaseEvent):
raise ControllerMessageBusException("Controller Message Bus 'message_to_selected' must be overriden by Controller Manager...")
def register_controller(self, name: str, controller):
raise ControllerMessageBusException("Controller Message Bus 'register_controller' must be overriden by Controller Manager...")

View File

@@ -8,6 +8,13 @@ from ..dto.base_event import BaseEvent
class EmitDispatcher:
"""
EmitDispatcher is used for allowing controllers to pass/hook in
their message system to children that need to signal events.
Note how we are not handling return info from the 'message' methods
whereas a controller would or could do so.
"""
def __init__(self):
super(EmitDispatcher, self).__init__()