From 25640751a588b43e0abda5ddc2e2edea269edf67 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 5 May 2026 23:37:31 +0900 Subject: [PATCH] chore: clear typehinting errors --- dzgui/api/mods.py | 21 +-------------------- dzgui/api/servers.py | 13 ++++--------- dzgui/api/steam.py | 4 ++-- dzgui/config/query.py | 2 +- dzgui/controllers/mc.py | 11 ++++------- dzgui/managers/connection.py | 8 ++++---- dzgui/model/proxy_model.py | 22 ++++++++++++++-------- dzgui/model/servers.py | 6 ++++-- dzgui/util/ip.py | 4 ++-- dzgui/views/base.py | 3 +-- dzgui/views/components/buttons.py | 4 ++-- dzgui/views/components/frame.py | 4 ++-- dzgui/views/components/mod_panel.py | 4 ++-- dzgui/views/components/statusbar.py | 2 +- dzgui/views/mixins/context_mixin.py | 2 +- dzgui/views/mixins/cursor_mixin.py | 8 ++++---- dzgui/views/mixins/help_menu_mixin.py | 7 +++---- dzgui/views/mixins/mods_mixin.py | 13 ++++++------- dzgui/views/mixins/scrollable_mixin.py | 13 ++++++++++--- dzgui/views/pages/keys.py | 25 ++++++++++--------------- dzgui/views/pages/preconnect.py | 8 ++++---- dzgui/views/trees/tree_base.py | 5 +++-- dzgui/views/trees/tree_servers.py | 2 +- 23 files changed, 86 insertions(+), 105 deletions(-) diff --git a/dzgui/api/mods.py b/dzgui/api/mods.py index 11d0683..29c154d 100644 --- a/dzgui/api/mods.py +++ b/dzgui/api/mods.py @@ -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")) diff --git a/dzgui/api/servers.py b/dzgui/api/servers.py index 9b63496..552a8ef 100644 --- a/dzgui/api/servers.py +++ b/dzgui/api/servers.py @@ -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"] diff --git a/dzgui/api/steam.py b/dzgui/api/steam.py index 699e004..bbab06f 100644 --- a/dzgui/api/steam.py +++ b/dzgui/api/steam.py @@ -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" diff --git a/dzgui/config/query.py b/dzgui/config/query.py index dc544d1..9c836cd 100644 --- a/dzgui/config/query.py +++ b/dzgui/config/query.py @@ -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: diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index fb77c01..eabdeff 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -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) diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index 25c9f37..0715568 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -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) diff --git a/dzgui/model/proxy_model.py b/dzgui/model/proxy_model.py index 472bf1a..623590e 100644 --- a/dzgui/model/proxy_model.py +++ b/dzgui/model/proxy_model.py @@ -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: diff --git a/dzgui/model/servers.py b/dzgui/model/servers.py index 2fb6c63..a88502a 100644 --- a/dzgui/model/servers.py +++ b/dzgui/model/servers.py @@ -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() diff --git a/dzgui/util/ip.py b/dzgui/util/ip.py index ae3f9d8..d2edf89 100644 --- a/dzgui/util/ip.py +++ b/dzgui/util/ip.py @@ -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] diff --git a/dzgui/views/base.py b/dzgui/views/base.py index 7c4a2a6..899a715 100644 --- a/dzgui/views/base.py +++ b/dzgui/views/base.py @@ -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() diff --git a/dzgui/views/components/buttons.py b/dzgui/views/components/buttons.py index 390c0dc..399130a 100644 --- a/dzgui/views/components/buttons.py +++ b/dzgui/views/components/buttons.py @@ -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 diff --git a/dzgui/views/components/frame.py b/dzgui/views/components/frame.py index d08c16d..c782d5f 100644 --- a/dzgui/views/components/frame.py +++ b/dzgui/views/components/frame.py @@ -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) diff --git a/dzgui/views/components/mod_panel.py b/dzgui/views/components/mod_panel.py index 76298a6..e8b1372 100644 --- a/dzgui/views/components/mod_panel.py +++ b/dzgui/views/components/mod_panel.py @@ -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) diff --git a/dzgui/views/components/statusbar.py b/dzgui/views/components/statusbar.py index b334f0e..4bf04d1 100644 --- a/dzgui/views/components/statusbar.py +++ b/dzgui/views/components/statusbar.py @@ -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 diff --git a/dzgui/views/mixins/context_mixin.py b/dzgui/views/mixins/context_mixin.py index be654d2..a384c1f 100644 --- a/dzgui/views/mixins/context_mixin.py +++ b/dzgui/views/mixins/context_mixin.py @@ -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(): diff --git a/dzgui/views/mixins/cursor_mixin.py b/dzgui/views/mixins/cursor_mixin.py index dd7d2ac..58087e9 100644 --- a/dzgui/views/mixins/cursor_mixin.py +++ b/dzgui/views/mixins/cursor_mixin.py @@ -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 diff --git a/dzgui/views/mixins/help_menu_mixin.py b/dzgui/views/mixins/help_menu_mixin.py index 1af135d..85a5361 100644 --- a/dzgui/views/mixins/help_menu_mixin.py +++ b/dzgui/views/mixins/help_menu_mixin.py @@ -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 diff --git a/dzgui/views/mixins/mods_mixin.py b/dzgui/views/mixins/mods_mixin.py index 638b8db..8cce682 100644 --- a/dzgui/views/mixins/mods_mixin.py +++ b/dzgui/views/mixins/mods_mixin.py @@ -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 diff --git a/dzgui/views/mixins/scrollable_mixin.py b/dzgui/views/mixins/scrollable_mixin.py index 775a522..79d83b8 100644 --- a/dzgui/views/mixins/scrollable_mixin.py +++ b/dzgui/views/mixins/scrollable_mixin.py @@ -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() diff --git a/dzgui/views/pages/keys.py b/dzgui/views/pages/keys.py index 46ef945..0c75c32 100644 --- a/dzgui/views/pages/keys.py +++ b/dzgui/views/pages/keys.py @@ -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() diff --git a/dzgui/views/pages/preconnect.py b/dzgui/views/pages/preconnect.py index d989165..a0ad525 100644 --- a/dzgui/views/pages/preconnect.py +++ b/dzgui/views/pages/preconnect.py @@ -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 diff --git a/dzgui/views/trees/tree_base.py b/dzgui/views/trees/tree_base.py index be14d36..7f00d99 100644 --- a/dzgui/views/trees/tree_base.py +++ b/dzgui/views/trees/tree_base.py @@ -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) diff --git a/dzgui/views/trees/tree_servers.py b/dzgui/views/trees/tree_servers.py index febe125..9ddc691 100644 --- a/dzgui/views/trees/tree_servers.py +++ b/dzgui/views/trees/tree_servers.py @@ -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(":")