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
This commit is contained in:
2026-02-25 23:31:31 -06:00
parent bc3fe1eee1
commit e9c0565c04
21 changed files with 139 additions and 32 deletions

View File

@@ -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):
...

View File

@@ -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() )

View File

@@ -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

View File

@@ -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()

View File

@@ -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(

View File

@@ -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",

View File

@@ -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)
)

View File

@@ -1,100 +0,0 @@
# Python imports
# Lib imports
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Pango
from gi.repository import Gio
# Application imports
class InfoBarWidget(Gtk.Box):
""" docstring for InfoBarWidget. """
def __init__(self):
super(InfoBarWidget, self).__init__()
self._setup_styling()
self._setup_signals()
self._subscribe_to_events()
self._load_widgets()
self.show_all()
def _setup_styling(self):
self.set_margin_start(25)
self.set_margin_end(25)
def _setup_signals(self):
...
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):
self.path_label = Gtk.Label(label = "...")
self.line_char_label = Gtk.Label(label = "1:0")
self.encoding_label = Gtk.Label(label = "utf-8")
self.file_type_label = Gtk.Label(label = "buffer")
self.add(self.path_label)
self.add(self.line_char_label)
self.add(self.encoding_label)
self.add(self.file_type_label)
self.path_label.set_hexpand(True)
self.path_label.set_ellipsize(Pango.EllipsizeMode.START)
self.path_label.set_single_line_mode(True)
self.path_label.set_max_width_chars(48)
self.line_char_label.set_hexpand(True)
self.encoding_label.set_hexpand(True)
self.file_type_label.set_hexpand(True)
def _set_info_labels(
self,
path: Gio.File or 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)
self._set_file_type_label(file_type)
self._set_encoding_label(encoding_type)
def _set_path_label(self, gfile: Gio.File or str = "..."):
gfile = "" if not gfile else gfile
if isinstance(gfile, str):
self.path_label.set_text( gfile )
self.path_label.set_tooltip_text( gfile )
else:
self.path_label.set_text( gfile.get_path() )
self.path_label.set_tooltip_text( gfile.get_path() )
def _set_line_char_label(self, line_char = "1:1"):
line_char = "1:1" if not line_char else line_char
self.line_char_label.set_text(line_char)
def _set_file_type_label(self, file_type = "buffer"):
file_type = "buffer" if not file_type else file_type
self.file_type_label.set_text(file_type)
def _set_encoding_label(self, encoding_type = "utf-8"):
encoding_type = "utf-8" if not encoding_type else encoding_type
self.encoding_label.set_text(encoding_type)

View File

@@ -1,48 +0,0 @@
# Python imports
# Lib imports
import gi
gi.require_version('GtkSource', '4')
from gi.repository.GtkSource import Map
from gi.repository import Pango
# Application imports
class MiniViewWidget(Map):
def __init__(self):
super(MiniViewWidget, self).__init__()
self._setup_styling()
self._setup_signals()
self._subscribe_to_events()
self._load_widgets()
def _setup_styling(self):
ctx = self.get_style_context()
ctx.add_class("mini-view")
self.set_hexpand(False)
self._set_font_desc()
def _setup_signals(self):
...
def _subscribe_to_events(self):
event_system.subscribe(f"set-mini-view", self.set_smini_view)
def _load_widgets(self):
...
def _set_font_desc(self):
default_font = 'Monospace 1'
desc = Pango.FontDescription(default_font)
desc.set_size(Pango.SCALE) # Set size to 1pt
desc.set_family('BuilderBlocks,' + desc.get_family())
self.set_property('font-desc', desc)
def set_smini_view(self, source_view):
self.set_view(source_view)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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