From 167935b96328c1dde526babf64d84e3ee783b7b6 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 30 Dec 2025 21:27:30 +0900 Subject: [PATCH] fix: update statusbars/crumbs correctly --- dzgui/controllers/mc.py | 21 ++++++++---- dzgui/views/base.py | 66 ++++++++++++++++-------------------- dzgui/views/pages/options.py | 9 +++++ 3 files changed, 53 insertions(+), 43 deletions(-) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index c520817..536d581 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -21,6 +21,7 @@ from dzgui.const.enum import ( NotebookPage, ButtonType, ContextMenu, + RowType ) from dzgui.const.constants import ( @@ -54,11 +55,11 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: from dzgui.views.components.buttonbox import ContextualButton from dzgui.views.base import AppNavigation - from dzgui.const.enum import ContextMenu, RowType from dzgui.views.base import OuterWindow class Controller: def __init__(self) -> None: + self.crumbs_cache = "" self.mediator: AppNavigation self.prefs: UserPrefs self.cooldown = 0 @@ -72,8 +73,8 @@ class Controller: if tip == store: self.set_crumbs("Help") - def set_crumbs(self, crumbs: str) -> None: - self.mediator.grid.set_breadcrumbs(crumbs) + def set_crumbs(self, text: str) -> None: + self.mediator.grid.set_breadcrumbs(text) def get_crumbs(self) -> str: return self.mediator.grid.get_breadcrumbs() @@ -293,15 +294,16 @@ class Controller: return case ButtonType.OPTIONS: self.mediator.grid.notebook.settings.populate_settings() + self.mediator.grid.statusbar.refresh(None) case ButtonType.MODS: self.load_mods() case ButtonType.HELP: + self.mediator.grid.statusbar.refresh(RowType.CHANGELOG) pass case ButtonType.SERVERS: self.mediator.notebook.set_page_by_enum(button.opens) - # TODO: shorten this - treeview = self.mediator.notebook.servers.get_active_treeview() - treeview.grab_focus() + # TODO: use cache + self.update_server_status() return self.mediator.notebook.set_page_by_enum(button.opens) @@ -588,3 +590,10 @@ class Controller: # self.suppress_signal(tab, col, "_on_col_width_changed", True) # col.set_fixed_width(width) # self.suppress_signal(tab, col, "_on_col_width_changed", False) + + def set_crumbs_cache(self,text: str) -> None: + self.crumbs_cache = text + + def get_crumbs_cache(self) -> None: + return self.crumbs_cache + self.crumbs_cache = text diff --git a/dzgui/views/base.py b/dzgui/views/base.py index ecb8588..f8f6544 100644 --- a/dzgui/views/base.py +++ b/dzgui/views/base.py @@ -289,7 +289,7 @@ class Notebook(ScrollableMixin, Gtk.Notebook): super().__init__(show_tabs=False, show_border=False) AppNav.notebook = self - self.prior_page: int + self.prior_page: NotebookPage from dzgui.views.pages.help import Help self.help = Help(MainController) @@ -394,26 +394,20 @@ class Notebook(ScrollableMixin, Gtk.Notebook): page._set_adjustment(VAdjustment.BOTTOM) 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; - this workaround unhighlights the selected region and makes entry - fields unfocusable prior to the page 'switch-page' signal, - then makes them focusable again + """ + Gtk.Notebook focuses the first input field when changing pages; + this workaround unhighlights the selected region and makes entry + fields unfocusable prior to the page 'switch-page' signal, + then makes them focusable again - Used when switching to keybindings dialog - """ - entries = page.steam_entry, page.bm_entry - for entry in entries: - entry.set_position(-1) - entry.set_can_focus(False) - self.set_current_page(self.prior_page) - for entry in entries: - entry.set_can_focus(True) - self.set_current_page(self.prior_page) + Used when switching back from NotebookPage.KEYS + """ + if self.prior_page is NotebookPage.OPTIONS: + self.settings.block_text_entry() + self.set_page_by_enum(self.prior_page) + self.settings.unblock_text_entry() + return + self.set_page_by_enum(self.prior_page) def get_page_by_enum(self) -> NotebookPage | None: for k, v in self.indexes.items(): @@ -426,7 +420,7 @@ class Notebook(ScrollableMixin, Gtk.Notebook): if cur_page == NotebookPage.KEYS: self.return_prior() else: - self.prior_page = self.get_current_page() + #self.prior_page = cur_page #self.get_current_page() self.set_page_by_enum(NotebookPage.KEYS) def focus_current(self) -> None: @@ -440,7 +434,6 @@ class Notebook(ScrollableMixin, Gtk.Notebook): return w = widget.get_children()[0] - # NOTE: if item contains treeview, focus first cell try: w.focus_first_row() w.grab_focus() @@ -455,25 +448,24 @@ class Notebook(ScrollableMixin, Gtk.Notebook): return widget def set_page_by_enum(self, enum: NotebookPage) -> None: - self.prior_page = self.get_current_page() + self.prior_page = self.get_page_by_enum() self.set_current_page(self.indexes[enum]) self.focus_current() # TODO: should be an internal property of those pages - if enum is NotebookPage.SERVERS: - AppNav.grid.show_connect_panel() - else: - AppNav.grid.hide_connect_panel() - - blank = [ - NotebookPage.OPTIONS, - NotebookPage.THANKS, - NotebookPage.CHANGELOG, - NotebookPage.LOG - ] - if enum in blank: - # TODO: delegate to controller - AppNav.grid.statusbar.refresh(None) + match enum: + case NotebookPage.KEYS: + MainController.set_statusbar("") + AppNav.grid.hide_connect_panel() + case NotebookPage.SERVERS: + # TODO: consolidate in mc.py + AppNav.grid.show_connect_panel() + self.servers.get_active_treeview().grab_focus() + MainController.update_server_status() + crumbs = self.servers.get_cached_label() + MainController.set_crumbs(crumbs) + case _: + AppNav.grid.hide_connect_panel() def _on_page_changed( self, notebook: "Notebook", page: Gtk.Widget, page_num: int diff --git a/dzgui/views/pages/options.py b/dzgui/views/pages/options.py index 95fcb37..f7a81a3 100644 --- a/dzgui/views/pages/options.py +++ b/dzgui/views/pages/options.py @@ -190,6 +190,15 @@ class Options(Gtk.Box): self.scrollable.add(grid) self.add(self.scrollable) + def block_text_entry(self) -> None: + for entry in self.steam_entry, self.bm_entry: + entry.set_position(-1) + entry.set_can_focus(False) + + def unblock_text_entry(self) -> None: + for entry in self.steam_entry, self.bm_entry: + entry.set_can_focus(True) + def _on_developers_clicked(self, button: Gtk.Button) -> None: self.controller.show_developers_page()