fix: signal supression on keyup

This commit is contained in:
aclist 2026-02-08 22:09:45 +09:00
parent 2ef62416c0
commit fc6e958c09
5 changed files with 57 additions and 10 deletions

View File

@ -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:

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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)