mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 14:42:54 +01:00
chore: clear typehinting errors
This commit is contained in:
1 parent
e64feac425
commit
25640751a5
23 files changed
+83
-102
No files matched your search
+1
-20
@@ -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"))
|
||||||
|
|||||||
@@ -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
@@ -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"
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,9 +229,10 @@ 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 = []
|
||||||
|
else:
|
||||||
self.filtered = rows
|
self.filtered = rows
|
||||||
|
|
||||||
def get_filtered(self) -> list:
|
def get_filtered(self) -> list:
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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,
|
|
||||||
column: Gtk.TreeViewColumn
|
|
||||||
) -> None:
|
) -> 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
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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(":")
|
||||||
|
|||||||
Reference in new issue
Block a user