Přeskočit obsah

Launcher 2 — GUI specifikace (Python / customtkinter)

Tento soubor nahrazuje main-app.md pro Python verzi launcheru. Backend (FastAPI) zůstává beze změny — viz ostatní spec soubory.


Přehled

Desktop launcher kompletně v Pythonu (customtkinter). Distribuován jako standalone .exe (PyInstaller, Windows) nebo .AppImage (Linux). Nahrazuje původní Rust/egui launcher.


Technologický stack

Vrstva Technologie Poznámka
GUI customtkinter 5.2+ Dark-themed widgets, ttk-based
HTTP requests + threading Async volání bez blokování UI
Barvy colors.py modul Dynamicky přepisován při změně tématu
Nastavení settings.py singleton JSON v %APPDATA%\Avaxis\launcher2\
Témata theme.py + 6 palet Live přepínání (rebuild okna)
Build PyInstaller 6+ Single-file .exe, ~21 MB

Struktura souborů

desktop/launcher2/
├── main.py           — vstupní bod, LoginWindow
├── main_window.py    — MainWindow (menu lišta + screen routing + reload_theme)
├── screens.py        — všechny obrazovky (Library, Help, Settings, Placeholder)
├── colors.py         — aktuální paleta (přepisuje theme.apply_theme)
├── theme.py          — 6 palet + apply_theme()
├── settings.py       — SettingsManager singleton (load/save JSON)
├── api.py            — HTTP wrapper (login, get_me, get_catalog_apps)
├── requirements.txt
└── plugins/          — výpočetní pluginy mzdy/DPH (L2.5+)

Spuštění

cd desktop/launcher2
pip install customtkinter requests Pillow
python main.py

Build exe:

cd avax/
python -m PyInstaller avax-launcher2.spec --noconfirm
# výstup: dist/avax-launcher2.exe  (~21 MB, self-contained)


Inicializační pořadí (main.py)

1. from settings import settings          ← načte settings.json
2. from theme import apply_theme          ← připraví paletový systém
3. apply_theme(settings.get("theme"))     ← zapíše barvy do colors.*
4. import customtkinter, api, colors      ← GUI moduly (čtou colors.*)
5. LoginWindow().mainloop()               ← spustí aplikaci

Pořadí je kritické — apply_theme musí být zavolána před importem GUI modulů.


Flow přihlášení

LoginWindow
  │  POST /auth/login  →  { access_token, refresh_token }
  │  GET  /auth/me     →  { email, name, company_name, system_role }
  ├─ [Úspěch]  →  LoginWindow.withdraw()
  │               MainWindow(session, on_logout=_show_login)
  └─ [Chyba]   →  zobrazit chybovou zprávu, tlačítko zpět na normal

Odhlášení:

MainWindow._logout()
  ├─ self.destroy()          ← nejdřív destroy (Python 3.13 rule)
  └─ _logout_cb()            ← pak callback → LoginWindow.deiconify()


[▶ AVAX]  [Novinky]  [Software ▾]  [Chat]  [Nápověda ▾]  |  [Jméno ▾]
  • Barva pozadí: colors.BG0
  • [▶ AVAX] — tlačítko s colors.ACCENT, naviguje na Novinky
  • Nav tlačítka — fg_color="transparent", hover_color=colors.BG2
  • Dropdowny — floating _Dropdown(CTkFrame), pozicovány přes place()
  • Zavření dropdownu — bind_all("<Button-1>"), kontrola hierarchie widgetů
📦  Knihovna
🛒  Obchod
🎧  Podpora
📄  GDPR
📋  Smlouvy
ℹ   O systému
💻  O klientu
👤  Můj profil
🏢  Detail účtu
⚙   Předvolby
📊  Moje předplatné
────────────────
🔧  Nastavení
────────────────
🚪  Odhlásit se

Obrazovky

Screen cache (lazy init)

Každá obrazovka se vytvoří jen jednou a ukládá do _cache: dict[str, CTkFrame]. Přepínání = pack_forget() + pack(). Při reload_theme() se cache zahodí (celé okno se zničí a vytvoří znovu).

Přehled obrazovek

Klíč Třída Stav Popis
library LibraryScreen ✅ Funkční Grid karet, live API, vyhledávání, refresh
store PlaceholderScreen 🔲 Placeholder Katalog k zakoupení
news PlaceholderScreen 🔲 Placeholder Novinky a blog
chat PlaceholderScreen 🔲 Placeholder Interní chat (čeká F4)
help_support HelpScreen ✅ FAQ karty Podpora, kontakt, provozní doba
help_gdpr HelpScreen ✅ FAQ karty GDPR, výmaz, umístění dat
help_contracts HelpScreen ✅ FAQ karty Smlouvy, fakturace
help_system HelpScreen ✅ FAQ karty Verze, backend URL
help_client HelpScreen ✅ FAQ karty O Avaxis, kontakt
profile PlaceholderScreen 🔲 Placeholder Editace profilu (GET/PUT /auth/me)
account PlaceholderScreen 🔲 Placeholder Info o firmě
prefs PlaceholderScreen 🔲 Placeholder Správa uživatelů (jen admin)
subscription PlaceholderScreen 🔲 Placeholder Aktivní předplatné
settings SettingsScreen ✅ Funkční Témata, písmo, chování, URL

Knihovna (LibraryScreen)

┌─ Header ─────────────────────────────────────────────────────┐
│  📦 Knihovna aplikací          [🔍 Hledat…] [↺]             │
│  Aplikace dostupné pro vaši firmu                            │
└───────────────────────────────────────────────────────────────┘
┌─ Scrollable grid (3 sloupce) ────────────────────────────────┐
│  ┌─ App Card ──────┐  ┌─ App Card ──────┐  ┌─ App Card ───┐ │
│  │ [A] Název       │  │ [B] Název       │  │              │ │
│  │     v2.1 · 12MB │  │     v1.0 · 5MB  │  │              │ │
│  │ [── Stáhnout ─] │  │ [── Stáhnout ─] │  │              │ │
│  └─────────────────┘  └─────────────────┘  └──────────────┘ │
└───────────────────────────────────────────────────────────────┘

Data: GET /catalog/apps (Authorization: Bearer token) Vyhledávání: filtr přes name / slug / description (lokálně) Refresh: smaže cache, znovu načte z API


Nastavení (SettingsScreen)

Sekce VZHLED

Barevné téma — 6 swatchů s radio výběrem, live přepnutí:

[●DarkModrá] [○Tmavá] [○Zelená] [○Světlá] [○Černá] [○Růžová]
Po kliknutí → main_win.reload_theme(name) → okno se obnoví do 50 ms.

Velikost písma — small / normal / large (projeví se po restartu)

Sekce CHOVÁNÍ

  • Při zavření okna: quit / tray (tray dostupné v L2.4)
  • Spustit s Windows: switch → registry HKCU\...\Run (jen v .exe)

Sekce PŘIHLÁŠENÍ

  • Zapamatovat e-mail: switch → settings.saved_email předvyplní login form

Sekce POKROČILÉ

  • Backend URL: textové pole → uloží + aktualizuje api.API_BASE ihned

Live přepínání témat

# SettingsScreen._on_theme(name)
settings.set("theme", name)
main_win.reload_theme(name)

# MainWindow.reload_theme(name)
apply_theme(name)          # colors.BG0 = nova_hodnota, ...
geom = self.geometry()     # zachovat pozici a velikost
self.after(50, do_reload)

# do_reload()
self.destroy()             # zničit staré okno
new_win = MainWindow(...)  # nové okno čte colors.* (aktuální hodnoty)
new_win.geometry(geom)
new_win.show_screen("settings")

Klíč: import colors místo from colors import BG0 — modul se nečte jednou při importu, ale vždy přes referenci colors.BG0 (vždy aktuální hodnota).


Barevná témata

Název BG0 BG1 ACCENT
dark_blue (výchozí) #0d131f #11192b #3d8bff
dark #111111 #1a1a1a #888888
green #0a140a #0f1e0f #2ecc71
light #c8c8d8 #d8d8e8 #2050cc
black #000000 #0a0a0a #505050
pink #1f0a14 #2a0f1e #ff3d9a

Paleta obsahuje: BG0, BG1, BG2, BG3, ACCENT, TEXT, TEXT_DIM, ERROR, GREEN, ORANGE


Settings soubor

Uloženo: %APPDATA%\Avaxis\launcher2\settings.json

{
  "theme": "dark_blue",
  "font_size": "normal",
  "language": "cs",
  "on_close": "quit",
  "start_with_windows": false,
  "backend_url": "http://192.168.1.55:8000",
  "notifications": true,
  "remember_login": true,
  "saved_email": "",
  "window_w": 1100,
  "window_h": 700
}

Distribuce (Windows)

avax-launcher2.spec  ←  PyInstaller spec (v kořenu projektu)
  ├── pathex: desktop/launcher2/
  ├── datas:  customtkinter package (témata + assety)
  └── console: False  (bez CMD okna)

dist/avax-launcher2.exe  ←  výstupní soubor (~21 MB)

WDAC (Windows Application Control) blokuje nepodepsané exe. Spuštění: pravý klik → Vlastnosti → Odblokovat, nebo spustit z terminálu. Pro produkci: OV code-signing certifikát (~5 000 Kč/rok).


Aktualizováno: 2026-04-25