Full 'code' widget refactor to utilize controllers and cross controller event signaling
This commit is contained in:
@@ -6,7 +6,10 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from ...widgets.code.tabs_widget import TabsWidget
|
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
|
from .editors_container import EditorsContainer
|
||||||
|
|
||||||
@@ -34,5 +37,28 @@ class CodeContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
self.add( TabsWidget() )
|
code_base = CodeBase()
|
||||||
self.add( EditorsContainer() )
|
|
||||||
|
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
|
||||||
|
|||||||
@@ -4,18 +4,18 @@
|
|||||||
import gi
|
import gi
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
from gi.repository import GLib
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from ...widgets.separator_widget import Separator
|
|
||||||
from ...widgets.code.miniview_widget import MiniViewWidget
|
|
||||||
from .paned_editors_container import PanedEditorsContainer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class EditorsContainer(Gtk.Box):
|
class EditorsContainer(Gtk.Paned):
|
||||||
def __init__(self):
|
def __init__(self, code_base: any):
|
||||||
super(EditorsContainer, self).__init__()
|
super(EditorsContainer, self).__init__()
|
||||||
|
|
||||||
|
self.code_base = code_base
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
@@ -23,16 +23,54 @@ class EditorsContainer(Gtk.Box):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
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):
|
def _setup_signals(self):
|
||||||
...
|
self.map_id = self.connect("map", self._init_map)
|
||||||
|
# self.map_id = self.connect("show", self._init_map)
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
self.add( Separator("separator_left") )
|
self.scrolled_win1, \
|
||||||
self.add( PanedEditorsContainer() )
|
self.scrolled_win2 = self._create_views()
|
||||||
self.add( Separator("separator_right") )
|
|
||||||
self.add( MiniViewWidget() )
|
self.add1(self.scrolled_win1)
|
||||||
|
self.add2(self.scrolled_win2)
|
||||||
|
|
||||||
|
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.set_position(
|
||||||
|
(self.get_allocated_width() / 2) + 250
|
||||||
|
)
|
||||||
|
|
||||||
|
self.code_base.first_map_load()
|
||||||
|
|
||||||
|
del self.code_base
|
||||||
|
return False
|
||||||
|
|
||||||
|
GLib.timeout_add(225, _first_show_init)
|
||||||
|
|||||||
@@ -1,69 +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
|
|
||||||
from ...widgets.code.view import SourceView
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PanedEditorsContainer(Gtk.Paned):
|
|
||||||
def __init__(self):
|
|
||||||
super(PanedEditorsContainer, self).__init__()
|
|
||||||
|
|
||||||
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_homogeneous(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):
|
|
||||||
scrolled_win1 = Gtk.ScrolledWindow()
|
|
||||||
scrolled_win2 = Gtk.ScrolledWindow()
|
|
||||||
source_view1 = SourceView()
|
|
||||||
source_view2 = SourceView()
|
|
||||||
|
|
||||||
source_view1.sibling_right = source_view2
|
|
||||||
source_view2.sibling_left = source_view1
|
|
||||||
|
|
||||||
scrolled_win1.add( source_view1 )
|
|
||||||
scrolled_win2.add( source_view2 )
|
|
||||||
|
|
||||||
self.add1(scrolled_win1)
|
|
||||||
self.add2(scrolled_win2)
|
|
||||||
|
|
||||||
def _init_map(self, view):
|
|
||||||
def _first_show_init():
|
|
||||||
self.disconnect(self.map_id)
|
|
||||||
del self.map_id
|
|
||||||
|
|
||||||
self._handle_first_show()
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
GLib.timeout_add(200, _first_show_init)
|
|
||||||
|
|
||||||
def _handle_first_show(self):
|
|
||||||
self.set_position(
|
|
||||||
self.get_allocated_width() / 2
|
|
||||||
)
|
|
||||||
|
|
||||||
50
src/core/widgets/code/code_base.py
Normal file
50
src/core/widgets/code/code_base.py
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .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.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("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)
|
||||||
|
|
||||||
|
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):
|
||||||
|
return self.controller_manager["source_views"].create_source_view()
|
||||||
|
|
||||||
|
def first_map_load(self):
|
||||||
|
self.controller_manager["source_views"].first_map_load()
|
||||||
@@ -3,8 +3,19 @@
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
|
from libs.dto.code import (
|
||||||
|
CodeEvent,
|
||||||
|
RequestCompletionEvent,
|
||||||
|
GetFileEvent,
|
||||||
|
GetSwapFileEvent,
|
||||||
|
AddNewFileEvent,
|
||||||
|
RemoveFileEvent,
|
||||||
|
)
|
||||||
|
|
||||||
from . import commands
|
from . import commands
|
||||||
|
|
||||||
|
from .source_view import SourceView
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CommandSystem:
|
class CommandSystem:
|
||||||
@@ -32,3 +43,55 @@ class CommandSystem:
|
|||||||
|
|
||||||
method = getattr(commands, command)
|
method = getattr(commands, command)
|
||||||
return method.execute(*args)
|
return method.execute(*args)
|
||||||
|
|
||||||
|
|
||||||
|
def emit(self, event: CodeEvent):
|
||||||
|
""" Monky patch 'emit' from command controller... """
|
||||||
|
...
|
||||||
|
|
||||||
|
def emit_to(self, controller: str, event: CodeEvent):
|
||||||
|
""" Monky patch 'emit' from command controller... """
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def get_file(self, view: SourceView):
|
||||||
|
event = GetFileEvent()
|
||||||
|
event.view = view
|
||||||
|
event.buffer = view.get_buffer()
|
||||||
|
|
||||||
|
self.emit_to("files", event)
|
||||||
|
|
||||||
|
return event.response
|
||||||
|
|
||||||
|
def get_swap_file(self, view: SourceView):
|
||||||
|
event = GetSwapFileEvent()
|
||||||
|
event.view = self
|
||||||
|
event.buffer = view.get_buffer()
|
||||||
|
|
||||||
|
self.emit_to("files", event)
|
||||||
|
|
||||||
|
return event.response
|
||||||
|
|
||||||
|
def new_file(self, view: SourceView):
|
||||||
|
event = AddNewFileEvent()
|
||||||
|
event.view = view
|
||||||
|
|
||||||
|
self.emit_to("files", event)
|
||||||
|
|
||||||
|
return event.response
|
||||||
|
|
||||||
|
def remove_file(self, view: SourceView):
|
||||||
|
event = RemoveFileEvent()
|
||||||
|
event.view = view
|
||||||
|
event.buffer = view.get_buffer()
|
||||||
|
|
||||||
|
self.emit_to("files", event)
|
||||||
|
|
||||||
|
return event.response
|
||||||
|
|
||||||
|
def request_completion(self, view: SourceView):
|
||||||
|
event = RequestCompletionEvent()
|
||||||
|
event.view = view
|
||||||
|
event.buffer = view.get_buffer()
|
||||||
|
|
||||||
|
self.emit_to("completion", event)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Buffer Redo Command")
|
logger.debug("Command: Buffer Redo")
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
buffer = view.get_buffer()
|
||||||
undo_manager = buffer.get_undo_manager()
|
undo_manager = buffer.get_undo_manager()
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Buffer Undo Command")
|
logger.debug("Command: Buffer Undo")
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
buffer = view.get_buffer()
|
||||||
undo_manager = buffer.get_undo_manager()
|
undo_manager = buffer.get_undo_manager()
|
||||||
|
|||||||
@@ -14,13 +14,6 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Close File Command")
|
logger.debug("Command: Close File")
|
||||||
buffer = view.get_buffer()
|
view.command.remove_file()
|
||||||
|
|
||||||
next_file = view.files_manager.remove_file(buffer)
|
|
||||||
if not next_file:
|
|
||||||
view.command.exec("new_file")
|
|
||||||
else:
|
|
||||||
view.set_buffer(next_file.buffer)
|
|
||||||
|
|
||||||
view.command.exec("update_info_bar")
|
view.command.exec("update_info_bar")
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Cut to Temp Buffer Command")
|
logger.debug("Command: Cut to Temp Buffer")
|
||||||
|
|
||||||
view.clear_temp_cut_buffer_delayed()
|
view.clear_temp_cut_buffer_delayed()
|
||||||
|
|
||||||
|
|||||||
@@ -16,13 +16,13 @@ def execute(
|
|||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
uri: str
|
uri: str
|
||||||
):
|
):
|
||||||
logger.debug("DnD Load File To Buffer Command")
|
logger.debug("Command: DnD Load File To Buffer")
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
file = view.command.get_file(view)
|
||||||
file = view.files_manager.get_file(buffer)
|
buffer = file.buffer
|
||||||
|
|
||||||
if not file.ftype == "buffer":
|
if not file.ftype == "buffer":
|
||||||
file = view.command.exec("new_file")
|
file = view.command.new_file(view)
|
||||||
|
|
||||||
gfile = Gio.File.new_for_uri(uri)
|
gfile = Gio.File.new_for_uri(uri)
|
||||||
view.command.exec_with_args(
|
view.command.exec_with_args(
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ def execute(
|
|||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
uris: list = []
|
uris: list = []
|
||||||
):
|
):
|
||||||
logger.debug("DnD Load Files Command")
|
logger.debug("Command: DnD Load Files")
|
||||||
for uri in uris:
|
for uri in uris:
|
||||||
try:
|
try:
|
||||||
gfile = Gio.File.new_for_uri(uri)
|
gfile = Gio.File.new_for_uri(uri)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Duplicate Line Command")
|
logger.debug("Command: Duplicate Line")
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
buffer = view.get_buffer()
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,6 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Focus Left Sibling Command")
|
logger.debug("Command: Focus Left Sibling")
|
||||||
if not view.sibling_left: return
|
if not view.sibling_left: return
|
||||||
view.sibling_left.grab_focus()
|
view.sibling_left.grab_focus()
|
||||||
|
|||||||
@@ -14,6 +14,6 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Focus Right Sibling Command")
|
logger.debug("Command: Focus Right Sibling")
|
||||||
if not view.sibling_right: return
|
if not view.sibling_right: return
|
||||||
view.sibling_right.grab_focus()
|
view.sibling_right.grab_focus()
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Get Current File Command")
|
logger.debug("Command: Get Current File")
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
file = view.command.get_file(view)
|
||||||
return view.files_manager.get_file(buffer)
|
|
||||||
|
return file
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Get File Type Command")
|
logger.debug("Command: Get File Type")
|
||||||
|
file = view.command.get_file(view)
|
||||||
buffer = view.get_buffer()
|
|
||||||
file = view.files_manager.get_file(buffer)
|
|
||||||
return file.ftype
|
return file.ftype
|
||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Get Text Command")
|
logger.debug("Command: Get Text")
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
buffer = view.get_buffer()
|
||||||
start_itr, end_itr = buffer.get_bounds()
|
start_itr, end_itr = buffer.get_bounds()
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Go-To Command")
|
logger.debug("Command: Go-To")
|
||||||
|
|
||||||
file = view.command.exec("get_current_file")
|
file = view.command.get_file(view)
|
||||||
gfile = file.get_location()
|
gfile = file.get_location()
|
||||||
uri = gfile.get_uri()
|
uri = gfile.get_uri()
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,6 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Has Focus Command")
|
logger.debug("Command: Has Focus")
|
||||||
ctx = view.get_parent().get_style_context()
|
ctx = view.get_parent().get_style_context()
|
||||||
return ctx.has_class("source-view-focused")
|
return ctx.has_class("source-view-focused")
|
||||||
|
|||||||
@@ -14,5 +14,5 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Line Up Command")
|
logger.debug("Command: Line Down")
|
||||||
view.emit("move-lines", True)
|
view.emit("move-lines", True)
|
||||||
|
|||||||
@@ -14,5 +14,5 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Line Up Command")
|
logger.debug("Command: Line Up")
|
||||||
view.emit("move-lines", False)
|
view.emit("move-lines", False)
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ def execute(
|
|||||||
gfile: Gio.File,
|
gfile: Gio.File,
|
||||||
file: SourceFile = None,
|
file: SourceFile = None,
|
||||||
):
|
):
|
||||||
logger.debug("Load File Command")
|
logger.debug("Command: Load File")
|
||||||
if not file:
|
if not file:
|
||||||
file = view.files_manager.new()
|
file = view.command.new_file(view)
|
||||||
|
|
||||||
file.load_path(gfile)
|
file.load_path(gfile)
|
||||||
|
|
||||||
|
|||||||
@@ -9,14 +9,13 @@ from gi.repository import GtkSource
|
|||||||
from gi.repository import Gio
|
from gi.repository import Gio
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from ..source_file import SourceFile
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
):
|
):
|
||||||
logger.debug("Load Start File(s) Command")
|
logger.debug("Command: Load Start File(s)")
|
||||||
|
|
||||||
starting_files = settings_manager.get_starting_files()
|
starting_files = settings_manager.get_starting_files()
|
||||||
|
|
||||||
@@ -25,8 +24,7 @@ def execute(
|
|||||||
file = starting_files.pop()
|
file = starting_files.pop()
|
||||||
file = file.replace("FILE|", "")
|
file = file.replace("FILE|", "")
|
||||||
gfile = Gio.File.new_for_path(file)
|
gfile = Gio.File.new_for_path(file)
|
||||||
buffer = view.get_buffer()
|
file = view.command.get_file(view)
|
||||||
file = view.files_manager.get_file(buffer)
|
|
||||||
|
|
||||||
view.command.exec_with_args(
|
view.command.exec_with_args(
|
||||||
"load_file",
|
"load_file",
|
||||||
|
|||||||
@@ -14,19 +14,16 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Move To Left Sibling Command")
|
logger.debug("Command: Move To Left Sibling")
|
||||||
if not view.sibling_left: return
|
if not view.sibling_left: return
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
buffer = view.get_buffer()
|
||||||
popped_file, next_file = view.files_manager.swap_file(buffer)
|
popped_file, next_file = view.command.get_swap_file(view)
|
||||||
|
|
||||||
popped_file.remove_observer(view)
|
|
||||||
popped_file.add_observer(view.sibling_left)
|
|
||||||
view.sibling_left.set_buffer(buffer)
|
view.sibling_left.set_buffer(buffer)
|
||||||
view.sibling_left.grab_focus()
|
view.sibling_left.grab_focus()
|
||||||
|
|
||||||
if next_file:
|
if next_file:
|
||||||
next_file.add_observer(view)
|
|
||||||
view.set_buffer(next_file.buffer)
|
view.set_buffer(next_file.buffer)
|
||||||
else:
|
else:
|
||||||
view.command.exec("new_file")
|
view.command.exec("new_file")
|
||||||
|
|||||||
@@ -14,19 +14,16 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Move To Right Sibling Command")
|
logger.debug("Command: Move To Right Sibling")
|
||||||
if not view.sibling_right: return
|
if not view.sibling_right: return
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
buffer = view.get_buffer()
|
||||||
popped_file, next_file = view.files_manager.swap_file(buffer)
|
popped_file, next_file = view.command.get_swap_file(view)
|
||||||
|
|
||||||
popped_file.remove_observer(view)
|
|
||||||
popped_file.add_observer(view.sibling_right)
|
|
||||||
view.sibling_right.set_buffer(buffer)
|
view.sibling_right.set_buffer(buffer)
|
||||||
view.sibling_right.grab_focus()
|
view.sibling_right.grab_focus()
|
||||||
|
|
||||||
if next_file:
|
if next_file:
|
||||||
next_file.add_observer(view)
|
|
||||||
view.set_buffer(next_file.buffer)
|
view.set_buffer(next_file.buffer)
|
||||||
else:
|
else:
|
||||||
view.command.exec("new_file")
|
view.command.exec("new_file")
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("New File Command")
|
logger.debug("Command: New File")
|
||||||
file = view.files_manager.new()
|
|
||||||
|
file = view.command.new_file(view)
|
||||||
language = view.language_manager \
|
language = view.language_manager \
|
||||||
.guess_language("file.txt", None)
|
.guess_language("file.txt", None)
|
||||||
|
|
||||||
@@ -24,7 +25,6 @@ def execute(
|
|||||||
file.buffer.set_style_scheme(view.syntax_theme)
|
file.buffer.set_style_scheme(view.syntax_theme)
|
||||||
|
|
||||||
view.set_buffer(file.buffer)
|
view.set_buffer(file.buffer)
|
||||||
file.add_observer(view)
|
|
||||||
|
|
||||||
has_focus = view.command.exec("has_focus")
|
has_focus = view.command.exec("has_focus")
|
||||||
if not has_focus: return file
|
if not has_focus: return file
|
||||||
|
|||||||
@@ -14,20 +14,16 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Open File(s) Command")
|
logger.debug("Command: Open File(s)")
|
||||||
gfiles = event_system.emit_and_await("open-files")
|
gfiles = event_system.emit_and_await("open-files")
|
||||||
if not gfiles: return
|
if not gfiles: return
|
||||||
|
|
||||||
size = len(gfiles)
|
file = view.command.get_file(view)
|
||||||
for i, gfile in enumerate(gfiles):
|
if file.ftype == "buffer":
|
||||||
file = view.files_manager.new()
|
gfile = gfiles.pop()
|
||||||
view.command.exec_with_args("load_file", (view, gfile, file))
|
view.command.exec_with_args("load_file", (view, gfile, file))
|
||||||
|
|
||||||
if i == (size - 1):
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
_file = view.files_manager.get_file(buffer)
|
|
||||||
_file.remove_observer(view)
|
|
||||||
|
|
||||||
view.set_buffer(file.buffer)
|
view.set_buffer(file.buffer)
|
||||||
file.add_observer(view)
|
|
||||||
view.command.exec("update_info_bar")
|
view.command.exec("update_info_bar")
|
||||||
|
|
||||||
|
for i, gfile in enumerate(gfiles):
|
||||||
|
view.command.exec_with_args("load_file", (view, gfile))
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Paste Temp Buffer Command")
|
logger.debug("Command: Paste Temp Buffer")
|
||||||
|
|
||||||
view.clear_temp_cut_buffer_delayed()
|
view.clear_temp_cut_buffer_delayed()
|
||||||
|
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Save File Command")
|
logger.debug("Command: Save File")
|
||||||
buffer = view.get_buffer()
|
file = view.command.get_file(view)
|
||||||
file = view.files_manager.get_file(buffer)
|
buffer = file.buffer
|
||||||
|
|
||||||
if file.ftype == "buffer":
|
if file.ftype == "buffer":
|
||||||
file.save_as()
|
file.save_as()
|
||||||
|
|||||||
@@ -14,9 +14,9 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.info("Save File As Command")
|
logger.info("Command: Save File As")
|
||||||
buffer = view.get_buffer()
|
file = view.command.get_file(view)
|
||||||
file = view.files_manager.get_file(buffer)
|
buffer = file.buffer
|
||||||
|
|
||||||
file.save_as()
|
file.save_as()
|
||||||
|
|
||||||
@@ -24,5 +24,5 @@ def execute(
|
|||||||
.guess_language(file.fname, None)
|
.guess_language(file.fname, None)
|
||||||
file.ftype = language
|
file.ftype = language
|
||||||
file.buffer.set_language(language)
|
file.buffer.set_language(language)
|
||||||
file.add_observer(view)
|
|
||||||
view.exec_command("update_info_bar")
|
view.command.exec("update_info_bar")
|
||||||
|
|||||||
@@ -17,18 +17,13 @@ def execute(
|
|||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
file: SourceFile
|
file: SourceFile
|
||||||
):
|
):
|
||||||
logger.debug("Set Buffer Command")
|
logger.debug("Command: Set Buffer")
|
||||||
|
|
||||||
buffer = view.get_buffer()
|
|
||||||
_file = view.files_manager.get_file(buffer)
|
|
||||||
_file.remove_observer(view)
|
|
||||||
|
|
||||||
if not file:
|
if not file:
|
||||||
view.command.exec("new_file")
|
view.command.new_file(view)
|
||||||
return
|
return
|
||||||
|
|
||||||
view.set_buffer(file.buffer)
|
view.set_buffer(file.buffer)
|
||||||
file.add_observer(view)
|
|
||||||
|
|
||||||
has_focus = view.command.exec("has_focus")
|
has_focus = view.command.exec("has_focus")
|
||||||
if has_focus:
|
if has_focus:
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ def execute(
|
|||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
language: str
|
language: str
|
||||||
):
|
):
|
||||||
logger.debug("Set Buffer Language Command")
|
logger.debug("Command: Set Buffer Language")
|
||||||
|
|
||||||
buffer = editor.get_buffer()
|
buffer = view.get_buffer()
|
||||||
buffer.set_language(
|
buffer.set_language(
|
||||||
view.language_manager.get_language(language)
|
view.language_manager.get_language(language)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ def execute(
|
|||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
style: str
|
style: str
|
||||||
):
|
):
|
||||||
logger.debug("Set Buffer Style Command")
|
logger.debug("Command: Set Buffer Style")
|
||||||
|
|
||||||
buffer = editor.get_buffer()
|
buffer = view.get_buffer()
|
||||||
buffer.set_style_scheme(
|
buffer.set_style_scheme(
|
||||||
view.style_scheme_manager.get_scheme(style)
|
view.style_scheme_manager.get_scheme(style)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Set Focus Border Command")
|
logger.debug("Command: Set Focus Border")
|
||||||
ctx = view.get_parent().get_style_context()
|
ctx = view.get_parent().get_style_context()
|
||||||
ctx.add_class("source-view-focused")
|
ctx.add_class("source-view-focused")
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from gi.repository import GtkSource
|
|||||||
from gi.repository import Gio
|
from gi.repository import Gio
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.code_event import CodeEvent
|
from libs.dto.code import FocusedViewEvent
|
||||||
|
|
||||||
from ..source_file import SourceFile
|
from ..source_file import SourceFile
|
||||||
|
|
||||||
@@ -18,10 +18,5 @@ from ..source_file import SourceFile
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
):
|
):
|
||||||
logger.debug("Set MiniView Command")
|
logger.debug("Command: Set MiniView")
|
||||||
event_system.emit("set-mini-view", (view,))
|
event_system.emit("set-mini-view", (view,))
|
||||||
|
|
||||||
event = CodeEvent()
|
|
||||||
event.etype = "focused_view_change"
|
|
||||||
event.view = view
|
|
||||||
view.notify_observers(event)
|
|
||||||
|
|||||||
@@ -14,5 +14,5 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Show Completion Command")
|
logger.debug("Command: Show Completion")
|
||||||
view.completion.request_completion()
|
view.command.request_completion(view)
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ from ..source_file import SourceFile
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View,
|
view: GtkSource.View,
|
||||||
):
|
):
|
||||||
logger.debug("Update Info Bar Command")
|
logger.debug("Command: Update Info Bar")
|
||||||
buffer = view.get_buffer()
|
file = view.command.get_file(view)
|
||||||
file = view.files_manager.get_file(buffer)
|
buffer = file.buffer
|
||||||
|
|
||||||
if not file: return
|
if not file: return
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Zoom In Command")
|
logger.debug("Command: Zoom In")
|
||||||
|
|
||||||
ctx = view.get_style_context()
|
ctx = view.get_style_context()
|
||||||
if view.zoom_level < 99:
|
if view.zoom_level < 99:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ from gi.repository import GtkSource
|
|||||||
def execute(
|
def execute(
|
||||||
view: GtkSource.View = None
|
view: GtkSource.View = None
|
||||||
):
|
):
|
||||||
logger.debug("Zoom Out Command")
|
logger.debug("Command: Zoom Out")
|
||||||
|
|
||||||
ctx = view.get_style_context()
|
ctx = view.get_style_context()
|
||||||
if view.zoom_level > 1:
|
if view.zoom_level > 1:
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
import gi
|
|
||||||
from gi.repository import GLib
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from .completion_providers.example_completion_provider import ExampleCompletionProvider
|
|
||||||
from .completion_providers.lsp_completion_provider import LSPCompletionProvider
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CompletionManager():
|
|
||||||
def __init__(self):
|
|
||||||
super(CompletionManager, self).__init__()
|
|
||||||
|
|
||||||
self._lsp_provider = LSPCompletionProvider()
|
|
||||||
self._timeout_id = None
|
|
||||||
|
|
||||||
|
|
||||||
def set_completer(self, completer):
|
|
||||||
self._completor = completer
|
|
||||||
|
|
||||||
def request_completion(self):
|
|
||||||
if self._timeout_id:
|
|
||||||
GLib.source_remove(self._timeout_id)
|
|
||||||
|
|
||||||
self._timeout_id = GLib.timeout_add(
|
|
||||||
800,
|
|
||||||
self._process_request_completion
|
|
||||||
)
|
|
||||||
|
|
||||||
def _process_request_completion(self):
|
|
||||||
self._start_completion()
|
|
||||||
|
|
||||||
self._timeout_id = None
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _do_completion(self):
|
|
||||||
if self._completor.get_providers():
|
|
||||||
self._mach_completion()
|
|
||||||
else:
|
|
||||||
self._start_completion()
|
|
||||||
|
|
||||||
def _mach_completion(self):
|
|
||||||
"""
|
|
||||||
Note: Use IF providers were added to completion...
|
|
||||||
"""
|
|
||||||
self._completion.match(
|
|
||||||
self._completion.create_context()
|
|
||||||
)
|
|
||||||
|
|
||||||
def _start_completion(self):
|
|
||||||
"""
|
|
||||||
Note: Use IF NO providers have been added to completion...
|
|
||||||
print("here")
|
|
||||||
"""
|
|
||||||
self._completor.start(
|
|
||||||
[
|
|
||||||
ExampleCompletionProvider(),
|
|
||||||
self._lsp_provider
|
|
||||||
],
|
|
||||||
self._completor.create_context()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
3
src/core/widgets/code/controllers/__init__.py
Normal file
3
src/core/widgets/code/controllers/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
"""
|
||||||
|
Controllers Package
|
||||||
|
"""
|
||||||
34
src/core/widgets/code/controllers/commands_controller.py
Normal file
34
src/core/widgets/code/controllers/commands_controller.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.dto.code import (
|
||||||
|
CodeEvent,
|
||||||
|
GetCommandSystemEvent,
|
||||||
|
FocusedViewEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
from ..command_system import CommandSystem
|
||||||
|
|
||||||
|
from .controller_base import ControllerBase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class CommandsController(ControllerBase, list):
|
||||||
|
def __init__(self):
|
||||||
|
super(CommandsController, self).__init__()
|
||||||
|
|
||||||
|
|
||||||
|
def _controller_message(self, event: CodeEvent):
|
||||||
|
if isinstance(event, 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
|
||||||
111
src/core/widgets/code/controllers/completion_controller.py
Normal file
111
src/core/widgets/code/controllers/completion_controller.py
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# 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.dto.code import (
|
||||||
|
CodeEvent,
|
||||||
|
FocusedViewEvent,
|
||||||
|
RequestCompletionEvent,
|
||||||
|
CursorMovedEvent,
|
||||||
|
TextChangedEvent,
|
||||||
|
TextInsertedEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
from ..completion_providers.example_completion_provider import ExampleCompletionProvider
|
||||||
|
from ..completion_providers.lsp_completion_provider import LSPCompletionProvider
|
||||||
|
|
||||||
|
from .controller_base import ControllerBase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class CompletionController(ControllerBase):
|
||||||
|
def __init__(self):
|
||||||
|
super(CompletionController, self).__init__()
|
||||||
|
|
||||||
|
self._completor: GtkSource.Completion = None
|
||||||
|
self._timeout_id: int = None
|
||||||
|
self._lsp_provider: LSPCompletionProvider = LSPCompletionProvider()
|
||||||
|
|
||||||
|
|
||||||
|
def _controller_message(self, event: CodeEvent):
|
||||||
|
if isinstance(event, FocusedViewEvent):
|
||||||
|
self._completor = event.view.get_completion()
|
||||||
|
|
||||||
|
if not self._timeout_id: return
|
||||||
|
|
||||||
|
GLib.source_remove(self._timeout_id)
|
||||||
|
self._timeout_id = None
|
||||||
|
elif isinstance(event, RequestCompletionEvent):
|
||||||
|
self.request_completion()
|
||||||
|
# elif isinstance(event, TextInsertedEvent):
|
||||||
|
# self.request_completion()
|
||||||
|
|
||||||
|
def _process_request_completion(self):
|
||||||
|
self._start_completion()
|
||||||
|
|
||||||
|
self._timeout_id = None
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _do_completion(self):
|
||||||
|
if self._completor.get_providers():
|
||||||
|
self._match_completion()
|
||||||
|
else:
|
||||||
|
self._start_completion()
|
||||||
|
|
||||||
|
def _match_completion(self):
|
||||||
|
"""
|
||||||
|
Note: Use IF providers were added to completion...
|
||||||
|
"""
|
||||||
|
self._completion.match(
|
||||||
|
self._completion.create_context()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _start_completion(self):
|
||||||
|
"""
|
||||||
|
Note: Use IF NO providers have been added to completion...
|
||||||
|
"""
|
||||||
|
self._completor.start(
|
||||||
|
[
|
||||||
|
ExampleCompletionProvider(),
|
||||||
|
self._lsp_provider
|
||||||
|
],
|
||||||
|
self._completor.create_context()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def set_completer(self, completer):
|
||||||
|
self._completor = completer
|
||||||
|
|
||||||
|
def request_completion(self):
|
||||||
|
if self._timeout_id:
|
||||||
|
GLib.source_remove(self._timeout_id)
|
||||||
|
|
||||||
|
self._timeout_id = GLib.timeout_add(
|
||||||
|
800,
|
||||||
|
self._process_request_completion
|
||||||
|
)
|
||||||
|
|
||||||
|
def register_provider(
|
||||||
|
self,
|
||||||
|
provider_name: str,
|
||||||
|
provider: GtkSource.CompletionProvider,
|
||||||
|
priority: int = 0,
|
||||||
|
language_ids: list = None
|
||||||
|
):
|
||||||
|
"""Register completion providers with priority and language filtering"""
|
||||||
|
...
|
||||||
|
|
||||||
|
def unregister_provider(self, provider_name: str):
|
||||||
|
"""Remove completion providers"""
|
||||||
|
...
|
||||||
|
|
||||||
|
def get_active_providers(self, language_id: str = None) -> list:
|
||||||
|
"""Get providers filtered by language"""
|
||||||
|
...
|
||||||
38
src/core/widgets/code/controllers/controller_base.py
Normal file
38
src/core/widgets/code/controllers/controller_base.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.singleton import Singleton
|
||||||
|
|
||||||
|
from libs.dto.code.code_event import CodeEvent
|
||||||
|
|
||||||
|
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: CodeEvent):
|
||||||
|
raise ControllerBaseException("Controller Base must override '_controller_message'...")
|
||||||
|
|
||||||
|
def set_controller_context(self, controller_context: ControllerContext):
|
||||||
|
self.controller_context = controller_context
|
||||||
|
|
||||||
|
def message_to(self, name: str, event: CodeEvent):
|
||||||
|
return self.controller_context.message_to(name, event)
|
||||||
|
|
||||||
|
def message_all(self, event: CodeEvent):
|
||||||
|
return self.controller_context.message_all(event)
|
||||||
|
|
||||||
24
src/core/widgets/code/controllers/controller_context.py
Normal file
24
src/core/widgets/code/controllers/controller_context.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.dto.code.code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ControllerContextException(Exception):
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ControllerContext:
|
||||||
|
def __init__(self):
|
||||||
|
super(ControllerContext, self).__init__()
|
||||||
|
|
||||||
|
|
||||||
|
def message_to(self, name: str, event: CodeEvent):
|
||||||
|
raise ControllerContextException("Controller Context 'message_to' must be overriden by Controller Manager...")
|
||||||
|
|
||||||
|
def message_all(self, event: CodeEvent):
|
||||||
|
raise ControllerContextException("Controller Context 'message_all' must be overriden by Controller Manager...")
|
||||||
48
src/core/widgets/code/controllers/controller_manager.py
Normal file
48
src/core/widgets/code/controllers/controller_manager.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.singleton import Singleton
|
||||||
|
|
||||||
|
from libs.dto.code.code_event import CodeEvent
|
||||||
|
|
||||||
|
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_all = self.message_all
|
||||||
|
|
||||||
|
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'...")
|
||||||
|
|
||||||
|
controller.set_controller_context(
|
||||||
|
self._crete_controller_context()
|
||||||
|
)
|
||||||
|
|
||||||
|
self[name] = controller
|
||||||
|
|
||||||
|
|
||||||
|
def message_to(self, name: str, event: CodeEvent):
|
||||||
|
self[name]._controller_message(event)
|
||||||
|
|
||||||
|
def message_all(self, event: CodeEvent):
|
||||||
|
for key in self.keys():
|
||||||
|
self[key]._controller_message(event)
|
||||||
19
src/core/widgets/code/controllers/emit_dispatcher.py
Normal file
19
src/core/widgets/code/controllers/emit_dispatcher.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.dto.code.code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class EmitDispatcher:
|
||||||
|
def __init__(self):
|
||||||
|
super(EmitDispatcher, self).__init__()
|
||||||
|
|
||||||
|
|
||||||
|
def emit(self, event: CodeEvent):
|
||||||
|
self.message_all(event)
|
||||||
|
|
||||||
|
def emit_to(self, controller: str, event: CodeEvent):
|
||||||
|
self.message_to(controller, event)
|
||||||
156
src/core/widgets/code/controllers/files_controller.py
Normal file
156
src/core/widgets/code/controllers/files_controller.py
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.dto.code import (
|
||||||
|
CodeEvent,
|
||||||
|
FilePathSetEvent,
|
||||||
|
GetSwapFileEvent,
|
||||||
|
GetFileEvent,
|
||||||
|
AddNewFileEvent,
|
||||||
|
PopFileEvent,
|
||||||
|
SwapFileEvent,
|
||||||
|
RemoveFileEvent,
|
||||||
|
AddedNewFileEvent,
|
||||||
|
SwappedFileEvent,
|
||||||
|
PoppedFileEvent,
|
||||||
|
RemovedFileEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
from ..source_file import SourceFile
|
||||||
|
from ..source_buffer import SourceBuffer
|
||||||
|
|
||||||
|
from .controller_base import ControllerBase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class FilesController(ControllerBase, list):
|
||||||
|
def __init__(self):
|
||||||
|
super(FilesController, self).__init__()
|
||||||
|
|
||||||
|
|
||||||
|
def _controller_message(self, event: CodeEvent):
|
||||||
|
if isinstance(event, AddNewFileEvent):
|
||||||
|
self.new_file(event)
|
||||||
|
elif isinstance(event, SwapFileEvent):
|
||||||
|
self.swap_file(event)
|
||||||
|
elif isinstance(event, PopFileEvent):
|
||||||
|
self.pop_file(event)
|
||||||
|
elif isinstance(event, RemoveFileEvent):
|
||||||
|
self.remove_file(event)
|
||||||
|
elif isinstance(event, GetFileEvent):
|
||||||
|
self.get_file(event)
|
||||||
|
elif isinstance(event, GetSwapFileEvent):
|
||||||
|
self.get_swap_file(event)
|
||||||
|
|
||||||
|
def get_file(self, event: 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: 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: AddNewFileEvent):
|
||||||
|
file = SourceFile()
|
||||||
|
file.emit = self.emit
|
||||||
|
file.emit_to = self.emit_to
|
||||||
|
|
||||||
|
event.response = file
|
||||||
|
|
||||||
|
eve = AddedNewFileEvent()
|
||||||
|
eve.view = event.view
|
||||||
|
eve.file = file
|
||||||
|
self.message_all(eve)
|
||||||
|
|
||||||
|
self.append(file)
|
||||||
|
|
||||||
|
return file
|
||||||
|
|
||||||
|
def swap_file(self, event: 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: 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 = PoppedFileEvent()
|
||||||
|
eve.view = view
|
||||||
|
eve.file = popped_file
|
||||||
|
eve.next_file = next_file
|
||||||
|
self.message_all(eve)
|
||||||
|
|
||||||
|
return popped_file, next_file
|
||||||
|
|
||||||
|
def remove_file(self, event: 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 = RemovedFileEvent()
|
||||||
|
eve.view = event.view
|
||||||
|
eve.ignore_focus = True
|
||||||
|
eve.file = file
|
||||||
|
eve.next_file = next_file
|
||||||
|
self.message_all(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
|
||||||
131
src/core/widgets/code/controllers/source_views_controller.py
Normal file
131
src/core/widgets/code/controllers/source_views_controller.py
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.dto.code import (
|
||||||
|
CodeEvent,
|
||||||
|
GetCommandSystemEvent,
|
||||||
|
CursorMovedEvent,
|
||||||
|
TextChangedEvent,
|
||||||
|
FocusedViewEvent,
|
||||||
|
SetActiveFileEvent,
|
||||||
|
RemoveFileEvent,
|
||||||
|
RemovedFileEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
from ..command_system import CommandSystem
|
||||||
|
from ..key_mapper import KeyMapper
|
||||||
|
|
||||||
|
from ..source_view import SourceView
|
||||||
|
|
||||||
|
from .controller_base import ControllerBase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SourceViewsController(ControllerBase, list):
|
||||||
|
def __init__(self):
|
||||||
|
super(SourceViewsController, self).__init__()
|
||||||
|
|
||||||
|
self.key_mapper: KeyMapper = KeyMapper()
|
||||||
|
self.active_view: SourceView = None
|
||||||
|
|
||||||
|
|
||||||
|
def get_command_system(self):
|
||||||
|
event = GetCommandSystemEvent()
|
||||||
|
self.message_to("commands", event)
|
||||||
|
command = event.response
|
||||||
|
|
||||||
|
del event
|
||||||
|
return command
|
||||||
|
|
||||||
|
def create_source_view(self):
|
||||||
|
source_view: SourceView = SourceView()
|
||||||
|
source_view.command = self.get_command_system()
|
||||||
|
source_view.command.set_data(source_view)
|
||||||
|
|
||||||
|
self._map_signals(source_view)
|
||||||
|
|
||||||
|
self.append(source_view)
|
||||||
|
return source_view
|
||||||
|
|
||||||
|
def _controller_message(self, event: CodeEvent):
|
||||||
|
if isinstance(event, RemovedFileEvent):
|
||||||
|
self._remove_file(event)
|
||||||
|
if isinstance(event, TextChangedEvent):
|
||||||
|
self.active_view.command.exec("update_info_bar")
|
||||||
|
|
||||||
|
def _map_signals(self, source_view: SourceView):
|
||||||
|
source_view.connect("focus-in-event", self._focus_in_event)
|
||||||
|
source_view.connect("move-cursor", self._move_cursor)
|
||||||
|
source_view.connect("key-press-event", self._key_press_event)
|
||||||
|
source_view.connect("key-release-event", self._key_release_event)
|
||||||
|
source_view.connect("button-press-event", self._button_press_event)
|
||||||
|
source_view.connect("button-release-event", self._button_release_event)
|
||||||
|
|
||||||
|
def _focus_in_event(self, view, eve):
|
||||||
|
self.active_view = view
|
||||||
|
|
||||||
|
view.command.exec("set_miniview")
|
||||||
|
view.command.exec("set_focus_border")
|
||||||
|
view.command.exec("update_info_bar")
|
||||||
|
|
||||||
|
event = FocusedViewEvent()
|
||||||
|
event.view = view
|
||||||
|
self.emit(event)
|
||||||
|
|
||||||
|
def _move_cursor(self, view, step, count, extend_selection):
|
||||||
|
event = CursorMovedEvent()
|
||||||
|
buffer = view.get_buffer()
|
||||||
|
iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
||||||
|
line = iter.get_line()
|
||||||
|
char = iter.get_line_offset()
|
||||||
|
|
||||||
|
event.view = view
|
||||||
|
event.buffer = buffer
|
||||||
|
event.line = line
|
||||||
|
event.char = char
|
||||||
|
|
||||||
|
self.emit(event)
|
||||||
|
|
||||||
|
view.command.exec("update_info_bar")
|
||||||
|
|
||||||
|
def _button_press_event(self, view, eve):
|
||||||
|
self.active_view.command.exec("update_info_bar")
|
||||||
|
|
||||||
|
def _button_release_event(self, view, eve):
|
||||||
|
self.active_view.command.exec("update_info_bar")
|
||||||
|
|
||||||
|
def _key_press_event(self, view, eve):
|
||||||
|
command = self.key_mapper._key_press_event(eve)
|
||||||
|
if not command: return False
|
||||||
|
|
||||||
|
view.command.exec(command)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _key_release_event(self, view, eve):
|
||||||
|
command = self.key_mapper._key_release_event(eve)
|
||||||
|
if not command: return False
|
||||||
|
|
||||||
|
view.command.exec(command)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _remove_file(self, event: RemovedFileEvent):
|
||||||
|
for view in self:
|
||||||
|
if not event.file.buffer == view.get_buffer(): continue
|
||||||
|
if not event.next_file:
|
||||||
|
view.command.exec("new_file")
|
||||||
|
continue
|
||||||
|
|
||||||
|
view.set_buffer(event.next_file.buffer)
|
||||||
|
|
||||||
|
def first_map_load(self):
|
||||||
|
for view in self:
|
||||||
|
view.command.exec("new_file")
|
||||||
|
|
||||||
|
view = self[0]
|
||||||
|
view.grab_focus()
|
||||||
|
view.command.exec("load_start_files")
|
||||||
|
|
||||||
90
src/core/widgets/code/controllers/tabs_controller.py
Normal file
90
src/core/widgets/code/controllers/tabs_controller.py
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Python imports
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from libs.dto.code import (
|
||||||
|
CodeEvent,
|
||||||
|
FocusedViewEvent,
|
||||||
|
FilePathSetEvent,
|
||||||
|
RemoveFileEvent,
|
||||||
|
SetActiveFileEvent,
|
||||||
|
AddedNewFileEvent,
|
||||||
|
PoppedFileEvent,
|
||||||
|
RemovedFileEvent
|
||||||
|
)
|
||||||
|
|
||||||
|
from ..tabs_widget import TabsWidget
|
||||||
|
from ..tab_widget import TabWidget
|
||||||
|
|
||||||
|
from ..source_view import SourceView
|
||||||
|
|
||||||
|
from .controller_base import ControllerBase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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: CodeEvent):
|
||||||
|
if isinstance(event, FocusedViewEvent):
|
||||||
|
self.active_view = event.view
|
||||||
|
elif isinstance(event, FilePathSetEvent):
|
||||||
|
self.update_tab_label(event)
|
||||||
|
elif isinstance(event, AddedNewFileEvent):
|
||||||
|
self.add_tab(event)
|
||||||
|
elif isinstance(event, PoppedFileEvent):
|
||||||
|
...
|
||||||
|
elif isinstance(event, RemovedFileEvent):
|
||||||
|
self.remove_tab(event)
|
||||||
|
|
||||||
|
def get_tabs_widget(self):
|
||||||
|
return self.tabs_widget
|
||||||
|
|
||||||
|
def update_tab_label(self, event: 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: AddedNewFileEvent):
|
||||||
|
def set_active_tab(tab, eve, file):
|
||||||
|
event = SetActiveFileEvent()
|
||||||
|
event.buffer = tab.get_parent().file.buffer
|
||||||
|
|
||||||
|
self.active_view.set_buffer(
|
||||||
|
tab.get_parent().file.buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
self.message_all(event)
|
||||||
|
|
||||||
|
def close_tab(tab, eve, file):
|
||||||
|
event = RemoveFileEvent()
|
||||||
|
event.buffer = tab.get_parent().file.buffer
|
||||||
|
|
||||||
|
self.message_all(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: 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
|
||||||
@@ -11,11 +11,11 @@ from gi.repository import Gio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class GeneralInfoWidget(Gtk.Box):
|
class InfoBarWidget(Gtk.Box):
|
||||||
""" docstring for StatusInfoWidget. """
|
""" docstring for InfoBarWidget. """
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(GeneralInfoWidget, self).__init__()
|
super(InfoBarWidget, self).__init__()
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
@@ -76,9 +76,6 @@ class GeneralInfoWidget(Gtk.Box):
|
|||||||
gfile = "" if not gfile else gfile
|
gfile = "" if not gfile else gfile
|
||||||
|
|
||||||
if isinstance(gfile, str):
|
if isinstance(gfile, str):
|
||||||
# path = gfile
|
|
||||||
# path = "..." + path[-120: -1] if len(path) >= 123 else path
|
|
||||||
# self.path_label.set_text( path )
|
|
||||||
self.path_label.set_text( gfile )
|
self.path_label.set_text( gfile )
|
||||||
self.path_label.set_tooltip_text( gfile )
|
self.path_label.set_tooltip_text( gfile )
|
||||||
else:
|
else:
|
||||||
@@ -21,10 +21,11 @@ class MiniViewWidget(Map):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.set_hexpand(False)
|
|
||||||
ctx = self.get_style_context()
|
ctx = self.get_style_context()
|
||||||
ctx.add_class("mini-view")
|
ctx.add_class("mini-view")
|
||||||
|
|
||||||
|
self.set_hexpand(False)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.dto.code_event import CodeEvent
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceViewEventsMixin:
|
|
||||||
def _focus_in_event(self, view, eve):
|
|
||||||
self.command.exec("set_miniview")
|
|
||||||
self.command.exec("set_focus_border")
|
|
||||||
self.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def _move_cursor(self, view, step, count, extend_selection):
|
|
||||||
self.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def _button_press_event(self, view, eve):
|
|
||||||
self.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def _button_release_event(self, view, eve):
|
|
||||||
self.command.exec("update_info_bar")
|
|
||||||
|
|
||||||
def _key_press_event(self, view, eve):
|
|
||||||
command = self.key_mapper._key_press_event(eve)
|
|
||||||
if not command: return False
|
|
||||||
|
|
||||||
self.command.exec(command)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _key_release_event(self, view, eve):
|
|
||||||
command = self.key_mapper._key_release_event(eve)
|
|
||||||
if not command: return False
|
|
||||||
|
|
||||||
self.command.exec(command)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def notification(self, event: CodeEvent):
|
|
||||||
if not hasattr(self, "command"): return
|
|
||||||
|
|
||||||
has_focus = self.command.exec("has_focus")
|
|
||||||
if not has_focus and not event.ignore_focus: return
|
|
||||||
|
|
||||||
match event.etype:
|
|
||||||
case "removed_file":
|
|
||||||
logger.debug("SourceFileManager.remove_file")
|
|
||||||
if not event.file.buffer == self.get_buffer(): return
|
|
||||||
self.command.exec_with_args("set_buffer", (self, event.next_file))
|
|
||||||
return
|
|
||||||
case "changed":
|
|
||||||
logger.debug("SourceFile._changed")
|
|
||||||
case "modified_changed":
|
|
||||||
logger.debug("SourceFile._modified_changed")
|
|
||||||
case "insert_text":
|
|
||||||
logger.debug("SourceFile._insert_text")
|
|
||||||
case "mark_set":
|
|
||||||
# logger.debug("SourceFile._mark_set")
|
|
||||||
...
|
|
||||||
case _:
|
|
||||||
...
|
|
||||||
|
|
||||||
self.command.exec("update_info_bar")
|
|
||||||
@@ -12,19 +12,22 @@ from gi.repository import GtkSource
|
|||||||
from gi.repository import Gio
|
from gi.repository import Gio
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.mixins.observable_mixin import ObservableMixin
|
from libs.dto.code import (
|
||||||
from libs.dto.code_event import CodeEvent
|
CodeEvent,
|
||||||
|
TextChangedEvent,
|
||||||
|
TextInsertedEvent,
|
||||||
|
FilePathSetEvent,
|
||||||
|
ModifiedChangedEvent
|
||||||
|
)
|
||||||
|
|
||||||
from .source_buffer import SourceBuffer
|
from .source_buffer import SourceBuffer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceFile(GtkSource.File, ObservableMixin):
|
class SourceFile(GtkSource.File):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(SourceFile, self).__init__()
|
super(SourceFile, self).__init__()
|
||||||
|
|
||||||
self.observers = []
|
|
||||||
|
|
||||||
self.encoding: str = "UTF-8"
|
self.encoding: str = "UTF-8"
|
||||||
self.fname: str = "buffer"
|
self.fname: str = "buffer"
|
||||||
self.fpath: str = "buffer"
|
self.fpath: str = "buffer"
|
||||||
@@ -43,24 +46,21 @@ class SourceFile(GtkSource.File, ObservableMixin):
|
|||||||
self._modified_changed
|
self._modified_changed
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _changed(self, buffer: SourceBuffer):
|
||||||
|
event = TextChangedEvent()
|
||||||
|
event.file = self
|
||||||
|
event.buffer = buffer
|
||||||
|
|
||||||
|
self.emit(event)
|
||||||
|
|
||||||
def _insert_text(self, buffer: SourceBuffer, location: Gtk.TextIter,
|
def _insert_text(self, buffer: SourceBuffer, location: Gtk.TextIter,
|
||||||
text: str, length: int
|
text: str, length: int
|
||||||
):
|
):
|
||||||
event = CodeEvent()
|
event = TextInsertedEvent()
|
||||||
event.etype = "insert_text"
|
|
||||||
event.file = self
|
event.file = self
|
||||||
event.buffer = buffer
|
event.buffer = buffer
|
||||||
|
|
||||||
self.notify_observers(event)
|
self.emit(event)
|
||||||
|
|
||||||
def _changed(self, buffer: SourceBuffer):
|
|
||||||
event = CodeEvent()
|
|
||||||
event.etype = "changed"
|
|
||||||
event.file = self
|
|
||||||
event.buffer = buffer
|
|
||||||
|
|
||||||
self.notify_observers(event)
|
|
||||||
|
|
||||||
def _mark_set(self, buffer: SourceBuffer, location: Gtk.TextIter,
|
def _mark_set(self, buffer: SourceBuffer, location: Gtk.TextIter,
|
||||||
mark: Gtk.TextMark
|
mark: Gtk.TextMark
|
||||||
@@ -70,16 +70,15 @@ class SourceFile(GtkSource.File, ObservableMixin):
|
|||||||
# event.file = self
|
# event.file = self
|
||||||
# event.buffer = buffer
|
# event.buffer = buffer
|
||||||
|
|
||||||
# self.notify_observers(event)
|
# self.emit(event)
|
||||||
...
|
...
|
||||||
|
|
||||||
def _modified_changed(self, buffer: SourceBuffer):
|
def _modified_changed(self, buffer: SourceBuffer):
|
||||||
event = CodeEvent()
|
event = ModifiedChangedEvent()
|
||||||
event.etype = "modified_changed"
|
|
||||||
event.file = self
|
event.file = self
|
||||||
event.buffer = buffer
|
event.buffer = buffer
|
||||||
|
|
||||||
self.notify_observers(event)
|
self.emit(event)
|
||||||
|
|
||||||
|
|
||||||
def _write_file(self, gfile: Gio.File):
|
def _write_file(self, gfile: Gio.File):
|
||||||
@@ -112,11 +111,10 @@ class SourceFile(GtkSource.File, ObservableMixin):
|
|||||||
self.fpath = gfile.get_path()
|
self.fpath = gfile.get_path()
|
||||||
self.fname = gfile.get_basename()
|
self.fname = gfile.get_basename()
|
||||||
|
|
||||||
event = CodeEvent()
|
event = FilePathSetEvent()
|
||||||
event.etype = "set_path"
|
|
||||||
event.file = self
|
event.file = self
|
||||||
|
|
||||||
self.notify_observers(event)
|
self.emit(event)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
self._write_file( self.get_location() )
|
self._write_file( self.get_location() )
|
||||||
@@ -131,7 +129,10 @@ class SourceFile(GtkSource.File, ObservableMixin):
|
|||||||
return file
|
return file
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.observers.clear()
|
|
||||||
|
|
||||||
del self.observers
|
|
||||||
del self.buffer
|
del self.buffer
|
||||||
|
|
||||||
|
def emit(self, event: CodeEvent):
|
||||||
|
...
|
||||||
|
|
||||||
|
def emit_to(self, controller: str, event: CodeEvent):
|
||||||
|
...
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
# Python imports
|
|
||||||
|
|
||||||
# Lib imports
|
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.mixins.observable_mixin import ObservableMixin
|
|
||||||
from libs.singleton import Singleton
|
|
||||||
from libs.dto.code_event import CodeEvent
|
|
||||||
|
|
||||||
from .source_file import SourceFile
|
|
||||||
from .source_buffer import SourceBuffer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SourceFilesManager(Singleton, list, ObservableMixin):
|
|
||||||
def __init__(self):
|
|
||||||
super(SourceFilesManager, self).__init__()
|
|
||||||
|
|
||||||
self.observers = []
|
|
||||||
|
|
||||||
|
|
||||||
def new(self):
|
|
||||||
file = SourceFile()
|
|
||||||
self.append(file)
|
|
||||||
return file
|
|
||||||
|
|
||||||
def append(self, file: SourceFile):
|
|
||||||
if not file: return
|
|
||||||
super().append(file)
|
|
||||||
|
|
||||||
event = CodeEvent()
|
|
||||||
event.etype = "appended_file"
|
|
||||||
event.file = file
|
|
||||||
|
|
||||||
self.notify_observers(event)
|
|
||||||
|
|
||||||
def get_file(self, buffer: SourceBuffer):
|
|
||||||
if not buffer: return
|
|
||||||
|
|
||||||
for file in self:
|
|
||||||
if not buffer == file.buffer: continue
|
|
||||||
return file
|
|
||||||
|
|
||||||
def pop_file(self, buffer: SourceBuffer):
|
|
||||||
if not buffer: return
|
|
||||||
|
|
||||||
for i, file in enumerate(self):
|
|
||||||
if not 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 = CodeEvent()
|
|
||||||
event.etype = "popped_file"
|
|
||||||
event.file = popped_file
|
|
||||||
event.next_file = next_file
|
|
||||||
|
|
||||||
self.notify_observers(event)
|
|
||||||
|
|
||||||
return popped_file, next_file
|
|
||||||
|
|
||||||
def swap_file(self, buffer: SourceBuffer):
|
|
||||||
if not buffer: return
|
|
||||||
|
|
||||||
for i, file in enumerate(self):
|
|
||||||
if not buffer == file.buffer: continue
|
|
||||||
|
|
||||||
j = self.next_index(i)
|
|
||||||
next_file = self[j]
|
|
||||||
swapped_file = self[j] if not j == -1 else None
|
|
||||||
|
|
||||||
return swapped_file, next_file
|
|
||||||
|
|
||||||
def remove_file(self, buffer: SourceBuffer):
|
|
||||||
if not buffer: return
|
|
||||||
|
|
||||||
for i, file in enumerate(self):
|
|
||||||
if not buffer == file.buffer: continue
|
|
||||||
|
|
||||||
j = self.next_index(i)
|
|
||||||
next_file = self[j] if not j == -1 else None
|
|
||||||
event = CodeEvent()
|
|
||||||
event.etype = "removed_file"
|
|
||||||
event.ignore_focus = True
|
|
||||||
event.file = file
|
|
||||||
event.next_file = next_file
|
|
||||||
self.notify_observers(event)
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -9,24 +9,14 @@ from gi.repository import Gtk
|
|||||||
from gi.repository import GLib
|
from gi.repository import GLib
|
||||||
from gi.repository import GtkSource
|
from gi.repository import GtkSource
|
||||||
|
|
||||||
# Application imports
|
|
||||||
from libs.mixins.observable_mixin import ObservableMixin
|
|
||||||
|
|
||||||
from .mixins.source_view_events_mixin import SourceViewEventsMixin
|
|
||||||
from .mixins.source_view_dnd_mixin import SourceViewDnDMixin
|
from .mixins.source_view_dnd_mixin import SourceViewDnDMixin
|
||||||
|
|
||||||
from .source_files_manager import SourceFilesManager
|
|
||||||
from .completion_manager import CompletionManager
|
|
||||||
from .command_system import CommandSystem
|
|
||||||
from .key_mapper import KeyMapper
|
|
||||||
|
|
||||||
|
|
||||||
|
class SourceView(GtkSource.View, SourceViewDnDMixin):
|
||||||
class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceViewDnDMixin):
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(SourceView, self).__init__()
|
super(SourceView, self).__init__()
|
||||||
|
|
||||||
self.observers = []
|
|
||||||
self._cut_temp_timeout_id = None
|
self._cut_temp_timeout_id = None
|
||||||
self._cut_buffer = ""
|
self._cut_buffer = ""
|
||||||
|
|
||||||
@@ -63,40 +53,15 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
|
|||||||
self.set_highlight_current_line(True)
|
self.set_highlight_current_line(True)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
self.map_id = self.connect("map", self._init_map)
|
|
||||||
|
|
||||||
self.connect("focus-in-event", self._focus_in_event)
|
|
||||||
self.connect("drag-data-received", self._on_drag_data_received)
|
self.connect("drag-data-received", self._on_drag_data_received)
|
||||||
self.connect("move-cursor", self._move_cursor)
|
|
||||||
self.connect("key-press-event", self._key_press_event)
|
|
||||||
self.connect("key-release-event", self._key_release_event)
|
|
||||||
self.connect("button-press-event", self._button_press_event)
|
|
||||||
self.connect("button-release-event", self._button_release_event)
|
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
self._set_up_dnd()
|
|
||||||
event_system.emit("register-view-to-tabs-widget", (self,))
|
|
||||||
|
|
||||||
def _init_map(self, view):
|
|
||||||
self.disconnect(self.map_id)
|
|
||||||
del self.map_id
|
|
||||||
|
|
||||||
GLib.idle_add(self._init_show)
|
|
||||||
|
|
||||||
def _init_show(self):
|
|
||||||
self.language_manager = GtkSource.LanguageManager()
|
self.language_manager = GtkSource.LanguageManager()
|
||||||
self.style_scheme_manager = GtkSource.StyleSchemeManager()
|
self.style_scheme_manager = GtkSource.StyleSchemeManager()
|
||||||
|
|
||||||
self.key_mapper = KeyMapper()
|
|
||||||
self.command = CommandSystem()
|
|
||||||
self.completion = CompletionManager()
|
|
||||||
|
|
||||||
self.command.set_data(self)
|
|
||||||
self.completion.set_completer( self.get_completion() )
|
|
||||||
|
|
||||||
self.style_scheme_manager.append_search_path(
|
self.style_scheme_manager.append_search_path(
|
||||||
f"{settings_manager.path_manager.get_home_config_path()}/code_styles"
|
f"{settings_manager.path_manager.get_home_config_path()}/code_styles"
|
||||||
)
|
)
|
||||||
@@ -104,18 +69,7 @@ class SourceView(GtkSource.View, ObservableMixin, SourceViewEventsMixin, SourceV
|
|||||||
f"{settings_manager.settings.theming.syntax_theme}"
|
f"{settings_manager.settings.theming.syntax_theme}"
|
||||||
)
|
)
|
||||||
|
|
||||||
self.command.exec("new_file")
|
self._set_up_dnd()
|
||||||
|
|
||||||
if not self.sibling_right: return
|
|
||||||
|
|
||||||
self.grab_focus()
|
|
||||||
self.command.exec("load_start_files")
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def set_files_manager(self, files_manager: SourceFilesManager):
|
|
||||||
self.files_manager = files_manager
|
|
||||||
self.files_manager.add_observer(self)
|
|
||||||
|
|
||||||
def clear_temp_cut_buffer_delayed(self):
|
def clear_temp_cut_buffer_delayed(self):
|
||||||
if self._cut_temp_timeout_id:
|
if self._cut_temp_timeout_id:
|
||||||
@@ -6,22 +6,19 @@ gi.require_version('Gtk', '3.0')
|
|||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.dto.code_event import CodeEvent
|
from libs.dto.code.code_event import CodeEvent
|
||||||
|
|
||||||
from .view import SourceView
|
from .source_view import SourceView
|
||||||
from .source_files_manager import SourceFilesManager
|
|
||||||
from .source_file import SourceFile
|
from .source_file import SourceFile
|
||||||
|
|
||||||
from .tab_widget import TabWidget
|
from .tab_widget import TabWidget
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TabsWidget(Gtk.ScrolledWindow):
|
class TabsWidget(Gtk.ButtonBox):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(TabsWidget, self).__init__()
|
super(TabsWidget, self).__init__()
|
||||||
|
|
||||||
self.active_view: SourceView = None
|
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
self._subscribe_to_events()
|
self._subscribe_to_events()
|
||||||
@@ -29,59 +26,35 @@ class TabsWidget(Gtk.ScrolledWindow):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
self.set_overlay_scrolling(False)
|
self.set_layout(Gtk.ButtonBoxStyle.CENTER)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
event_system.subscribe("register-view-to-tabs-widget", self._register_view_to_tabs_widget)
|
...
|
||||||
|
|
||||||
def _subscribe_to_events(self):
|
def _subscribe_to_events(self):
|
||||||
self.files_manager: SourceFilesManager = SourceFilesManager()
|
...
|
||||||
self.files_manager.add_observer(self)
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
self.viewport = Gtk.Viewport()
|
|
||||||
self.tabs = Gtk.ButtonBox()
|
|
||||||
|
|
||||||
self.tabs.set_layout(Gtk.ButtonBoxStyle.CENTER)
|
|
||||||
|
|
||||||
self.viewport.add(self.tabs)
|
|
||||||
self.add(self.viewport)
|
|
||||||
|
|
||||||
def _register_view_to_tabs_widget(self, view: SourceView):
|
|
||||||
view.add_observer(self)
|
|
||||||
view.set_files_manager(self.files_manager)
|
|
||||||
|
|
||||||
def notification(self, event: CodeEvent):
|
|
||||||
match event.etype:
|
|
||||||
case "focused_view_change":
|
|
||||||
logger.debug("SourceView.focused_view_change")
|
|
||||||
self.active_view = event.view
|
|
||||||
case "appended_file":
|
|
||||||
logger.debug("SourceFilesManager.appended")
|
|
||||||
self.add_tab(event)
|
|
||||||
case "popped_file":
|
|
||||||
logger.debug("SourceFilesManager.pop_file")
|
|
||||||
case "removed_file":
|
|
||||||
logger.debug("SourceFilesManager.remove_file")
|
|
||||||
self.remove_tab(event)
|
|
||||||
case "set_path":
|
|
||||||
logger.debug("SourceFile.set_path")
|
|
||||||
self.update_tab_label(event)
|
|
||||||
case _:
|
|
||||||
...
|
...
|
||||||
|
|
||||||
def add_tab(self, event: CodeEvent):
|
def add_tab(self, event: CodeEvent):
|
||||||
|
"""Add a tab widget for the given file event."""
|
||||||
|
if not hasattr(self, 'tabs'):
|
||||||
|
return
|
||||||
|
|
||||||
tab = TabWidget()
|
tab = TabWidget()
|
||||||
tab.file = event.file
|
tab.file = event.file
|
||||||
|
|
||||||
tab.label.set_label(event.file.fname)
|
tab.label.set_label(event.file.fname)
|
||||||
event.file.add_observer(self)
|
|
||||||
|
|
||||||
def select_signal(widget, eve, file):
|
def select_signal(widget, eve, file):
|
||||||
self.active_view.command.exec_with_args("set_buffer", (self.active_view, file))
|
self.code_base.active_view.command.exec_with_args(
|
||||||
|
"set_buffer",
|
||||||
|
(self.code_base.active_view, file)
|
||||||
|
)
|
||||||
|
|
||||||
def close_signal(widget, eve, file):
|
def close_signal(widget, eve, file):
|
||||||
self.files_manager.remove_file(file.buffer)
|
self.code_base.files_controller.remove_file(file.buffer)
|
||||||
|
|
||||||
tab.set_select_signal(select_signal)
|
tab.set_select_signal(select_signal)
|
||||||
tab.set_close_signal(close_signal)
|
tab.set_close_signal(close_signal)
|
||||||
@@ -89,10 +62,13 @@ class TabsWidget(Gtk.ScrolledWindow):
|
|||||||
self.tabs.add(tab)
|
self.tabs.add(tab)
|
||||||
|
|
||||||
def remove_tab(self, event: CodeEvent):
|
def remove_tab(self, event: CodeEvent):
|
||||||
|
"""Remove a tab widget for the given file event."""
|
||||||
|
if not hasattr(self, 'tabs'):
|
||||||
|
return
|
||||||
|
|
||||||
for child in self.tabs.get_children():
|
for child in self.tabs.get_children():
|
||||||
if not child.file == event.file: continue
|
if not child.file == event.file: continue
|
||||||
|
|
||||||
child.file.remove_observer(self)
|
|
||||||
self.tabs.remove(child)
|
self.tabs.remove(child)
|
||||||
child.clear_signals_and_data()
|
child.clear_signals_and_data()
|
||||||
del child
|
del child
|
||||||
@@ -100,6 +76,10 @@ class TabsWidget(Gtk.ScrolledWindow):
|
|||||||
return
|
return
|
||||||
|
|
||||||
def update_tab_label(self, event: CodeEvent):
|
def update_tab_label(self, event: CodeEvent):
|
||||||
|
"""Update tab label for the given file event."""
|
||||||
|
if not hasattr(self, 'tabs'):
|
||||||
|
return
|
||||||
|
|
||||||
for tab in self.tabs.get_children():
|
for tab in self.tabs.get_children():
|
||||||
if not tab.file == event.file: continue
|
if not tab.file == event.file: continue
|
||||||
tab.label.set_label(event.file.fname)
|
tab.label.set_label(event.file.fname)
|
||||||
|
|||||||
@@ -70,16 +70,17 @@ class VteWidget(Vte.Terminal):
|
|||||||
|
|
||||||
# Note: '-->:' is used as a delimiter to split on to get command actual.
|
# Note: '-->:' is used as a delimiter to split on to get command actual.
|
||||||
# !!! DO NOT REMOVE UNLESS CODE UPDATED ACCORDINGLY !!!
|
# !!! DO NOT REMOVE UNLESS CODE UPDATED ACCORDINGLY !!!
|
||||||
|
# Also, KEEP the <space> prefix in commands to keep from inserting to bash history.
|
||||||
startup_cmds = [
|
startup_cmds = [
|
||||||
"env -i /bin/bash --noprofile --norc\n",
|
" env -i /bin/bash --noprofile --norc\n",
|
||||||
"export TERM='xterm-256color'\n",
|
" export TERM='xterm-256color'\n",
|
||||||
"export LC_ALL=C\n",
|
" export LC_ALL=C\n",
|
||||||
"export XDG_RUNTIME_DIR='/run/user/1000'\n",
|
" export XDG_RUNTIME_DIR='/run/user/1000'\n",
|
||||||
"export DISPLAY=:0\n",
|
" export DISPLAY=:0\n",
|
||||||
f"export XAUTHORITY='{settings_manager.path_manager.get_home_path()}/.Xauthority'\n",
|
f" export XAUTHORITY='{settings_manager.path_manager.get_home_path()}/.Xauthority'\n",
|
||||||
f"\nexport HOME='{settings_manager.path_manager.get_home_path()}'\n",
|
f" \nexport HOME='{settings_manager.path_manager.get_home_path()}'\n",
|
||||||
"export PS1='\\h@\\u \\W -->: '\n",
|
" export PS1='\\h@\\u \\W -->: '\n",
|
||||||
"clear\n"
|
" clear\n"
|
||||||
]
|
]
|
||||||
|
|
||||||
for i in startup_cmds:
|
for i in startup_cmds:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
Dasta Class Package
|
DTO Class Package
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from .event import Event
|
from .event import Event
|
||||||
27
src/libs/dto/code/__init__.py
Normal file
27
src/libs/dto/code/__init__.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
"""
|
||||||
|
Code DTO Class Package
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
from .get_command_system_event import GetCommandSystemEvent
|
||||||
|
from .request_completion_event import RequestCompletionEvent
|
||||||
|
from .cursor_moved_event import CursorMovedEvent
|
||||||
|
from .modified_changed_event import ModifiedChangedEvent
|
||||||
|
from .text_changed_event import TextChangedEvent
|
||||||
|
from .text_inserted_event import TextInsertedEvent
|
||||||
|
from .focused_view_event import FocusedViewEvent
|
||||||
|
from .set_active_file_event import SetActiveFileEvent
|
||||||
|
|
||||||
|
from .file_path_set_event import FilePathSetEvent
|
||||||
|
from .added_new_file_event import AddedNewFileEvent
|
||||||
|
from .swapped_file_event import SwappedFileEvent
|
||||||
|
from .popped_file_event import PoppedFileEvent
|
||||||
|
from .removed_file_event import RemovedFileEvent
|
||||||
|
|
||||||
|
from .get_file_event import GetFileEvent
|
||||||
|
from .get_swap_file_event import GetSwapFileEvent
|
||||||
|
from .add_new_file_event import AddNewFileEvent
|
||||||
|
from .swap_file_event import SwapFileEvent
|
||||||
|
from .pop_file_event import PopFileEvent
|
||||||
|
from .remove_file_event import RemoveFileEvent
|
||||||
13
src/libs/dto/code/add_new_file_event.py
Normal file
13
src/libs/dto/code/add_new_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AddNewFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
13
src/libs/dto/code/added_new_file_event.py
Normal file
13
src/libs/dto/code/added_new_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AddedNewFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
@@ -4,15 +4,14 @@ from dataclasses import dataclass, field
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from .observable_event import ObservableEvent
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class CodeEvent(ObservableEvent):
|
class CodeEvent:
|
||||||
etype: str = ""
|
|
||||||
ignore_focus: bool = False
|
ignore_focus: bool = False
|
||||||
view: any = None
|
view: any = None
|
||||||
file: any = None
|
file: any = None
|
||||||
next_file: any = None
|
next_file: any = None
|
||||||
buffer: any = None
|
buffer: any = None
|
||||||
|
response: any = None
|
||||||
14
src/libs/dto/code/cursor_moved_event.py
Normal file
14
src/libs/dto/code/cursor_moved_event.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CursorMovedEvent(CodeEvent):
|
||||||
|
line: int = 0
|
||||||
|
char: int = 0
|
||||||
15
src/libs/dto/code/file_path_set_event.py
Normal file
15
src/libs/dto/code/file_path_set_event.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class FilePathSetEvent(CodeEvent):
|
||||||
|
fname: str = ""
|
||||||
|
fpath: str = ""
|
||||||
|
ftype: str = ""
|
||||||
14
src/libs/dto/code/focused_view_event.py
Normal file
14
src/libs/dto/code/focused_view_event.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class FocusedViewEvent(CodeEvent):
|
||||||
|
left_view: any = False
|
||||||
|
right_view: any = False
|
||||||
13
src/libs/dto/code/get_command_system_event.py
Normal file
13
src/libs/dto/code/get_command_system_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class GetCommandSystemEvent(CodeEvent):
|
||||||
|
...
|
||||||
13
src/libs/dto/code/get_file_event.py
Normal file
13
src/libs/dto/code/get_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class GetFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
13
src/libs/dto/code/get_swap_file_event.py
Normal file
13
src/libs/dto/code/get_swap_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class GetSwapFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
15
src/libs/dto/code/modified_changed_event.py
Normal file
15
src/libs/dto/code/modified_changed_event.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ModifiedChangedEvent(CodeEvent):
|
||||||
|
line: int = 0
|
||||||
|
char: int = 0
|
||||||
|
value: str = ""
|
||||||
13
src/libs/dto/code/pop_file_event.py
Normal file
13
src/libs/dto/code/pop_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PopFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
15
src/libs/dto/code/popped_file_event.py
Normal file
15
src/libs/dto/code/popped_file_event.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PoppedFileEvent(CodeEvent):
|
||||||
|
fname: str = ""
|
||||||
|
fpath: str = ""
|
||||||
|
ftype: str = ""
|
||||||
13
src/libs/dto/code/remove_file_event.py
Normal file
13
src/libs/dto/code/remove_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RemoveFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
15
src/libs/dto/code/removed_file_event.py
Normal file
15
src/libs/dto/code/removed_file_event.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RemovedFileEvent(CodeEvent):
|
||||||
|
fname: str = ""
|
||||||
|
fpath: str = ""
|
||||||
|
ftype: str = ""
|
||||||
13
src/libs/dto/code/request_completion_event.py
Normal file
13
src/libs/dto/code/request_completion_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RequestCompletionEvent(CodeEvent):
|
||||||
|
...
|
||||||
13
src/libs/dto/code/set_active_file_event.py
Normal file
13
src/libs/dto/code/set_active_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SetActiveFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
13
src/libs/dto/code/swap_file_event.py
Normal file
13
src/libs/dto/code/swap_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SwapFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
13
src/libs/dto/code/swapped_file_event.py
Normal file
13
src/libs/dto/code/swapped_file_event.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SwappedFileEvent(CodeEvent):
|
||||||
|
...
|
||||||
18
src/libs/dto/code/text_changed_event.py
Normal file
18
src/libs/dto/code/text_changed_event.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TextChangedEvent(CodeEvent):
|
||||||
|
has_selection: bool = False
|
||||||
|
start_range: int = 0
|
||||||
|
end_range: int = 0
|
||||||
|
line: int = 0
|
||||||
|
char: int = 0
|
||||||
|
value: str = ""
|
||||||
15
src/libs/dto/code/text_inserted_event.py
Normal file
15
src/libs/dto/code/text_inserted_event.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Python imports
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
|
# Lib imports
|
||||||
|
|
||||||
|
# Application imports
|
||||||
|
from .code_event import CodeEvent
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TextInsertedEvent(CodeEvent):
|
||||||
|
line: int = 0
|
||||||
|
char: int = 0
|
||||||
|
value: str = ""
|
||||||
Reference in New Issue
Block a user