diff --git a/dzgui/api/servers.py b/dzgui/api/servers.py index 490fbda..c73ff67 100644 --- a/dzgui/api/servers.py +++ b/dzgui/api/servers.py @@ -472,6 +472,7 @@ def query_by_ip(addr: str) -> A2SInfo: return A2SInfo(Record("0", 0, 0), None) return query_by_record(record, update_gameport=True) + def query_by_id(server_id: int, key: str) -> A2SInfo: """ Used with numeric Battlemetrics IDs diff --git a/dzgui/config/xdg.py b/dzgui/config/xdg.py index 137d143..2748c8f 100644 --- a/dzgui/config/xdg.py +++ b/dzgui/config/xdg.py @@ -17,6 +17,7 @@ class Xdg: system: Path debug: Path ips: Path + filters: Path def is_writeable(path_str: str) -> bool: @@ -63,9 +64,6 @@ def get_xdg_paths() -> dict: def parse_filepaths(xdg: dict) -> Xdg: - # cache = xdg["XDG_CACHE_HOME"] - # data = xdg["XDG_DATA_HOME"] - config = xdg["XDG_CONFIG_HOME"] state = xdg["XDG_STATE_HOME"] @@ -80,6 +78,7 @@ def parse_filepaths(xdg: dict) -> Xdg: history = state / "dzg.history" versions = state / "dzg.versions" ips = state / "ips.csv" + filters = state / "dzg.filters.json" return Xdg( config, @@ -91,4 +90,5 @@ def parse_filepaths(xdg: dict) -> Xdg: system, debug, ips, + filters ) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 5de87dc..d1f6a57 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -260,6 +260,21 @@ class Controller(GObject.GObject): def select_colorized(self) -> None: self.mod_man.select_colorized() + def get_all_tree_filters(self) -> list[str]: + servers = self.get_servers() + all_filters: dict[str, dict[str, bool]] = {} + trees = ( + servers.get_browser(), + servers.get_saved(), + servers.get_recent(), + servers.get_lan(), + ) + for tree in trees: + enum = str(tree.get_enum()) + filters = tree.get_filter_man().get_filters() + all_filters[enum] = filters + return all_filters + def get_filter_man(self) -> "FilterManager": """Each ServerTreeView has an atomic FilterManager""" return self.get_active_treeview().get_filter_man() @@ -303,8 +318,24 @@ class Controller(GObject.GObject): self.emitter.emit("servers_loaded", tv.get_enum()) return self.mediator.statusbar.set_by_context(tv.get_enum(), "") + self.mediator.filters.button_grid.block_toggles(True) + self.populate_filter_prefs() + self.mediator.filters.button_grid.block_toggles(False) ServerModelManager(self, tv).load() + def populate_filter_prefs(self) -> None: + tv = self.get_active_treeview() + filters = self.config_man.get_filters(tv) + if filters is None: + return + filter_man = self.get_filter_man() + for filt, state in filters.items(): + filter_man.set_filter(filt, state) + self.mediator.filters.set_filters(filters) + + def get_filters(self) -> list[str]: + return self.mediator.filters.get_filters() + def get_dist_cache(self) -> dict[str, "Haversine"]: return self.dist_cache diff --git a/dzgui/managers/config.py b/dzgui/managers/config.py index 12cb23e..71afdea 100644 --- a/dzgui/managers/config.py +++ b/dzgui/managers/config.py @@ -159,6 +159,9 @@ class ConfigManager: def save_res_and_quit(self, tv: "ServerTreeView", window: "OuterWindow") -> None: columns = tv.get_columns() + filters = self.controller.get_all_tree_filters() + filters_file = self.prefs.paths.filters + columns_file = self.prefs.paths.columns try: data = read_json(columns_file) @@ -173,6 +176,7 @@ class ConfigManager: try: write_json(data, columns_file) + write_json(filters, filters_file) except Exception as e: logger.critical(e) @@ -216,3 +220,12 @@ class ConfigManager: h = WINDOW_DEFAULT_Y logger.info(f"Using default window size {w},{h}") window.set_default_size(w, h) + + def get_filters(self, tv: "ServerTreeView") -> list[str] | None: + filters = self.prefs.paths.filters + try: + enum = tv.get_enum() + filters = read_json(filters) + return filters[str(enum)] + except Exception: + return None diff --git a/dzgui/views/components/filter_panel.py b/dzgui/views/components/filter_panel.py index eba6735..4584433 100644 --- a/dzgui/views/components/filter_panel.py +++ b/dzgui/views/components/filter_panel.py @@ -68,6 +68,7 @@ class ButtonGrid(Gtk.Grid): ) def reload_filters(self) -> None: + # TODO: may be superfluous checkboxes = self.checks self.block_toggles(True) filters = self.controller.get_enabled_filters() @@ -330,3 +331,8 @@ class FilterPanel(Gtk.Box): self.block_map_change_propagation = False return self.emitter.emit("map_selection_changed", name) + + def set_filters(self, filters: dict[str, str]) -> None: + for check in self.button_grid.checks: + label = check.get_label() + check.set_active(filters[label])