mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 06:32:53 +01:00
chore: clear typehinting errors
This commit is contained in:
1 parent
99083d207a
commit
9bfa39c17e
14 files changed
+160
-142
No files matched your search
+2
-2
@@ -101,8 +101,8 @@ def get_delimited_mods(steam_path: Path) -> list[Any]:
|
|||||||
continue
|
continue
|
||||||
size = get_mod_size(mod)
|
size = get_mod_size(mod)
|
||||||
# NOTE: final col is cell renderer highlight toggle
|
# NOTE: final col is cell renderer highlight toggle
|
||||||
clean.append([meta.name, symlink, mod_dir, size, False])
|
clean.append([meta.name.casefold(), symlink, mod_dir, size, False])
|
||||||
clean.sort(key=lambda row: row[0].casefold())
|
clean.sort(key=lambda row: row[0])
|
||||||
return clean
|
return clean
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import subprocess
|
|||||||
import threading
|
import threading
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Optional, TYPE_CHECKING, Union
|
from typing import Any, Optional, TYPE_CHECKING, Union
|
||||||
|
|
||||||
from dzgui.api.bm import map_id_to_record
|
from dzgui.api.bm import map_id_to_record
|
||||||
from dzgui.const.constants import APP_NAME, REQUEST_TIMEOUT
|
from dzgui.const.constants import APP_NAME, REQUEST_TIMEOUT
|
||||||
@@ -228,7 +228,7 @@ def query_direct(ip: str, qport: int, timeout: float = 3.0) -> dict | None:
|
|||||||
class Res:
|
class Res:
|
||||||
status: int
|
status: int
|
||||||
parsed: bool
|
parsed: bool
|
||||||
json: Union[str, None]
|
json: Union[dict[str, Any], None]
|
||||||
|
|
||||||
|
|
||||||
@dataclass(slots=True, frozen=True)
|
@dataclass(slots=True, frozen=True)
|
||||||
@@ -393,13 +393,13 @@ def query_api(key: str, appid: int, param: str) -> Res:
|
|||||||
res.raise_for_status()
|
res.raise_for_status()
|
||||||
parsed = True
|
parsed = True
|
||||||
status = 200
|
status = 200
|
||||||
data = res.json()
|
json = res.json()
|
||||||
except Exception:
|
except Exception:
|
||||||
parsed = False
|
parsed = False
|
||||||
data = None
|
json = None
|
||||||
status = 403
|
status = 403
|
||||||
finally:
|
finally:
|
||||||
return Res(status, parsed, data)
|
return Res(status, parsed, json)
|
||||||
|
|
||||||
|
|
||||||
def validate_ip(addr: str) -> Record:
|
def validate_ip(addr: str) -> Record:
|
||||||
@@ -453,7 +453,7 @@ def query_by_id(addr: str, key: str) -> Optional[dict]:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def query_playercount(record: Record) -> Optional[tuple[int]]:
|
def query_playercount(record: Record) -> tuple[int, int] | None:
|
||||||
try:
|
try:
|
||||||
res = query_direct(record.ip, record.qport)
|
res = query_direct(record.ip, record.qport)
|
||||||
players = int(res["players"])
|
players = int(res["players"])
|
||||||
@@ -462,7 +462,7 @@ def query_playercount(record: Record) -> Optional[tuple[int]]:
|
|||||||
queue = int(r[1].split(",")[0])
|
queue = int(r[1].split(",")[0])
|
||||||
except IndexError:
|
except IndexError:
|
||||||
queue = 0
|
queue = 0
|
||||||
return (players, queue)
|
return players, queue
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.critical(e)
|
logger.critical(e)
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class ConfigManager:
|
|||||||
# TODO: do this on demand if/when in options page
|
# TODO: do this on demand if/when in options page
|
||||||
# self.mediator.grid.notebook.settings.populate_settings()
|
# self.mediator.grid.notebook.settings.populate_settings()
|
||||||
|
|
||||||
def get_config(self) -> dict:
|
def get_config(self) -> Any:
|
||||||
# TODO: is this being called twice?
|
# TODO: is this being called twice?
|
||||||
try:
|
try:
|
||||||
return read_json(self.config)
|
return read_json(self.config)
|
||||||
|
|||||||
@@ -33,61 +33,55 @@ class ContextMenuManager:
|
|||||||
self.treeview = treeview
|
self.treeview = treeview
|
||||||
|
|
||||||
def process(self, action: ContextMenu) -> None:
|
def process(self, action: ContextMenu) -> None:
|
||||||
match action:
|
if isinstance(self.treeview, ServerTreeView):
|
||||||
# UNTHREADED
|
record = self.treeview.get_record()
|
||||||
case ContextMenu.ADD_NOTE:
|
if record is None:
|
||||||
dialog = NoteDialog(self.controller)
|
return
|
||||||
dialog.run()
|
|
||||||
case ContextMenu.COPY_LOG_CLIPBOARD:
|
|
||||||
self.copy_log()
|
|
||||||
case ContextMenu.COPY_SERVER_IP:
|
|
||||||
self.copy_server_ip()
|
|
||||||
case ContextMenu.COPY_SERVER_NAME:
|
|
||||||
self.copy_server_name()
|
|
||||||
case ContextMenu.DELETE_MOD:
|
|
||||||
self.controller.delete_mods()
|
|
||||||
case ContextMenu.OPEN_WORKSHOP:
|
|
||||||
self.open_mod_page()
|
|
||||||
case ContextMenu.SET_FAV:
|
|
||||||
name = self.treeview.get_value_at_index(0)
|
|
||||||
record_str = self.treeview.get_record_string()
|
|
||||||
simple = self.treeview.get_simplified_ip()
|
|
||||||
self.controller.set_fav(name, record_str, simple)
|
|
||||||
|
|
||||||
# THREADED
|
match action:
|
||||||
case ContextMenu.ADD_SERVER:
|
# UNTHREADED
|
||||||
record = self.treeview.get_record()
|
case ContextMenu.ADD_NOTE:
|
||||||
if record is None:
|
dialog = NoteDialog(self.controller)
|
||||||
return
|
dialog.run()
|
||||||
self.controller.add_by_record(record)
|
case ContextMenu.COPY_SERVER_IP:
|
||||||
case ContextMenu.CONNECT:
|
self.copy_server_ip()
|
||||||
record = self.treeview.get_record()
|
case ContextMenu.COPY_SERVER_NAME:
|
||||||
if record is None:
|
self.copy_server_name()
|
||||||
return
|
case ContextMenu.SET_FAV:
|
||||||
self.controller.connect_by_record(record)
|
name = self.treeview.get_value_at_index(0)
|
||||||
case ContextMenu.REFRESH_PLAYERS:
|
# NOTE: fully qualified ip
|
||||||
record = self.treeview.get_record()
|
fqip = self.treeview.get_record_string()
|
||||||
if record is None:
|
# NOTE: short ip for display purposes
|
||||||
return
|
simple = self.treeview.get_simplified_ip()
|
||||||
self.controller.refresh_players(record)
|
self.controller.set_fav(name, fqip, simple)
|
||||||
case ContextMenu.REMOVE_HISTORY:
|
|
||||||
record = self.treeview.get_record()
|
# THREADED
|
||||||
if record is None:
|
case ContextMenu.ADD_SERVER:
|
||||||
return
|
self.controller.add_by_record(record)
|
||||||
self.controller.remove_from_history(record)
|
case ContextMenu.CONNECT:
|
||||||
case ContextMenu.REMOVE_SERVER:
|
self.controller.connect_by_record(record)
|
||||||
record = self.treeview.get_record()
|
case ContextMenu.REFRESH_PLAYERS:
|
||||||
if record is None:
|
self.controller.refresh_players(record)
|
||||||
return
|
case ContextMenu.REMOVE_HISTORY:
|
||||||
self.controller.remove_by_record(record)
|
self.controller.remove_from_history(record)
|
||||||
case ContextMenu.SHOW_DETAILS:
|
case ContextMenu.REMOVE_SERVER:
|
||||||
record = self.treeview.get_record()
|
self.controller.remove_by_record(record)
|
||||||
if record is None:
|
case ContextMenu.SHOW_DETAILS:
|
||||||
return
|
self.controller.get_details(record)
|
||||||
self.controller.get_details(record)
|
case ContextMenu.SHOW_MODS:
|
||||||
case ContextMenu.SHOW_MODS:
|
self.controller.get_modlist(record)
|
||||||
record = self.treeview.get_record()
|
|
||||||
self.controller.get_modlist(record)
|
if isinstance(self.treeview, ModTreeView):
|
||||||
|
match action:
|
||||||
|
case ContextMenu.DELETE_MOD:
|
||||||
|
self.controller.delete_mods()
|
||||||
|
case ContextMenu.OPEN_WORKSHOP:
|
||||||
|
self.open_mod_page()
|
||||||
|
|
||||||
|
if isinstance(self.treeview, LogTreeView):
|
||||||
|
match action:
|
||||||
|
case ContextMenu.COPY_LOG_CLIPBOARD:
|
||||||
|
self.copy_log()
|
||||||
|
|
||||||
def copy_server_ip(self) -> None:
|
def copy_server_ip(self) -> None:
|
||||||
if not isinstance(self.treeview, ServerTreeView):
|
if not isinstance(self.treeview, ServerTreeView):
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ class FilterManager:
|
|||||||
def append_map(self, row: list[str]) -> None:
|
def append_map(self, row: list[str]) -> None:
|
||||||
self.map_store.append(row)
|
self.map_store.append(row)
|
||||||
|
|
||||||
def set_unique_maps(self, maps: list) -> None:
|
def set_unique_maps(self, maps: list[str]) -> None:
|
||||||
if maps is None:
|
if maps is None:
|
||||||
return
|
return
|
||||||
if len(maps) < 1:
|
if len(maps) < 1:
|
||||||
|
|||||||
+20
-7
@@ -2,7 +2,7 @@ import logging
|
|||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import TYPE_CHECKING
|
from typing import Any, TYPE_CHECKING
|
||||||
|
|
||||||
from dzgui.api.mods import (
|
from dzgui.api.mods import (
|
||||||
get_delimited_mods,
|
get_delimited_mods,
|
||||||
@@ -60,7 +60,7 @@ class ModManager:
|
|||||||
func = StoredFunc(self._on_mods_loaded, mods)
|
func = StoredFunc(self._on_mods_loaded, mods)
|
||||||
self.thread_man.set_cleanup_func(func)
|
self.thread_man.set_cleanup_func(func)
|
||||||
|
|
||||||
def _on_mods_loaded(self, mods: list[list[str, str, str, float, bool]]) -> None:
|
def _on_mods_loaded(self, mods: list[list[Any]]) -> None:
|
||||||
self.store = ModelFactory().make_mod_store()
|
self.store = ModelFactory().make_mod_store()
|
||||||
self.store.extend(mods)
|
self.store.extend(mods)
|
||||||
self.treeview.set_model(self.store)
|
self.treeview.set_model(self.store)
|
||||||
@@ -83,14 +83,20 @@ class ModManager:
|
|||||||
|
|
||||||
def get_mod_from_tree_path(
|
def get_mod_from_tree_path(
|
||||||
self, tree_path: Gtk.TreePath
|
self, tree_path: Gtk.TreePath
|
||||||
) -> tuple[str, Gtk.TreeIter]:
|
) -> tuple[str, Gtk.TreeIter] | None:
|
||||||
model = self.treeview.get_model()
|
model = self.treeview.get_model()
|
||||||
|
if model is None:
|
||||||
|
return None
|
||||||
tree_iter = model.get_iter(tree_path)
|
tree_iter = model.get_iter(tree_path)
|
||||||
mod = model.get(tree_iter, 2)[0]
|
mod = model.get_value(tree_iter, 2)[0]
|
||||||
|
print(mod)
|
||||||
return mod, tree_iter
|
return mod, tree_iter
|
||||||
|
|
||||||
def delete_single_mod(self, tree_path: Gtk.TreePath) -> Gtk.TreeIter:
|
def delete_single_mod(self, tree_path: Gtk.TreePath) -> Gtk.TreeIter | None:
|
||||||
mod, _iter = self.get_mod_from_tree_path(tree_path)
|
res = self.get_mod_from_tree_path(tree_path)
|
||||||
|
if res is None:
|
||||||
|
return None
|
||||||
|
mod, _iter = res
|
||||||
|
|
||||||
steam_path = Path(self.path)
|
steam_path = Path(self.path)
|
||||||
mods_path = get_local_mod_path(steam_path)
|
mods_path = get_local_mod_path(steam_path)
|
||||||
@@ -118,12 +124,17 @@ class ModManager:
|
|||||||
#if model:
|
#if model:
|
||||||
# model.remove(_iter) # FIXME: do not remove from model interface directly
|
# model.remove(_iter) # FIXME: do not remove from model interface directly
|
||||||
remove_stale_signatures(self.prefs.paths.config, self.prefs.paths.version)
|
remove_stale_signatures(self.prefs.paths.config, self.prefs.paths.version)
|
||||||
mods = len(self.treeview.get_model())
|
model = self.treeview.get_model()
|
||||||
|
if model is None:
|
||||||
|
return
|
||||||
|
mods = len(model)
|
||||||
msg = self.format_mod_statusbar()
|
msg = self.format_mod_statusbar()
|
||||||
self.emitter.emit("mods_updated", msg, mods)
|
self.emitter.emit("mods_updated", msg, mods)
|
||||||
|
|
||||||
def uncolorize_mods(self) -> None:
|
def uncolorize_mods(self) -> None:
|
||||||
model = self.treeview.get_model()
|
model = self.treeview.get_model()
|
||||||
|
if model is None:
|
||||||
|
return
|
||||||
for mod in model:
|
for mod in model:
|
||||||
_iter = mod.iter
|
_iter = mod.iter
|
||||||
path = model.get_path(_iter)
|
path = model.get_path(_iter)
|
||||||
@@ -175,6 +186,8 @@ class ModManager:
|
|||||||
|
|
||||||
def select_colorized(self) -> None:
|
def select_colorized(self) -> None:
|
||||||
model = self.treeview.get_model()
|
model = self.treeview.get_model()
|
||||||
|
if model is None:
|
||||||
|
return
|
||||||
sel = self.treeview.get_selection()
|
sel = self.treeview.get_selection()
|
||||||
for mod in model:
|
for mod in model:
|
||||||
it = mod.iter
|
it = mod.iter
|
||||||
|
|||||||
@@ -32,8 +32,9 @@ class ProxyModelManager:
|
|||||||
self.proxy_model: "FastInsertListStore" = None
|
self.proxy_model: "FastInsertListStore" = None
|
||||||
self.filter_man = filter_man
|
self.filter_man = filter_man
|
||||||
|
|
||||||
self.control_model: list = None
|
# TODO: list typehints
|
||||||
self.filtered: list = None
|
self.control_model: list | None = None
|
||||||
|
self.filtered: list | None = None
|
||||||
self.success = True
|
self.success = True
|
||||||
|
|
||||||
def has_control_model(self) -> bool:
|
def has_control_model(self) -> bool:
|
||||||
@@ -61,9 +62,9 @@ class ProxyModelManager:
|
|||||||
def remove_row_from_control(self, record: "Record") -> None:
|
def remove_row_from_control(self, record: "Record") -> None:
|
||||||
addr = f"{record.ip}:{record.gameport}"
|
addr = f"{record.ip}:{record.gameport}"
|
||||||
qport = record.qport
|
qport = record.qport
|
||||||
for record in self.control_model:
|
for row in self.control_model:
|
||||||
if addr == record[7] and qport == record[8]:
|
if addr == row[7] and qport == row[8]:
|
||||||
self.control_model.remove(record)
|
self.control_model.remove(row)
|
||||||
break
|
break
|
||||||
self.wipe_cache()
|
self.wipe_cache()
|
||||||
self.filter(FilterMode.INITIAL, skip_cache=True)
|
self.filter(FilterMode.INITIAL, skip_cache=True)
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ class ServerModelManager:
|
|||||||
key = config_man.lookup(Preferences.STEAM)
|
key = config_man.lookup(Preferences.STEAM)
|
||||||
job = Servers.query_api
|
job = Servers.query_api
|
||||||
params = Servers.params
|
params = Servers.params
|
||||||
servers: list[dict[Any, Any]] = []
|
servers = []
|
||||||
with ThreadPoolExecutor() as executor:
|
with ThreadPoolExecutor() as executor:
|
||||||
futures = [executor.submit(job, key, APPID_DAYZ, param) for param in params]
|
futures = [executor.submit(job, key, APPID_DAYZ, param) for param in params]
|
||||||
for future in as_completed(futures):
|
for future in as_completed(futures):
|
||||||
@@ -105,7 +105,8 @@ class ServerModelManager:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
j = res.json
|
j = res.json
|
||||||
servers += j["response"]["servers"]
|
if j is not None:
|
||||||
|
servers.extend(j["response"]["servers"])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.critical(e)
|
logger.critical(e)
|
||||||
self.thread_man.set_cleanup_func(
|
self.thread_man.set_cleanup_func(
|
||||||
@@ -117,7 +118,8 @@ class ServerModelManager:
|
|||||||
res = Servers.query_api(key, APPID_DAYZ_EXP, "")
|
res = Servers.query_api(key, APPID_DAYZ_EXP, "")
|
||||||
if res.status == 200 and res.parsed is True:
|
if res.status == 200 and res.parsed is True:
|
||||||
j = res.json
|
j = res.json
|
||||||
servers += j["response"]["servers"]
|
if j is not None:
|
||||||
|
servers.extend(j["response"]["servers"])
|
||||||
|
|
||||||
parsed = Servers.parse_json(servers)
|
parsed = Servers.parse_json(servers)
|
||||||
self._push_data(parsed)
|
self._push_data(parsed)
|
||||||
@@ -364,14 +366,15 @@ class ServerModelManager:
|
|||||||
if self.first_iteration:
|
if self.first_iteration:
|
||||||
self._update_maps()
|
self._update_maps()
|
||||||
|
|
||||||
def _cleanup_on_failure(self, show_dialog=True) -> None:
|
def _cleanup_on_failure(self, show_dialog: bool = True) -> None:
|
||||||
# TODO: disable map, keyword, and filter widgets if model is None
|
# TODO: disable map, keyword, and filter widgets if model is None
|
||||||
# -> signal driven (servers_empty, servers_failed_to_load)
|
# -> signal driven (servers_empty, servers_failed_to_load)
|
||||||
|
|
||||||
if self.preserve_on_fail is False:
|
if self.preserve_on_fail is False:
|
||||||
|
# CHORE: test if maps are cleared on failure
|
||||||
self.tv.set_model(None)
|
self.tv.set_model(None)
|
||||||
filter_man = self.tv.get_filter_man()
|
#filter_man = self.tv.get_filter_man()
|
||||||
filter_man.set_unique_maps(None)
|
#filter_man.set_unique_maps([])
|
||||||
# TODO: emit signal to not disable widget sensitivity
|
# TODO: emit signal to not disable widget sensitivity
|
||||||
|
|
||||||
# TODO: distinguish signals, e.g. "servers_failed_to_load", "servers_loaded_empty"
|
# TODO: distinguish signals, e.g. "servers_failed_to_load", "servers_loaded_empty"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ connect_entry_placeholder="Enter IP (IP:Query port) or Battlemetrics ID (numeric
|
|||||||
fav_heading="Favorite server"
|
fav_heading="Favorite server"
|
||||||
favs_empty="None set. Right click a server and select 'Set favorite' to set."
|
favs_empty="None set. Right click a server and select 'Set favorite' to set."
|
||||||
|
|
||||||
lan_heading="LAN query port",
|
lan_heading="LAN query port"
|
||||||
lan_default_button="Default port (27016)"
|
lan_default_button="Default port (27016)"
|
||||||
lan_custom_button="Custom port"
|
lan_custom_button="Custom port"
|
||||||
lan_scan_button="Scan"
|
lan_scan_button="Scan"
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class ServerDialog(GenericDialog):
|
|||||||
|
|
||||||
|
|
||||||
class ServerDetailsDialog(ServerDialog):
|
class ServerDetailsDialog(ServerDialog):
|
||||||
def __init__(self, controller, details: "Details"):
|
def __init__(self, controller: "Controller", details: "Details"):
|
||||||
name = controller.get_server_name()
|
name = controller.get_server_name()
|
||||||
super().__init__(controller, strings.server_details, name)
|
super().__init__(controller, strings.server_details, name)
|
||||||
|
|
||||||
@@ -96,6 +96,9 @@ class ServerDetailsDialog(ServerDialog):
|
|||||||
|
|
||||||
self.pack(scrollable_message)
|
self.pack(scrollable_message)
|
||||||
|
|
||||||
|
if details.data is None:
|
||||||
|
return
|
||||||
|
|
||||||
for row in details.data:
|
for row in details.data:
|
||||||
self.store.append(row + [Pango.Weight.BOLD])
|
self.store.append(row + [Pango.Weight.BOLD])
|
||||||
self.view.set_model(self.store)
|
self.view.set_model(self.store)
|
||||||
@@ -115,7 +118,7 @@ class ServerDetailsDialog(ServerDialog):
|
|||||||
|
|
||||||
|
|
||||||
class ServerModDialog(ServerDialog):
|
class ServerModDialog(ServerDialog):
|
||||||
def __init__(self, controller, mods: list[str]):
|
def __init__(self, controller: "Controller", mods: list[list[str]]):
|
||||||
|
|
||||||
name = controller.get_server_name()
|
name = controller.get_server_name()
|
||||||
super().__init__(controller, strings.modlist, name)
|
super().__init__(controller, strings.modlist, name)
|
||||||
|
|||||||
@@ -76,15 +76,20 @@ class ServerNotebook(Gtk.ScrolledWindow):
|
|||||||
if cur_page == saved:
|
if cur_page == saved:
|
||||||
return
|
return
|
||||||
page = self.notebook.get_nth_page(saved)
|
page = self.notebook.get_nth_page(saved)
|
||||||
|
if not page:
|
||||||
|
return
|
||||||
label = self.notebook.get_tab_label(page)
|
label = self.notebook.get_tab_label(page)
|
||||||
if label is None:
|
if label is None:
|
||||||
return
|
return
|
||||||
label.set_text(f"{server_labels.saved}*")
|
if hasattr(label, "set_text"):
|
||||||
|
label.set_text(f"{server_labels.saved}*")
|
||||||
|
|
||||||
def _on_servers_loaded(self, emitter: "Emitter", tab: "ServerTab") -> None:
|
def _on_servers_loaded(self, emitter: "Emitter", tab: "ServerTab") -> None:
|
||||||
# NOTE: workaround for GTK bug where fullscreen causes headers to vanish when model is None
|
# NOTE: workaround for GTK bug where fullscreen causes headers to vanish when model is None
|
||||||
# TODO: this should be internal to servers page
|
# TODO: this should be internal to servers page
|
||||||
tv = self.get_active_treeview()
|
tv = self.get_active_treeview()
|
||||||
|
if tv is None:
|
||||||
|
return
|
||||||
state = False if tv.get_model() is None else True
|
state = False if tv.get_model() is None else True
|
||||||
tv.set_headers_visible(state)
|
tv.set_headers_visible(state)
|
||||||
tv.set_loaded(True)
|
tv.set_loaded(True)
|
||||||
@@ -114,14 +119,19 @@ class ServerNotebook(Gtk.ScrolledWindow):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def grab_content_area(self) -> None:
|
def grab_content_area(self) -> None:
|
||||||
self.get_active_treeview().grab_focus()
|
tv = self.get_active_treeview()
|
||||||
|
if tv is not None:
|
||||||
|
tv.grab_focus()
|
||||||
|
|
||||||
def get_current_tab_text(self) -> str:
|
def get_current_tab_text(self) -> str:
|
||||||
ind = self.notebook.get_current_page()
|
ind = self.notebook.get_current_page()
|
||||||
child = self.notebook.get_nth_page(ind)
|
child = self.notebook.get_nth_page(ind)
|
||||||
if child is None:
|
if child is None:
|
||||||
return ""
|
return ""
|
||||||
return self.notebook.get_tab_label_text(child)
|
text = self.notebook.get_tab_label_text(child)
|
||||||
|
if text is None:
|
||||||
|
return ""
|
||||||
|
return text
|
||||||
|
|
||||||
def _on_page_changed(
|
def _on_page_changed(
|
||||||
self, notebook: Gtk.Notebook, child: ScrollableTree, index: int
|
self, notebook: Gtk.Notebook, child: ScrollableTree, index: int
|
||||||
@@ -130,21 +140,27 @@ class ServerNotebook(Gtk.ScrolledWindow):
|
|||||||
return
|
return
|
||||||
|
|
||||||
label = self.notebook.get_tab_label_text(child)
|
label = self.notebook.get_tab_label_text(child)
|
||||||
# TODO: strings
|
if label is not None:
|
||||||
text = label.strip("*")
|
# TODO: strings
|
||||||
self.notebook.set_tab_label_text(child, text)
|
text = label.strip("*")
|
||||||
|
self.notebook.set_tab_label_text(child, text)
|
||||||
|
|
||||||
tree = child.get_tree()
|
tree = child.get_tree()
|
||||||
self.emitter.emit("server_page_changed", tree)
|
self.emitter.emit("server_page_changed", tree)
|
||||||
|
|
||||||
# NOTE: spawns a thread
|
# NOTE: spawns a thread
|
||||||
self.controller.populate_model(self.get_active_treeview())
|
tv = self.get_active_treeview()
|
||||||
|
if tv is not None:
|
||||||
|
self.controller.populate_model(tv)
|
||||||
|
|
||||||
def get_active_treeview(self) -> ServerTreeView:
|
def get_active_treeview(self) -> ServerTreeView | None:
|
||||||
index = self.notebook.get_current_page()
|
index = self.notebook.get_current_page()
|
||||||
scrollable = self.notebook.get_nth_page(index)
|
scrollable = self.notebook.get_nth_page(index)
|
||||||
treeview = scrollable.get_children()[0]
|
if scrollable is not None and hasattr(scrollable, "get_children"):
|
||||||
return treeview
|
tv = scrollable.get_children()[0]
|
||||||
|
if isinstance(tv, ServerTreeView):
|
||||||
|
return tv
|
||||||
|
return None
|
||||||
|
|
||||||
def add_notification(self) -> None:
|
def add_notification(self) -> None:
|
||||||
saved = self.notebook.get_nth_page(1)
|
saved = self.notebook.get_nth_page(1)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ if TYPE_CHECKING:
|
|||||||
logger = logging.getLogger(APP_NAME)
|
logger = logging.getLogger(APP_NAME)
|
||||||
|
|
||||||
|
|
||||||
class LogTreeView(ContextMixin, TreeView):
|
class LogTreeView(ContextMixin, TreeView): # type: ignore
|
||||||
def __init__(self, controller: "Controller") -> None:
|
def __init__(self, controller: "Controller") -> None:
|
||||||
super().__init__(controller, menu=ContextMenuGroup.LOG)
|
super().__init__(controller, menu=ContextMenuGroup.LOG)
|
||||||
|
|
||||||
@@ -56,7 +56,8 @@ class LogTreeView(ContextMixin, TreeView):
|
|||||||
sortable = Gtk.TreeModelSort(_filter)
|
sortable = Gtk.TreeModelSort(_filter)
|
||||||
self.set_model(sortable)
|
self.set_model(sortable)
|
||||||
_filter.refilter()
|
_filter.refilter()
|
||||||
self.set_cursor(0)
|
path = Gtk.TreePath.new_from_indices([0])
|
||||||
|
self.set_cursor(path)
|
||||||
|
|
||||||
def toggle_filter(self, _filter: str) -> None:
|
def toggle_filter(self, _filter: str) -> None:
|
||||||
if _filter in self.filters:
|
if _filter in self.filters:
|
||||||
@@ -64,19 +65,20 @@ class LogTreeView(ContextMixin, TreeView):
|
|||||||
else:
|
else:
|
||||||
self.filters.append(_filter)
|
self.filters.append(_filter)
|
||||||
# NOTE: unwrap TreeModelSort and TreeModelFilter
|
# NOTE: unwrap TreeModelSort and TreeModelFilter
|
||||||
self.get_model().get_model().refilter()
|
self.get_model().get_model().refilter() # type: ignore
|
||||||
|
|
||||||
def _filter_rows(
|
def _filter_rows(
|
||||||
self, model: Gtk.ListStore, _iter: Gtk.TreeIter, data: Any
|
self, filter_model: Gtk.TreeModelFilter, _iter: Gtk.TreeIter, data: Any
|
||||||
) -> None:
|
) -> bool:
|
||||||
if len(self.filters) < 1:
|
if len(self.filters) < 1:
|
||||||
return False
|
return False
|
||||||
return model[_iter][1] in self.filters
|
return filter_model[_iter][1] in self.filters
|
||||||
|
|
||||||
def _on_log_buttonpress(self, widget: Gtk.Widget, event: Gdk.EventButton) -> None:
|
def _on_log_buttonpress(self, widget: Gtk.Widget, event: Gdk.EventButton) -> bool:
|
||||||
if event.button == Gdk.BUTTON_SECONDARY:
|
if event.button == Gdk.BUTTON_SECONDARY:
|
||||||
self.present_menu(widget, event)
|
self.present_menu(widget, event)
|
||||||
return True
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def _on_log_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
|
def _on_log_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
|
||||||
self.present_menu(widget, event)
|
self.present_menu(widget, event)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ if TYPE_CHECKING:
|
|||||||
logger = logging.getLogger(APP_NAME)
|
logger = logging.getLogger(APP_NAME)
|
||||||
|
|
||||||
|
|
||||||
class ModTreeView(ModsMixin, ContextMixin, TreeView):
|
class ModTreeView(ModsMixin, ContextMixin, TreeView): # type: ignore
|
||||||
def __init__(self, controller: "Controller") -> None:
|
def __init__(self, controller: "Controller") -> None:
|
||||||
super().__init__(controller, menu=ContextMenuGroup.MOD)
|
super().__init__(controller, menu=ContextMenuGroup.MOD)
|
||||||
self.controller = controller
|
self.controller = controller
|
||||||
@@ -64,31 +64,17 @@ class ModTreeView(ModsMixin, ContextMixin, TreeView):
|
|||||||
def _on_mods_updated(self, emitter: "Emitter", msg: str, mods: int) -> None:
|
def _on_mods_updated(self, emitter: "Emitter", msg: str, mods: int) -> None:
|
||||||
if mods < 1:
|
if mods < 1:
|
||||||
return
|
return
|
||||||
self.set_cursor(0)
|
path = Gtk.TreePath.new_from_indices([0])
|
||||||
|
self.set_cursor(path)
|
||||||
|
|
||||||
def get_selected_mod(self) -> str:
|
def get_selected_mod(self) -> str:
|
||||||
path = self.get_focused_row_path()
|
path = self.get_focused_row_path()
|
||||||
model = self.get_model()
|
model = self.get_model()
|
||||||
tree_iter = model.get_iter(path)
|
tree_iter = model.get_iter(path)
|
||||||
mod = model.get(tree_iter, 2)[0]
|
mod = model.get(tree_iter, 2)[0]
|
||||||
return mod
|
return str(mod)
|
||||||
# return mod, tree_iter
|
|
||||||
|
|
||||||
# def _on_mods_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> None:
|
def _parent_selection_changed(self, base_class: TreeView, sel: Gtk.TreeSelection) -> None:
|
||||||
# # TODO: multiselect
|
|
||||||
# # if event.keyval is Gdk.KEY_space:
|
|
||||||
# # it = self.get_focused_row_iter()
|
|
||||||
# # self.get_selection().select_iter(it)
|
|
||||||
# # path = self.get_focused_row_path()
|
|
||||||
# # self.set_cursor(path)
|
|
||||||
# # return False
|
|
||||||
# self.present_menu(widget, event)
|
|
||||||
|
|
||||||
# def _on_mods_button_press(self, widget: Gtk.Widget, event: Gdk.EventButton) -> None:
|
|
||||||
# if event.button == 3:
|
|
||||||
# self.present_menu(widget, event)
|
|
||||||
|
|
||||||
def _parent_selection_changed(self, base_class: TreeView, sel: Gtk.TreeSelection):
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _format_color(
|
def _format_color(
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ if TYPE_CHECKING:
|
|||||||
QUEUE_CHECK_DELAY = 200
|
QUEUE_CHECK_DELAY = 200
|
||||||
|
|
||||||
|
|
||||||
class ServerTreeView(ContextMixin, TreeView):
|
class ServerTreeView(ContextMixin, TreeView): # type: ignore
|
||||||
def __init__(
|
def __init__(
|
||||||
self, controller: "Controller", enum: ServerTab, menu: ContextMenuGroup
|
self, controller: "Controller", enum: ServerTab, menu: ContextMenuGroup
|
||||||
) -> None:
|
) -> None:
|
||||||
@@ -58,9 +58,9 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
|
|
||||||
self.queue_id: int
|
self.queue_id: int
|
||||||
self.handler_id: int
|
self.handler_id: int
|
||||||
self.queue = Queue()
|
self.queue: Queue = Queue()
|
||||||
|
|
||||||
self.seen_cache = []
|
self.seen_cache: list[str] = []
|
||||||
|
|
||||||
prefs = self.controller.get_prefs()
|
prefs = self.controller.get_prefs()
|
||||||
columns = prefs.paths.columns
|
columns = prefs.paths.columns
|
||||||
@@ -119,7 +119,7 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
|
|
||||||
def _on_tooltip(
|
def _on_tooltip(
|
||||||
self,
|
self,
|
||||||
widget: Gtk.Widget,
|
treeview: Self,
|
||||||
x: int,
|
x: int,
|
||||||
y: int,
|
y: int,
|
||||||
keyboard_mode: bool,
|
keyboard_mode: bool,
|
||||||
@@ -128,12 +128,13 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
"""
|
"""
|
||||||
Present record data for the hovered row even if it is unfocused
|
Present record data for the hovered row even if it is unfocused
|
||||||
"""
|
"""
|
||||||
coords = widget.convert_widget_to_bin_window_coords(x, y)
|
coords_x, coords_y = treeview.convert_widget_to_bin_window_coords(x, y)
|
||||||
path = self.get_path_at_pos(coords.bx, coords.by)
|
path = self.get_path_at_pos(coords_x, coords_y)
|
||||||
if path is None:
|
if path is None or path[0] is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
model = self.get_model()
|
model = self.get_model()
|
||||||
|
if model is None:
|
||||||
|
return False
|
||||||
tree_iter = model.get_iter(path[0])
|
tree_iter = model.get_iter(path[0])
|
||||||
ip = model.get_value(tree_iter, 7)
|
ip = model.get_value(tree_iter, 7)
|
||||||
qport = model.get_value(tree_iter, 8)
|
qport = model.get_value(tree_iter, 8)
|
||||||
@@ -188,7 +189,7 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
# NOTE: get final width after drag action completes
|
# NOTE: get final width after drag action completes
|
||||||
GLib.idle_add(self.controller.propagate_column_width, col)
|
GLib.idle_add(self.controller.propagate_column_width, col)
|
||||||
|
|
||||||
def start_distcalc(self, emitter: Optional["Emitter"] = None):
|
def start_distcalc(self, emitter: Union["Emitter", None] = None) -> None:
|
||||||
self.emitter.emit("distcalc_started")
|
self.emitter.emit("distcalc_started")
|
||||||
record = self.get_record()
|
record = self.get_record()
|
||||||
if record is None:
|
if record is None:
|
||||||
@@ -248,14 +249,10 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
case Gdk.KEY_r:
|
case Gdk.KEY_r:
|
||||||
# TODO: unimplemented, needs threading
|
# TODO: unimplemented, needs threading
|
||||||
self.controller.menu_action(ContextMenu.REFRESH_PLAYERS, self)
|
self.controller.menu_action(ContextMenu.REFRESH_PLAYERS, self)
|
||||||
case _:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
else:
|
else:
|
||||||
match event.keyval:
|
match event.keyval:
|
||||||
case Gdk.KEY_l | Gdk.KEY_Right:
|
case Gdk.KEY_l | Gdk.KEY_Right:
|
||||||
self.emitter.emit("request_button_box_focus")
|
self.emitter.emit("request_button_box_focus")
|
||||||
return True
|
|
||||||
case _:
|
case _:
|
||||||
self.emitter.emit("check_button_pressed", event.keyval)
|
self.emitter.emit("check_button_pressed", event.keyval)
|
||||||
|
|
||||||
@@ -266,12 +263,13 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
path = pathlist[0]
|
path = pathlist[0]
|
||||||
tree_iter = model.get_iter(path)
|
tree_iter = model.get_iter(path)
|
||||||
has_mods = model.get_value(tree_iter, 11)
|
has_mods = model.get_value(tree_iter, 11)
|
||||||
return has_mods
|
return bool(has_mods)
|
||||||
|
|
||||||
def get_selected_row(self) -> Gtk.TreeModelRow:
|
#def get_selected_row(self) -> Gtk.TreeModelRow:
|
||||||
sel = self.get_selection()
|
# sel = self.get_selection()
|
||||||
sels = sel.get_selected_rows()
|
# sels = sel.get_selected_rows()
|
||||||
return sels[0]
|
# print(type(sels[0]))
|
||||||
|
# return sels[0]
|
||||||
|
|
||||||
def is_in_favs(self) -> bool:
|
def is_in_favs(self) -> bool:
|
||||||
record = self.get_record_string()
|
record = self.get_record_string()
|
||||||
@@ -283,6 +281,8 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn
|
self, tree: TreeView, path: Gtk.TreePath, column: Gtk.TreeViewColumn
|
||||||
) -> None:
|
) -> None:
|
||||||
record = self.get_record()
|
record = self.get_record()
|
||||||
|
if record is None:
|
||||||
|
return
|
||||||
self.controller.connect_by_record(record)
|
self.controller.connect_by_record(record)
|
||||||
|
|
||||||
def _parent_selection_changed(
|
def _parent_selection_changed(
|
||||||
@@ -321,14 +321,14 @@ class ServerTreeView(ContextMixin, TreeView):
|
|||||||
def set_loaded(self, status: bool) -> None:
|
def set_loaded(self, status: bool) -> None:
|
||||||
self.loaded = status
|
self.loaded = status
|
||||||
|
|
||||||
def get_model_and_control_model(self) -> tuple[Union["FastInsertListStore", None], list[Any]]:
|
def get_model_and_control_model(self) -> tuple[Union[Gtk.TreeModel, None], list[Any]]:
|
||||||
model = self.get_model()
|
model = self.get_model()
|
||||||
control = self.proxy_man.get_control()
|
control = self.proxy_man.get_control()
|
||||||
return model, control
|
return model, control
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def ping_server(
|
def ping_server(
|
||||||
model, _iter: Gtk.TreeIter, ip: str, qport: int, ping_column: int
|
model: "FastInsertListStore", _iter: Gtk.TreeIter, ip: str, qport: int, ping_column: int
|
||||||
) -> None:
|
) -> None:
|
||||||
_ping = ping(ip, qport)
|
_ping = ping(ip, qport)
|
||||||
GLib.idle_add(lambda: model.set(_iter, ping_column, _ping))
|
GLib.idle_add(lambda: model.set(_iter, ping_column, _ping))
|
||||||
|
|||||||
Reference in new issue
Block a user