diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 8ce05d7..e458cb6 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -94,7 +94,7 @@ class AppNavigation: filters: "FilterPanel" -class CleanupFunc: +class StoredFunc: def __init__(self, func: Callable, *args, **kwargs) -> None: sig = inspect.signature(func) self.func = func @@ -109,7 +109,7 @@ class Controller(GObject.GObject): self.dist_cache: dict[str, "Haversine", "ServerTab"] = {} self.mediator = AppNavigation() self.prefs: UserPrefs - self.cleanup_func: CleanupFunc = None + self.cleanup_func: StoredFunc = None self.model_man = ModelManager() self.emitter = Emitter() @@ -325,7 +325,7 @@ class Controller(GObject.GObject): mod.append(None) model.append(mod) - self.cleanup_func = CleanupFunc(self.load_mods_cleanup, model) + self.cleanup_func = StoredFunc(self.load_mods_cleanup, model) def toggle_config(self, context: Preferences) -> None: config = self.prefs.paths.config @@ -399,13 +399,13 @@ class Controller(GObject.GObject): GLib.idle_add(lambda: self.wait_dialog.increment()) res = future.result(timeout=3) if res.status != 200 or not res.parsed: - self.cleanup_func = CleanupFunc(self.cleanup_on_failure) + self.cleanup_func = StoredFunc(self.cleanup_on_failure) return j = res.json serv += j["response"]["servers"] except Exception as e: logger.critical(e) - self.cleanup_func = CleanupFunc(self.cleanup_on_failure) + self.cleanup_func = StoredFunc(self.cleanup_on_failure) # NOTE: This step is allowed to fail, since this metadata is incidental res = Servers.query_api(key, APPID_DAYZ_EXP, "") @@ -506,7 +506,7 @@ class Controller(GObject.GObject): except PeFile.AppNotInstalledError: pass - self.cleanup_func = CleanupFunc(self.delete_single_mod_cleanup, _iter) + self.cleanup_func = StoredFunc(self.delete_single_mod_cleanup, _iter) def get_mod_store(self) -> Gtk.ListStore: return self.mediator.modtreeview.get_model() @@ -877,7 +877,7 @@ class Controller(GObject.GObject): self.new_maps = sorted(u_maps) treeview.set_loaded(True) - self.cleanup_func = CleanupFunc(self.cleanup_on_success) + self.cleanup_func = StoredFunc(self.cleanup_on_success) def highlight_stale_cleanup(self, stale_mods: list) -> None: """Manipulates attached ListStore in the main event loop""" @@ -893,9 +893,9 @@ class Controller(GObject.GObject): def highlight_stale(self) -> None: # TODO: set progress bar for number of mods stale = find_stale_mods(self.prefs.paths.config) - self.cleanup_func = CleanupFunc(self.highlight_stale_cleanup, stale) + self.cleanup_func = StoredFunc(self.highlight_stale_cleanup, stale) - def get_cleanup_func(self) -> CleanupFunc: + def get_cleanup_func(self) -> StoredFunc: return self.cleanup_func def _destroy_on_idle(self) -> None: @@ -926,7 +926,7 @@ class Controller(GObject.GObject): if res is True: self.update_config(key, text) else: - self.cleanup_func = CleanupFunc( + self.cleanup_func = StoredFunc( lambda: self.emitter.emit("api_change_failed") ) @@ -975,9 +975,8 @@ class Controller(GObject.GObject): return self.mediator.statusbar @call_on_thread(strings.dialog.fetching) - def run_query_func(self, func: Callable) -> None: - # TODO: use CleanupFunc -> StoredFunc - func() + def run_query_func(self, func: StoredFunc) -> None: + func.call() @call_on_thread(strings.dialog.filtering) def filter_threaded(self, mode: FilterMode, label: str) -> None: diff --git a/dzgui/views/components/buttons.py b/dzgui/views/components/buttons.py index afd72f2..de6141a 100644 --- a/dzgui/views/components/buttons.py +++ b/dzgui/views/components/buttons.py @@ -95,11 +95,13 @@ class RefreshButton(IconTextButton): self.connect("clicked", self._on_refresh_clicked) def _on_refresh_clicked(self, button: Self) -> None: - # TODO: get page enum - print(self.controller.mediator.notebook.get_page_by_enum()) - # if .MODS, .LOG, .OPTIONS, reload in place + # TODO: get server tab enum + # if LAN tab, reload existing entries in place self.set_sensitive(False) self.show_time(True) + # FIXME: do this after threaded call fully finishes + # FIXME: other signals cause refresh button to become sensitive + # after model is loaded GLib.timeout_add_seconds(1, self.decrement) self.controller.refresh_tree() diff --git a/dzgui/views/pages/servers.py b/dzgui/views/pages/servers.py index f891f67..9d3d2a3 100644 --- a/dzgui/views/pages/servers.py +++ b/dzgui/views/pages/servers.py @@ -2,6 +2,7 @@ import logging from typing import Self, TYPE_CHECKING +from dzgui.controllers.mc import StoredFunc from dzgui.const.enum import ContextMenuGroup, ServerTab from dzgui.views.trees.tree_servers import ServerTreeView from dzgui.util.strings import server_labels @@ -36,10 +37,10 @@ class ServerNotebook(Gtk.ScrolledWindow): ) self.lan = ServerTreeView(controller, ServerTab.LAN, ContextMenuGroup.SCAN_LAN) - self.recent.set_query_func(self.controller.dump_test_2) + self.recent.set_query_func(StoredFunc(self.controller.dump_test_2)) # TODO: number of servers will not be known a priori until reading file during query phase - self.lan.set_query_func(self.controller.dump_test_2) - self.browser.set_query_func(self.controller.dump_api, jobs=11) + self.lan.set_query_func(StoredFunc(self.controller.dump_test_2)) + self.browser.set_query_func(StoredFunc(self.controller.dump_api), jobs=11) tabs = [ (self.browser, server_labels.browser), diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index cbf7fef..11167b3 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -27,7 +27,7 @@ from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa logger = logging.getLogger(__name__) if TYPE_CHECKING: - from dzgui.controllers.mc import Controller + from dzgui.controllers.mc import Controller, StoredFunc from dzgui.controllers.emitter import Emitter QUEUE_CHECK_DELAY = 200 @@ -100,14 +100,14 @@ class ServerTreeView(ContextMixin, TreeView): else: w = width_map[column_title] column.set_fixed_width(w) - #if column_title == "Ping": - #self.fancy_col = column - #self.fancy_rend = renderer - #column.set_cell_data_func(renderer, self._get_ping) - # if column_title == "Name": - # column.set_fixed_width(800) - # if column_title == "Map": - # column.set_fixed_width(300) + # if column_title == "Ping": + # self.fancy_col = column + # self.fancy_rend = renderer + # column.set_cell_data_func(renderer, self._get_ping) + # if column_title == "Name": + # column.set_fixed_width(800) + # if column_title == "Map": + # column.set_fixed_width(300) # TODO: standardize widths based on column title and longest content # if column_title == "Name": @@ -129,15 +129,15 @@ class ServerTreeView(ContextMixin, TreeView): self.connect("unmap", self._on_unmap) def _get_ping( - self, - column: Gtk.TreeViewColumn, - cell: Gtk.CellRendererText, - model: Gtk.TreeModel, - it: Gtk.TreeIter, - data: Any, + self, + column: Gtk.TreeViewColumn, + cell: Gtk.CellRendererText, + model: Gtk.TreeModel, + it: Gtk.TreeIter, + data: Any, ): def ping_server(model, _iter, ip: str, qport: int, ping: int): - #res = Ping(0, model[_iter]) + # res = Ping(0, model[_iter]) res = Ping(0, ip, qport, ping) ping = res.ping print(res) @@ -160,13 +160,7 @@ class ServerTreeView(ContextMixin, TreeView): thread = threading.Thread( daemon=True, target=ping_server, - args=( - model, - it, - ip, - qport, - ping - ), + args=(model, it, ip, qport, ping), ) thread.start() @@ -223,11 +217,12 @@ class ServerTreeView(ContextMixin, TreeView): if self.get_enum() is ServerTab.LAN: self.emitter.emit("lan_tab_toggled", False) - def set_query_func(self, func: Callable, jobs: int = 1) -> None: + def set_query_func(self, func: "StoredFunc", jobs: int = 1) -> None: self.query_func = func self.query_func_jobs = jobs - def get_query_func(self) -> Callable | None: + # TODO: possibly split this up + def get_query_func(self) -> tuple["StoredFunc", int]: return self.query_func, self.query_func_jobs def _on_col_width_changed(