chore: clear typehinting errors

This commit is contained in:
aclist committed 2026-05-05 23:37:31 +09:00
1 parent e64feac425
commit 25640751a5
23 files changed
+85 -104

No files matched your search

+1 -20
View File
@@ -1,4 +1,3 @@
import dayzquery
import hashlib import hashlib
import logging import logging
import shlex import shlex
@@ -9,7 +8,7 @@ from dataclasses import dataclass
from pathlib import Path from pathlib import Path
import dzgui.api.pefile as PeFile 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 ( from dzgui.const.constants import (
APP_NAME, APP_NAME,
APPID_DAYZ, APPID_DAYZ,
@@ -17,7 +16,6 @@ from dzgui.const.constants import (
WORKSHOP_PATH, WORKSHOP_PATH,
) )
from dzgui.util.strings import checkmark
from dzgui.config.query import lookup from dzgui.config.query import lookup
from dzgui.const.enum import Preferences 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] 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: def _hash(uid: str) -> str:
md5 = hashlib.md5() md5 = hashlib.md5()
md5.update(uid.encode("ascii")) md5.update(uid.encode("ascii"))
+4 -9
View File
@@ -443,12 +443,12 @@ def get_rules(record: Record) -> list["DayzMod"]:
return [mod for mod in mods] 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 Used with numeric Battlemetrics IDs
""" """
try: try:
resolved = map_id_to_record(key, addr) resolved = map_id_to_record(key, server_id)
return query_direct(resolved.ip, resolved.qport, full) return query_direct(resolved.ip, resolved.qport, full)
except Exception as e: except Exception as e:
logger.critical(e) logger.critical(e)
@@ -470,11 +470,11 @@ def query_playercount(record: Record) -> tuple[int, int] | None:
return 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) record = short_ip_to_record(addr)
return query_by_record(record, full) 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: if full:
try: try:
info = a2s.info((record.ip, record.qport), 3.0) 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}" 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: def response_to_record(res: dict) -> Record:
ip = res["addr"].split(":")[0] ip = res["addr"].split(":")[0]
gameport = res["gameport"] gameport = res["gameport"]
+2 -2
View File
@@ -83,7 +83,7 @@ def find_user_id(path: Path) -> str | None:
j = json.loads(vdf) j = json.loads(vdf)
for user in j["users"]: for user in j["users"]:
if j["users"][user]["MostRecent"] == "1": if j["users"][user]["MostRecent"] == "1":
return user return str(user)
return None return None
except Exception as e: except Exception as e:
logger.warn(e) logger.warn(e)
@@ -91,7 +91,7 @@ def find_user_id(path: Path) -> str | None:
def vdf2json(path: Path) -> str: def vdf2json(path: Path) -> str:
def _istr(indent, string): def _istr(indent: int, string: str):
return (indent * " ") + string return (indent * " ") + string
jbuf = "{\n" jbuf = "{\n"
+1 -1
View File
@@ -48,7 +48,7 @@ def get_favorites(path: Path) -> list[str]:
def enum_to_key(enum: Preferences) -> str: def enum_to_key(enum: Preferences) -> str:
return enum.dict["key"] return str(enum.dict["key"])
def get_client_index(client: str) -> int: def get_client_index(client: str) -> int:
+4 -7
View File
@@ -46,6 +46,7 @@ if TYPE_CHECKING:
from dzgui.views.components.filter_panel import FilterPanel from dzgui.views.components.filter_panel import FilterPanel
from dzgui.views.components.right_panel import RightPanel from dzgui.views.components.right_panel import RightPanel
from dzgui.views.components.statusbar import Statusbar from dzgui.views.components.statusbar import Statusbar
from dzgui.views.pages.preconnect import PreConnectionAssistant
from dzgui.views.pages.servers import ServerNotebook from dzgui.views.pages.servers import ServerNotebook
from dzgui.views.trees.tree_log import LogTreeView from dzgui.views.trees.tree_log import LogTreeView
from dzgui.views.trees.tree_menu import MenuTreeView from dzgui.views.trees.tree_menu import MenuTreeView
@@ -199,7 +200,6 @@ class Controller(GObject.GObject):
except Exception: except Exception:
return return
case ButtonType.MODS: case ButtonType.MODS:
# TODO: reload using refresh button, rather than on demand?
self.load_mods() self.load_mods()
self.open_page(button.opens) self.open_page(button.opens)
@@ -393,7 +393,7 @@ class Controller(GObject.GObject):
if addr.isdigit(): if addr.isdigit():
config_man = self.get_config_man() config_man = self.get_config_man()
key = config_man.lookup(Preferences.BM) key = config_man.lookup(Preferences.BM)
ConnectionManager(self).connect_by_id(addr, key) ConnectionManager(self).connect_by_id(int(addr), key)
else: else:
ConnectionManager(self).connect_by_ip(addr) ConnectionManager(self).connect_by_ip(addr)
@@ -452,7 +452,7 @@ class Controller(GObject.GObject):
def get_modtreeview(self) -> "ModTreeView": def get_modtreeview(self) -> "ModTreeView":
return self.mediator.modtreeview return self.mediator.modtreeview
def get_exit_event(self) -> None: def get_exit_event(self) -> threading.Event:
return self.exit_event return self.exit_event
def set_exit_event(self) -> None: 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: def open_connection_assistant(self, res: "PreReqs", mods: list["DayzMod"]) -> None:
self.open_page(NotebookPage.CONNECTION) self.open_page(NotebookPage.CONNECTION)
self.mediator.preconnect.populate(res, mods) 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() ind = self.config_man.get_start_tab()
self.get_servers().notebook.set_current_page(ind) self.get_servers().notebook.set_current_page(ind)
+4 -4
View File
@@ -1,7 +1,7 @@
import shutil import shutil
from pathlib import Path 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.pefile as PeFile
import dzgui.api.servers as Servers import dzgui.api.servers as Servers
@@ -30,8 +30,8 @@ class ConnectionManager:
self.thread_man = ThreadingManager(controller) self.thread_man = ThreadingManager(controller)
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
def connect_by_id(self, addr: str, key: str) -> None: def connect_by_id(self, _id: int, key: str) -> None:
res = Servers.query_by_id(addr, key, full=True) res = Servers.query_by_id(_id, key, full=True)
self._prepare_connection(res) self._prepare_connection(res)
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
@@ -89,7 +89,7 @@ class ConnectionManager:
StoredFunc(self._present_details_dialog, details), destroy_first=True 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) mods = Servers.get_rules(record)
steam_path = self.controller.query_config(Preferences.DEFAULT) steam_path = self.controller.query_config(Preferences.DEFAULT)
local = get_local_mod_ids(steam_path) local = get_local_mod_ids(steam_path)
+14 -8
View File
@@ -1,6 +1,6 @@
import re import re
from typing import Any, Optional, TYPE_CHECKING from typing import Any, Optional, TYPE_CHECKING, Union
from warnings import deprecated from warnings import deprecated
from dzgui.const.enum import FilterMode from dzgui.const.enum import FilterMode
@@ -14,6 +14,7 @@ if TYPE_CHECKING:
from dzgui.model.servers import NewPlayerCount from dzgui.model.servers import NewPlayerCount
# TODO: annotate list contents (list[list[Any]])
class ProxyModelManager: class ProxyModelManager:
""" """
Manages access to cached FastInsertListStore resources and Manages access to cached FastInsertListStore resources and
@@ -34,7 +35,7 @@ class ProxyModelManager:
# TODO: list typehints # TODO: list typehints
self.control_model: list | None = None self.control_model: list | None = None
self.filtered: list | None = None self.filtered: list = []
self.success = True self.success = True
def has_control_model(self) -> bool: def has_control_model(self) -> bool:
@@ -60,6 +61,8 @@ class ProxyModelManager:
# self.control_model.append(row) # self.control_model.append(row)
def remove_row_from_control(self, record: "Record") -> None: def remove_row_from_control(self, record: "Record") -> None:
if self.control_model is None:
return
addr = f"{record.ip}:{record.gameport}" addr = f"{record.ip}:{record.gameport}"
qport = record.qport qport = record.qport
for row in self.control_model: for row in self.control_model:
@@ -75,7 +78,9 @@ class ProxyModelManager:
def get_proxy_model(self) -> "FastInsertListStore": def get_proxy_model(self) -> "FastInsertListStore":
return self.proxy_model 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 Native Gtk.TreeView.refilter() method was not performant enough
when running in the main loop with 40k+ records when running in the main loop with 40k+ records
@@ -91,7 +96,7 @@ class ProxyModelManager:
cache = self.filter_cache[filters] cache = self.filter_cache[filters]
self.set_proxy_model(cache[0]) self.set_proxy_model(cache[0])
self.set_filtered(cache[1]) self.set_filtered(cache[1])
return return None
match mode: match mode:
case FilterMode.INITIAL: case FilterMode.INITIAL:
@@ -224,10 +229,11 @@ class ProxyModelManager:
def convert_model_to_list(self, model: "FastInsertListStore") -> list: def convert_model_to_list(self, model: "FastInsertListStore") -> list:
return [[el for el in row] for row in model] 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: if rows is None:
rows = [] self.filtered = []
self.filtered = rows else:
self.filtered = rows
def get_filtered(self) -> list: def get_filtered(self) -> list:
return self.filtered return self.filtered
@@ -248,7 +254,7 @@ class ProxyModelManager:
return self.control_model return self.control_model
def wipe_cache(self, full: bool = False) -> None: def wipe_cache(self, full: bool = False) -> None:
self.filtered = None self.filtered = []
self.filter_cache = {} self.filter_cache = {}
def push(self, data: list[Any]) -> None: def push(self, data: list[Any]) -> None:
+4 -2
View File
@@ -187,10 +187,10 @@ class ServerModelManager:
self._push_data(parsed) self._push_data(parsed)
@call_on_thread(dialog.querying) @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() config_man = self.controller.get_config_man()
key = config_man.lookup(Preferences.BM) 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) self._parse_single_record(res)
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
@@ -266,6 +266,8 @@ class ServerModelManager:
# NOTE: expected to only contain one item # NOTE: expected to only contain one item
records = Servers.parse_json([response]) records = Servers.parse_json([response])
server = records[0] server = records[0]
if server is None:
return
proxy_man = self._get_proxy_man() proxy_man = self._get_proxy_man()
config_man = self.controller.get_config_man() config_man = self.controller.get_config_man()
+2 -2
View File
@@ -62,9 +62,9 @@ def get_coords(ips: "Path", ip: str) -> Coords:
if proc.returncode != 0: if proc.returncode != 0:
raise GeolocationError("Failed to split records") 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(",") fields = address.split(",")
upper = fields[1] upper = fields[1]
+1 -2
View File
@@ -194,11 +194,10 @@ class Notebook(ScrollableMixin, Gtk.Notebook): # type: ignore
def get_prior_page(self) -> NotebookPage: def get_prior_page(self) -> NotebookPage:
return self.prior_page 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(): for k, v in self.indexes.items():
if v == self.get_current_page(): if v == self.get_current_page():
return k return k
return None
def toggle_keybindings(self) -> None: def toggle_keybindings(self) -> None:
cur_page = self.get_page_by_enum() cur_page = self.get_page_by_enum()
+2 -2
View File
@@ -117,13 +117,13 @@ class RefreshButton(IconTextButton):
self.show_time(True) self.show_time(True)
GLib.timeout_add_seconds(1, self.decrement) GLib.timeout_add_seconds(1, self.decrement)
def decrement(self) -> type[GLib.SOURCE_REMOVE] | Literal[True]: def decrement(self) -> bool:
self.time -= 1 self.time -= 1
if self.time == 0: if self.time == 0:
self.time = 30 self.time = 30
self.show_time(False) self.show_time(False)
self.set_sensitive(True) self.set_sensitive(True)
return GLib.SOURCE_REMOVE return False
self.show_time(True) self.show_time(True)
return True return True
+2 -2
View File
@@ -1,17 +1,17 @@
from dzgui.util import strings, css, open_links from dzgui.util import css
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk # noqa from gi.repository import Gtk # noqa
class HeadingFrame(Gtk.Box): class HeadingFrame(Gtk.Box):
def __init__(self, widget: Gtk.Widget, heading: str) -> None: def __init__(self, widget: Gtk.Widget, heading: str) -> None:
super().__init__(orientation=Gtk.Orientation.VERTICAL) super().__init__(orientation=Gtk.Orientation.VERTICAL)
label = Gtk.Label(label=heading) label = Gtk.Label(label=heading)
label.set_halign(Gtk.Align.START) label.set_halign(Gtk.Align.START)
# TODO: rename selector
css.add_class(label, "settings-subheading") css.add_class(label, "settings-subheading")
frame = Gtk.Frame(hexpand=True) frame = Gtk.Frame(hexpand=True)
+2 -2
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.enum import ModButton
from dzgui.const.constants import NO_EXPAND, FILL, NO_PADDING from dzgui.const.constants import NO_EXPAND, FILL, NO_PADDING
@@ -64,7 +64,7 @@ class ModSelectionPanel(Gtk.Box):
self.connect("map", self._reinit_button) 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(): for child in self.stale_panel.get_children():
if child.enum == ModButton.UNHIGHLIGHT_STALE: if child.enum == ModButton.UNHIGHLIGHT_STALE:
child.set_sensitive(False) child.set_sensitive(False)
+1 -1
View File
@@ -131,7 +131,7 @@ class Statusbar(Gtk.Grid):
def get_text(self) -> str: def get_text(self) -> str:
area = self.statusbar.get_message_area() area = self.statusbar.get_message_area()
label = area.get_children()[0] label = area.get_children()[0]
return label.get_text() return str(label.get_text())
def set_by_context( def set_by_context(
self, context: Union[NotebookPage, "ServerTab"], string: str self, context: Union[NotebookPage, "ServerTab"], string: str
+1 -1
View File
@@ -66,7 +66,7 @@ class ContextMixin(TreeView):
item.connect("activate", self._on_menu_click, row) item.connect("activate", self._on_menu_click, row)
if row == ContextMenu.SHOW_MODS: 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 row == ContextMenu.ADD_NOTE:
if self.controller.has_note(): if self.controller.has_note():
+4 -4
View File
@@ -21,13 +21,13 @@ class CursorMixin:
case Gdk.KEY_l | Gdk.KEY_Right: case Gdk.KEY_l | Gdk.KEY_Right:
if event.state is Gdk.ModifierType.CONTROL_MASK: if event.state is Gdk.ModifierType.CONTROL_MASK:
return return
self.emitter.emit("request_button_box_focus") self.emitter.emit("request_button_box_focus") # type: ignore
case _: case _:
return False return False
def _move_cursor(self, position: CursorPosition) -> bool: def _move_cursor(self, position: CursorPosition) -> bool:
cur_row = self.get_focused_row_index() cur_row = self.get_focused_row_index() # type: ignore
model = self.get_model() model = self.get_model() # type: ignore
if model: if model:
end = len(model) - 1 end = len(model) - 1
else: else:
@@ -55,5 +55,5 @@ class CursorMixin:
dest = end dest = end
path = Gtk.TreePath.new_from_indices([dest]) path = Gtk.TreePath.new_from_indices([dest])
self.set_cursor(path) self.set_cursor(path) # type: ignore
return True return True
+3 -4
View File
@@ -7,10 +7,9 @@ from gi.repository import Gtk, Gdk # noqa
class HelpMenuMixin: class HelpMenuMixin:
def _on_esc_keypress( def _on_esc_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> bool:
self, widget: Gtk.Widget, event: Gdk.EventKey
) -> Literal[True]:
if event.keyval == Gdk.KEY_Escape: 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 self.controller.open_page(prior) # type: ignore
return True return True
return False
+6 -7
View File
@@ -1,16 +1,15 @@
from dzgui.views.trees.tree_base import TreeView from dzgui.views.trees.tree_base import TreeView
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa E402 from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa E402
class ModsMixin: class ModsMixin:
def _on_mod_row_activated(self, def _on_mod_row_activated(
tree: TreeView, self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn
path: Gtk.TreePath, ) -> None:
column: Gtk.TreeViewColumn
) -> None:
path = self.get_focused_row_path() path = self.get_focused_row_path() # type: ignore
self.controller.open_mod_page(path) self.controller.open_mod_page(path) # type: ignore
+10 -3
View File
@@ -8,21 +8,28 @@ from gi.repository import Gtk, Gdk # noqa
class ScrollableMixin: 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: match event.keyval:
case Gdk.KEY_k | Gdk.KEY_Up: case Gdk.KEY_k | Gdk.KEY_Up:
self._set_adjustment(VAdjustment.UP) self._set_adjustment(VAdjustment.UP)
return True
case Gdk.KEY_Down | Gdk.KEY_j: case Gdk.KEY_Down | Gdk.KEY_j:
self._set_adjustment(VAdjustment.DOWN) self._set_adjustment(VAdjustment.DOWN)
return True
case Gdk.KEY_g: case Gdk.KEY_g:
self._set_adjustment(VAdjustment.TOP) self._set_adjustment(VAdjustment.TOP)
return True
case Gdk.KEY_G: case Gdk.KEY_G:
self._set_adjustment(VAdjustment.BOTTOM) self._set_adjustment(VAdjustment.BOTTOM)
return True
case Gdk.KEY_l | Gdk.KEY_Right: 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: def _set_adjustment(self, adjustment: VAdjustment) -> None:
vadj = self.get_vadjustment() vadj = self.get_vadjustment() # type: ignore
match adjustment: match adjustment:
case VAdjustment.TOP: case VAdjustment.TOP:
adj = vadj.get_lower() adj = vadj.get_lower()
+9 -14
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 from dzgui.util.css import add_class
import gi import gi
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk # noqa E402 from gi.repository import Gtk # noqa E402
if TYPE_CHECKING: if TYPE_CHECKING:
from dzgui.controllers.mc import Controller from dzgui.controllers.mc import Controller
class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
class Keybindings(ScrollableMixin, Gtk.ScrolledWindow): # type: ignore
""" """
Notebook page holding a prearranged grid Notebook page holding a prearranged grid
of keybindings and their descriptions of keybindings and their descriptions
""" """
def __init__(self, controller: "Controller") -> None: def __init__(self, controller: "Controller") -> None:
super().__init__() super().__init__()
@@ -57,9 +60,7 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
if not sep: if not sep:
grid.attach(desc, col, row, w, h) grid.attach(desc, col, row, w, h)
else: else:
grid.attach_next_to( grid.attach_next_to(desc, sep, Gtk.PositionType.BOTTOM, w, h)
desc, sep, Gtk.PositionType.BOTTOM, w, h
)
row += 1 row += 1
sep = None sep = None
grid.attach_next_to(frame, desc, Gtk.PositionType.RIGHT, w, h) 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="") l_spacer = Gtk.Label(label="")
r_spacer = Gtk.Label(label="") r_spacer = Gtk.Label(label="")
grid.attach(l_spacer, col, row + 1, w, h) grid.attach(l_spacer, col, row + 1, w, h)
grid.attach_next_to( grid.attach_next_to(r_spacer, l_spacer, Gtk.PositionType.RIGHT, w, h)
r_spacer, l_spacer, Gtk.PositionType.RIGHT, w, h
)
row += 1 row += 1
return grid return grid
def build_sidebar(self, categories: list) -> Gtk.Grid: def build_sidebar(self, categories: list) -> Gtk.Grid:
row, col = 0, 0 row, col = 0, 0
w, h = 1, 1 w, h = 1, 1
sidebar = Gtk.Grid( sidebar = Gtk.Grid(row_homogeneous=True, orientation=Gtk.Orientation.VERTICAL)
row_homogeneous=True, orientation=Gtk.Orientation.VERTICAL
)
for cat in categories: for cat in categories:
label = Gtk.Label(label=cat) label = Gtk.Label(label=cat)
add_class(label, "left-label") add_class(label, "left-label")
@@ -96,9 +93,7 @@ class Keybindings(ScrollableMixin, Gtk.ScrolledWindow):
row, column = 1, 1 row, column = 1, 1
w, h = 1, 1 w, h = 1, 1
sidebar = self.build_sidebar( sidebar = self.build_sidebar(key_contexts)
key_contexts
)
separator = Gtk.Separator() separator = Gtk.Separator()
keys_box = self.build_keys(items) keys_box = self.build_keys(items)
+4 -4
View File
@@ -52,8 +52,8 @@ class PreConnectionAssistant(Gtk.ScrolledWindow):
spacing=10, spacing=10,
) )
self.rules: dict[Any] # self.rules: dict[Any]
self.mods: list["DayzMod"] # self.mods: list["DayzMod"]
self.controller.register_widget("preconnect", self) self.controller.register_widget("preconnect", self)
@@ -97,7 +97,7 @@ class PreConnectionAssistant(Gtk.ScrolledWindow):
self.tree_frame = HeadingFrame(self.tree_box, preconnect.mods) self.tree_frame = HeadingFrame(self.tree_box, preconnect.mods)
self.warnings = [] self.warnings: list[WarningLabel] = []
# TODO: populate with strings and icons # TODO: populate with strings and icons
# set visibility if warnings > 1 # set visibility if warnings > 1
# warning category enums with matching strings # warning category enums with matching strings
@@ -162,7 +162,7 @@ class PreConnectionAssistant(Gtk.ScrolledWindow):
def download_mods(self) -> None: def download_mods(self) -> None:
pass pass
def connect(self) -> None: def connect_server(self) -> None:
# TODO: add to history file and list store # TODO: add to history file and list store
""" """
spawn dialog in thread spawn dialog in thread
+3 -2
View File
@@ -134,7 +134,8 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
self.get_selection().unselect_path(path) self.get_selection().unselect_path(path)
def focus_first_row(self) -> None: 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: def get_value_at_index(self, index: int) -> str:
(model, pathlist) = self.get_model_and_pathlist() (model, pathlist) = self.get_model_and_pathlist()
@@ -143,7 +144,7 @@ class TreeView(CursorMixin, Gtk.TreeView): # type: ignore
path = pathlist[0] path = pathlist[0]
tree_iter = model.get_iter(path) tree_iter = model.get_iter(path)
value = model.get_value(tree_iter, index) value = model.get_value(tree_iter, index)
return value return str(value)
def get_name(self) -> str: def get_name(self) -> str:
name = self.get_value_at_index(0) name = self.get_value_at_index(0)
+1 -1
View File
@@ -306,7 +306,7 @@ class ServerTreeView(ContextMixin, TreeView): # type: ignore
def get_record(self) -> Record | None: def get_record(self) -> Record | None:
if self.loaded is False: if self.loaded is False:
return return None
r = self.get_record_string() r = self.get_record_string()
try: try:
ip, gameport, qport = r.split(":") ip, gameport, qport = r.split(":")