diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 6f81d19..a71d65c 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -380,7 +380,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.push_data(None, success=False) + self.push_data(None, FilterMode.INITIAL, success=False) return j = res.json serv += j["response"]["servers"] @@ -654,6 +654,7 @@ class Controller(GObject.GObject): # TODO: init maps here manager.filter(mode) insert = manager.get_model() + # TODO: should list store be set outside of this thread? treeview.set_model(insert) treeview.set_loaded(True) GLib.idle_add(self.cleanup) @@ -751,7 +752,8 @@ class Controller(GObject.GObject): def get_player_count(self) -> str: treeview = self.get_active_treeview() model = treeview.get_model() - count = format_player_count(model) + control_model = treeview.filter_man.get_control() + count = format_player_count(model, control_model) return count def get_statusbar(self) -> None: diff --git a/dzgui/model/filtered_model.py b/dzgui/model/filtered_model.py index 0f649fd..57c7967 100644 --- a/dzgui/model/filtered_model.py +++ b/dzgui/model/filtered_model.py @@ -263,6 +263,9 @@ class FilteredModelManager: """ self.control_model = rows + def get_control(self) -> list: + return self.control_model + def set_success(self, result: bool) -> None: self.success = result diff --git a/dzgui/util/format.py b/dzgui/util/format.py index e6e6b3f..3d83d24 100644 --- a/dzgui/util/format.py +++ b/dzgui/util/format.py @@ -4,8 +4,9 @@ from dzgui.util.localize import number from dzgui.util.strings import no_mods, no_servers, distance_suffix import gi + gi.require_version("Gtk", "3.0") -from gi.repository import Gtk # noqa E402 +from gi.repository import Gtk # noqa E402 def format_pango(text: str) -> str: @@ -50,7 +51,7 @@ def format_mods(size: int, mods: int) -> str: return f"Found {mods:n} {plural} taking up {l_size} MiB. {suffix}" -def format_player_count(model: Gtk.TreeModel | None) -> str: +def format_player_count(model: Gtk.TreeModel | None, control: list) -> str: players = 0 hits: int status: str @@ -62,10 +63,9 @@ def format_player_count(model: Gtk.TreeModel | None) -> str: players += row[4] players_pretty = pluralize("players", players) hits_pretty = pluralize("matches", hits) - suffix = distance_suffix - status = f"Found {hits:n} {hits_pretty} with {players:n} {players_pretty}" + control_total = len(control) + status = f"Showing {hits:n}/{control_total:n} {hits_pretty} with {players:n} {players_pretty}" return status - return f"{status} | {suffix}" def embolden(text: str) -> str: diff --git a/dzgui/views/trees/tree_base.py b/dzgui/views/trees/tree_base.py index 3663157..c042804 100644 --- a/dzgui/views/trees/tree_base.py +++ b/dzgui/views/trees/tree_base.py @@ -38,6 +38,9 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore self.selected_row.set_mode(Gtk.SelectionMode.SINGLE) self.selected_row.connect("changed", self._on_tree_selection_changed) self.connect("row-activated", self._on_row_activated) + + self.connect("button-press-event", lambda x, y: print(self.sel_blocked)) + self.connect("key-press-event", self._on_keypress) self.connect("key-release-event", self._on_key_release) @@ -84,6 +87,7 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore if self.get_model() is None: return if self.sel_blocked is False: + self.sel_blocked = True self.controller.suppress_signal( self, self.selected_row, @@ -110,9 +114,10 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore return if is_navkey(event.keyval): if self.sel_blocked is True: + self.sel_blocked = False self.controller.suppress_signal( - self.controller.mediator.treeview, - self.controller.mediator.treeview.selected_row, + self, + self.selected_row, "_on_tree_selection_changed", False, ) @@ -120,6 +125,7 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore self._on_tree_selection_changed(selection) def _on_tree_selection_changed(self, selection: Gtk.TreeSelection) -> None: + print("selection changed") self.emit("generic_treesel_changed", selection) def toggle_selection(self, state: bool) -> None: diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index cb3bba7..e8722ac 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -1,6 +1,7 @@ import logging import multiprocessing -from typing import Any, Self +import threading +from typing import Any from warnings import deprecated from dzgui.views.mixins.context_mixin import ContextMixin @@ -71,6 +72,8 @@ class ServerTreeView(ContextMixin, TreeView): column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) column.set_resizable(True) column.set_sort_column_id(i) + if column_title == "Ping": + column.set_cell_data_func(renderer, self._get_ping) if valid_json: try: @@ -109,6 +112,39 @@ class ServerTreeView(ContextMixin, TreeView): self.emitter.connect("statusbar_loaded", self.start_distcalc) # self.emitter.connect("distcalc_started", self._on_distcalc_started) + def _get_ping( + self, + column: Gtk.TreeViewColumn, + cell: Gtk.CellRendererText, + model: Gtk.TreeModel, + it: Gtk.TreeIter, + data: Any, + ): + def ping(model, it, ip: str): + # TODO: use a2s to ping server + # a2s.info -> "ping" key + # Servers.ping() -> this accepts a whole row + # try, if failure just abort + self.res = ip.replace(":", "%") + num = 11111 + GLib.idle_add(lambda: model.set(it, 9, num)) + + addr = model.get_value(it, 7).split(":")[0] + qport = model.get_value(it, 8) + ip = f"{addr}:{qport}" + + thread = threading.Thread( + daemon=True, + target=ping, + args=( + model, + it, + ip, + ), + ) + thread.start() + pass + def start_timeout(self) -> None: if self.queue_id: GLib.Source.remove(self.queue_id)