chore: clear typehinting errors

This commit is contained in:
aclist committed 2026-05-03 02:14:08 +09:00
1 parent 99083d207a
commit 9bfa39c17e
14 files changed
+160 -142

No files matched your search

+2 -2
View File
@@ -101,8 +101,8 @@ def get_delimited_mods(steam_path: Path) -> list[Any]:
continue continue
size = get_mod_size(mod) size = get_mod_size(mod)
# NOTE: final col is cell renderer highlight toggle # NOTE: final col is cell renderer highlight toggle
clean.append([meta.name, symlink, mod_dir, size, False]) clean.append([meta.name.casefold(), symlink, mod_dir, size, False])
clean.sort(key=lambda row: row[0].casefold()) clean.sort(key=lambda row: row[0])
return clean return clean
+7 -7
View File
@@ -9,7 +9,7 @@ import subprocess
import threading import threading
from dataclasses import dataclass from dataclasses import dataclass
from typing import Optional, TYPE_CHECKING, Union from typing import Any, Optional, TYPE_CHECKING, Union
from dzgui.api.bm import map_id_to_record from dzgui.api.bm import map_id_to_record
from dzgui.const.constants import APP_NAME, REQUEST_TIMEOUT from dzgui.const.constants import APP_NAME, REQUEST_TIMEOUT
@@ -228,7 +228,7 @@ def query_direct(ip: str, qport: int, timeout: float = 3.0) -> dict | None:
class Res: class Res:
status: int status: int
parsed: bool parsed: bool
json: Union[str, None] json: Union[dict[str, Any], None]
@dataclass(slots=True, frozen=True) @dataclass(slots=True, frozen=True)
@@ -393,13 +393,13 @@ def query_api(key: str, appid: int, param: str) -> Res:
res.raise_for_status() res.raise_for_status()
parsed = True parsed = True
status = 200 status = 200
data = res.json() json = res.json()
except Exception: except Exception:
parsed = False parsed = False
data = None json = None
status = 403 status = 403
finally: finally:
return Res(status, parsed, data) return Res(status, parsed, json)
def validate_ip(addr: str) -> Record: def validate_ip(addr: str) -> Record:
@@ -453,7 +453,7 @@ def query_by_id(addr: str, key: str) -> Optional[dict]:
return None return None
def query_playercount(record: Record) -> Optional[tuple[int]]: def query_playercount(record: Record) -> tuple[int, int] | None:
try: try:
res = query_direct(record.ip, record.qport) res = query_direct(record.ip, record.qport)
players = int(res["players"]) players = int(res["players"])
@@ -462,7 +462,7 @@ def query_playercount(record: Record) -> Optional[tuple[int]]:
queue = int(r[1].split(",")[0]) queue = int(r[1].split(",")[0])
except IndexError: except IndexError:
queue = 0 queue = 0
return (players, queue) return players, queue
except Exception as e: except Exception as e:
logger.critical(e) logger.critical(e)
return None return None
+1 -1
View File
@@ -72,7 +72,7 @@ class ConfigManager:
# TODO: do this on demand if/when in options page # TODO: do this on demand if/when in options page
# self.mediator.grid.notebook.settings.populate_settings() # self.mediator.grid.notebook.settings.populate_settings()
def get_config(self) -> dict: def get_config(self) -> Any:
# TODO: is this being called twice? # TODO: is this being called twice?
try: try:
return read_json(self.config) return read_json(self.config)
+48 -54
View File
@@ -33,61 +33,55 @@ class ContextMenuManager:
self.treeview = treeview self.treeview = treeview
def process(self, action: ContextMenu) -> None: def process(self, action: ContextMenu) -> None:
match action: if isinstance(self.treeview, ServerTreeView):
# UNTHREADED record = self.treeview.get_record()
case ContextMenu.ADD_NOTE: if record is None:
dialog = NoteDialog(self.controller) return
dialog.run()
case ContextMenu.COPY_LOG_CLIPBOARD:
self.copy_log()
case ContextMenu.COPY_SERVER_IP:
self.copy_server_ip()
case ContextMenu.COPY_SERVER_NAME:
self.copy_server_name()
case ContextMenu.DELETE_MOD:
self.controller.delete_mods()
case ContextMenu.OPEN_WORKSHOP:
self.open_mod_page()
case ContextMenu.SET_FAV:
name = self.treeview.get_value_at_index(0)
record_str = self.treeview.get_record_string()
simple = self.treeview.get_simplified_ip()
self.controller.set_fav(name, record_str, simple)
# THREADED match action:
case ContextMenu.ADD_SERVER: # UNTHREADED
record = self.treeview.get_record() case ContextMenu.ADD_NOTE:
if record is None: dialog = NoteDialog(self.controller)
return dialog.run()
self.controller.add_by_record(record) case ContextMenu.COPY_SERVER_IP:
case ContextMenu.CONNECT: self.copy_server_ip()
record = self.treeview.get_record() case ContextMenu.COPY_SERVER_NAME:
if record is None: self.copy_server_name()
return case ContextMenu.SET_FAV:
self.controller.connect_by_record(record) name = self.treeview.get_value_at_index(0)
case ContextMenu.REFRESH_PLAYERS: # NOTE: fully qualified ip
record = self.treeview.get_record() fqip = self.treeview.get_record_string()
if record is None: # NOTE: short ip for display purposes
return simple = self.treeview.get_simplified_ip()
self.controller.refresh_players(record) self.controller.set_fav(name, fqip, simple)
case ContextMenu.REMOVE_HISTORY:
record = self.treeview.get_record() # THREADED
if record is None: case ContextMenu.ADD_SERVER:
return self.controller.add_by_record(record)
self.controller.remove_from_history(record) case ContextMenu.CONNECT:
case ContextMenu.REMOVE_SERVER: self.controller.connect_by_record(record)
record = self.treeview.get_record() case ContextMenu.REFRESH_PLAYERS:
if record is None: self.controller.refresh_players(record)
return case ContextMenu.REMOVE_HISTORY:
self.controller.remove_by_record(record) self.controller.remove_from_history(record)
case ContextMenu.SHOW_DETAILS: case ContextMenu.REMOVE_SERVER:
record = self.treeview.get_record() self.controller.remove_by_record(record)
if record is None: case ContextMenu.SHOW_DETAILS:
return self.controller.get_details(record)
self.controller.get_details(record) case ContextMenu.SHOW_MODS:
case ContextMenu.SHOW_MODS: self.controller.get_modlist(record)
record = self.treeview.get_record()
self.controller.get_modlist(record) if isinstance(self.treeview, ModTreeView):
match action:
case ContextMenu.DELETE_MOD:
self.controller.delete_mods()
case ContextMenu.OPEN_WORKSHOP:
self.open_mod_page()
if isinstance(self.treeview, LogTreeView):
match action:
case ContextMenu.COPY_LOG_CLIPBOARD:
self.copy_log()
def copy_server_ip(self) -> None: def copy_server_ip(self) -> None:
if not isinstance(self.treeview, ServerTreeView): if not isinstance(self.treeview, ServerTreeView):
+1 -1
View File
@@ -76,7 +76,7 @@ class FilterManager:
def append_map(self, row: list[str]) -> None: def append_map(self, row: list[str]) -> None:
self.map_store.append(row) self.map_store.append(row)
def set_unique_maps(self, maps: list) -> None: def set_unique_maps(self, maps: list[str]) -> None:
if maps is None: if maps is None:
return return
if len(maps) < 1: if len(maps) < 1:
+20 -7
View File
@@ -2,7 +2,7 @@ import logging
import shutil import shutil
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import Any, TYPE_CHECKING
from dzgui.api.mods import ( from dzgui.api.mods import (
get_delimited_mods, get_delimited_mods,
@@ -60,7 +60,7 @@ class ModManager:
func = StoredFunc(self._on_mods_loaded, mods) func = StoredFunc(self._on_mods_loaded, mods)
self.thread_man.set_cleanup_func(func) self.thread_man.set_cleanup_func(func)
def _on_mods_loaded(self, mods: list[list[str, str, str, float, bool]]) -> None: def _on_mods_loaded(self, mods: list[list[Any]]) -> None:
self.store = ModelFactory().make_mod_store() self.store = ModelFactory().make_mod_store()
self.store.extend(mods) self.store.extend(mods)
self.treeview.set_model(self.store) self.treeview.set_model(self.store)
@@ -83,14 +83,20 @@ class ModManager:
def get_mod_from_tree_path( def get_mod_from_tree_path(
self, tree_path: Gtk.TreePath self, tree_path: Gtk.TreePath
) -> tuple[str, Gtk.TreeIter]: ) -> tuple[str, Gtk.TreeIter] | None:
model = self.treeview.get_model() model = self.treeview.get_model()
if model is None:
return None
tree_iter = model.get_iter(tree_path) tree_iter = model.get_iter(tree_path)
mod = model.get(tree_iter, 2)[0] mod = model.get_value(tree_iter, 2)[0]
print(mod)
return mod, tree_iter return mod, tree_iter
def delete_single_mod(self, tree_path: Gtk.TreePath) -> Gtk.TreeIter: def delete_single_mod(self, tree_path: Gtk.TreePath) -> Gtk.TreeIter | None:
mod, _iter = self.get_mod_from_tree_path(tree_path) res = self.get_mod_from_tree_path(tree_path)
if res is None:
return None
mod, _iter = res
steam_path = Path(self.path) steam_path = Path(self.path)
mods_path = get_local_mod_path(steam_path) mods_path = get_local_mod_path(steam_path)
@@ -118,12 +124,17 @@ class ModManager:
#if model: #if model:
# model.remove(_iter) # FIXME: do not remove from model interface directly # model.remove(_iter) # FIXME: do not remove from model interface directly
remove_stale_signatures(self.prefs.paths.config, self.prefs.paths.version) remove_stale_signatures(self.prefs.paths.config, self.prefs.paths.version)
mods = len(self.treeview.get_model()) model = self.treeview.get_model()
if model is None:
return
mods = len(model)
msg = self.format_mod_statusbar() msg = self.format_mod_statusbar()
self.emitter.emit("mods_updated", msg, mods) self.emitter.emit("mods_updated", msg, mods)
def uncolorize_mods(self) -> None: def uncolorize_mods(self) -> None:
model = self.treeview.get_model() model = self.treeview.get_model()
if model is None:
return
for mod in model: for mod in model:
_iter = mod.iter _iter = mod.iter
path = model.get_path(_iter) path = model.get_path(_iter)
@@ -175,6 +186,8 @@ class ModManager:
def select_colorized(self) -> None: def select_colorized(self) -> None:
model = self.treeview.get_model() model = self.treeview.get_model()
if model is None:
return
sel = self.treeview.get_selection() sel = self.treeview.get_selection()
for mod in model: for mod in model:
it = mod.iter it = mod.iter
+6 -5
View File
@@ -32,8 +32,9 @@ class ProxyModelManager:
self.proxy_model: "FastInsertListStore" = None self.proxy_model: "FastInsertListStore" = None
self.filter_man = filter_man self.filter_man = filter_man
self.control_model: list = None # TODO: list typehints
self.filtered: list = None self.control_model: list | None = None
self.filtered: list | None = None
self.success = True self.success = True
def has_control_model(self) -> bool: def has_control_model(self) -> bool:
@@ -61,9 +62,9 @@ class ProxyModelManager:
def remove_row_from_control(self, record: "Record") -> None: def remove_row_from_control(self, record: "Record") -> None:
addr = f"{record.ip}:{record.gameport}" addr = f"{record.ip}:{record.gameport}"
qport = record.qport qport = record.qport
for record in self.control_model: for row in self.control_model:
if addr == record[7] and qport == record[8]: if addr == row[7] and qport == row[8]:
self.control_model.remove(record) self.control_model.remove(row)
break break
self.wipe_cache() self.wipe_cache()
self.filter(FilterMode.INITIAL, skip_cache=True) self.filter(FilterMode.INITIAL, skip_cache=True)
+9 -6
View File
@@ -86,7 +86,7 @@ class ServerModelManager:
key = config_man.lookup(Preferences.STEAM) key = config_man.lookup(Preferences.STEAM)
job = Servers.query_api job = Servers.query_api
params = Servers.params params = Servers.params
servers: list[dict[Any, Any]] = [] servers = []
with ThreadPoolExecutor() as executor: with ThreadPoolExecutor() as executor:
futures = [executor.submit(job, key, APPID_DAYZ, param) for param in params] futures = [executor.submit(job, key, APPID_DAYZ, param) for param in params]
for future in as_completed(futures): for future in as_completed(futures):
@@ -105,7 +105,8 @@ class ServerModelManager:
) )
return return
j = res.json j = res.json
servers += j["response"]["servers"] if j is not None:
servers.extend(j["response"]["servers"])
except Exception as e: except Exception as e:
logger.critical(e) logger.critical(e)
self.thread_man.set_cleanup_func( self.thread_man.set_cleanup_func(
@@ -117,7 +118,8 @@ class ServerModelManager:
res = Servers.query_api(key, APPID_DAYZ_EXP, "") res = Servers.query_api(key, APPID_DAYZ_EXP, "")
if res.status == 200 and res.parsed is True: if res.status == 200 and res.parsed is True:
j = res.json j = res.json
servers += j["response"]["servers"] if j is not None:
servers.extend(j["response"]["servers"])
parsed = Servers.parse_json(servers) parsed = Servers.parse_json(servers)
self._push_data(parsed) self._push_data(parsed)
@@ -364,14 +366,15 @@ class ServerModelManager:
if self.first_iteration: if self.first_iteration:
self._update_maps() self._update_maps()
def _cleanup_on_failure(self, show_dialog=True) -> None: def _cleanup_on_failure(self, show_dialog: bool = True) -> None:
# TODO: disable map, keyword, and filter widgets if model is None # TODO: disable map, keyword, and filter widgets if model is None
# -> signal driven (servers_empty, servers_failed_to_load) # -> signal driven (servers_empty, servers_failed_to_load)
if self.preserve_on_fail is False: if self.preserve_on_fail is False:
# CHORE: test if maps are cleared on failure
self.tv.set_model(None) self.tv.set_model(None)
filter_man = self.tv.get_filter_man() #filter_man = self.tv.get_filter_man()
filter_man.set_unique_maps(None) #filter_man.set_unique_maps([])
# TODO: emit signal to not disable widget sensitivity # TODO: emit signal to not disable widget sensitivity
# TODO: distinguish signals, e.g. "servers_failed_to_load", "servers_loaded_empty" # TODO: distinguish signals, e.g. "servers_failed_to_load", "servers_loaded_empty"
+1 -1
View File
@@ -13,7 +13,7 @@ connect_entry_placeholder="Enter IP (IP:Query port) or Battlemetrics ID (numeric
fav_heading="Favorite server" fav_heading="Favorite server"
favs_empty="None set. Right click a server and select 'Set favorite' to set." favs_empty="None set. Right click a server and select 'Set favorite' to set."
lan_heading="LAN query port", lan_heading="LAN query port"
lan_default_button="Default port (27016)" lan_default_button="Default port (27016)"
lan_custom_button="Custom port" lan_custom_button="Custom port"
lan_scan_button="Scan" lan_scan_button="Scan"
+5 -2
View File
@@ -59,7 +59,7 @@ class ServerDialog(GenericDialog):
class ServerDetailsDialog(ServerDialog): class ServerDetailsDialog(ServerDialog):
def __init__(self, controller, details: "Details"): def __init__(self, controller: "Controller", details: "Details"):
name = controller.get_server_name() name = controller.get_server_name()
super().__init__(controller, strings.server_details, name) super().__init__(controller, strings.server_details, name)
@@ -96,6 +96,9 @@ class ServerDetailsDialog(ServerDialog):
self.pack(scrollable_message) self.pack(scrollable_message)
if details.data is None:
return
for row in details.data: for row in details.data:
self.store.append(row + [Pango.Weight.BOLD]) self.store.append(row + [Pango.Weight.BOLD])
self.view.set_model(self.store) self.view.set_model(self.store)
@@ -115,7 +118,7 @@ class ServerDetailsDialog(ServerDialog):
class ServerModDialog(ServerDialog): class ServerModDialog(ServerDialog):
def __init__(self, controller, mods: list[str]): def __init__(self, controller: "Controller", mods: list[list[str]]):
name = controller.get_server_name() name = controller.get_server_name()
super().__init__(controller, strings.modlist, name) super().__init__(controller, strings.modlist, name)
+26 -10
View File
@@ -76,15 +76,20 @@ class ServerNotebook(Gtk.ScrolledWindow):
if cur_page == saved: if cur_page == saved:
return return
page = self.notebook.get_nth_page(saved) page = self.notebook.get_nth_page(saved)
if not page:
return
label = self.notebook.get_tab_label(page) label = self.notebook.get_tab_label(page)
if label is None: if label is None:
return return
label.set_text(f"{server_labels.saved}*") if hasattr(label, "set_text"):
label.set_text(f"{server_labels.saved}*")
def _on_servers_loaded(self, emitter: "Emitter", tab: "ServerTab") -> None: def _on_servers_loaded(self, emitter: "Emitter", tab: "ServerTab") -> None:
# NOTE: workaround for GTK bug where fullscreen causes headers to vanish when model is None # NOTE: workaround for GTK bug where fullscreen causes headers to vanish when model is None
# TODO: this should be internal to servers page # TODO: this should be internal to servers page
tv = self.get_active_treeview() tv = self.get_active_treeview()
if tv is None:
return
state = False if tv.get_model() is None else True state = False if tv.get_model() is None else True
tv.set_headers_visible(state) tv.set_headers_visible(state)
tv.set_loaded(True) tv.set_loaded(True)
@@ -114,14 +119,19 @@ class ServerNotebook(Gtk.ScrolledWindow):
return False return False
def grab_content_area(self) -> None: def grab_content_area(self) -> None:
self.get_active_treeview().grab_focus() tv = self.get_active_treeview()
if tv is not None:
tv.grab_focus()
def get_current_tab_text(self) -> str: def get_current_tab_text(self) -> str:
ind = self.notebook.get_current_page() ind = self.notebook.get_current_page()
child = self.notebook.get_nth_page(ind) child = self.notebook.get_nth_page(ind)
if child is None: if child is None:
return "" return ""
return self.notebook.get_tab_label_text(child) text = self.notebook.get_tab_label_text(child)
if text is None:
return ""
return text
def _on_page_changed( def _on_page_changed(
self, notebook: Gtk.Notebook, child: ScrollableTree, index: int self, notebook: Gtk.Notebook, child: ScrollableTree, index: int
@@ -130,21 +140,27 @@ class ServerNotebook(Gtk.ScrolledWindow):
return return
label = self.notebook.get_tab_label_text(child) label = self.notebook.get_tab_label_text(child)
# TODO: strings if label is not None:
text = label.strip("*") # TODO: strings
self.notebook.set_tab_label_text(child, text) text = label.strip("*")
self.notebook.set_tab_label_text(child, text)
tree = child.get_tree() tree = child.get_tree()
self.emitter.emit("server_page_changed", tree) self.emitter.emit("server_page_changed", tree)
# NOTE: spawns a thread # NOTE: spawns a thread
self.controller.populate_model(self.get_active_treeview()) tv = self.get_active_treeview()
if tv is not None:
self.controller.populate_model(tv)
def get_active_treeview(self) -> ServerTreeView: def get_active_treeview(self) -> ServerTreeView | None:
index = self.notebook.get_current_page() index = self.notebook.get_current_page()
scrollable = self.notebook.get_nth_page(index) scrollable = self.notebook.get_nth_page(index)
treeview = scrollable.get_children()[0] if scrollable is not None and hasattr(scrollable, "get_children"):
return treeview tv = scrollable.get_children()[0]
if isinstance(tv, ServerTreeView):
return tv
return None
def add_notification(self) -> None: def add_notification(self) -> None:
saved = self.notebook.get_nth_page(1) saved = self.notebook.get_nth_page(1)
+9 -7
View File
@@ -21,7 +21,7 @@ if TYPE_CHECKING:
logger = logging.getLogger(APP_NAME) logger = logging.getLogger(APP_NAME)
class LogTreeView(ContextMixin, TreeView): class LogTreeView(ContextMixin, TreeView): # type: ignore
def __init__(self, controller: "Controller") -> None: def __init__(self, controller: "Controller") -> None:
super().__init__(controller, menu=ContextMenuGroup.LOG) super().__init__(controller, menu=ContextMenuGroup.LOG)
@@ -56,7 +56,8 @@ class LogTreeView(ContextMixin, TreeView):
sortable = Gtk.TreeModelSort(_filter) sortable = Gtk.TreeModelSort(_filter)
self.set_model(sortable) self.set_model(sortable)
_filter.refilter() _filter.refilter()
self.set_cursor(0) path = Gtk.TreePath.new_from_indices([0])
self.set_cursor(path)
def toggle_filter(self, _filter: str) -> None: def toggle_filter(self, _filter: str) -> None:
if _filter in self.filters: if _filter in self.filters:
@@ -64,19 +65,20 @@ class LogTreeView(ContextMixin, TreeView):
else: else:
self.filters.append(_filter) self.filters.append(_filter)
# NOTE: unwrap TreeModelSort and TreeModelFilter # NOTE: unwrap TreeModelSort and TreeModelFilter
self.get_model().get_model().refilter() self.get_model().get_model().refilter() # type: ignore
def _filter_rows( def _filter_rows(
self, model: Gtk.ListStore, _iter: Gtk.TreeIter, data: Any self, filter_model: Gtk.TreeModelFilter, _iter: Gtk.TreeIter, data: Any
) -> None: ) -> bool:
if len(self.filters) < 1: if len(self.filters) < 1:
return False return False
return model[_iter][1] in self.filters return filter_model[_iter][1] in self.filters
def _on_log_buttonpress(self, widget: Gtk.Widget, event: Gdk.EventButton) -> None: def _on_log_buttonpress(self, widget: Gtk.Widget, event: Gdk.EventButton) -> bool:
if event.button == Gdk.BUTTON_SECONDARY: if event.button == Gdk.BUTTON_SECONDARY:
self.present_menu(widget, event) self.present_menu(widget, event)
return True return True
return False
def _on_log_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None: def _on_log_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
self.present_menu(widget, event) self.present_menu(widget, event)
+5 -19
View File
@@ -21,7 +21,7 @@ if TYPE_CHECKING:
logger = logging.getLogger(APP_NAME) logger = logging.getLogger(APP_NAME)
class ModTreeView(ModsMixin, ContextMixin, TreeView): class ModTreeView(ModsMixin, ContextMixin, TreeView): # type: ignore
def __init__(self, controller: "Controller") -> None: def __init__(self, controller: "Controller") -> None:
super().__init__(controller, menu=ContextMenuGroup.MOD) super().__init__(controller, menu=ContextMenuGroup.MOD)
self.controller = controller self.controller = controller
@@ -64,31 +64,17 @@ class ModTreeView(ModsMixin, ContextMixin, TreeView):
def _on_mods_updated(self, emitter: "Emitter", msg: str, mods: int) -> None: def _on_mods_updated(self, emitter: "Emitter", msg: str, mods: int) -> None:
if mods < 1: if mods < 1:
return return
self.set_cursor(0) path = Gtk.TreePath.new_from_indices([0])
self.set_cursor(path)
def get_selected_mod(self) -> str: def get_selected_mod(self) -> str:
path = self.get_focused_row_path() path = self.get_focused_row_path()
model = self.get_model() model = self.get_model()
tree_iter = model.get_iter(path) tree_iter = model.get_iter(path)
mod = model.get(tree_iter, 2)[0] mod = model.get(tree_iter, 2)[0]
return mod return str(mod)
# return mod, tree_iter
# def _on_mods_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None: def _parent_selection_changed(self, base_class: TreeView, sel: Gtk.TreeSelection) -> None:
# # TODO: multiselect
# # if event.keyval is Gdk.KEY_space:
# # it = self.get_focused_row_iter()
# # self.get_selection().select_iter(it)
# # path = self.get_focused_row_path()
# # self.set_cursor(path)
# # return False
# self.present_menu(widget, event)
# def _on_mods_button_press(self, widget: Gtk.Widget, event: Gdk.EventButton) -> None:
# if event.button == 3:
# self.present_menu(widget, event)
def _parent_selection_changed(self, base_class: TreeView, sel: Gtk.TreeSelection):
pass pass
def _format_color( def _format_color(
+20 -20
View File
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
QUEUE_CHECK_DELAY = 200 QUEUE_CHECK_DELAY = 200
class ServerTreeView(ContextMixin, TreeView): class ServerTreeView(ContextMixin, TreeView): # type: ignore
def __init__( def __init__(
self, controller: "Controller", enum: ServerTab, menu: ContextMenuGroup self, controller: "Controller", enum: ServerTab, menu: ContextMenuGroup
) -> None: ) -> None:
@@ -58,9 +58,9 @@ class ServerTreeView(ContextMixin, TreeView):
self.queue_id: int self.queue_id: int
self.handler_id: int self.handler_id: int
self.queue = Queue() self.queue: Queue = Queue()
self.seen_cache = [] self.seen_cache: list[str] = []
prefs = self.controller.get_prefs() prefs = self.controller.get_prefs()
columns = prefs.paths.columns columns = prefs.paths.columns
@@ -119,7 +119,7 @@ class ServerTreeView(ContextMixin, TreeView):
def _on_tooltip( def _on_tooltip(
self, self,
widget: Gtk.Widget, treeview: Self,
x: int, x: int,
y: int, y: int,
keyboard_mode: bool, keyboard_mode: bool,
@@ -128,12 +128,13 @@ class ServerTreeView(ContextMixin, TreeView):
""" """
Present record data for the hovered row even if it is unfocused Present record data for the hovered row even if it is unfocused
""" """
coords = widget.convert_widget_to_bin_window_coords(x, y) coords_x, coords_y = treeview.convert_widget_to_bin_window_coords(x, y)
path = self.get_path_at_pos(coords.bx, coords.by) path = self.get_path_at_pos(coords_x, coords_y)
if path is None: if path is None or path[0] is None:
return False return False
model = self.get_model() model = self.get_model()
if model is None:
return False
tree_iter = model.get_iter(path[0]) tree_iter = model.get_iter(path[0])
ip = model.get_value(tree_iter, 7) ip = model.get_value(tree_iter, 7)
qport = model.get_value(tree_iter, 8) qport = model.get_value(tree_iter, 8)
@@ -188,7 +189,7 @@ class ServerTreeView(ContextMixin, TreeView):
# NOTE: get final width after drag action completes # NOTE: get final width after drag action completes
GLib.idle_add(self.controller.propagate_column_width, col) GLib.idle_add(self.controller.propagate_column_width, col)
def start_distcalc(self, emitter: Optional["Emitter"] = None): def start_distcalc(self, emitter: Union["Emitter", None] = None) -> None:
self.emitter.emit("distcalc_started") self.emitter.emit("distcalc_started")
record = self.get_record() record = self.get_record()
if record is None: if record is None:
@@ -248,14 +249,10 @@ class ServerTreeView(ContextMixin, TreeView):
case Gdk.KEY_r: case Gdk.KEY_r:
# TODO: unimplemented, needs threading # TODO: unimplemented, needs threading
self.controller.menu_action(ContextMenu.REFRESH_PLAYERS, self) self.controller.menu_action(ContextMenu.REFRESH_PLAYERS, self)
case _:
return False
return True
else: else:
match event.keyval: match event.keyval:
case Gdk.KEY_l | Gdk.KEY_Right: case Gdk.KEY_l | Gdk.KEY_Right:
self.emitter.emit("request_button_box_focus") self.emitter.emit("request_button_box_focus")
return True
case _: case _:
self.emitter.emit("check_button_pressed", event.keyval) self.emitter.emit("check_button_pressed", event.keyval)
@@ -266,12 +263,13 @@ class ServerTreeView(ContextMixin, TreeView):
path = pathlist[0] path = pathlist[0]
tree_iter = model.get_iter(path) tree_iter = model.get_iter(path)
has_mods = model.get_value(tree_iter, 11) has_mods = model.get_value(tree_iter, 11)
return has_mods return bool(has_mods)
def get_selected_row(self) -> Gtk.TreeModelRow: #def get_selected_row(self) -> Gtk.TreeModelRow:
sel = self.get_selection() # sel = self.get_selection()
sels = sel.get_selected_rows() # sels = sel.get_selected_rows()
return sels[0] # print(type(sels[0]))
# return sels[0]
def is_in_favs(self) -> bool: def is_in_favs(self) -> bool:
record = self.get_record_string() record = self.get_record_string()
@@ -283,6 +281,8 @@ class ServerTreeView(ContextMixin, TreeView):
self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn
) -> None: ) -> None:
record = self.get_record() record = self.get_record()
if record is None:
return
self.controller.connect_by_record(record) self.controller.connect_by_record(record)
def _parent_selection_changed( def _parent_selection_changed(
@@ -321,14 +321,14 @@ class ServerTreeView(ContextMixin, TreeView):
def set_loaded(self, status: bool) -> None: def set_loaded(self, status: bool) -> None:
self.loaded = status self.loaded = status
def get_model_and_control_model(self) -> tuple[Union["FastInsertListStore", None], list[Any]]: def get_model_and_control_model(self) -> tuple[Union[Gtk.TreeModel, None], list[Any]]:
model = self.get_model() model = self.get_model()
control = self.proxy_man.get_control() control = self.proxy_man.get_control()
return model, control return model, control
@staticmethod @staticmethod
def ping_server( def ping_server(
model, _iter: Gtk.TreeIter, ip: str, qport: int, ping_column: int model: "FastInsertListStore", _iter: Gtk.TreeIter, ip: str, qport: int, ping_column: int
) -> None: ) -> None:
_ping = ping(ip, qport) _ping = ping(ip, qport)
GLib.idle_add(lambda: model.set(_iter, ping_column, _ping)) GLib.idle_add(lambda: model.set(_iter, ping_column, _ping))