mirror of
https://github.com/aclist/dztui.git
synced 2026-11-08 11:00:48 +01:00
feat: reimplement details dialog
This commit is contained in:
1 parent
ae291eff41
commit
4022b4c6b6
11 files changed
+126
-89
No files matched your search
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
Reference in new issue
Block a user