From e03c6905c6715fa9d36e4d0007a4a047269e5256 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 10 Nov 2026 06:30:12 +0900 Subject: [PATCH] chore: clear typehinting errors --- dzgui/api/acf.py | 2 +- dzgui/api/mods.py | 6 +----- dzgui/config/xdg.py | 4 ++-- dzgui/util/flatpak.py | 8 +++++-- dzgui/views/dialogs/early_alert.py | 2 +- dzgui/views/dialogs/filepicker.py | 12 +++++------ dzgui/views/dialogs/uninstall.py | 8 +++---- dzgui/views/dialogs/wizard.py | 8 +++---- dzgui/views/pages/keys.py | 7 +++--- dzgui/views/pages/options.py | 5 +++-- dzgui/views/trees/tree_base.py | 34 ++++++++---------------------- 11 files changed, 41 insertions(+), 55 deletions(-) diff --git a/dzgui/api/acf.py b/dzgui/api/acf.py index ce243a4..ba36ce0 100644 --- a/dzgui/api/acf.py +++ b/dzgui/api/acf.py @@ -111,7 +111,7 @@ class WorkshopACF(ACF): def __init__(self, file: Path) -> None: super().__init__(file) - def unpack(self, d: dict, lines: list[Any] = []) -> str: + def unpack(self, d: dict[str, str], lines: list[Any] = []) -> str: t1 = "AppWorkshop" t2 = ("WorkshopItemsInstalled", "WorkshopItemDetails") for k, v in d.items(): diff --git a/dzgui/api/mods.py b/dzgui/api/mods.py index c6a076d..f8a9814 100644 --- a/dzgui/api/mods.py +++ b/dzgui/api/mods.py @@ -114,10 +114,6 @@ def get_delimited_mods(steam_path: Path) -> list[Any]: return parse_mods(mods) -def get_missing_mods(local: list, remote: list) -> list: - return [mod for mod in remote if mod not in local] - - def _hash(uid: str, use_custom: bool = False) -> str: md5 = hashlib.md5() md5.update(uid.encode("ascii")) @@ -152,7 +148,7 @@ def remove_stale_signatures( def find_stale_mods(config: Path) -> list[int]: - def push_record(rec: str) -> list: + def push_record(rec: str) -> list[int]: record = fqip_to_record(rec) if record is None: return [] diff --git a/dzgui/config/xdg.py b/dzgui/config/xdg.py index b72ea7b..532c73f 100644 --- a/dzgui/config/xdg.py +++ b/dzgui/config/xdg.py @@ -51,7 +51,7 @@ def is_writeable(path_str: str) -> bool: return True -def get_xdg_paths() -> dict: +def get_xdg_paths() -> dict[str, Path]: home = Path.home() xdg_paths = { "XDG_CONFIG_HOME": home / ".config", @@ -73,7 +73,7 @@ def get_xdg_paths() -> dict: return resolved_paths -def parse_filepaths(xdg: dict) -> Xdg: +def parse_filepaths(xdg: dict[str, Path]) -> Xdg: config = xdg["XDG_CONFIG_HOME"] state = xdg["XDG_STATE_HOME"] share = xdg["XDG_DATA_HOME"] diff --git a/dzgui/util/flatpak.py b/dzgui/util/flatpak.py index 7372fd6..d86663d 100644 --- a/dzgui/util/flatpak.py +++ b/dzgui/util/flatpak.py @@ -1,12 +1,16 @@ import logging import subprocess +from typing import TYPE_CHECKING from dzgui.const.constants import APP_NAME, FLATPAK_APPID, GTK_APP_ID, TMP_PATH logger = logging.getLogger(APP_NAME) +if TYPE_CHECKING: + from pathlib import Path -def apply_overrides(xdg: dict[str, str]) -> None: + +def apply_overrides(xdg: dict[str, "Path"]) -> None: try: # NOTE: D-Bus registration required for sandbox args = [ @@ -19,7 +23,7 @@ def apply_overrides(xdg: dict[str, str]) -> None: subprocess.run([*args], capture_output=True) paths: list[str] = [] - paths.extend([*xdg.values()]) + paths.extend([str(path) for path in xdg.values()]) paths.append(TMP_PATH) for path in paths: diff --git a/dzgui/views/dialogs/early_alert.py b/dzgui/views/dialogs/early_alert.py index b7032a0..ac4dfd4 100644 --- a/dzgui/views/dialogs/early_alert.py +++ b/dzgui/views/dialogs/early_alert.py @@ -46,7 +46,7 @@ class AbortDialog(ColorAwareApp, Gtk.MessageDialog): # type: ignore self.connect("response", self._on_response) - self.run() + self.run() # type: ignore[no-untyped-call] self.destroy() def _on_response(self, dialog: Self, response: Gtk.ResponseType) -> None: diff --git a/dzgui/views/dialogs/filepicker.py b/dzgui/views/dialogs/filepicker.py index 2048598..f72c70d 100644 --- a/dzgui/views/dialogs/filepicker.py +++ b/dzgui/views/dialogs/filepicker.py @@ -16,14 +16,14 @@ class FilePicker(Gtk.FileChooserDialog): transient_for=parent, resizable=True, ) - self.add_buttons("_Cancel", Gtk.ResponseType.CANCEL) - self.add_buttons("_Save", Gtk.ResponseType.OK) + self.add_buttons("_Cancel", Gtk.ResponseType.CANCEL) # type: ignore[no-untyped-call] + self.add_buttons("_Save", Gtk.ResponseType.OK) # type: ignore[no-untyped-call] self.set_default_response(Gtk.ResponseType.OK) self.set_current_name(picker.placeholder) def pick_file(self) -> Path | None: - res = self.run() + res = self.run() # type: ignore[no-untyped-call] if res in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT): self.destroy() return None @@ -43,12 +43,12 @@ class FolderPicker(Gtk.FileChooserDialog): parent=parent, resizable=True, ) - self.add_buttons("_Cancel", Gtk.ResponseType.CANCEL) - self.add_buttons("_OK", Gtk.ResponseType.OK) + self.add_buttons("_Cancel", Gtk.ResponseType.CANCEL) # type: ignore[no-untyped-call] + self.add_buttons("_OK", Gtk.ResponseType.OK) # type: ignore[no-untyped-call] self.set_default_response(Gtk.ResponseType.OK) def pick_folder(self) -> Path | None: - res = self.run() + res = self.run() # type: ignore[no-untyped-call] if res in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.DELETE_EVENT): self.destroy() return None diff --git a/dzgui/views/dialogs/uninstall.py b/dzgui/views/dialogs/uninstall.py index 3e7d2e7..b27f1d6 100644 --- a/dzgui/views/dialogs/uninstall.py +++ b/dzgui/views/dialogs/uninstall.py @@ -22,7 +22,7 @@ from gi.repository import Gtk, GLib, Pango # noqa E402 class Assistant(Gtk.Assistant): - def __init__(self, is_deck: bool, paths: dict[str, str]): + def __init__(self, is_deck: bool, paths: dict[str, Path]): super().__init__() if is_deck: # NOTE: deemed to be "safe" dimensions that exclude taskbar size @@ -63,7 +63,7 @@ class Assistant(Gtk.Assistant): class Window(Gtk.Window): - def __init__(self, is_deck: bool, paths: dict[str, str]) -> None: + def __init__(self, is_deck: bool, paths: dict[str, Path]) -> None: super().__init__(title=APP_NAME, icon_name=APP_NAME) self.assistant = Assistant(is_deck, paths) @@ -121,7 +121,7 @@ class CheckboxWithPath(CheckboxWithLabel): class UninstallPage(ScrolledWizardPage): - def __init__(self, paths: dict[str, str], pyapp: str | None): + def __init__(self, paths: dict[str, Path], pyapp: str | None): super().__init__(heading=uninstall.pg1_heading, description=uninstall.pg1_blurb) self.pyapp = pyapp @@ -219,7 +219,7 @@ class UninstallPage(ScrolledWizardPage): class UninstallWizard(ColorAwareApp, Gtk.Application): # type: ignore - def __init__(self, is_deck: bool, paths: dict[str, str]) -> None: + def __init__(self, is_deck: bool, paths: dict[str, Path]) -> None: super().__init__() config = Path(paths["XDG_CONFIG_HOME"]) if not config.is_dir() or not config.joinpath("config.json").is_file(): diff --git a/dzgui/views/dialogs/wizard.py b/dzgui/views/dialogs/wizard.py index 9a44e09..c2f38af 100644 --- a/dzgui/views/dialogs/wizard.py +++ b/dzgui/views/dialogs/wizard.py @@ -426,7 +426,7 @@ class PreferencesPage(EnumeratedWizardPage): class FlatpakOverridePage(EnumeratedWizardPage): - def __init__(self, xdg_paths: dict[str, str]) -> None: + def __init__(self, xdg_paths: dict[str, Path]) -> None: super().__init__( enum=PageNum.FLATPAK, heading=wizard.heading_flatpak, @@ -476,7 +476,7 @@ class CompletionPage(EnumeratedWizardPage): class Assistant(Gtk.Assistant): - def __init__(self, is_deck: bool, XDG: "Xdg", xdg_paths: dict[str, str]): + def __init__(self, is_deck: bool, XDG: "Xdg", xdg_paths: dict[str, Path]): super().__init__() if is_deck: # NOTE: deemed to be "safe" dimensions that exclude taskbar size @@ -781,7 +781,7 @@ class SteamPathPage(EnumeratedWizardPage): class SetupWizard(ColorAwareApp, Gtk.Application): # type: ignore - def __init__(self, is_deck: bool, XDG: "Xdg", xdg_paths: dict[str, str]) -> None: + def __init__(self, is_deck: bool, XDG: "Xdg", xdg_paths: dict[str, Path]) -> None: super().__init__() GLib.set_prgname(APP_NAME) self.win = Window(is_deck, XDG, xdg_paths) @@ -792,7 +792,7 @@ class SetupWizard(ColorAwareApp, Gtk.Application): # type: ignore class Window(Gtk.Window): - def __init__(self, is_deck: bool, XDG: "Xdg", xdg_paths: dict[str, str]) -> None: + def __init__(self, is_deck: bool, XDG: "Xdg", xdg_paths: dict[str, Path]) -> None: super().__init__(title=APP_NAME, icon_name=APP_NAME) self.assistant = Assistant(is_deck, XDG, xdg_paths) diff --git a/dzgui/views/pages/keys.py b/dzgui/views/pages/keys.py index ea12476..1da56d3 100644 --- a/dzgui/views/pages/keys.py +++ b/dzgui/views/pages/keys.py @@ -13,6 +13,7 @@ if TYPE_CHECKING: from dzgui.controllers.mc import Controller +# TODO: refactor into autopopulated ListStores class Keybindings(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore """ Notebook page holding a prearranged grid @@ -35,7 +36,7 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore self.connect("key-press-event", self._on_keypress) - def build_keys(self, items: list) -> Gtk.Grid: + def build_keys(self, items: list[dict[str, str]]) -> Gtk.Grid: grid = Gtk.Grid(row_spacing=10, column_homogeneous=True) grid.set_halign(Gtk.Align.START) row, col = 1, 0 @@ -72,7 +73,7 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore row += 1 return grid - def build_sidebar(self, categories: list) -> Gtk.Grid: + def build_sidebar(self, categories: list[str]) -> Gtk.Grid: row, col = 0, 0 w, h = 1, 1 sidebar = Gtk.Grid(row_homogeneous=True, orientation=Gtk.Orientation.VERTICAL) @@ -83,7 +84,7 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore sidebar.attach(label, col, row, w, h) return sidebar - def build_grid(self, items: list) -> Gtk.Grid: + def build_grid(self, items: list[dict[str, str]]) -> Gtk.Grid: grid = Gtk.Grid( row_spacing=20, halign=Gtk.Align.CENTER, diff --git a/dzgui/views/pages/options.py b/dzgui/views/pages/options.py index 718c556..6269e89 100644 --- a/dzgui/views/pages/options.py +++ b/dzgui/views/pages/options.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Callable, TYPE_CHECKING +from typing import Any, Callable, TYPE_CHECKING from dzgui.api import pefile as PeFile from dzgui.api.steam import get_last_updated @@ -406,7 +406,8 @@ class Options(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore def _on_link_button_clicked(self, button: Gtk.Button, url: str) -> None: open_links.open_link_by_url(url) - def _make_grid(self, rows: list) -> Gtk.Grid: + # TODO: use FlowBox + def _make_grid(self, rows: list[list[Any]]) -> Gtk.Grid: grid = Gtk.Grid( orientation=Gtk.Orientation.VERTICAL, column_spacing=10, diff --git a/dzgui/views/trees/tree_base.py b/dzgui/views/trees/tree_base.py index 5d7b6a2..0919b08 100644 --- a/dzgui/views/trees/tree_base.py +++ b/dzgui/views/trees/tree_base.py @@ -79,11 +79,6 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore index = path.get_indices()[0] return index - def get_selected_records(self) -> list: - sel = self.get_selection() - model, rows = sel.get_selected_rows() - return [model[row] for row in rows] - def _on_keypress(self, treeview: Gtk.TreeView, event: Gdk.EventKey) -> bool: from dzgui.views.trees.tree_servers import ServerTreeView @@ -145,9 +140,11 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore self.set_cursor(path) def get_value_at_index(self, index: int) -> Any: - (model, pathlist) = self.get_model_and_pathlist() + model, pathlist = self.get_model_and_pathlist() if len(pathlist) < 1: return "" + if model is None: + return "" path = pathlist[0] tree_iter = model.get_iter(path) value = model.get_value(tree_iter, index) @@ -161,20 +158,16 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore sel = self.get_selection() self._on_tree_selection_changed(sel) - def get_model_and_pathlist(self) -> tuple: + def get_model_and_pathlist( + self, + ) -> tuple[Gtk.TreeModel | None, list[Gtk.TreePath]]: select = self.get_selection() sels = select.get_selected_rows() - (model, pathlist) = sels + model: Gtk.TreeModel | None + pathlist: list[Gtk.TreePath] + model, pathlist = sels return (model, pathlist) - # @deprecated("Currently unused") - # def get_mpath(self) -> Optional[Gtk.TreePath]: - # (model, pathlist) = self.get_model_and_pathlist() - # if len(pathlist) < 1: - # return None - # path = pathlist[0] - # return path - def _on_row_activated( self, treeview: Gtk.TreeView, @@ -189,15 +182,6 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore return True return False - # @deprecated("unused") - # def get_selected_row(self) -> Optional[Gtk.TreeModelRow]: - # ind = self.get_selected_row_index() - # model = self.get_model() - # if model is None: - # return None - # row = model[ind] - # return row - def get_col_value_by_path_index(self, path: Gtk.TreePath, index: int) -> Any: model = self.get_model() if model is None: