feat: reimplement server mod dialog

This commit is contained in:
aclist committed 2026-03-30 22:51:45 +09:00
1 parent 4022b4c6b6
commit 6393265935
8 files changed
+179 -62

No files matched your search

+43 -45
View File
@@ -1,25 +1,48 @@
import gi
import textwrap
from typing import TYPE_CHECKING
from dzgui.const.constants import EXPAND, FILL
from dzgui.model.model_factory import ModelFactory
from dzgui.util import strings
from dzgui.views.dialogs.generic import GenericDialog
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
class ModDialog(GenericDialog):
def __init__(self, record: str):
if TYPE_CHECKING:
from dzgui.api.servers import Record
class ServerModDialog(GenericDialog):
def __init__(self, controller, mods: list[str]):
# TODO: center secondary text
msg = strings.workshop
super().__init__(textwrap.dedent(msg), Popup.MODLIST)
msg = textwrap.dedent(strings.workshop)
super().__init__(
controller=controller,
text=msg,
buttons="Gtk.ButtonsType.OK",
mtype="Gtk.MessageType.INFO",
secondary="",
)
self.mod_store = ModelFactory().make_server_mod_store()
dialogBox = self.get_content_area()
self.set_default_response(Gtk.ResponseType.OK)
self.set_size_request(800, 500)
self.set_size_request(800, 700)
self.scrollable = Gtk.ScrolledWindow()
self.view = Gtk.TreeView(
enable_search=False, search_column=-1, fixed_height_mode=True
)
self.scrollable.add(self.view)
set_surrounding_margins(self.scrollable, 20)
# set_surrounding_margins(self.scrollable, 20)
self.connect("response", self._on_response)
self.view.connect("row-activated", self._on_row_activated)
self.view.set_model(self.mod_store)
for i, column_title in enumerate(strings.server_mod_cols):
renderer = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END)
@@ -36,46 +59,20 @@ class ModDialog(GenericDialog):
pass
dialogBox.pack_end(self.scrollable, EXPAND, FILL, 0)
wait_dialog = GenericDialog(strings.modlist, Popup.WAIT)
wait_dialog.show_all()
thread = threading.Thread(
target=self._background, args=(wait_dialog, record)
)
thread.start()
mod_count = len(mods)
self.set_markup(f"Modlist ({mod_count} mods")
for mod in mods:
self.mod_store.append(mod)
# TODO: why are we passing record here?
def _background(self, dialog: "GenericDialog", record: str) -> None:
def _load():
dialog.destroy()
# TODO: natively implement
#if data.returncode == 1:
# AppNav.window.spawn_dialog(strings.server_error, Popup.NOTIFY)
# return
self.show_all()
self.set_markup(f"Modlist ({mod_count} mods)")
self.run()
self.show_all()
# TODO: handle response a la details dialog
def _on_keypress(self, view: Gtk.TreeView, event: Gdk.EventKey) -> None:
if event.keyval == Gdk.KEY_Escape:
self.destroy()
record = AppNav.treeview.get_record()
if not record:
return
# TODO: thread
try:
# TODO: get default_steam_path from config
modlist = get_server_modlist(record)
mod_count = self._parse_modlist_rows(modlist)
except Exception:
# TODO: needs to pop error dialog
mod_count = 0
modlist_store.clear()
self.view.set_model(modlist_store)
GLib.idle_add(_load)
def _parse_modlist_rows(self, rows: list) -> bool | int:
for row in rows:
modlist_store.append(row)
return len(rows)
return True
return False
def _on_row_activated(
self,
@@ -91,4 +88,5 @@ class ModDialog(GenericDialog):
path = pathlist[0]
tree_iter = model.get_iter(path)
mod_id = model.get_value(tree_iter, 1)
call_bash_func("open_workshop_page", mod_id)
print(mod_id)
# call_bash_func("open_workshop_page", mod_id)
@@ -1,14 +1,14 @@
import gi
import textwrap
from typing import Self, TYPE_CHECKING
import dzgui.api.servers as Servers
from dzgui.const.constants import EXPAND, FILL, NO_PADDING
from dzgui.const.enum import Popup
from dzgui.model.model_factory import ModelFactory
from dzgui.util import css
from dzgui.util import strings
from dzgui.util.format import format_hyperlinks
from dzgui.views.dialogs.generic import GenericDialog
from typing import Self, TYPE_CHECKING
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
@@ -17,6 +17,7 @@ if TYPE_CHECKING:
from dzgui.api.servers import Details
# TODO: make a more generic base class
class ServerDetailsDialog(GenericDialog):
def __init__(self, controller, details: "Details"):
super().__init__(
@@ -99,3 +100,95 @@ class ServerDetailsDialog(GenericDialog):
col: Gtk.TreeViewColumn,
) -> None:
self.destroy()
def __init__(self, controller, details: "Details"):
super().__init__(
controller=controller,
text=details.name,
buttons=Gtk.ButtonsType.OK,
mtype=Gtk.MessageType.INFO,
secondary=strings.server_details,
)
# TODO: data type is dayzquery.DayzMod
class ServerModDialog(GenericDialog):
def __init__(self, controller, mods: list[str]):
# TODO: center secondary text
msg = textwrap.dedent(strings.workshop)
super().__init__(
controller=controller,
text=msg,
buttons=Gtk.ButtonsType.OK,
mtype=Gtk.MessageType.INFO,
secondary="",
)
self.mod_store = ModelFactory().make_server_mod_store()
dialogBox = self.get_content_area()
self.set_default_response(Gtk.ResponseType.OK)
self.set_size_request(800, 700)
self.scrollable = Gtk.ScrolledWindow()
self.view = Gtk.TreeView(
enable_search=False, search_column=-1, fixed_height_mode=True
)
self.scrollable.add(self.view)
# set_surrounding_margins(self.scrollable, 20)
self.connect("response", self._on_response)
self.view.connect("row-activated", self._on_row_activated)
self.view.set_model(self.mod_store)
for i, column_title in enumerate(strings.server_mod_cols):
renderer = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END)
column = Gtk.TreeViewColumn(column_title, renderer, text=i)
column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
self.view.append_column(column)
column.set_sort_column_id(i)
# FIXME: do not recycle generic string vars
match column_title:
case strings.mod:
column.set_fixed_width(350)
case strings._id:
column.set_fixed_width(200)
case _:
pass
dialogBox.pack_end(self.scrollable, EXPAND, FILL, 0)
mod_count = len(mods)
self.set_markup(f"Modlist ({mod_count} mods)")
for mod in mods:
self.mod_store.append(mod)
self.show_all()
def _on_response(self, dialog: Self, response: Gtk.ResponseType) -> None:
self.destroy()
def _on_keypress(self, view: Gtk.TreeView, event: Gdk.EventKey) -> None:
if event.keyval == Gdk.KEY_Escape:
self.destroy()
return True
return False
def _on_row_activated(
self,
treeview: Gtk.TreeView,
tree_iter: Gtk.TreeIter,
col: Gtk.TreeViewColumn,
) -> None:
select = treeview.get_selection()
sels = select.get_selected_rows()
(model, pathlist) = sels
if len(pathlist) < 1:
return
path = pathlist[0]
tree_iter = model.get_iter(path)
mod_id = model.get_value(tree_iter, 1)
print(mod_id)
# call_bash_func("open_workshop_page", mod_id)