feat: reimplement details dialog

This commit is contained in:
aclist committed 2026-03-30 21:42:19 +09:00
1 parent ae291eff41
commit 4022b4c6b6
11 files changed
+126 -89

No files matched your search

-7
View File
@@ -19,13 +19,6 @@ if TYPE_CHECKING:
# dialog_type = Gtk.MessageType.INFO
# button_type = Gtk.ButtonsType.OK
# header_text = strings.modlist
# case Popup.DETAILS:
# dialog_type = Gtk.MessageType.INFO
# button_type = Gtk.ButtonsType.OK
# header_text = strings.server_details
# TODO: unused
# def update_label(self, text: str) -> None:
# self.format_secondary_text(text)
class GenericDialog(Gtk.MessageDialog):
+45 -47
View File
@@ -1,20 +1,36 @@
import gi
import dzgui.api.servers as Servers
from dzgui.const.constants import EXPAND, FILL, NO_PADDING
from dzgui.const.enum import Popup
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
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gdk, GObject, Pango # noqa
from dzgui.const.constants import EXPAND, FILL, NO_PADDING
from dzgui.const.enum import Popup
if TYPE_CHECKING:
from dzgui.api.servers import Details
class ServerDetailsDialog(GenericDialog):
def __init__(self, server_name: str, ip: str, qport: int):
super().__init__(server_name, Popup.DETAILS)
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,
)
dialog_box = self.get_content_area()
self.set_default_response(Gtk.ResponseType.OK)
self.set_size_request(800, 700)
self.ip = ip.split(":")[0]
self.qport = qport
self.store = Gtk.ListStore(str, str, Pango.Weight)
self.view = Gtk.TreeView(
@@ -24,13 +40,12 @@ class ServerDetailsDialog(GenericDialog):
fixed_height_mode=True,
)
self.view.connect("row-activated", self._on_row_activated)
self.view.connect("key-press-event", self._on_keypress)
for i, column_title in enumerate(["Item", "Details"]):
renderer = Gtk.CellRendererText(xalign=0)
if i == 0:
column = Gtk.TreeViewColumn(
column_title, renderer, text=i, weight=2
)
column = Gtk.TreeViewColumn(column_title, renderer, text=i, weight=2)
else:
column = Gtk.TreeViewColumn(column_title, renderer, text=i)
column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
@@ -43,15 +58,12 @@ class ServerDetailsDialog(GenericDialog):
scrollable_tree.add(self.view)
scrollable_tree.set_size_request(700, 200)
# TODO: center header text
scrollable_message = Gtk.ScrolledWindow()
desc = Gtk.Label(label=strings.server_message, valign=Gtk.Align.START)
css.add_class(desc, "details-heading")
box = Gtk.Box(
orientation=Gtk.Orientation.VERTICAL, halign=Gtk.Align.CENTER
)
self.description = Gtk.Label(
justify=Gtk.Justification.CENTER, wrap=True
)
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, halign=Gtk.Align.CENTER)
self.description = Gtk.Label(justify=Gtk.Justification.CENTER, wrap=True)
sep = Gtk.Separator(orientation=Gtk.Orientation.HORIZONTAL)
sep.set_margin_bottom(10)
for el in desc, sep, self.description:
@@ -61,12 +73,24 @@ class ServerDetailsDialog(GenericDialog):
dialog_box.pack_start(scrollable_tree, EXPAND, FILL, NO_PADDING)
dialog_box.pack_start(scrollable_message, EXPAND, FILL, NO_PADDING)
self.wait_dialog = GenericDialog(strings.details, Popup.WAIT)
self.wait_dialog.show_all()
thread = threading.Thread(
target=self._background, args=(self.wait_dialog, ip, qport)
)
thread.start()
for row in details.data:
self.store.append(row + [Pango.Weight.BOLD])
self.view.set_model(self.store)
text = details.description
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,
@@ -75,29 +99,3 @@ class ServerDetailsDialog(GenericDialog):
col: Gtk.TreeViewColumn,
) -> None:
self.destroy()
def _load(self) -> None:
if self.wait_dialog:
self.wait_dialog.destroy()
if self.success is False:
AppNav.window.spawn_dialog(strings.server_error, Popup.NOTIFY)
return
self.show_all()
self.run()
self.destroy()
def _background(
self, dialog: "GenericDialog", ip: str, qport: int
) -> None:
response = Servers.details(self.ip, self.qport)
if response.success:
for row in response.data:
self.store.append(row + [Pango.Weight.BOLD])
self.view.set_model(self.store)
text = response.description
text = format_hyperlinks(text)
self.description.set_markup(text)
self.success = response.success
GLib.idle_add(self._load)