From e51b4270e2079310e1d612806678306b460e32fb Mon Sep 17 00:00:00 2001
From: aclist <92275929+aclist@users.noreply.github.com>
Date: Wed, 10 Dec 2025 13:35:15 +0900
Subject: [PATCH] feat: add notebook page
---
dzgui/util/strings.py | 2 +
dzgui/views/pages/devs.py | 84 +++++++++++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+)
create mode 100644 dzgui/views/pages/devs.py
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