diff --git a/dzgui/util/strings.py b/dzgui/util/strings.py index a9fd523..c472474 100644 --- a/dzgui/util/strings.py +++ b/dzgui/util/strings.py @@ -485,11 +485,13 @@ api_error = "API key validation error or timeout. See 'Help > Show debug log' fo @dataclass(slots=True, frozen=True) class DevelopersPage: + header: str paths_label: str prefs_label: str columns: list[str] developers = DevelopersPage( + header="Developers", paths_label="Resolved XDG paths", prefs_label="Boot preferences", columns=["Key", "Value"] diff --git a/dzgui/views/pages/devs.py b/dzgui/views/pages/devs.py new file mode 100644 index 0000000..5d99ff1 --- /dev/null +++ b/dzgui/views/pages/devs.py @@ -0,0 +1,84 @@ +import typing + +import gi # noqa E402 +gi.require_version("Gtk", "3.0") +from gi.repository import Gtk + +from dataclasses import fields +from typing import Union, TYPE_CHECKING +from dzgui.const.enum import NotebookPage +from dzgui.util.strings import developers +from dzgui.util.css import add_class + +if TYPE_CHECKING: + from dzgui.controllers.mc import Controller + from dzgui.config.userprefs import UserPrefs + from dzgui.config.xdg import Xdg + +""" +Shows TreeViews displaying contents of parsed XDG paths and user preferences +""" + +# TODO: make scrollable, test long values/wrapping + +class Developers(Gtk.Box): + def __init__(self, controller: "Controller") -> None: + super().__init__( + orientation=Gtk.Orientation.VERTICAL, + margin_start=10, + margin_end=10, + ) + + self.controller = controller + + heading = Gtk.Label(label=developers.header) + heading.set_halign(Gtk.Align.CENTER) + add_class(heading, "page-heading") + + back_button = Gtk.Button(label="Back", halign=Gtk.Align.START) + back_button.connect("clicked", self._on_back_clicked) + paths_label = Gtk.Label() + paths_label.set_markup(f"{developers.paths_label}") + + prefs_label = Gtk.Label() + prefs_label.set_markup(f"{developers.prefs_label}") + + paths_tree = self._make_tree(self.controller.prefs.paths) + prefs_tree = self._make_tree(self.controller.prefs) + trees_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) + + paths_tree.set_cursor(0) + prefs_tree.set_cursor(0) + + for el in [ + paths_label, + paths_tree, + prefs_label, + prefs_tree + ]: + trees_box.add(el) + + self.add(heading) + self.add(back_button) + self.add(trees_box) + + def _on_back_clicked(self, button: Gtk.Button) -> None: + self.controller.open_page(NotebookPage.OPTIONS) + + def _make_tree(self, prefs: Union["Xdg", "UserPrefs"]) -> Gtk.TreeView: + view = Gtk.TreeView() + renderer = Gtk.CellRendererText() + for i, col in enumerate(developers.columns): + column = Gtk.TreeViewColumn(col, renderer, text=i) + column.set_sizing(Gtk.TreeViewColumnSizing.FIXED) + view.append_column(column) + + store = Gtk.ListStore(str, str) + for field in fields(prefs): + if field.name == "paths": + break + k, v = field.name, getattr(prefs, field.name) + store.append((k, str(v))) + + view.set_model(store) + return view