feat: abstract base server dialog

This commit is contained in:
aclist committed 2026-03-31 23:58:10 +09:00
1 parent 6393265935
commit 55e6af8fe2
11 files changed
+110 -112

No files matched your search

+59 -89
View File
@@ -1,12 +1,12 @@
import textwrap
from typing import Self, TYPE_CHECKING
from dzgui.const.constants import EXPAND, FILL, NO_PADDING
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.util.format import format_hyperlinks, format_server_mods
from dzgui.views.dialogs.generic import GenericDialog
from dzgui.views.trees.tree_base import TreeView
import gi
@@ -15,34 +15,57 @@ from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
if TYPE_CHECKING:
from dzgui.api.servers import Details
from dzgui.controllers.mc import Controller
# TODO: make a more generic base class
class ServerDetailsDialog(GenericDialog):
def __init__(self, controller, details: "Details"):
class ServerDialog(GenericDialog):
def __init__(self, controller: "Controller", title: str, secondary: str):
super().__init__(
controller=controller,
text=details.name,
text=title,
buttons=Gtk.ButtonsType.OK,
mtype=Gtk.MessageType.INFO,
secondary=strings.server_details,
secondary=secondary,
)
dialog_box = self.get_content_area()
self.set_default_response(Gtk.ResponseType.OK)
self.set_size_request(800, 700)
self.store = Gtk.ListStore(str, str, Pango.Weight)
self.view = TreeView(controller)
self.view.set_fixed_height_mode(True)
self.view = Gtk.TreeView(
enable_search=False,
search_column=-1,
headers_visible=False,
fixed_height_mode=True,
)
self.view.connect("row-activated", self._on_row_activated)
self.connect("response", self._on_response)
self.view.connect("key-press-event", self._on_keypress)
self.scrollable_tree = Gtk.ScrolledWindow()
self.scrollable_tree.add(self.view)
self.scrollable_tree.set_size_request(700, 400)
self.content = self.get_content_area()
self.content.pack_start(self.scrollable_tree, EXPAND, FILL, 0)
def pack(self, widget: Gtk.Widget) -> None:
self.content.pack_start(widget, EXPAND, FILL, NO_PADDING)
def _on_keypress(self, view: Gtk.TreeView, event: Gdk.EventKey) -> None:
# NOTE: ESC normally unfocuses treeview instead of destroying dialog
if event.keyval == Gdk.KEY_Escape:
self.destroy()
return True
return False
def _on_response(self, dialog: Self, response: Gtk.ResponseType) -> None:
self.destroy()
class ServerDetailsDialog(ServerDialog):
def __init__(self, controller, details: "Details"):
name = controller.get_server_name()
super().__init__(controller, strings.server_details, name)
self.store = Gtk.ListStore(str, str, Pango.Weight)
self.view.connect("row-activated", self._on_row_activated)
for i, column_title in enumerate(["Item", "Details"]):
renderer = Gtk.CellRendererText(xalign=0)
if i == 0:
@@ -55,11 +78,7 @@ class ServerDetailsDialog(GenericDialog):
column.set_sort_column_id(i)
column.set_expand(True)
scrollable_tree = Gtk.ScrolledWindow()
scrollable_tree.add(self.view)
scrollable_tree.set_size_request(700, 200)
# TODO: center header text
# TODO: make "Server message" text boldface
scrollable_message = Gtk.ScrolledWindow()
desc = Gtk.Label(label=strings.server_message, valign=Gtk.Align.START)
css.add_class(desc, "details-heading")
@@ -71,8 +90,7 @@ class ServerDetailsDialog(GenericDialog):
box.add(el)
scrollable_message.add(box)
dialog_box.pack_start(scrollable_tree, EXPAND, FILL, NO_PADDING)
dialog_box.pack_start(scrollable_message, EXPAND, FILL, NO_PADDING)
self.pack(scrollable_message)
for row in details.data:
self.store.append(row + [Pango.Weight.BOLD])
@@ -81,18 +99,8 @@ class ServerDetailsDialog(GenericDialog):
text = format_hyperlinks(text)
self.description.set_markup(text)
self.connect("response", self._on_response)
self.show_all()
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_response(self, dialog: Self, response: Gtk.ResponseType) -> None:
self.destroy()
def _on_row_activated(
self,
treeview: Gtk.TreeView,
@@ -101,48 +109,19 @@ class ServerDetailsDialog(GenericDialog):
) -> 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):
class ServerModDialog(ServerDialog):
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="",
)
name = controller.get_server_name()
super().__init__(controller, strings.modlist, name)
self.controller = controller
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_headers_visible(True)
self.view.set_model(self.mod_store)
self.view.connect("row-activated", self._on_row_activated)
for i, column_title in enumerate(strings.server_mod_cols):
renderer = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END)
@@ -158,37 +137,28 @@ class ServerModDialog(GenericDialog):
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)")
self._set_footer(mod_count)
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 _set_footer(self, mods: int) -> None:
footer = Gtk.Label(
valign=Gtk.Align.START, justify=Gtk.Justification.CENTER, wrap=True
)
footer_text = format_server_mods(mods)
footer.set_text(footer_text)
self.pack(footer)
def _on_row_activated(
self,
treeview: Gtk.TreeView,
tree_iter: Gtk.TreeIter,
path: Gtk.TreePath,
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)
mod = self.view.get_value_at_index(1)
self.controller.open_workshop_page(mod)