refactor(editor): remove legacy split-view system and introduce source view lifecycle

* remove toggle_source_view plugin and related command implementations
* drop built-in sibling focus/move commands from core
* simplify EditorsContainer (Paned → Box) and editor initialization
* refactor source view creation to return (scrolled_window, source_view)
* add source view lifecycle events (remove/removed)
* rename GetNewCommandSystemEvent → CreateCommandSystemEvent
* update CommandsController to handle command system creation and cleanup
* ensure command systems are removed with their source views
* improve focus border handling across sibling chains
* clean up imports to use absolute core.* paths
* update keybindings to remove deprecated split navigation commands
This commit is contained in:
2026-04-04 21:40:13 -05:00
parent b13d9c2397
commit 890c6cdfcc
29 changed files with 343 additions and 156 deletions

View File

@@ -34,7 +34,6 @@ class CodeBase:
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("commands", commands_controller)
self.controller_manager.register_controller("completion", completion_controller)
@@ -43,12 +42,13 @@ class CodeBase:
self.controller_manager.register_controller("widgets", widget_registery)
def create_source_view(self):
source_view = self.controller_manager["source_views"].create_source_view()
scrolled_win, \
source_view = self.controller_manager["source_views"].create_source_view()
self.controller_manager["completion"].register_completer(
source_view.get_completion()
)
return source_view
return scrolled_win, source_view
def first_map_load(self):
self.controller_manager["source_views"].first_map_load()

View File

@@ -1,22 +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,
*args,
**kwargs
):
logger.debug("Command: Focus Left Sibling")
if not view.sibling_left: return
view.sibling_left.get_parent().show()
view.sibling_left.grab_focus()

View File

@@ -1,22 +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,
*args,
**kwargs
):
logger.debug("Command: Focus Right Sibling")
if not view.sibling_right: return
view.sibling_right.get_parent().show()
view.sibling_right.grab_focus()

View File

@@ -1,32 +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,
*args,
**kwargs
):
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.get_parent().show()
view.sibling_left.grab_focus()
if next_file:
view.set_buffer(next_file.buffer)
else:
view.command.exec("new_file")

View File

@@ -1,32 +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,
*args,
**kwargs
):
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.get_parent().show()
view.sibling_right.grab_focus()
if next_file:
view.set_buffer(next_file.buffer)
else:
view.command.exec("new_file")

View File

@@ -20,9 +20,14 @@ def execute(
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()
lview = view.sibling_left
while lview is not None:
ctx = lview.get_parent().get_style_context()
ctx.remove_class("source-view-focused")
lview = lview.sibling_left
ctx.remove_class("source-view-focused")
rview = view.sibling_right
while rview is not None:
ctx = rview.get_parent().get_style_context()
ctx.remove_class("source-view-focused")
rview = rview.sibling_right

View File

@@ -17,10 +17,12 @@ class CommandsController(ControllerBase, list):
def _controller_message(self, event: Code_Event_Types.CodeEvent):
if isinstance(event, Code_Event_Types.GetNewCommandSystemEvent):
event.response = self.get_new_command_system()
if isinstance(event, Code_Event_Types.CreateCommandSystemEvent):
event.response = self.create_command_system()
elif isinstance(event, Code_Event_Types.RemovedSourceViewEvent):
self.remove_command_system(event)
def get_new_command_system(self):
def create_command_system(self):
command_system = SourceViewCommandSystem()
command_system.emit = self.emit
command_system.emit_to = self.emit_to
@@ -28,3 +30,6 @@ class CommandsController(ControllerBase, list):
self.append(command_system)
return command_system
def remove_command_system(self, event: Code_Event_Types.RemovedSourceViewEvent):
self.remove(event.view.command)

View File

@@ -1,6 +1,9 @@
# Python imports
# Lib imports
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
# Application imports
from libs.controllers.controller_base import ControllerBase
@@ -29,6 +32,8 @@ class SourceViewsController(ControllerBase, list):
def _controller_message(self, event: Code_Event_Types.CodeEvent):
if isinstance(event, Code_Event_Types.CreateSourceViewEvent):
event.response = self.create_source_view(event.state)
elif isinstance(event, Code_Event_Types.RemoveSourceViewEvent):
self._remove_source_view(event)
elif isinstance(event, Code_Event_Types.RemovedFileEvent):
self._remove_file(event)
elif isinstance(event, Code_Event_Types.RegisterCommandEvent):
@@ -86,7 +91,7 @@ class SourceViewsController(ControllerBase, list):
)
def _get_command_system(self):
event = Event_Factory.create_event("get_new_command_system")
event = Event_Factory.create_event("create_command_system")
self.message_to("commands", event)
command = event.response
@@ -103,21 +108,33 @@ class SourceViewsController(ControllerBase, list):
source_view.set_buffer(event.next_file.buffer)
def create_source_view(self, state: SourceViewStates = SourceViewStates.INSERT):
source_view: SourceView = SourceView(state)
source_view.command = self._get_command_system()
source_view.command.set_data(source_view)
def _remove_source_view(self, event: Code_Event_Types.RemovedFileEvent):
event = Event_Factory.create_event("removed_source_view", view = event.view)
self.message(event)
self.remove(event.view)
self.signal_mapper.disconnect_signals(event.view)
def create_source_view(self, state: SourceViewStates = SourceViewStates.INSERT):
scrolled_win: Gtk.ScrolledWindow = Gtk.ScrolledWindow()
source_view: SourceView = SourceView(state)
source_view.command = self._get_command_system()
scrolled_win.set_hexpand(True)
scrolled_win.set_vexpand(True)
source_view.command.set_data(source_view)
self.signal_mapper.connect_signals(source_view)
self.append(source_view)
scrolled_win.add(source_view)
event = Event_Factory.create_event(
"created_source_view", view = source_view
)
self.emit(event)
return source_view
return scrolled_win, source_view
def first_map_load(self):
for source_view in self: