Source code for repoman.ui.wizard.dialog
"""Upgrade assistant wizard dialog (RepomanWizardDialog).
Wraps an AdwNavigationView with three pages (select → check → confirm).
Uses Gtk.Window so the WM draws the titlebar with the user's own theme.
"""
from __future__ import annotations
import gi
gi.require_version("Adw", "1")
gi.require_version("Gtk", "4.0")
from gi.repository import Adw, GLib, GObject, Gtk
from ...models import Repository, WizardState
from ...utils import get_current_codename
from ..position import center_on_parent
from .select_page import SelectReposPage
[docs]
class RepomanWizardDialog(Gtk.Window):
"""
Upgrade assistant — modal Gtk.Window wrapping AdwNavigationView.
Uses Gtk.Window so the system window manager (Xfwm4, etc.) draws the
titlebar with the user's own theme, consistent with the main window.
Emits:
repos-updated — after polkit writes succeed; caller must reload repo list
"""
__gtype_name__ = "RepomanWizardDialog"
__gsignals__ = {
"repos-updated": (GObject.SignalFlags.RUN_FIRST, None, ()),
"closing": (GObject.SignalFlags.RUN_FIRST, None, ()),
}
def __init__(
self,
repos: list[Repository],
parent: Gtk.Window,
**kwargs,
) -> None:
super().__init__(
title="Upgrade assistant",
modal=True,
transient_for=parent,
default_width=480,
default_height=560,
**kwargs,
)
self.set_icon_name("io.github.Tecktron.repoman")
center_on_parent(self)
self._closing = False
self._state = WizardState(
candidate_repos=repos,
target_codename=get_current_codename(),
on_complete=self._handle_complete,
)
self._nav_view = Adw.NavigationView()
self._toast_overlay = Adw.ToastOverlay()
self._toast_overlay.set_child(self._nav_view)
self.set_child(self._toast_overlay)
first_page = SelectReposPage(state=self._state, nav_view=self._nav_view)
self._nav_view.push(first_page)
# Belt-and-suspenders: connect_after runs even when an earlier handler
# (e.g. AdwNavigationView) returns True and stops normal propagation.
self.connect_after("close-request", self._on_close_after)
[docs]
def do_close_request(self) -> bool:
self._schedule_close()
return True
def _on_close_after(self, _win: Gtk.Window) -> bool:
self._schedule_close()
return True
def _schedule_close(self) -> None:
if self._closing:
return
self._closing = True
# Notify owner immediately so it clears its reference before any idle fires.
self.emit("closing")
self.set_visible(False)
GLib.idle_add(self.destroy)
[docs]
def add_toast(self, toast: Adw.Toast) -> None:
self._toast_overlay.add_toast(toast)
def _handle_complete(self) -> None:
self.emit("repos-updated")
self._schedule_close()