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:
@@ -6,7 +6,7 @@ gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
|
||||
# Application imports
|
||||
from ..widgets.webkit.webkit_ui import WebkitUI
|
||||
from core.widgets.webkit.webkit_ui import WebkitUI
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,10 +6,6 @@ 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 .editors_container import EditorsContainer
|
||||
|
||||
|
||||
@@ -27,6 +23,9 @@ class CodeContainer(Gtk.Box):
|
||||
|
||||
|
||||
def _setup_styling(self):
|
||||
self.ctx = self.get_style_context()
|
||||
self.ctx.add_class("code-container")
|
||||
|
||||
self.set_orientation(Gtk.Orientation.VERTICAL)
|
||||
|
||||
def _setup_signals(self):
|
||||
@@ -37,18 +36,4 @@ class CodeContainer(Gtk.Box):
|
||||
|
||||
def _load_widgets(self):
|
||||
widget_registery.expose_object("code-container", self)
|
||||
|
||||
code_base = CodeBase()
|
||||
|
||||
self.add( self._create_editor_widget(code_base) )
|
||||
|
||||
def _create_editor_widget(self, code_base: CodeBase):
|
||||
editors_container = Gtk.Box()
|
||||
|
||||
widget_registery.expose_object("editors-container", editors_container)
|
||||
|
||||
editors_container.add( Separator("separator_left") )
|
||||
editors_container.add( EditorsContainer(code_base) )
|
||||
editors_container.add( Separator("separator_right") )
|
||||
|
||||
return editors_container
|
||||
self.add( EditorsContainer() )
|
||||
|
||||
@@ -4,18 +4,17 @@
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
#from gi.repository import GLib
|
||||
|
||||
# Application imports
|
||||
from core.widgets.code.code_base import CodeBase
|
||||
from core.widgets.separator_widget import Separator
|
||||
|
||||
|
||||
|
||||
class EditorsContainer(Gtk.Paned):
|
||||
def __init__(self, code_base: any):
|
||||
class EditorsContainer(Gtk.Box):
|
||||
def __init__(self):
|
||||
super(EditorsContainer, self).__init__()
|
||||
|
||||
self.code_base = code_base
|
||||
|
||||
self._setup_styling()
|
||||
self._setup_signals()
|
||||
self._subscribe_to_events()
|
||||
@@ -24,11 +23,10 @@ class EditorsContainer(Gtk.Paned):
|
||||
|
||||
def _setup_styling(self):
|
||||
self.ctx = self.get_style_context()
|
||||
self.ctx.add_class("paned-editors-container")
|
||||
self.ctx.add_class("editors-container")
|
||||
|
||||
self.set_hexpand(True)
|
||||
self.set_vexpand(True)
|
||||
self.set_wide_handle(True)
|
||||
self.set_size_request(320, -1)
|
||||
|
||||
def _setup_signals(self):
|
||||
@@ -38,26 +36,16 @@ class EditorsContainer(Gtk.Paned):
|
||||
...
|
||||
|
||||
def _load_widgets(self):
|
||||
self.scrolled_win1, \
|
||||
self.scrolled_win2 = self._create_views()
|
||||
box = Gtk.Box()
|
||||
widget_registery.expose_object("editors-container", self)
|
||||
self.code_base = CodeBase()
|
||||
scrolled_win, \
|
||||
source_view = self.code_base.create_source_view()
|
||||
|
||||
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
|
||||
box.add( scrolled_win )
|
||||
self.add( Separator("separator_left") )
|
||||
self.add( box )
|
||||
self.add( Separator("separator_right") )
|
||||
|
||||
def _init_map(self, view):
|
||||
self.disconnect_by_func( self._init_map )
|
||||
|
||||
@@ -6,7 +6,7 @@ gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
|
||||
# Application imports
|
||||
from ..widgets.separator_widget import Separator
|
||||
from core.widgets.separator_widget import Separator
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,9 +6,9 @@ gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
|
||||
# Application imports
|
||||
from ..widgets.separator_widget import Separator
|
||||
from ..widgets.controls.open_files_button import OpenFilesButton
|
||||
from ..widgets.controls.transparency_scale import TransparencyScale
|
||||
from core.widgets.separator_widget import Separator
|
||||
from core.widgets.controls.open_files_button import OpenFilesButton
|
||||
from core.widgets.controls.transparency_scale import TransparencyScale
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,7 +6,8 @@ gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
|
||||
# Application imports
|
||||
from ..widgets.separator_widget import Separator
|
||||
from core.widgets.separator_widget import Separator
|
||||
|
||||
from .code.code_container import CodeContainer
|
||||
|
||||
|
||||
|
||||
@@ -6,8 +6,8 @@ gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
|
||||
# Application imports
|
||||
from ..widgets.separator_widget import Separator
|
||||
from ..widgets.vte_widget import VteWidget
|
||||
from core.widgets.separator_widget import Separator
|
||||
from core.widgets.vte_widget import VteWidget
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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")
|
||||
@@ -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")
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -7,6 +7,8 @@ from .code_event import CodeEvent
|
||||
from .toggle_plugins_ui_event import TogglePluginsUiEvent
|
||||
from .create_source_view_event import CreateSourceViewEvent
|
||||
from .created_source_view_event import CreatedSourceViewEvent
|
||||
from .remove_source_view_event import RemoveSourceViewEvent
|
||||
from .removed_source_view_event import RemovedSourceViewEvent
|
||||
from .register_completer_event import RegisterCompleterEvent
|
||||
from .unregister_completer_event import UnregisterCompleterEvent
|
||||
from .register_provider_event import RegisterProviderEvent
|
||||
@@ -21,7 +23,7 @@ from .filter_out_loaded_files_event import FilterOutLoadedFilesEvent
|
||||
from .get_active_view_event import GetActiveViewEvent
|
||||
from .get_source_views_event import GetSourceViewsEvent
|
||||
|
||||
from .get_new_command_system_event import GetNewCommandSystemEvent
|
||||
from .create_command_system_event import CreateCommandSystemEvent
|
||||
from .request_completion_event import RequestCompletionEvent
|
||||
from .cursor_moved_event import CursorMovedEvent
|
||||
from .modified_changed_event import ModifiedChangedEvent
|
||||
|
||||
@@ -9,5 +9,5 @@ from .code_event import CodeEvent
|
||||
|
||||
|
||||
@dataclass
|
||||
class GetNewCommandSystemEvent(CodeEvent):
|
||||
class CreateCommandSystemEvent(CodeEvent):
|
||||
...
|
||||
14
src/libs/dto/code/events/remove_source_view_event.py
Normal file
14
src/libs/dto/code/events/remove_source_view_event.py
Normal 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 RemoveSourceViewEvent(CodeEvent):
|
||||
...
|
||||
14
src/libs/dto/code/events/removed_source_view_event.py
Normal file
14
src/libs/dto/code/events/removed_source_view_event.py
Normal 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 RemovedSourceViewEvent(CodeEvent):
|
||||
...
|
||||
Reference in New Issue
Block a user