diff --git a/dzgui/controllers/emitter.py b/dzgui/controllers/emitter.py index 6bad77f..aa23bef 100644 --- a/dzgui/controllers/emitter.py +++ b/dzgui/controllers/emitter.py @@ -42,6 +42,10 @@ class Emitter(GObject.GObject): @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(int,)) def check_button_pressed(self, keyval: int) -> None: """User toggled filter panel check button via keyboard""" + + @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=(bool,)) + def server_page_toggled(self, keyval: int) -> None: + """Triggered on map/unmap signal from NotebookPage.SERVERS. Shows/hides grid panels.""" pass @GObject.Signal(flags=GObject.SignalFlags.RUN_LAST, arg_types=()) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 38e9ed6..210afa4 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -336,13 +336,6 @@ class Controller(GObject.GObject): notebook = self.mediator.grid.notebook notebook.focus_current() - def toggle_server_panels(self, state: bool) -> None: - # TODO: this is going to be signal dependent now, cf. map/unmap - #self.mediator.grid.emit("toggle panels", state) - self.mediator.grid.toggle_filter_panel(state) - self.mediator.grid.toggle_connect_panel(state) - self.mediator.grid.toggle_refresh_button(state) - def toggle_mod_panel(self, state: bool) -> None: self.mediator.grid.right_panel.sel_panel.set_visible(state) @@ -434,18 +427,33 @@ class Controller(GObject.GObject): text = "\n".join(final) return text - def copy_ip(self, path: Gtk.TreePath) -> None: + def get_col_value_by_path_index(self, path: Gtk.TreePath, index: int) -> Any: treeview = self.get_active_treeview() model = treeview.get_model() - if not model: + if model is None: return None - addr = model[path][7] - if addr is None: + value = model[path][index] + return value + + def copy_name(self, path: Gtk.TreePath) -> None: + # TODO: column values are deterministic, perhaps use a col name to index map + name = self.get_col_value_by_path_index(path, 0) + if name is None: return - qport = model[path][8] - ip = addr.split(":")[0] - gameport = int(addr.split(":")[1]) - record = Servers.Record(ip, gameport, qport) + self.copy_clipboard(name) + + def copy_ip(self, path: Gtk.TreePath) -> None: + treeview = self.get_active_treeview() + record = treeview.get_record() + # TODO: maybe delegate to filter man + #addr = self.get_col_value_by_path_index(path, 7) + #if addr is None: + # return + #qport = self.get_col_value_by_path_index(path, 8) + ## TODO: abstract get record function + #ip = addr.split(":")[0] + #gameport = int(addr.split(":")[1]) + #record = Servers.Record(ip, gameport, qport) self.copy_clipboard(f"{record.ip}:{record.qport}") def copy_clipboard(self, text: str) -> None: @@ -520,7 +528,6 @@ class Controller(GObject.GObject): self.copy_ip(path) case ContextMenu.COPY_NAME: self.copy_name(path) - pass case ContextMenu.REFRESH_PLAYERS: pass case ContextMenu.REMOVE_HISTORY: @@ -535,8 +542,9 @@ class Controller(GObject.GObject): # NOTE: manipulates mod store case ContextMenu.DELETE_MOD: self.delete_single_mod(path) - # TODO: hook treeview changed signal automatically + # TODO: connect to emitter automatically # Gtk.TreeModel, row-inserted/row-deleted + # updates statusbar self.update_mod_statusbar() remove_stale_signatures( self.prefs.paths.config, self.prefs.paths.version diff --git a/dzgui/views/base.py b/dzgui/views/base.py index 288407a..9ef205b 100644 --- a/dzgui/views/base.py +++ b/dzgui/views/base.py @@ -4,16 +4,18 @@ import warnings from typing import TYPE_CHECKING, Literal -from dzgui.const.enum import NotebookPage +# TODO: import notebook only and add components there? from dzgui.const.constants import APP_NAME, APP_NAME_LOWER, STEAM_ICON +from dzgui.const.enum import NotebookPage +from dzgui.controllers.emitter import Emitter from dzgui.controllers.mc import Controller from dzgui.util import css, strings - -# NOTEBOOK ITEMS -# TODO: import notebook only and add components there? -from dzgui.views.pages.changelog import Changelog from dzgui.views.components.connect_panel import ConnectPanel from dzgui.views.components.crumbs import Breadcrumbs +from dzgui.views.components.right_panel import RightPanel +from dzgui.views.components.statusbar import Statusbar +from dzgui.views.mixins.scrollable_mixin import ScrollableMixin +from dzgui.views.pages.changelog import Changelog from dzgui.views.pages.devs import Developers from dzgui.views.pages.help import Help from dzgui.views.pages.keys import Keybindings @@ -23,10 +25,6 @@ from dzgui.views.pages.options import Options from dzgui.views.pages.servers import ServerNotebook from dzgui.views.pages.thanks import Thanks -from dzgui.views.components.statusbar import Statusbar -from dzgui.views.components.right_panel import RightPanel -from dzgui.views.mixins.scrollable_mixin import ScrollableMixin - if TYPE_CHECKING: from dzgui.config.userprefs import UserPrefs @@ -309,6 +307,8 @@ class Grid(Gtk.Grid): # self.bu.connect("clicked", self._shrink) # self.crumb_box.add(self.bu) + self.emitter = MainController.get_emitter() + self.notebook = Notebook() self.conpan = ConnectPanel(MainController) @@ -344,17 +344,15 @@ class Grid(Gtk.Grid): self.show_all() + self.emitter.connect("server_page_toggled", self.toggle_filter_panels) + def _shrink(self, button: Gtk.Button) -> None: tv = MainController.get_active_treeview() tv.shrink_to_fit() - def toggle_filter_panel(self, state: bool) -> None: + def toggle_filter_panels(self, emitter: "Emitter", state: bool) -> None: self.right_panel.filters_vbox.set_visible(state) - - def toggle_connect_panel(self, state: bool) -> None: self.conpan.set_visible(state) - - def toggle_refresh_button(self, state: bool) -> None: self.right_panel.refresh_button.set_visible(state) diff --git a/dzgui/views/mixins/context_mixin.py b/dzgui/views/mixins/context_mixin.py index 4e389bc..4cd12b0 100644 --- a/dzgui/views/mixins/context_mixin.py +++ b/dzgui/views/mixins/context_mixin.py @@ -22,7 +22,9 @@ class ContextMixin(TreeView): if self.is_selection_empty(): return - if event.type is Gdk.EventType.BUTTON_PRESS and event.button == 3: + if event.type is Gdk.EventType.BUTTON_PRESS: + if event.button != 3: + return try: pathinfo = self.get_path_at_pos(int(event.x), int(event.y)) if pathinfo is None: diff --git a/dzgui/views/pages/mods.py b/dzgui/views/pages/mods.py index 9ac5767..6d0d4a5 100644 --- a/dzgui/views/pages/mods.py +++ b/dzgui/views/pages/mods.py @@ -23,6 +23,7 @@ class Mods(Gtk.ScrolledWindow): self.connect("map", self._on_map) self.connect("unmap", self._on_unmap) + # TODO: use emitter def _on_unmap(self, widget: Self) -> None: self.controller.toggle_mod_panel(False) diff --git a/dzgui/views/pages/servers.py b/dzgui/views/pages/servers.py index 23c739a..f23ab1a 100644 --- a/dzgui/views/pages/servers.py +++ b/dzgui/views/pages/servers.py @@ -22,6 +22,8 @@ class ServerNotebook(Gtk.ScrolledWindow): super().__init__() self.controller = controller + self.emitter = self.controller.get_emitter() + self.controller.register_widget("servers", self) self.notebook = Gtk.Notebook(show_tabs=True) @@ -56,10 +58,10 @@ class ServerNotebook(Gtk.ScrolledWindow): self.connect("unmap", self._on_unmap) def _on_map(self, widget: Self) -> None: - self.controller.toggle_server_panels(True) + self.emitter.emit("server_page_toggled", True) def _on_unmap(self, widget: Self) -> None: - self.controller.toggle_server_panels(False) + self.emitter.emit("server_page_toggled", False) def _on_keypress(self, widget: Self, event: Gdk.EventKey) -> None: match event.keyval: