chore: clear typehinting errors

This commit is contained in:
aclist 2026-05-05 23:37:31 +09:00
parent e64feac425
commit 25640751a5
23 changed files with 86 additions and 105 deletions

View File

@ -1,4 +1,3 @@
import dayzquery
import hashlib
import logging
import shlex
@ -9,7 +8,7 @@ from dataclasses import dataclass
from pathlib import Path
import dzgui.api.pefile as PeFile
from dzgui.api.servers import Record, get_rules, fqip_to_record
from dzgui.api.servers import get_rules, fqip_to_record
from dzgui.const.constants import (
APP_NAME,
APPID_DAYZ,
@ -17,7 +16,6 @@ from dzgui.const.constants import (
WORKSHOP_PATH,
)
from dzgui.util.strings import checkmark
from dzgui.config.query import lookup
from dzgui.const.enum import Preferences
@ -110,23 +108,6 @@ def get_missing_mods(local: list, remote: list) -> list:
return [mod for mod in remote if mod not in local]
# TODO: drop
# def get_server_modlist(server: Record, steam: Path) -> list:
# try:
# rules = dayzquery.dayz_rules((server.ip, server.qport))
# except Exception as e:
# raise e
# remote_mods = [[mod.name, mod.workshop_id] for mod in rules.mods]
# remote_mods.sort(key=lambda row: row[0])
# local_mods = get_local_mod_ids(steam)
# for mod in remote_mods:
# if mod[1] in local_mods:
# mod.append(checkmark)
# else:
# mod.append("")
# return remote_mods
def _hash(uid: str) -> str:
md5 = hashlib.md5()
md5.update(uid.encode("ascii"))

View File

@ -443,12 +443,12 @@ def get_rules(record: Record) -> list["DayzMod"]:
return [mod for mod in mods]
def query_by_id(addr: str, key: str, full: bool = False) -> dict[Any] | None:
def query_by_id(server_id: int, key: str, full: bool = False) -> dict[Any] | None:
"""
Used with numeric Battlemetrics IDs
"""
try:
resolved = map_id_to_record(key, addr)
resolved = map_id_to_record(key, server_id)
return query_direct(resolved.ip, resolved.qport, full)
except Exception as e:
logger.critical(e)
@ -470,11 +470,11 @@ def query_playercount(record: Record) -> tuple[int, int] | None:
return None
def query_by_ip(addr: str, full: bool = False) -> dict[Any] | None:
def query_by_ip(addr: str, full: bool = False) -> dict[str, Any] | PreReqs | None:
record = short_ip_to_record(addr)
return query_by_record(record, full)
def query_by_record(record: Record, full: bool = False) -> dict[Any] | None:
def query_by_record(record: Record, full: bool = False) -> dict[str, Any] | PreReqs | None:
if full:
try:
info = a2s.info((record.ip, record.qport), 3.0)
@ -511,11 +511,6 @@ def response_to_fqip(res: dict) -> str:
return f"{ip}:{gameport}:{qport}"
def source_info_to_record(res: a2s.SourceInfo) -> Record:
print(res)
return
return Record(ip, int(gameport), int(qport))
def response_to_record(res: dict) -> Record:
ip = res["addr"].split(":")[0]
gameport = res["gameport"]

View File

@ -83,7 +83,7 @@ def find_user_id(path: Path) -> str | None:
j = json.loads(vdf)
for user in j["users"]:
if j["users"][user]["MostRecent"] == "1":
return user
return str(user)
return None
except Exception as e:
logger.warn(e)
@ -91,7 +91,7 @@ def find_user_id(path: Path) -> str | None:
def vdf2json(path: Path) -> str:
def _istr(indent, string):
def _istr(indent: int, string: str):
return (indent * " ") + string
jbuf = "{\n"

View File

@ -48,7 +48,7 @@ def get_favorites(path: Path) -> list[str]:
def enum_to_key(enum: Preferences) -> str:
return enum.dict["key"]
return str(enum.dict["key"])
def get_client_index(client: str) -> int:

View File

@ -46,6 +46,7 @@ if TYPE_CHECKING:
from dzgui.views.components.filter_panel import FilterPanel
from dzgui.views.components.right_panel import RightPanel
from dzgui.views.components.statusbar import Statusbar
from dzgui.views.pages.preconnect import PreConnectionAssistant
from dzgui.views.pages.servers import ServerNotebook
from dzgui.views.trees.tree_log import LogTreeView
from dzgui.views.trees.tree_menu import MenuTreeView
@ -199,7 +200,6 @@ class Controller(GObject.GObject):
except Exception:
return
case ButtonType.MODS:
# TODO: reload using refresh button, rather than on demand?
self.load_mods()
self.open_page(button.opens)
@ -393,7 +393,7 @@ class Controller(GObject.GObject):
if addr.isdigit():
config_man = self.get_config_man()
key = config_man.lookup(Preferences.BM)
ConnectionManager(self).connect_by_id(addr, key)
ConnectionManager(self).connect_by_id(int(addr), key)
else:
ConnectionManager(self).connect_by_ip(addr)
@ -452,7 +452,7 @@ class Controller(GObject.GObject):
def get_modtreeview(self) -> "ModTreeView":
return self.mediator.modtreeview
def get_exit_event(self) -> None:
def get_exit_event(self) -> threading.Event:
return self.exit_event
def set_exit_event(self) -> None:
@ -461,10 +461,7 @@ class Controller(GObject.GObject):
def open_connection_assistant(self, res: "PreReqs", mods: list["DayzMod"]) -> None:
self.open_page(NotebookPage.CONNECTION)
self.mediator.preconnect.populate(res, mods)
# TODO: populate assistant
# TODO: embed dialogs
# dialog = ServerModDialog(self, mods)
def set_start_tab(self) -> int:
def set_start_tab(self) -> None:
ind = self.config_man.get_start_tab()
self.get_servers().notebook.set_current_page(ind)

View File

@ -1,7 +1,7 @@
import shutil
from pathlib import Path
from typing import Any, Union, TYPE_CHECKING
from typing import Union, TYPE_CHECKING
import dzgui.api.pefile as PeFile
import dzgui.api.servers as Servers
@ -30,8 +30,8 @@ class ConnectionManager:
self.thread_man = ThreadingManager(controller)
@call_on_thread(dialog.querying)
def connect_by_id(self, addr: str, key: str) -> None:
res = Servers.query_by_id(addr, key, full=True)
def connect_by_id(self, _id: int, key: str) -> None:
res = Servers.query_by_id(_id, key, full=True)
self._prepare_connection(res)
@call_on_thread(dialog.querying)
@ -89,7 +89,7 @@ class ConnectionManager:
StoredFunc(self._present_details_dialog, details), destroy_first=True
)
def _query_modlist(self, record: Servers.Record) -> None:
def _query_modlist(self, record: Servers.Record) -> list[list[str]]:
mods = Servers.get_rules(record)
steam_path = self.controller.query_config(Preferences.DEFAULT)
local = get_local_mod_ids(steam_path)

View File

@ -1,6 +1,6 @@
import re
from typing import Any, Optional, TYPE_CHECKING
from typing import Any, Optional, TYPE_CHECKING, Union
from warnings import deprecated
from dzgui.const.enum import FilterMode
@ -14,6 +14,7 @@ if TYPE_CHECKING:
from dzgui.model.servers import NewPlayerCount
# TODO: annotate list contents (list[list[Any]])
class ProxyModelManager:
"""
Manages access to cached FastInsertListStore resources and
@ -34,7 +35,7 @@ class ProxyModelManager:
# TODO: list typehints
self.control_model: list | None = None
self.filtered: list | None = None
self.filtered: list = []
self.success = True
def has_control_model(self) -> bool:
@ -60,6 +61,8 @@ class ProxyModelManager:
# self.control_model.append(row)
def remove_row_from_control(self, record: "Record") -> None:
if self.control_model is None:
return
addr = f"{record.ip}:{record.gameport}"
qport = record.qport
for row in self.control_model:
@ -75,7 +78,9 @@ class ProxyModelManager:
def get_proxy_model(self) -> "FastInsertListStore":
return self.proxy_model
def filter(self, mode: FilterMode, skip_cache: bool = False) -> None:
def filter(
self, mode: FilterMode, skip_cache: bool = False
) -> Union["FastInsertListStore", None]:
"""
Native Gtk.TreeView.refilter() method was not performant enough
when running in the main loop with 40k+ records
@ -91,7 +96,7 @@ class ProxyModelManager:
cache = self.filter_cache[filters]
self.set_proxy_model(cache[0])
self.set_filtered(cache[1])
return
return None
match mode:
case FilterMode.INITIAL:
@ -224,10 +229,11 @@ class ProxyModelManager:
def convert_model_to_list(self, model: "FastInsertListStore") -> list:
return [[el for el in row] for row in model]
def set_filtered(self, rows: Optional[list]) -> None:
def set_filtered(self, rows: list | None) -> None:
if rows is None:
rows = []
self.filtered = rows
self.filtered = []
else:
self.filtered = rows
def get_filtered(self) -> list:
return self.filtered
@ -248,7 +254,7 @@ class ProxyModelManager:
return self.control_model
def wipe_cache(self, full: bool = False) -> None:
self.filtered = None
self.filtered = []
self.filter_cache = {}
def push(self, data: list[Any]) -> None:

View File

@ -187,10 +187,10 @@ class ServerModelManager:
self._push_data(parsed)
@call_on_thread(dialog.querying)
def add_by_id(self, addr: str) -> None:
def add_by_id(self, _id: str) -> None:
config_man = self.controller.get_config_man()
key = config_man.lookup(Preferences.BM)
res = Servers.query_by_id(addr, key)
res = Servers.query_by_id(int(_id), key)
self._parse_single_record(res)
@call_on_thread(dialog.querying)
@ -266,6 +266,8 @@ class ServerModelManager:
# NOTE: expected to only contain one item
records = Servers.parse_json([response])
server = records[0]
if server is None:
return
proxy_man = self._get_proxy_man()
config_man = self.controller.get_config_man()

View File

@ -62,9 +62,9 @@ def get_coords(ips: "Path", ip: str) -> Coords:
if proc.returncode != 0:
raise GeolocationError("Failed to split records")
ips = proc.stdout.splitlines()
ip_list = proc.stdout.splitlines()
for address in ips:
for address in ip_list:
fields = address.split(",")
upper = fields[1]

View File

@ -194,11 +194,10 @@ class Notebook(ScrollableMixin, Gtk.Notebook): # type: ignore
def get_prior_page(self) -> NotebookPage:
return self.prior_page
def get_page_by_enum(self) -> NotebookPage | None:
def get_page_by_enum(self) -> NotebookPage:
for k, v in self.indexes.items():
if v == self.get_current_page():
return k
return None
def toggle_keybindings(self) -> None:
cur_page = self.get_page_by_enum()

View File

@ -117,13 +117,13 @@ class RefreshButton(IconTextButton):
self.show_time(True)
GLib.timeout_add_seconds(1, self.decrement)
def decrement(self) -> type[GLib.SOURCE_REMOVE] | Literal[True]:
def decrement(self) -> bool:
self.time -= 1
if self.time == 0:
self.time = 30
self.show_time(False)
self.set_sensitive(True)
return GLib.SOURCE_REMOVE
return False
self.show_time(True)
return True

View File

@ -1,17 +1,17 @@
from dzgui.util import strings, css, open_links
from dzgui.util import css
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa
class HeadingFrame(Gtk.Box):
def __init__(self, widget: Gtk.Widget, heading: str) -> None:
super().__init__(orientation=Gtk.Orientation.VERTICAL)
label = Gtk.Label(label=heading)
label.set_halign(Gtk.Align.START)
# TODO: rename selector
css.add_class(label, "settings-subheading")
frame = Gtk.Frame(hexpand=True)

View File

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING
from typing import Self, TYPE_CHECKING
from dzgui.const.enum import ModButton
from dzgui.const.constants import NO_EXPAND, FILL, NO_PADDING
@ -64,7 +64,7 @@ class ModSelectionPanel(Gtk.Box):
self.connect("map", self._reinit_button)
def _reinit_button(self, s) -> None:
def _reinit_button(self, widget: Self) -> None:
for child in self.stale_panel.get_children():
if child.enum == ModButton.UNHIGHLIGHT_STALE:
child.set_sensitive(False)

View File

@ -131,7 +131,7 @@ class Statusbar(Gtk.Grid):
def get_text(self) -> str:
area = self.statusbar.get_message_area()
label = area.get_children()[0]
return label.get_text()
return str(label.get_text())
def set_by_context(
self, context: Union[NotebookPage, "ServerTab"], string: str

View File

@ -66,7 +66,7 @@ class ContextMixin(TreeView):
item.connect("activate", self._on_menu_click, row)
if row == ContextMenu.SHOW_MODS:
item.set_sensitive(self.is_modded())
item.set_sensitive(self.is_modded()) # type: ignore
if row == ContextMenu.ADD_NOTE:
if self.controller.has_note():

View File

@ -21,13 +21,13 @@ class CursorMixin:
case Gdk.KEY_l | Gdk.KEY_Right:
if event.state is Gdk.ModifierType.CONTROL_MASK:
return
self.emitter.emit("request_button_box_focus")
self.emitter.emit("request_button_box_focus") # type: ignore
case _:
return False
def _move_cursor(self, position: CursorPosition) -> bool:
cur_row = self.get_focused_row_index()
model = self.get_model()
cur_row = self.get_focused_row_index() # type: ignore
model = self.get_model() # type: ignore
if model:
end = len(model) - 1
else:
@ -55,5 +55,5 @@ class CursorMixin:
dest = end
path = Gtk.TreePath.new_from_indices([dest])
self.set_cursor(path)
self.set_cursor(path) # type: ignore
return True

View File

@ -7,10 +7,9 @@ from gi.repository import Gtk, Gdk # noqa
class HelpMenuMixin:
def _on_esc_keypress(
self, widget: Gtk.Widget, event: Gdk.EventKey
) -> Literal[True]:
def _on_esc_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> bool:
if event.keyval == Gdk.KEY_Escape:
prior = self.controller.get_prior_page()
prior = self.controller.get_prior_page() # type: ignore
self.controller.open_page(prior) # type: ignore
return True
return False

View File

@ -1,16 +1,15 @@
from dzgui.views.trees.tree_base import TreeView
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa E402
class ModsMixin:
def _on_mod_row_activated(self,
tree: TreeView,
path: Gtk.TreePath,
column: Gtk.TreeViewColumn
) -> None:
def _on_mod_row_activated(
self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn
) -> None:
path = self.get_focused_row_path()
self.controller.open_mod_page(path)
path = self.get_focused_row_path() # type: ignore
self.controller.open_mod_page(path) # type: ignore

View File

@ -8,21 +8,28 @@ from gi.repository import Gtk, Gdk # noqa
class ScrollableMixin:
def _on_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
def _on_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> bool:
match event.keyval:
case Gdk.KEY_k | Gdk.KEY_Up:
self._set_adjustment(VAdjustment.UP)
return True
case Gdk.KEY_Down | Gdk.KEY_j:
self._set_adjustment(VAdjustment.DOWN)
return True
case Gdk.KEY_g:
self._set_adjustment(VAdjustment.TOP)
return True
case Gdk.KEY_G:
self._set_adjustment(VAdjustment.BOTTOM)
return True
case Gdk.KEY_l | Gdk.KEY_Right:
self.controller.get_emitter().emit("request_button_box_focus")
self.controller.get_emitter().emit("request_button_box_focus") # type: ignore
return True
case _:
return False
def _set_adjustment(self, adjustment: VAdjustment) -> None:
vadj = self.get_vadjustment()
vadj = self.get_vadjustment() # type: ignore
match adjustment:
case VAdjustment.TOP:
adj = vadj.get_lower()

View File

@ -5,17 +5,20 @@ from dzgui.util.strings import navigation, servers, vim, key_header, key_context
from dzgui.util.css import add_class
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk # noqa E402
from gi.repository import Gtk # noqa E402
if TYPE_CHECKING:
from dzgui.controllers.mc import Controller
class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
class Keybindings(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore
"""
Notebook page holding a prearranged grid
of keybindings and their descriptions
"""
def __init__(self, controller: "Controller") -> None:
super().__init__()
@ -57,9 +60,7 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
if not sep:
grid.attach(desc, col, row, w, h)
else:
grid.attach_next_to(
desc, sep, Gtk.PositionType.BOTTOM, w, h
)
grid.attach_next_to(desc, sep, Gtk.PositionType.BOTTOM, w, h)
row += 1
sep = None
grid.attach_next_to(frame, desc, Gtk.PositionType.RIGHT, w, h)
@ -67,18 +68,14 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
l_spacer = Gtk.Label(label="")
r_spacer = Gtk.Label(label="")
grid.attach(l_spacer, col, row + 1, w, h)
grid.attach_next_to(
r_spacer, l_spacer, Gtk.PositionType.RIGHT, w, h
)
grid.attach_next_to(r_spacer, l_spacer, Gtk.PositionType.RIGHT, w, h)
row += 1
return grid
def build_sidebar(self, categories: list) -> Gtk.Grid:
row, col = 0, 0
w, h = 1, 1
sidebar = Gtk.Grid(
row_homogeneous=True, orientation=Gtk.Orientation.VERTICAL
)
sidebar = Gtk.Grid(row_homogeneous=True, orientation=Gtk.Orientation.VERTICAL)
for cat in categories:
label = Gtk.Label(label=cat)
add_class(label, "left-label")
@ -96,9 +93,7 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
row, column = 1, 1
w, h = 1, 1
sidebar = self.build_sidebar(
key_contexts
)
sidebar = self.build_sidebar(key_contexts)
separator = Gtk.Separator()
keys_box = self.build_keys(items)
@ -106,6 +101,6 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
grid.attach_next_to(separator, sidebar, Gtk.PositionType.RIGHT, w, h)
grid.attach_next_to(keys_box, separator, Gtk.PositionType.RIGHT, w, h)
return grid
def grab_content_area(self) -> None:
self.box.grab_focus()

View File

@ -52,8 +52,8 @@ class PreConnectionAssistant(Gtk.ScrolledWindow):
spacing=10,
)
self.rules: dict[Any]
self.mods: list["DayzMod"]
# self.rules: dict[Any]
# self.mods: list["DayzMod"]
self.controller.register_widget("preconnect", self)
@ -97,7 +97,7 @@ class PreConnectionAssistant(Gtk.ScrolledWindow):
self.tree_frame = HeadingFrame(self.tree_box, preconnect.mods)
self.warnings = []
self.warnings: list[WarningLabel] = []
# TODO: populate with strings and icons
# set visibility if warnings > 1
# warning category enums with matching strings
@ -162,7 +162,7 @@ class PreConnectionAssistant(Gtk.ScrolledWindow):
def download_mods(self) -> None:
pass
def connect(self) -> None:
def connect_server(self) -> None:
# TODO: add to history file and list store
"""
spawn dialog in thread

View File

@ -134,7 +134,8 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
self.get_selection().unselect_path(path)
def focus_first_row(self) -> None:
self.set_cursor(0)
path = Gtk.TreePath.new_from_indices([0])
self.set_cursor(path)
def get_value_at_index(self, index: int) -> str:
(model, pathlist) = self.get_model_and_pathlist()
@ -143,7 +144,7 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
path = pathlist[0]
tree_iter = model.get_iter(path)
value = model.get_value(tree_iter, index)
return value
return str(value)
def get_name(self) -> str:
name = self.get_value_at_index(0)

View File

@ -306,7 +306,7 @@ class ServerTreeView(ContextMixin, TreeView): # type: ignore
def get_record(self) -> Record | None:
if self.loaded is False:
return
return None
r = self.get_record_string()
try:
ip, gameport, qport = r.split(":")