diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index dcff5ee..4aa2d91 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -307,6 +307,7 @@ class Controller: def show_developers_page(self) -> None: self.open_page(NotebookPage.DEVELOPERS) + # TODO: focus first row def open_page(self, page: NotebookPage) -> None: self.mediator.grid.notebook.set_page_by_enum(page) @@ -593,3 +594,22 @@ class Controller: def get_crumbs_cache(self) -> None: return self.crumbs_cache self.crumbs_cache = text + + def refresh_tree(self) -> None: + treeview = self.mediator.notebook.servers.get_active_treeview() + treeview.set_loaded(False) + self.populate_model() + + def populate_model(self) -> None: + # TODO: always use same server model, store in servertreeview class + treeview = self.mediator.notebook.servers.get_active_treeview() + if treeview.get_loaded() is False: + new_model = self.model_manager.new_model() + func = treeview.get_query_func() + if func is not None: + model = treeview.get_model() + model.clear() + data = func() + model.append(data) + treeview.set_loaded(True) + self.update_server_status() diff --git a/dzgui/controllers/model.py b/dzgui/controllers/model.py index 7550a1c..2b75b76 100644 --- a/dzgui/controllers/model.py +++ b/dzgui/controllers/model.py @@ -89,10 +89,10 @@ class ModelManager: self.filtered = None self.success = True - def __new__(cls) -> Self: - if not hasattr(cls, "instance"): - cls.instance = super(ModelManager, cls).__new__(cls) - return cls.instance + #def __new__(cls) -> Self: + # if not hasattr(cls, "instance"): + # cls.instance = super(ModelManager, cls).__new__(cls) + # return cls.instance def get_recent_store(self) -> ListStore: return self.recent_store diff --git a/dzgui/views/components/right_panel.py b/dzgui/views/components/right_panel.py index 730e3cc..2ee5704 100644 --- a/dzgui/views/components/right_panel.py +++ b/dzgui/views/components/right_panel.py @@ -6,6 +6,8 @@ from dzgui.const.enum import Preferences from dzgui.views.components.buttonbox import ButtonBox from dzgui.views.components.filter_panel import FilterPanel from dzgui.views.components.icon import Icon +from dzgui.views.components.web_button import RefreshButton +# TODO: rename web_button from dzgui.const.constants import NO_EXPAND, NO_FILL, EXPAND, FILL, INPUT_KEYBOARD from dzgui.util import strings @@ -25,6 +27,7 @@ class RightPanel(Gtk.Box): padding = 0 self.pack_start(el, NO_EXPAND, NO_FILL, padding) + # TODO: more custom button classes self.ping = Gtk.Button( label=strings.ping_servers, margin_top=10, @@ -43,10 +46,18 @@ class RightPanel(Gtk.Box): tooltip_text=strings.debug_tooltip, ) + # TODO: icon + self.refresh_button = RefreshButton("Refresh") + self.refresh_button.set_margin_top(10) + self.refresh_button.set_margin_start(80) + self.refresh_button.set_margin_end(80) + self.refresh_button.connect("clicked", self._on_refresh_clicked) + if controller.query_config(Preferences.DEBUG) == True: self.debug_toggle.set_active(True) self.debug_toggle.connect("toggled", self._on_debug_toggled) + # TODO: make button class i = Icon(INPUT_KEYBOARD) i.set_margin_start(5) self.question = Gtk.Button( @@ -59,7 +70,7 @@ class RightPanel(Gtk.Box): self.question.set_image_position(Gtk.PositionType.RIGHT) self.question.connect("clicked", self._on_question_clicked) - for el in self.ping, self.debug_toggle, self.question: + for el in self.ping, self.debug_toggle, self.question, self.refresh_button: padding = 0 self.pack_start(el, NO_EXPAND, FILL, padding) @@ -85,6 +96,10 @@ class RightPanel(Gtk.Box): grid = self.AppNav.grid self.controller.toggle_debug_mode() + def _on_refresh_clicked(self, button: RefreshButton) -> None: + print("button clicked") + self.controller.refresh_tree() + def _on_ping_clicked(self, button: Gtk.Button) -> None: # TODO block_signals() diff --git a/dzgui/views/components/web_button.py b/dzgui/views/components/web_button.py index dc0b71d..1089de8 100644 --- a/dzgui/views/components/web_button.py +++ b/dzgui/views/components/web_button.py @@ -1,5 +1,5 @@ from dzgui.views.components.icon import Icon -from dzgui.const.constants import WEB_BROWSER +from dzgui.const.constants import REFRESH_ICON, WEB_BROWSER import gi gi.require_version("Gtk", "3.0") @@ -25,5 +25,10 @@ class IconTextButton(IconButton): class WebButton(IconTextButton): def __init__(self, label: str): super().__init__(icon=WEB_BROWSER, label=label) - + pass + + +class RefreshButton(IconTextButton): + def __init__(self, label: str): + super().__init__(icon=REFRESH_ICON, label=label) pass diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index 3f98170..b5bd183 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -43,6 +43,9 @@ class ServerTreeView(TreeView): def __init__(self, controller: "Controller") -> None: super().__init__(controller) + self.loaded = False + self.query_func: Callable = None + self.menu = Gtk.Menu() self.menu.connect("key-press-event", self._on_key) self.controller = controller @@ -127,6 +130,12 @@ class ServerTreeView(TreeView): return False return True + def set_query_func(self, func: Callable) -> None: + self.query_func = func + + def get_query_func(self) -> Callable | None: + return self.query_func + def _on_col_width_changed( self, col: Gtk.TreeViewColumn, width: GObject.ParamSpecInt ) -> None: @@ -304,3 +313,10 @@ class ServerTreeView(TreeView): ip = addr.split(":")[0] gameport = int(addr.split(":")[1]) return Record(ip, gameport, qport) + + def get_loaded(self) -> bool: + return self.loaded + + def set_loaded(self, status: bool) -> None: + self.loaded = status +