From e9c0565c04e1237341d6264508da02c6bb97c2f3 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Wed, 25 Feb 2026 23:31:31 -0600 Subject: [PATCH] refactor: remove InfoBarWidget in favor of plugin-based one - Replace direct InfoBarWidget with set_info_labels command that emits events to plugins - Replace mini view widget in favor of plugin-based one - Add widget registry exposure for code-container and editors-container - Fix DND mixin exec_with_args call (tuple args issue) - Add break statements in tabs_widget loops for efficiency - Add _update_transparency call to BaseContainer --- plugins/code/code_minimap/__init__.py | 3 ++ plugins/code/code_minimap/__main__.py | 3 ++ .../code/code_minimap/code_minimap.py | 6 ++-- plugins/code/code_minimap/manifest.json | 7 ++++ plugins/code/code_minimap/plugin.py | 32 +++++++++++++++++++ plugins/code/info_bar/__init__.py | 3 ++ plugins/code/info_bar/__main__.py | 3 ++ .../code/info_bar}/info_bar_widget.py | 12 +++---- plugins/code/info_bar/manifest.json | 7 ++++ plugins/code/info_bar/plugin.py | 32 +++++++++++++++++++ src/core/containers/base_container.py | 1 + src/core/containers/center_container.py | 3 -- src/core/containers/code/code_container.py | 5 +-- src/core/containers/header_container.py | 9 ++---- src/core/widgets/code/code_base.py | 6 ---- .../code/command_system/command_system.py | 8 +++++ .../commands/update_info_bar.py | 3 +- .../code/mixins/source_view_dnd_mixin.py | 2 +- src/core/widgets/code/tabs_widget.py | 6 ++++ src/libs/dto/code/__init__.py | 5 +-- src/libs/dto/code/set_info_labels_event.py | 15 +++++++++ 21 files changed, 139 insertions(+), 32 deletions(-) create mode 100644 plugins/code/code_minimap/__init__.py create mode 100644 plugins/code/code_minimap/__main__.py rename src/core/widgets/code/mini_view_widget.py => plugins/code/code_minimap/code_minimap.py (89%) create mode 100644 plugins/code/code_minimap/manifest.json create mode 100644 plugins/code/code_minimap/plugin.py create mode 100644 plugins/code/info_bar/__init__.py create mode 100644 plugins/code/info_bar/__main__.py rename {src/core/widgets/code => plugins/code/info_bar}/info_bar_widget.py (84%) create mode 100644 plugins/code/info_bar/manifest.json create mode 100644 plugins/code/info_bar/plugin.py create mode 100644 src/libs/dto/code/set_info_labels_event.py diff --git a/plugins/code/code_minimap/__init__.py b/plugins/code/code_minimap/__init__.py new file mode 100644 index 0000000..d36fa8c --- /dev/null +++ b/plugins/code/code_minimap/__init__.py @@ -0,0 +1,3 @@ +""" + Pligin Module +""" diff --git a/plugins/code/code_minimap/__main__.py b/plugins/code/code_minimap/__main__.py new file mode 100644 index 0000000..a576329 --- /dev/null +++ b/plugins/code/code_minimap/__main__.py @@ -0,0 +1,3 @@ +""" + Pligin Package +""" diff --git a/src/core/widgets/code/mini_view_widget.py b/plugins/code/code_minimap/code_minimap.py similarity index 89% rename from src/core/widgets/code/mini_view_widget.py rename to plugins/code/code_minimap/code_minimap.py index da77c6a..14c1415 100644 --- a/src/core/widgets/code/mini_view_widget.py +++ b/plugins/code/code_minimap/code_minimap.py @@ -10,15 +10,17 @@ from gi.repository import Pango -class MiniViewWidget(Map): +class CodeMiniMap(Map): def __init__(self): - super(MiniViewWidget, self).__init__() + super(CodeMiniMap, self).__init__() self._setup_styling() self._setup_signals() self._subscribe_to_events() self._load_widgets() + self.show() + def _setup_styling(self): ctx = self.get_style_context() diff --git a/plugins/code/code_minimap/manifest.json b/plugins/code/code_minimap/manifest.json new file mode 100644 index 0000000..fc18ca7 --- /dev/null +++ b/plugins/code/code_minimap/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Code MiniMap", + "author": "ITDominator", + "version": "0.0.1", + "support": "", + "requests": {} +} diff --git a/plugins/code/code_minimap/plugin.py b/plugins/code/code_minimap/plugin.py new file mode 100644 index 0000000..a37db78 --- /dev/null +++ b/plugins/code/code_minimap/plugin.py @@ -0,0 +1,32 @@ +# Python imports + +# Lib imports + +# Application imports +from libs.event_factory import Event_Factory, Code_Event_Types + +from plugins.plugin_types import PluginCode + +from .code_minimap import CodeMiniMap + + + +code_minimap = CodeMiniMap() + + + +class Plugin(PluginCode): + def __init__(self): + super(Plugin, self).__init__() + + + def _controller_message(self, event: Code_Event_Types.CodeEvent): + if isinstance(event, Code_Event_Types.FocusedViewEvent): + code_minimap.set_smini_view(event.view) + + def load(self): + editors_container = self.requests_ui_element("editors-container") + editors_container.add( code_minimap ) + + def run(self): + ... diff --git a/plugins/code/info_bar/__init__.py b/plugins/code/info_bar/__init__.py new file mode 100644 index 0000000..d36fa8c --- /dev/null +++ b/plugins/code/info_bar/__init__.py @@ -0,0 +1,3 @@ +""" + Pligin Module +""" diff --git a/plugins/code/info_bar/__main__.py b/plugins/code/info_bar/__main__.py new file mode 100644 index 0000000..a576329 --- /dev/null +++ b/plugins/code/info_bar/__main__.py @@ -0,0 +1,3 @@ +""" + Pligin Package +""" diff --git a/src/core/widgets/code/info_bar_widget.py b/plugins/code/info_bar/info_bar_widget.py similarity index 84% rename from src/core/widgets/code/info_bar_widget.py rename to plugins/code/info_bar/info_bar_widget.py index a4da54c..40c48ed 100644 --- a/src/core/widgets/code/info_bar_widget.py +++ b/plugins/code/info_bar/info_bar_widget.py @@ -33,11 +33,7 @@ class InfoBarWidget(Gtk.Box): ... def _subscribe_to_events(self): - event_system.subscribe("set-info-labels", self._set_info_labels) - event_system.subscribe("set-path-label", self._set_path_label) - event_system.subscribe("set-encoding-label", self._set_encoding_label) - event_system.subscribe("set-line-char-label", self._set_line_char_label) - event_system.subscribe("set-file-type-label", self._set_file_type_label) + ... def _load_widgets(self): @@ -63,9 +59,9 @@ class InfoBarWidget(Gtk.Box): def _set_info_labels( self, path: Gio.File or str = None, - line_char: str = None, - file_type: str = None, - encoding_type: str = None + line_char: str = None, + file_type: str = None, + encoding_type: str = None ): self._set_path_label(path) self._set_line_char_label(line_char) diff --git a/plugins/code/info_bar/manifest.json b/plugins/code/info_bar/manifest.json new file mode 100644 index 0000000..26546b5 --- /dev/null +++ b/plugins/code/info_bar/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Info Bar", + "author": "ITDominator", + "version": "0.0.1", + "support": "", + "requests": {} +} diff --git a/plugins/code/info_bar/plugin.py b/plugins/code/info_bar/plugin.py new file mode 100644 index 0000000..594569b --- /dev/null +++ b/plugins/code/info_bar/plugin.py @@ -0,0 +1,32 @@ +# Python imports + +# Lib imports + +# Application imports +from libs.event_factory import Event_Factory, Code_Event_Types + +from plugins.plugin_types import PluginCode + +from .info_bar_widget import InfoBarWidget + + + +info_bar_widget = InfoBarWidget() + + + +class Plugin(PluginCode): + def __init__(self): + super(Plugin, self).__init__() + + + def _controller_message(self, event: Code_Event_Types.CodeEvent): + if isinstance(event, Code_Event_Types.SetInfoLabelsEvent): + info_bar_widget._set_info_labels(*event.info) + + def load(self): + header = self.requests_ui_element("header-container") + header.add( info_bar_widget ) + + def run(self): + ... diff --git a/src/core/containers/base_container.py b/src/core/containers/base_container.py index a10e763..c8c1d54 100644 --- a/src/core/containers/base_container.py +++ b/src/core/containers/base_container.py @@ -29,6 +29,7 @@ class BaseContainer(Gtk.Box): self.ctx.add_class("base-container") self.set_orientation(Gtk.Orientation.VERTICAL) + self._update_transparency() def _setup_signals(self): ... diff --git a/src/core/containers/center_container.py b/src/core/containers/center_container.py index 391d5da..7e82f0e 100644 --- a/src/core/containers/center_container.py +++ b/src/core/containers/center_container.py @@ -6,7 +6,6 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports -from ..widgets.code.info_bar_widget import InfoBarWidget from .code.code_container import CodeContainer from ..widgets.save_file_dialog import SaveFileDialog from ..widgets.controls.open_files_button import OpenFilesButton @@ -43,9 +42,7 @@ class CenterContainer(Gtk.Box): def _load_widgets(self): widget_registery.expose_object("center-container", self) - SaveFileDialog() OpenFilesButton() - self.add( InfoBarWidget() ) self.add( CodeContainer() ) diff --git a/src/core/containers/code/code_container.py b/src/core/containers/code/code_container.py index 16b8ddf..04598e0 100644 --- a/src/core/containers/code/code_container.py +++ b/src/core/containers/code/code_container.py @@ -9,7 +9,6 @@ from gi.repository import Gtk 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 @@ -48,9 +47,11 @@ class CodeContainer(Gtk.Box): def _create_editor_widget(self, code_base: CodeBase): editors_container = Gtk.Box() + widget_registery.expose_object("code-container", self) + 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") ) - editors_container.add( code_base.get_mini_view_widget() ) return editors_container diff --git a/src/core/containers/header_container.py b/src/core/containers/header_container.py index 8205363..ab1104d 100644 --- a/src/core/containers/header_container.py +++ b/src/core/containers/header_container.py @@ -7,7 +7,6 @@ from gi.repository import Gtk # Application imports from ..widgets.separator_widget import Separator -from ..widgets.controls.transparency_scale import TransparencyScale @@ -20,6 +19,8 @@ class HeaderContainer(Gtk.Box): self._subscribe_to_events() self._load_widgets() + self.show() + def _setup_styling(self): self.ctx = self.get_style_context() @@ -32,13 +33,9 @@ class HeaderContainer(Gtk.Box): ... def _subscribe_to_events(self): - event_system.subscribe("tggl-top-main-menubar", self.tggl_top_main_menubar) + ... def _load_widgets(self): widget_registery.expose_object("header-container", self) self.add( Separator("separator-header", 0) ) - self.add( TransparencyScale() ) - - def tggl_top_main_menubar(self): - self.hide() if self.is_visible() else self.show_all() \ No newline at end of file diff --git a/src/core/widgets/code/code_base.py b/src/core/widgets/code/code_base.py index 85974ea..875a17c 100644 --- a/src/core/widgets/code/code_base.py +++ b/src/core/widgets/code/code_base.py @@ -13,8 +13,6 @@ from .controllers.commands_controller import CommandsController from .controllers.completion_controller import CompletionController from .controllers.views.source_views_controller import SourceViewsController -from .mini_view_widget import MiniViewWidget - class CodeBase: @@ -22,7 +20,6 @@ class CodeBase: super(CodeBase, self).__init__() self.controller_manager: ControllerManager = ControllerManager() - self.miniview_widget: MiniViewWidget = MiniViewWidget() self._subscribe_to_events() self._load_controllers() @@ -50,9 +47,6 @@ class CodeBase: 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): source_view = self.controller_manager["source_views"].create_source_view() self.controller_manager["completion"].register_completer( diff --git a/src/core/widgets/code/command_system/command_system.py b/src/core/widgets/code/command_system/command_system.py index 0dd0e65..d5bcdc3 100644 --- a/src/core/widgets/code/command_system/command_system.py +++ b/src/core/widgets/code/command_system/command_system.py @@ -47,6 +47,14 @@ class CommandSystem: ... + def set_info_labels(self, data: tuple[str]): + event = Event_Factory.create_event( + "set_info_labels", + info = data + ) + + self.emit_to("plugins", event) + def get_file(self, view: SourceView): event = Event_Factory.create_event( "get_file", diff --git a/src/core/widgets/code/command_system/commands/update_info_bar.py b/src/core/widgets/code/command_system/commands/update_info_bar.py index 6776247..f83a102 100644 --- a/src/core/widgets/code/command_system/commands/update_info_bar.py +++ b/src/core/widgets/code/command_system/commands/update_info_bar.py @@ -27,7 +27,6 @@ def execute( column = iter.get_line_offset() ftype = file.ftype.get_id() if hasattr(file.ftype, "get_id") else file.ftype - event_system.emit( - "set-info-labels", + view.command.set_info_labels( (file.fpath, f"{line}:{column}", ftype, file.encoding) ) diff --git a/src/core/widgets/code/mixins/source_view_dnd_mixin.py b/src/core/widgets/code/mixins/source_view_dnd_mixin.py index bbfed59..72d47c8 100644 --- a/src/core/widgets/code/mixins/source_view_dnd_mixin.py +++ b/src/core/widgets/code/mixins/source_view_dnd_mixin.py @@ -37,4 +37,4 @@ class SourceViewDnDMixin: if not uris: return - self.command.exec_with_args("dnd_load_files", (self, uris)) + self.command.exec_with_args("dnd_load_files", self, uris) diff --git a/src/core/widgets/code/tabs_widget.py b/src/core/widgets/code/tabs_widget.py index 3f7487f..067a2ac 100644 --- a/src/core/widgets/code/tabs_widget.py +++ b/src/core/widgets/code/tabs_widget.py @@ -116,6 +116,8 @@ class TabsWidget(Gtk.Notebook): self.handler_unblock(self.switch_page_id) + break + def modified_changed(self, buffer): for page_widget in self.get_children(): tab = self.get_tab_label(page_widget) @@ -128,12 +130,16 @@ class TabsWidget(Gtk.Notebook): else: ctx.remove_class("file-changed") + break + def externally_deleted(self, buffer): for page_widget in self.get_children(): tab = self.get_tab_label(page_widget) if not buffer == tab.file.buffer: continue ctx = tab.label.get_style_context() ctx.add_class("file-deleted") + break + def close_item(self, menu_item, page_widget): tab = self.get_tab_label(page_widget) diff --git a/src/libs/dto/code/__init__.py b/src/libs/dto/code/__init__.py index 0616520..fbba5b7 100644 --- a/src/libs/dto/code/__init__.py +++ b/src/libs/dto/code/__init__.py @@ -6,8 +6,9 @@ from .code_event import CodeEvent from .register_provider_event import RegisterProviderEvent from .register_command_event import RegisterCommandEvent -from .file_externally_modified_event import FileExternallyModifiedEvent -from .file_externally_deleted_event import FileExternallyDeletedEvent +from .file_externally_modified_event import FileExternallyModifiedEvent +from .file_externally_deleted_event import FileExternallyDeletedEvent +from .set_info_labels_event import SetInfoLabelsEvent from .get_new_command_system_event import GetNewCommandSystemEvent from .request_completion_event import RequestCompletionEvent diff --git a/src/libs/dto/code/set_info_labels_event.py b/src/libs/dto/code/set_info_labels_event.py new file mode 100644 index 0000000..d12a889 --- /dev/null +++ b/src/libs/dto/code/set_info_labels_event.py @@ -0,0 +1,15 @@ +# Python imports +from dataclasses import dataclass, field + +# Lib imports +import gi +from gi.repository import Gio + +# Application imports +from .code_event import CodeEvent + + + +@dataclass +class SetInfoLabelsEvent(CodeEvent): + info: tuple[str or Gio.File] = None