From bb94fbf51b72d57a3f9d5b3718fd053b91b58c7e Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 2 Feb 2026 16:51:51 +0900 Subject: [PATCH] feat: add emitter --- dzgui/controllers/mc.py | 46 +++++++++++++++++++++++++ dzgui/views/components/connect_panel.py | 6 ++++ dzgui/views/components/entry.py | 3 ++ dzgui/views/components/filter_panel.py | 4 +++ dzgui/views/trees/tree_servers.py | 12 ++++--- 5 files changed, 66 insertions(+), 5 deletions(-) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 1afbc93..f1f07e1 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -83,6 +83,30 @@ class AppNavigation: logtreeview: "LogTreeView" filters: "FilterPanel" +class Emitter(GObject.GObject): + def __init__(self) -> None: + super().__init__() + + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(object,)) + def widget_changed(self, widget: GObject) -> None: + pass + + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=()) + def request_keyword_focus(self) -> None: + pass + + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=()) + def request_maps_focus(self) -> None: + pass + + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=()) + def request_ip_entry_focus(self) -> None: + pass + + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=()) + def request_lan_entry_focus(self) -> None: + pass + class Controller(GObject.GObject): def __init__(self) -> None: @@ -95,6 +119,17 @@ class Controller(GObject.GObject): # NOTE: suppress requests until entire UI is loaded self.loaded = False + self.emitter = Emitter() + self.emitter.connect("widget_changed", self.test_emitter) + + def get_emitter(self) -> Emitter: + return self.emitter + + def test_emitter(self, widget: GObject, emitter: Emitter) -> None: + print(type(widget)) + print(type(signal)) + print(f"caught signal from widget: {widget}") + def call_on_thread(func: Callable) -> Callable: def wrapper(*args, **kwargs): self = args[0] @@ -393,8 +428,19 @@ class Controller(GObject.GObject): # TODO: ping column pass parsed = Servers.parse_json(serv) + self.mediator.filters.set_unique_maps(parsed) self.push_data(parsed, FilterMode.INITIAL) + #def set_unique_maps(self, records: list) -> None: + # if len(records) < 1: + # return + # u_maps = set([row[1] for row in records]) + # u_maps = sorted(u_maps) + # for m in u_maps: + # print(m) + # #map_store.append([m]) + # #self.maps_hr.append(m) + def get_help_row(self) -> str: tv = self.mediator.menu model = self.get_help_store() diff --git a/dzgui/views/components/connect_panel.py b/dzgui/views/components/connect_panel.py index dd3b31e..81b206e 100644 --- a/dzgui/views/components/connect_panel.py +++ b/dzgui/views/components/connect_panel.py @@ -20,6 +20,9 @@ class LanPanel(Gtk.Frame): super().__init__(margin_top=10, margin_bottom=5) # TODO: hide lan panel on other tabs + self.controller = controller + self.emitter = controller.get_emitter() + label = BoldLabel(lan_panel.heading) self.set_label_widget(label) @@ -30,6 +33,7 @@ class LanPanel(Gtk.Frame): self.scan = Gtk.Button(label=lan_panel.scan_button) self.entry.connect("string_validated", self._on_port_validated) + self.emitter.connect("request_lan_entry_focus", lambda _: self.entry.grab_focus()) radio1.connect("toggled", self._on_radio_toggled) self.grid = Gtk.Grid(margin=10, vexpand=False, column_spacing=15, row_spacing=5) @@ -91,6 +95,7 @@ class AddPanel(Gtk.Frame): super().__init__(margin_top=10, margin_bottom=5) self.controller = controller + self.emitter = controller.get_emitter() self.classname = "invalid-entry" label = BoldLabel("Connect") @@ -103,6 +108,7 @@ class AddPanel(Gtk.Frame): self.entry = IpEntry(controller) self.entry.connect("string_validated", self._on_ip_validated) + self.emitter.connect("request_ip_entry_focus", lambda _: self.entry.grab_focus()) self.grid = Gtk.Grid(margin=10, vexpand=False, column_spacing=15, row_spacing=5) self.grid.attach(self.entry, 0, 0, COLS, ROWS) diff --git a/dzgui/views/components/entry.py b/dzgui/views/components/entry.py index 37093ea..66ec8a5 100644 --- a/dzgui/views/components/entry.py +++ b/dzgui/views/components/entry.py @@ -47,6 +47,8 @@ class ValidatedEntry(Gtk.Entry): self.set_validation_func(func) self.controller = controller + self.emitter = self.controller.get_emitter() + self.classname = "invalid-entry" self.connect("key-press-event", self._on_entry_keypress) self.connect("changed", self._on_text_changed) @@ -57,6 +59,7 @@ class ValidatedEntry(Gtk.Entry): def mark_valid(self) -> None: self.emit("string_validated", True) + self.emitter.emit("widget_changed", self) remove_class(self, self.classname) def mark_invalid(self) -> None: diff --git a/dzgui/views/components/filter_panel.py b/dzgui/views/components/filter_panel.py index 4a21c22..eacde6c 100644 --- a/dzgui/views/components/filter_panel.py +++ b/dzgui/views/components/filter_panel.py @@ -36,6 +36,7 @@ class FilterPanel(Gtk.Box): self.controller = controller self.controller.register_widget("filters", self) + self.emitter = self.controller.get_emitter() map_store = self.controller.get_map_store() @@ -84,6 +85,9 @@ class FilterPanel(Gtk.Box): self.keyword_entry.connect("activate", self._on_keyword_enter) self.keyword_entry.connect("key-press-event", self._on_keyword_keypress) + self.emitter.connect("request_keyword_focus", lambda _: self.keyword_entry.grab_focus()) + self.emitter.connect("request_maps_focus", lambda _: self.maps_entry.grab_focus()) + completion = Gtk.EntryCompletion(inline_completion=True) completion.set_text_column(0) completion.set_minimum_key_length(1) diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index a518b94..e69b721 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -41,6 +41,7 @@ class ServerTreeView(TreeView): QUEUE_CHECK_DELAY = 200 self.controller = controller + self.emitter = controller.get_emitter() self.enum = enum self.loaded = False @@ -146,6 +147,7 @@ class ServerTreeView(TreeView): def _on_map(self, a) -> None: if self.get_enum() is ServerTab.LAN: + # TODO: use emitter here self.controller.mediator.grid.conpan.lan.set_visible(True) def _on_unmap(self, a) -> None: @@ -248,17 +250,17 @@ class ServerTreeView(TreeView): case Gdk.KEY_r: self.refresh_player_count() case Gdk.KEY_f: - self.controller.mediator.filters.keyword_entry.grab_focus() + self.emitter.emit("request_keyword_focus") case Gdk.KEY_m: - self.controller.mediator.filters.maps_entry.grab_focus() + self.emitter.emit("request_maps_focus") case Gdk.KEY_i: # TODO: - self.controller.mediator.grid.conpan.add_panel.entry.grab_focus() + self.emitter.emit("request_ip_entry_focus") case Gdk.KEY_p: if self.enum is ServerTab.LAN: - self.controller.mediator.grid.conpan.lan.entry.grab_focus() + self.emitter.emit("request_lan_entry_focus") case Gdk.KEY_c: - print("copy to clipboard") + print("UNIMPLEMENTED: copy to clipboard") else: match event.keyval: case Gdk.KEY_l | Gdk.KEY_Right: