GUI launcher¶
Technical notes for the PyQt6 UI under launcher/. Brand and UX rules: Brand.
Start¶
Dependencies for git clone / tar.gz / ./setup.sh: host PyQt6; optional PyQt6-Fluent-Widgets (ui_fluent.FLUENT_AVAILABLE).
AppImage and Flatpak already bundle Python + PyQt6 (+ Fluent) — no host python-pyqt6 needed there. See Quick start.
Module map¶
| File | Role |
|---|---|
launcher.py |
Main window, QProcess hooks, activity, updates |
recipe_discovery.py |
RecipeInfo / discover / YAML metadata |
ARCHITECTURE-LAUNCHER.md |
Process / trust / secrets model |
ui_fluent.py |
Fluent Theme.DARK + copper #B87333 |
ui_styles.py |
Host QSS, brand tokens |
ui_rezeptor.py |
Sidebar, segment tabs, status pill |
ui_settings.py |
Settings dialog |
ui_docs.py |
In-app markdown (author catalog) |
ui_recipe_view.py / ui_recipe_wizard.py |
Dev: editor / new recipe |
ui_source.py |
Source/target pickers |
recipe_catalog.py |
catalog.json, remote install |
recipe_trust.py |
Manifest SHA256 |
settings.py |
~/.local/share/wine-software/rezeptor/settings.json |
log_context.py |
LogEvent, stable codes E_* |
app_support.py |
humanize_log_line, bug report, releases |
i18n/ + locales/*.json |
UI strings |
version_detect.py |
Engine for YAML version_detect |
host_deps.py |
Suggest missing host tools |
UI conventions¶
- Sidebar fixed 240 px, primary CTA + More ▾, segment tabs
- Always Fluent Dark + copper — no system light hybrid, no PyQtDarkTheme
- Do not override Fluent widgets with host QSS
- Visual changes (colors, radii, scrollbars) only with explicit approval
Settings (excerpt)¶
Persisted in settings.json: locale, developer_mode, validate_on_startup, window geometry, recipe order, hidden IDs, recipe_sources, install env, archive passwords, log retention.
Env passed to hook scripts¶
The GUI sets among others:
| Variable | Purpose |
|---|---|
LAUNCHER_GUI=1 |
Enables @step: / @progress: tags |
LAUNCHER_SESSION_ID |
Session for reports |
RECIPE_DATA_ROOT |
Chosen data location |
RECIPE_INSTALLER_PATH / RECIPE_ARCHIVE_PATH / RECIPE_SOURCE_ROOT |
Source |
RECIPE_TARGET_DIR / RECIPE_DEPLOY_MODE |
Portable target |
In-app docs¶
ui_docs.py → DOC_CATALOG lists author/user pages under docs/{locale}/. The Help menu opens the local markdown view; GitHub links via github_doc_url.
Bug report (GitHub)¶
In app_support.py:
- Clipboard = full body from
bug_report.md(report_clipboard_text/build_issue_body) - URL short +
?template=bug_report.md(+ label/title); paste supplies the long text - Session ID (
LAUNCHER_SESSION_ID) only in the report file, not in the status bar
Error codes¶
Defined in log_context.py, strings under error.* in locales — see I18N.
Install vs reinstall vs repair¶
| Action | Script | Contract |
|---|---|---|
| Install (first time) | install.sh |
Full install_steps |
| Reinstall (GUI, already installed) | install.sh again |
No automatic wipe — recipe decides what to overwrite; use Uninstall for a clean slate |
| Repair | repair.sh |
validate.sh → fix gaps only → validate again |
Reinstall is not idempotent by design: there is no global pre-install purge. Recipes that need a clean deploy must document it in install.sh or require uninstall first.