mirror of
https://github.com/aclist/dztui.git
synced 2026-10-30 22:52:42 +01:00
change: consolidate query methods
This commit is contained in:
1 parent
e3e507598b
commit
29082ea1c1
7 files changed
+75
-41
No files matched your search
@@ -442,7 +442,7 @@ def get_rules(record: Record) -> list["DayzMod"]:
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
def query_by_id(addr: str, key: str) -> Optional[dict]:
|
def query_by_id(addr: str, key: str) -> dict[Any] | None:
|
||||||
"""
|
"""
|
||||||
Used with numeric Battlemetrics IDs
|
Used with numeric Battlemetrics IDs
|
||||||
"""
|
"""
|
||||||
@@ -469,12 +469,12 @@ def query_playercount(record: Record) -> tuple[int, int] | None:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def query_by_ip(addr: str) -> Optional[dict]:
|
def query_by_ip(addr: str) -> dict[Any] | None:
|
||||||
record = short_ip_to_record(addr)
|
record = short_ip_to_record(addr)
|
||||||
return query_by_record(record)
|
return query_by_record(record)
|
||||||
|
|
||||||
|
|
||||||
def query_by_record(record: Record) -> Optional[dict]:
|
def query_by_record(record: Record) -> dict[Any] | None:
|
||||||
try:
|
try:
|
||||||
return query_direct(record.ip, record.qport)
|
return query_direct(record.ip, record.qport)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@@ -179,6 +179,7 @@ class ContextMenuGroup(Enum):
|
|||||||
Groupings of context menu items
|
Groupings of context menu items
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
SERVER_MOD = (ContextMenu.OPEN_WORKSHOP,)
|
||||||
MOD = (ContextMenu.OPEN_WORKSHOP, ContextMenu.DELETE_MOD)
|
MOD = (ContextMenu.OPEN_WORKSHOP, ContextMenu.DELETE_MOD)
|
||||||
LOG = (ContextMenu.COPY_LOG_CLIPBOARD,)
|
LOG = (ContextMenu.COPY_LOG_CLIPBOARD,)
|
||||||
SERVER_BROWSER = (
|
SERVER_BROWSER = (
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from typing import TYPE_CHECKING
|
from typing import Any, TYPE_CHECKING
|
||||||
|
|
||||||
import dzgui.api.servers as Servers
|
import dzgui.api.servers as Servers
|
||||||
|
|
||||||
@@ -27,37 +27,28 @@ class ConnectionManager:
|
|||||||
@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, addr: str, key: str) -> None:
|
||||||
res = Servers.query_by_id(addr, key)
|
res = Servers.query_by_id(addr, key)
|
||||||
if res is None:
|
self.prepare_connection(res)
|
||||||
self.thread_man.set_cleanup_func(
|
|
||||||
StoredFunc(self._server_timeout), destroy_first=True
|
|
||||||
)
|
|
||||||
|
|
||||||
# TODO: resolve real ip
|
|
||||||
print("UNIMPLEMENTED: get rules")
|
|
||||||
print(res)
|
|
||||||
|
|
||||||
@call_on_thread(dialog.querying)
|
@call_on_thread(dialog.querying)
|
||||||
def connect_by_ip(self, addr: str) -> None:
|
def connect_by_ip(self, addr: str) -> None:
|
||||||
res = Servers.query_by_ip(addr)
|
res = Servers.query_by_ip(addr)
|
||||||
if res is None:
|
self.prepare_connection(res)
|
||||||
self.thread_man.set_cleanup_func(
|
|
||||||
StoredFunc(self._server_timeout), destroy_first=True
|
|
||||||
)
|
|
||||||
|
|
||||||
# TODO: resolve real ip
|
|
||||||
print("UNIMPLEMENTED: get rules")
|
|
||||||
print(res)
|
|
||||||
|
|
||||||
@call_on_thread(dialog.querying)
|
@call_on_thread(dialog.querying)
|
||||||
def connect_by_record(self, record: Servers.Record) -> None:
|
def connect_by_record(self, record: Servers.Record) -> None:
|
||||||
res = Servers.query_by_record(record)
|
res = Servers.query_by_record(record)
|
||||||
|
self.prepare_connection(res)
|
||||||
|
|
||||||
|
def prepare_connection(self, res: dict[Any] | None) -> None:
|
||||||
if res is None:
|
if res is None:
|
||||||
self.thread_man.set_cleanup_func(
|
self.thread_man.set_cleanup_func(
|
||||||
StoredFunc(self._server_timeout), destroy_first=True
|
StoredFunc(self._server_timeout), destroy_first=True
|
||||||
)
|
)
|
||||||
|
return
|
||||||
|
|
||||||
# TODO: proper error handling (currently returns empty list)
|
record = Servers.response_to_record(res)
|
||||||
try:
|
try:
|
||||||
|
# TODO: proper error handling (currently returns empty list)
|
||||||
mods = self.query_modlist(record)
|
mods = self.query_modlist(record)
|
||||||
except Exception:
|
except Exception:
|
||||||
self.thread_man.set_cleanup_func(
|
self.thread_man.set_cleanup_func(
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from dzgui.views.dialogs.note import NoteDialog
|
|||||||
from dzgui.views.trees.tree_mods import ModTreeView
|
from dzgui.views.trees.tree_mods import ModTreeView
|
||||||
from dzgui.views.trees.tree_log import LogTreeView
|
from dzgui.views.trees.tree_log import LogTreeView
|
||||||
from dzgui.views.trees.tree_servers import ServerTreeView
|
from dzgui.views.trees.tree_servers import ServerTreeView
|
||||||
|
from dzgui.views.trees.tree_server_mods import ServerModTreeView
|
||||||
|
|
||||||
|
|
||||||
gi.require_version("Gtk", "3.0")
|
gi.require_version("Gtk", "3.0")
|
||||||
@@ -26,7 +27,7 @@ if TYPE_CHECKING:
|
|||||||
class ContextMenuManager:
|
class ContextMenuManager:
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
treeview: LogTreeView | ModTreeView | ServerTreeView,
|
treeview: LogTreeView | ModTreeView | ServerTreeView | ServerModTreeView,
|
||||||
controller: "Controller",
|
controller: "Controller",
|
||||||
) -> None:
|
) -> None:
|
||||||
self.controller = controller
|
self.controller = controller
|
||||||
@@ -83,6 +84,11 @@ class ContextMenuManager:
|
|||||||
case ContextMenu.COPY_LOG_CLIPBOARD:
|
case ContextMenu.COPY_LOG_CLIPBOARD:
|
||||||
self.copy_log()
|
self.copy_log()
|
||||||
|
|
||||||
|
if isinstance(self.treeview, ServerModTreeView):
|
||||||
|
match action:
|
||||||
|
case ContextMenu.OPEN_WORKSHOP:
|
||||||
|
self.open_mod_page()
|
||||||
|
|
||||||
def copy_server_ip(self) -> None:
|
def copy_server_ip(self) -> None:
|
||||||
if not isinstance(self.treeview, ServerTreeView):
|
if not isinstance(self.treeview, ServerTreeView):
|
||||||
return
|
return
|
||||||
@@ -96,7 +102,7 @@ class ContextMenuManager:
|
|||||||
copy_clipboard(name)
|
copy_clipboard(name)
|
||||||
|
|
||||||
def open_mod_page(self) -> None:
|
def open_mod_page(self) -> None:
|
||||||
if not isinstance(self.treeview, ModTreeView):
|
if not hasattr(self.treeview, "get_selected_mod"):
|
||||||
return
|
return
|
||||||
mod = self.treeview.get_selected_mod()
|
mod = self.treeview.get_selected_mod()
|
||||||
cmd = self.controller.query_config(Preferences.CLIENT)
|
cmd = self.controller.query_config(Preferences.CLIENT)
|
||||||
|
|||||||
@@ -288,6 +288,9 @@ class ServerModelManager:
|
|||||||
self.emitter.emit("already_saved_server")
|
self.emitter.emit("already_saved_server")
|
||||||
return
|
return
|
||||||
config_man.add_saved_server(fqip)
|
config_man.add_saved_server(fqip)
|
||||||
|
# 2026-05-04
|
||||||
|
# TODO: this is valid if saved servers tab is already open,
|
||||||
|
# but not if app was just booted
|
||||||
if proxy_man.has_control_model() is False:
|
if proxy_man.has_control_model() is False:
|
||||||
self._get_proxy_man().push(records)
|
self._get_proxy_man().push(records)
|
||||||
else:
|
else:
|
||||||
@@ -373,8 +376,8 @@ class ServerModelManager:
|
|||||||
if self.preserve_on_fail is False:
|
if self.preserve_on_fail is False:
|
||||||
# CHORE: test if maps are cleared on failure
|
# 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([])
|
# 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"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from dzgui.const.constants import (
|
|||||||
)
|
)
|
||||||
from dayzquery import DayzMod
|
from dayzquery import DayzMod
|
||||||
from dzgui.views.components.frame import HeadingFrame
|
from dzgui.views.components.frame import HeadingFrame
|
||||||
from dzgui.views.trees.tree_server_mods import ServerModTree
|
from dzgui.views.trees.tree_server_mods import ServerModTreeView
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
|
|
||||||
@@ -42,7 +42,6 @@ class PreConnectionAssistant(Gtk.Box):
|
|||||||
|
|
||||||
self.controller.register_widget("preconnect", self)
|
self.controller.register_widget("preconnect", self)
|
||||||
|
|
||||||
|
|
||||||
# TODO: strings
|
# TODO: strings
|
||||||
self.back = Gtk.Button(label="Back")
|
self.back = Gtk.Button(label="Back")
|
||||||
# TODO: dynamic button text if no mods needed
|
# TODO: dynamic button text if no mods needed
|
||||||
@@ -58,13 +57,22 @@ class PreConnectionAssistant(Gtk.Box):
|
|||||||
# set visibility if warnings > 1
|
# set visibility if warnings > 1
|
||||||
frame = HeadingFrame(Gtk.Label(label="ITEM ONE"), "Warnings")
|
frame = HeadingFrame(Gtk.Label(label="ITEM ONE"), "Warnings")
|
||||||
|
|
||||||
self.tree = ServerModTree(self.controller)
|
self.tree = ServerModTreeView(self.controller)
|
||||||
|
|
||||||
self.scrolled = Gtk.ScrolledWindow()
|
self.scrolled = Gtk.ScrolledWindow()
|
||||||
self.scrolled.add(self.tree)
|
self.scrolled.add(self.tree)
|
||||||
self.scrolled.set_size_request(600, 400)
|
self.scrolled.set_size_request(600, 400)
|
||||||
|
|
||||||
self.add(self.scrolled)
|
self.tree_frame = HeadingFrame(self.scrolled, "Mods")
|
||||||
|
|
||||||
|
# TODO: should form a part of tree_frame above
|
||||||
|
self.mod_count = Gtk.Label(label="")
|
||||||
|
|
||||||
|
self.title = Gtk.Label(label="")
|
||||||
|
|
||||||
|
self.add(self.title)
|
||||||
|
self.add(self.tree_frame)
|
||||||
|
self.add(self.mod_count)
|
||||||
self.add(frame)
|
self.add(frame)
|
||||||
self.add(self.button_box)
|
self.add(self.button_box)
|
||||||
|
|
||||||
@@ -78,8 +86,17 @@ class PreConnectionAssistant(Gtk.Box):
|
|||||||
self.controller.open_page(page)
|
self.controller.open_page(page)
|
||||||
|
|
||||||
def populate(self, res: dict[Any], mods: list["DayzMod"]) -> None:
|
def populate(self, res: dict[Any], mods: list["DayzMod"]) -> None:
|
||||||
# TODO: embed tree from dialog, but not dialog itself
|
|
||||||
self.tree.populate(mods)
|
self.tree.populate(mods)
|
||||||
|
total = len(mods)
|
||||||
|
self.title.set_text(f"Connecting to {res["name"]}")
|
||||||
|
if total < 1:
|
||||||
|
self.tree.set_visible(False)
|
||||||
|
self.mod_count.set_visible(False)
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.tree.set_visible(True)
|
||||||
|
self.mod_count.set_visible(True)
|
||||||
|
self.mod_count.set_text(f"Total mods: {str(total)}")
|
||||||
# steam_path = self.controller.get_config_man().lookup(Preferences.DEFAULT)
|
# steam_path = self.controller.get_config_man().lookup(Preferences.DEFAULT)
|
||||||
# dayz_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ)
|
# dayz_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ)
|
||||||
# dayz_exp_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ_EXP)
|
# dayz_exp_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ_EXP)
|
||||||
@@ -94,3 +111,4 @@ class PreConnectionAssistant(Gtk.Box):
|
|||||||
|
|
||||||
# TODO: icon for mod signature issue
|
# TODO: icon for mod signature issue
|
||||||
# or "Update mods and connect"
|
# or "Update mods and connect"
|
||||||
|
# also handle servers with no mods; do not show tree
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
|
from dzgui.const.enum import ContextMenuGroup
|
||||||
from dzgui.model.model_factory import ModelFactory
|
from dzgui.model.model_factory import ModelFactory
|
||||||
from dzgui.views.mixins.cursor_mixin import CursorMixin
|
from dzgui.views.mixins.context_mixin import ContextMixin
|
||||||
from dzgui.views.trees.tree_base import TreeView
|
from dzgui.views.trees.tree_base import TreeView
|
||||||
from dzgui.util import strings
|
from dzgui.util import strings
|
||||||
|
|
||||||
@@ -14,22 +15,19 @@ if TYPE_CHECKING:
|
|||||||
from dzgui.controllers.mc import Controller
|
from dzgui.controllers.mc import Controller
|
||||||
|
|
||||||
|
|
||||||
class ServerModTree(TreeView): # type: ignore
|
class ServerModTreeView(ContextMixin, TreeView): # type: ignore
|
||||||
def __init__(self, controller: "Controller") -> None:
|
def __init__(self, controller: "Controller") -> None:
|
||||||
super().__init__(controller)
|
super().__init__(controller, menu=ContextMenuGroup.SERVER_MOD)
|
||||||
|
|
||||||
# self.view = TreeView(controller)
|
|
||||||
self.mod_store = ModelFactory().make_server_mod_store()
|
self.mod_store = ModelFactory().make_server_mod_store()
|
||||||
|
|
||||||
self.set_fixed_height_mode(True)
|
self.set_fixed_height_mode(True)
|
||||||
self.set_headers_visible(True)
|
self.set_headers_visible(True)
|
||||||
self.set_model(self.mod_store)
|
self.set_model(self.mod_store)
|
||||||
|
|
||||||
# self.scrollable_tree = Gtk.ScrolledWindow()
|
self.connect("button-press-event", self.present_menu)
|
||||||
# self.scrollable_tree.add(self.view)
|
self.connect("key-press-event", self.present_menu)
|
||||||
# self.scrollable_tree.set_size_request(700, 400)
|
self.connect("row-activated", self._on_row_activated)
|
||||||
|
|
||||||
# self.view.connect("row-activated", self._on_row_activated)
|
|
||||||
|
|
||||||
for i, column_title in enumerate(strings.server_mod_cols):
|
for i, column_title in enumerate(strings.server_mod_cols):
|
||||||
renderer = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END)
|
renderer = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END)
|
||||||
@@ -46,9 +44,26 @@ class ServerModTree(TreeView): # type: ignore
|
|||||||
case _:
|
case _:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# mod_count = len(mods)
|
# TODO: could be problematic if user downloads mods out of band
|
||||||
# self._set_footer(mod_count)
|
def _on_row_activated(
|
||||||
|
self,
|
||||||
|
treeview: Gtk.TreeView,
|
||||||
|
path: Gtk.TreePath,
|
||||||
|
col: Gtk.TreeViewColumn,
|
||||||
|
) -> None:
|
||||||
|
mod = self.get_value_at_index(1)
|
||||||
|
self.controller.open_workshop_page(mod)
|
||||||
|
|
||||||
|
def get_selected_mod(self) -> str:
|
||||||
|
path = self.get_focused_row_path()
|
||||||
|
model = self.get_model()
|
||||||
|
tree_iter = model.get_iter(path)
|
||||||
|
mod = model.get(tree_iter, 1)[0]
|
||||||
|
return str(mod)
|
||||||
|
|
||||||
def populate(self, mods: list[list[str]]) -> None:
|
def populate(self, mods: list[list[str]]) -> None:
|
||||||
|
self.mod_store.clear()
|
||||||
for mod in mods:
|
for mod in mods:
|
||||||
self.mod_store.append(mod)
|
self.mod_store.append(mod)
|
||||||
|
path = Gtk.TreePath.new_from_indices([0])
|
||||||
|
self.set_cursor(path)
|
||||||
Reference in new issue
Block a user