From 38883626f5053bf640e4607680bb254b10070639 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Wed, 11 Feb 2026 21:35:51 +0900 Subject: [PATCH] feat: restore map selection --- dzgui/controllers/mc.py | 36 ++++++++++++++------------ dzgui/model/filtered_model.py | 28 +++++++++++--------- dzgui/views/components/filter_panel.py | 25 +++++++++++------- dzgui/views/components/right_panel.py | 14 +++++----- 4 files changed, 58 insertions(+), 45 deletions(-) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 313b29f..b84a8db 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -377,6 +377,7 @@ class Controller(GObject.GObject): if res.status != 200 or not res.parsed: # TODO: pop warning dialog, create enum around various failure states print("failed to parse/timeout error") + self.new_maps = None self.push_data(None, FilterMode.INITIAL, success=False) return j = res.json @@ -387,21 +388,12 @@ class Controller(GObject.GObject): j = res.json serv += j["response"]["servers"] - # TODO: ping column pass + # TODO: additional ping column pass, collated parsed = Servers.parse_json(serv) - self.mediator.filters.set_unique_maps(parsed) + self.first_iteration = True + self.new_maps = parsed self.push_data(parsed, FilterMode.INITIAL, success=True) - #def set_unique_maps(self, records: list) -> None: - # if len(records) < 1: - # return - # u_maps = set([row[1] for row in records]) - # u_maps = sorted(u_maps) - # for m in u_maps: - # print(m) - # #map_store.append([m]) - # #self.maps_hr.append(m) - def get_help_row(self) -> str: tv = self.mediator.menu model = self.get_help_store() @@ -620,8 +612,17 @@ class Controller(GObject.GObject): self.push_data(data, FilterMode.INITIAL, success=True) def cleanup(self) -> None: - # TODO: if success failed, throw popup treeview = self.get_active_treeview() + + # TODO: signals or other approach to deferring model insertion + # after thread closes + # cf. servers_loaded signal + treeview.set_model(self.to_insert) + # CHORE: this is placeholder logic + if self.first_iteration: + self.mediator.filters.set_unique_maps(self.new_maps) + self.first_iteration = False + context = self.get_active_context() self.emitter.emit("servers_loaded", context) @@ -638,20 +639,21 @@ class Controller(GObject.GObject): treeview = self.get_active_treeview() manager = treeview.get_filter_man() + self.to_insert = None + # TODO: self.success = success if success: if data is None: - insert = None + self.to_insert = None else: # TODO: consolidate into filter manager if mode == FilterMode.INITIAL: manager.set_control(data) - # TODO: init maps here manager.filter(mode) - insert = manager.get_model() + self.to_insert = manager.get_model() # TODO: should list store be set outside of this thread? - treeview.set_model(insert) + # treeview.set_model(self.to_insert) treeview.set_loaded(True) GLib.idle_add(self.cleanup) diff --git a/dzgui/model/filtered_model.py b/dzgui/model/filtered_model.py index 57c7967..b751dd9 100644 --- a/dzgui/model/filtered_model.py +++ b/dzgui/model/filtered_model.py @@ -49,8 +49,8 @@ class FilteredModelManager: self.ephemeral_model = self.new_model_from_class(ServerColumns) - self.control_model = None - self.filtered = None + self.control_model: list = None + self.filtered: list = None self.success = True def append_row(self, row: list) -> None: @@ -86,7 +86,7 @@ class FilteredModelManager: case FilterMode.MAP: prior_map = self.controller.get_prior_map() - if prior_map == "All maps": + if prior_map == strings.all_maps: rows = self.filter_map(filters) else: rows = self.filter_toggle_on(filters, *args) @@ -138,7 +138,7 @@ class FilteredModelManager: rows = self.filtered sel_map = self.controller.get_map() - if sel_map == "All maps": + if sel_map == strings.all_maps: return rows rows = [row for row in rows if row[1] == sel_map] @@ -234,7 +234,7 @@ class FilteredModelManager: if row[7] == addr and row[8] == qport: self.control_model.remove(row) - # self.wipe_cache() + self.wipe_cache() filters = self.controller.get_filters() refiltered = self.filter_toggle_on(filters) self.set_filtered(refiltered) @@ -272,10 +272,14 @@ class FilteredModelManager: def get_success(self) -> bool: return self.success - # def wipe_cache(self, full=False) -> None: - # self.success = True - # self.filtered = None - # self.filter_cache = {} - # self.ping_cache = {} - # if full: - # self.control_model = None + # NOTE: used when adding/removing rows in-situ in the ephemeral model + # and syncing changes to control model, but ignored for player count/ping updates + # cf. remove_from_history(), remove_server() + # NOTE: this can most likely be simplified for v7 + def wipe_cache(self, full=False) -> None: + self.success = True + self.filtered = None + self.filter_cache = {} + self.ping_cache = {} + if full: + self.control_model = None diff --git a/dzgui/views/components/filter_panel.py b/dzgui/views/components/filter_panel.py index 8586101..d3c15de 100644 --- a/dzgui/views/components/filter_panel.py +++ b/dzgui/views/components/filter_panel.py @@ -127,13 +127,18 @@ class FilterPanel(Gtk.Box): self.pack_start(el, NO_EXPAND, NO_FILL, NO_PADDING) def set_unique_maps(self, maps: list) -> None: + if maps is None: + return if len(maps) < 1: return u_maps = set([row[1] for row in maps]) u_maps = sorted(u_maps) + self.controller.append_map([strings.all_maps]) + self.selected_map = strings.all_maps for m in u_maps: self.controller.append_map([m]) self.maps_hr.append(m) + self.maps_combo.set_active(0) def get_filters(self) -> tuple: filters = [] @@ -144,16 +149,17 @@ class FilterPanel(Gtk.Box): filters.append(k) return tuple(filters) - def reinit_panel(self) -> None: - self.keyword_entry.set_text("") - self.keyword_filter = "" - self.reinit_filters() - self.set_visible(False) - # TODO: - sel_panel = self.controller.mediator.grid.sel_panel - if sel_panel.is_visible(): - sel_panel.set_visible(False) + # TODO: currently unused + # def reinit_panel(self) -> None: + # self.keyword_entry.set_text("") + # self.keyword_filter = "" + # self.reinit_filters() + # self.set_visible(False) + # sel_panel = self.controller.mediator.grid.sel_panel + # if sel_panel.is_visible(): + # sel_panel.set_visible(False) + # TODO: change filters on a per-tab basis def reinit_filters(self) -> None: self.enabled_filters = dict(self.default_filters) for check in self.checks: @@ -162,6 +168,7 @@ class FilterPanel(Gtk.Box): check.set_active(state) def _on_map_entry_keypress(self, entry: Gtk.Entry, event: Gdk.EventKey) -> None: + # TODO: use activated() signal match event.keyval: case Gdk.KEY_Return: text = entry.get_text() diff --git a/dzgui/views/components/right_panel.py b/dzgui/views/components/right_panel.py index 7f47ae3..cb3791d 100644 --- a/dzgui/views/components/right_panel.py +++ b/dzgui/views/components/right_panel.py @@ -50,13 +50,13 @@ class RightPanel(Gtk.Box): self.refresh_button.set_sensitive(False) # TODO: move to filter panel - def reinit_maps(self, rows: list) -> None: - self.controller.reinit_map_store() - # TODO: communicate with controller - # self.controller.clear_map_store() - # map_store.append(["All maps"]) - self.selected = "All maps" - self.filters_vbox.set_unique_maps(rows) + # def reinit_maps(self, rows: list) -> None: + # self.controller.reinit_map_store() + # # TODO: communicate with controller + # # self.controller.clear_map_store() + # # map_store.append(["All maps"]) + # self.selected = "All maps" + # self.filters_vbox.set_unique_maps(rows) # TODO: reference # def _on_ping_clicked(self, button: Gtk.Button) -> None: