From 248978f993c3f278b8ed09357f440af22bafd8f0 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Mon, 22 Dec 2025 17:03:44 +0900 Subject: [PATCH] fix: update crumbs when paginating --- dzgui/const/constants.py | 1 + dzgui/const/enum.py | 3 - dzgui/controllers/mc.py | 13 ++-- dzgui/util/css.py | 2 + dzgui/util/strings.py | 8 +- dzgui/views/base.py | 111 ++++----------------------- dzgui/views/components/web_button.py | 26 +++++-- dzgui/views/trees/tree_menu.py | 1 - dzgui/views/trees/tree_servers.py | 11 ++- 9 files changed, 54 insertions(+), 122 deletions(-) diff --git a/dzgui/const/constants.py b/dzgui/const/constants.py index a004505..9782bab 100644 --- a/dzgui/const/constants.py +++ b/dzgui/const/constants.py @@ -34,6 +34,7 @@ VIEW_CONCEAL = "view-conceal-symbolic" VIEW_REVEAL = "view-reveal-symbolic" INPUT_KEYBOARD = "input-keyboard-symbolic" HELP_BUBBLE = "help-about-symbolic" +REFRESH_ICON = "view-refresh-symbolic" WEB_BROWSER = "web-browser-symbolic" SEPARATOR = "SEPARATOR" diff --git a/dzgui/const/enum.py b/dzgui/const/enum.py index fffb8b2..111a5fc 100644 --- a/dzgui/const/enum.py +++ b/dzgui/const/enum.py @@ -78,13 +78,10 @@ class Preferences(EnumWithAttrs): class NotebookPage(EnumWithAttrs): CHANGELOG = {"crumbs": strings.crumbs.changelog,} - HISTORY = {"crumbs": strings.crumbs.history,} KEYS = {"crumbs": strings.crumbs.keys,} - LAN = {"crumbs": strings.crumbs.lan,} LOG = {"crumbs": strings.crumbs.log,} HELP = {"crumbs": strings.crumbs._help,} MODS = {"crumbs": strings.crumbs.mods,} - MY_SERVERS = {"crumbs": strings.crumbs.my_servers,} OPTIONS = {"crumbs": strings.crumbs.options,} SERVERS = {"crumbs": strings.crumbs.servers,} THANKS = {"crumbs": strings.crumbs.thanks,} diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index ae1174d..b058c40 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -556,10 +556,10 @@ class Controller: def get_developer_mode(self) -> bool: return self.is_developer - def set_server_statusbar(self) -> None: - # TODO: different models - model = self.model_manager.get_server_store() - model = AppNav.treeview.get_model() + def update_server_status(self) -> None: + from dzgui.util.format import pluralize + treeview = self.mediator.notebook.servers.get_active_treeview() + model = treeview.get_model() if model is None: players = 0 hits = 0 @@ -568,7 +568,6 @@ class Controller: players = 0 for row in model: players += row[4] - # TODO: move to util.format players_pretty = pluralize("players", players) hits_pretty = pluralize("matches", hits) @@ -579,5 +578,5 @@ class Controller: if players == 0: suffix = "" - self.set_text(formatted + suffix) - self.players = formatted + self.mediator.statusbar.set_text(formatted + suffix) + #self.players = formatted diff --git a/dzgui/util/css.py b/dzgui/util/css.py index d53188d..90411ad 100644 --- a/dzgui/util/css.py +++ b/dzgui/util/css.py @@ -11,6 +11,8 @@ def add_class(widget: Gtk.Widget, label: str) -> None: context = widget.get_style_context() context.add_class(label) +# TODO: def remove_class() + def load_css() -> None: # TODO: consider storing this in a data file css = """ diff --git a/dzgui/util/strings.py b/dzgui/util/strings.py index c1eefc3..88975cb 100644 --- a/dzgui/util/strings.py +++ b/dzgui/util/strings.py @@ -255,13 +255,10 @@ class Button: @dataclass(slots=True, frozen=True) class Crumbs: changelog: str - history: str keys: str - lan: str log: str _help: str mods: str - my_servers: str options: str servers: str thanks: str @@ -441,15 +438,12 @@ buttons = Button( crumbs = Crumbs( changelog="Help > Changelog", - history="Main menu > Recent servers", keys="Keybindings", - lan="Main menu > Local servers", log="Help > Debug log", _help="Help", mods="Mods", - my_servers="Main menu > Saved servers", options="Options", - servers="Servers", + servers="Servers > Server browser", thanks="Help > Special thanks", developers="Options > Developers", ) diff --git a/dzgui/views/base.py b/dzgui/views/base.py index a3c5f08..5904433 100644 --- a/dzgui/views/base.py +++ b/dzgui/views/base.py @@ -40,6 +40,7 @@ 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.mod_panel import ModSelectionPanel from dzgui.views.components.right_panel import RightPanel from dzgui.views.components.toast import Toast @@ -65,19 +66,7 @@ logger = logging.getLogger(__name__) warnings.filterwarnings("ignore", ".*g_value_get_int", Warning) # TODO: move to controller -cache: dict[str, int] = {} - -# TODO: move to strings.py -def format_metadata(row: RowType) -> str: - prefix = row.dict["tooltip"] - - if row == RowType.QUICK_CONNECT or row == RowType.CHNG_FAV: - label = MainController.query_config(Preferences.FAV_LBL) - if len(label) < 1: - label = "unset" - return f"{prefix} ({label})" - else: - return prefix +#cache: dict[str, int] = {} ## TODO: move to configs/servers #def query_history() -> list | None: @@ -228,23 +217,14 @@ class OuterWindow(Gtk.Window): MainController.set_resolution(self) self.grid = Grid() - self.toast = Toast() - self.overlay = Gtk.Overlay() - self.overlay.add_overlay(self.grid) - # TODO: toast is deprecated - self.overlay.add_overlay(self.toast) - self.add(self.overlay) + self.add(self.grid) self.show_all() - self.toast.set_visible(False) self.grid.right_panel.filters_vbox.set_visible(False) self.grid.right_panel.enable_ping_button(False) self.grid.sel_panel.set_visible(False) - # TODO: register from treeview or notebook - #AppNav.treeview = self.grid.notebook.scrollable_treelist.treeview - css.load_css() AppNav.grid.notebook.set_page_by_enum(NotebookPage.SERVERS) @@ -416,6 +396,7 @@ class Notebook(ScrollableMixin, Gtk.Notebook): def return_prior(self) -> None: page = self.get_nth_page(self.prior_page) # FIXME: check enum for NotebookPage.OPTIONS + # TODO: can be dropped? if hasattr(page, "steam_entry"): """ Gtk.Notebook focuses the first input field when changing pages; @@ -479,7 +460,6 @@ class Notebook(ScrollableMixin, Gtk.Notebook): self.focus_current() # TODO: should be an internal property of those pages blank = [ - NotebookPage.SERVERS, NotebookPage.OPTIONS, NotebookPage.THANKS, NotebookPage.CHANGELOG, @@ -496,99 +476,35 @@ class Notebook(ScrollableMixin, Gtk.Notebook): is_mods = True if enum is NotebookPage.MODS else False MainController.toggle_mod_panel(is_mods) - # TODO: + # TODO: crumbs = enum.dict["crumbs"] MainController.set_crumbs(crumbs) -# TODO: move to components -class Statusbar(Gtk.Statusbar): - def __init__(self) -> None: - super().__init__() - - help_text = strings.statusbar_helptext - self.set_text(help_text) - - version = MainController.get_prefs().version - self.status_right_label = Gtk.Label(label=version) - self.add(self.status_right_label) - - self.players = "" - - def get_text(self) -> str: - area = self.get_message_area() - label = area.get_children()[0] - return label.get_text() - - def set_text(self, string: str) -> None: - if string is None: - return - meta = self.get_context_id("Statusbar") - self.push(meta, string) - - def refresh(self, row: RowType) -> None: - if row is None: - formatted = "" - else: - formatted = format_metadata(row) - self.set_text(formatted) - - def append_distance(self, dist: str) -> None: - # TODO: process strings in controller - if dist == strings.unknown: - dist = f"| Distance: {dist}" - else: - dist = f"| Distance: {dist}" - self.set_text(self.players + dist) - - def update_server_meta(self) -> None: - model = AppNav.treeview.get_model() - if model is None: - players = 0 - hits = 0 - else: - hits = len(model) - players = 0 - for row in model: - players += row[4] - - # TODO: move to util.format - players_pretty = pluralize("players", players) - hits_pretty = pluralize("matches", hits) - formatted = ( - f"Found {hits:n} {hits_pretty} with {players:n} {players_pretty}" - ) - suffix = "| Distance: calculating..." - - if players == 0: - suffix = "" - self.set_text(formatted + suffix) - self.players = formatted - class Grid(Gtk.Grid): def __init__(self) -> None: super().__init__() self.set_column_homogeneous(True) - AppNav.grid = self - + self.statusbar = Statusbar(MainController) self.breadcrumbs = Gtk.Label(halign=Gtk.Align.START) self.set_breadcrumbs(strings.label_main_menu) + AppNav.statusbar = self.statusbar + AppNav.grid = self + # FIXME: do not pass AppNav to right panel self.right_panel = RightPanel(AppNav, MainController) self.sel_panel = ModSelectionPanel(MainController) self.right_panel.pack_start(self.sel_panel, NO_EXPAND, NO_FILL, 0) self.notebook = Notebook() - self.statusbar = Statusbar() - self.attach(self.notebook, 0, 0, 3, 1) self.attach_next_to( self.breadcrumbs, self.notebook, Gtk.PositionType.TOP, 3, 1 ) - + #from dzgui.views.components.connect_panel import ConnectPanel #self.conpan = ConnectPanel() #self.attach_next_to( @@ -629,6 +545,11 @@ class App(Gtk.Application): ) self.win.add_accel_group(accel) + # FIXME: hacky + AppNav.notebook.servers.notebook.next_page() + AppNav.notebook.servers.notebook.prev_page() + MainController.focus_notebook() + GLib.unix_signal_add( GLib.PRIORITY_DEFAULT, signal.SIGINT, self._catch_sigint ) @@ -652,6 +573,7 @@ class AppNavigation: window: OuterWindow notebook: Notebook right_panel: RightPanel + statusbar: Statusbar menu: MenuTreeView servers: Gtk.ScrolledWindow browser: ServerTreeView @@ -661,6 +583,7 @@ class AppNavigation: modtreeview: ModTreeView logtreeview: LogTreeView # TODO: add tree_log and tree_server views here + # or obtain via get_treeview() AppNav = AppNavigation() MainController = Controller() diff --git a/dzgui/views/components/web_button.py b/dzgui/views/components/web_button.py index d0a301e..dc0b71d 100644 --- a/dzgui/views/components/web_button.py +++ b/dzgui/views/components/web_button.py @@ -5,11 +5,25 @@ import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk # noqa E402 -# TODO: abstract to support other icons -class WebButton(Gtk.Button): - def __init__(self, label: str): - super().__init__(label=label) - icon = Icon(WEB_BROWSER, l_margin=5) - self.set_image(icon) +class IconButton(Gtk.Button): + def __init__(self, icon: str, margin: int = 0): + super().__init__() + + i = Icon(icon, l_margin=margin) + self.set_image(i) self.set_image_position(Gtk.PositionType.RIGHT) + + +class IconTextButton(IconButton): + def __init__(self, icon: str, label: str): + super().__init__(icon, margin=5) + + self.set_label(label) + + +class WebButton(IconTextButton): + def __init__(self, label: str): + super().__init__(icon=WEB_BROWSER, label=label) + + pass diff --git a/dzgui/views/trees/tree_menu.py b/dzgui/views/trees/tree_menu.py index 4ca8774..da9cd9e 100644 --- a/dzgui/views/trees/tree_menu.py +++ b/dzgui/views/trees/tree_menu.py @@ -44,7 +44,6 @@ class MenuTreeView(TreeView): column: Gtk.TreeViewColumn ) -> None: row_type = self.get_value_at_index(1) - print(row_type) match row_type: case RowType.THANKS: diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index 98dcaa7..c3b52a6 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -216,17 +216,20 @@ class ServerTreeView(TreeView): column: Gtk.TreeViewColumn ) -> None: # TODO: process server connection + # TODO: get record print(self.get_value_at_index(0)) def _parent_selection_changed(self, base_class: TreeView, sel: Gtk.TreeSelection): self.terminate_process() record = self.get_record() + #TODO + return - if record is None: - # TODO: move to controller - #grid.statusbar.update_server_meta() - return + #model = self.get_model() + #if record is None: + # self.controller.update_server_status(model) + # return ip = record.ip