# shared-gui ## Was ist das? Gemeinsame GTK3-Basisklasse fuer alle Desktop-Apps in diesem Setup. Stellt `BaseApp` bereit — ein GTK3-Fenster mit Catppuccin-Theme, COSMIC Dark/Light Auto-Detection, HeaderBar, StatusBar und Refresh-Timer-Management. Wird von ClaudeCodePanel und Sidecar genutzt. ## Architektur & Tech-Stack ``` gui_base.py (204 LOC) | BaseApp(Gtk.Window) |-- __init__(title, width, height, icon_name) | HeaderBar + content_box + StatusBar | |-- set_subtitle(text) |-- add_header_widget(widget, end=True) |-- set_status(text, css_class) # "status-saved" | "status-error" |-- start_refresh(interval_s, cb) # GLib.timeout_add_seconds |-- stop_all_refresh() |-- add_css(css_string) # Palette-aware extra CSS |-- run() # show_all() + Gtk.main() | |-- _apply_full_css() # intern: Theme-CSS + Base-CSS laden |-- _base_css(palette) # intern: Card, Badge, Button CSS Abhaengigkeit: ~/Projekte/ClaudeCodePanel/theme.py build_css(palette), get_palette(), setup_theme_watcher() ``` **Stack:** Python 3, GTK3 (gi.repository), GLib, Catppuccin-Palette aus ClaudeCodePanel/theme.py **CSS-Klassen die BaseApp mitbringt:** - `.base-card` — abgerundete Karte mit Hover - `.base-toolbar` — Toolbar-Hintergrund - `.base-badge`, `.base-badge-ok`, `.base-badge-warn`, `.base-badge-error` - `.base-accent-btn` — Haupt-Akzent-Button ## Starten / Nutzen Nicht direkt ausfuehrbar. Als Library importieren: ```python # In einer neuen GTK3-App: import sys sys.path.insert(0, str(Path.home() / "Projekte" / "shared-gui")) from gui_base import BaseApp import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk class MeineApp(BaseApp): def __init__(self): super().__init__("Meine App", 800, 600) label = Gtk.Label(label="Hallo") self.content_box.pack_start(label, True, True, 0) MeineApp().run() ``` ## Was funktioniert - Fenster-Setup mit HeaderBar (Titel, Untertitel, Close-Button) - StatusBar unten mit Text + CSS-Klassen (ok/error) - Catppuccin-Theme wird automatisch geladen (hell/dunkel je nach COSMIC-Setting) - Theme-Watcher: GUI aktualisiert sich live bei Theme-Wechsel - Refresh-Timer (GLib.timeout_add_seconds) mit sauberem Cleanup - Erweiterbare CSS via `add_css()` — eigene Klassen hinzufuegen ohne Theme zu ueberschreiben - `add_header_widget()` fuer Buttons/Labels in der HeaderBar (links oder rechts) ## Was fehlt - Kein Packaging/`__init__.py` — direkter Import via sys.path Hack - Keine Tests - Kein Fallback wenn ClaudeCodePanel/theme.py nicht existiert (hard dependency) - Kein `icon_name` Default (None = kein App-Icon) ## Entscheidungen & Lessons Learned - **Abhaengigkeit zu ClaudeCodePanel/theme.py**: ClaudeCodePanel war zuerst da und hat das Theme-System. shared-gui baut darauf auf statt es zu duplizieren. Kopplung ist bewusst — beide liegen lokal. - **GTK3 statt GTK4**: COSMIC Desktop nutzt GTK3. GTK4-Migration ist unnoetig und wuerde Kompatiblitaet brechen. - **Kein eigenes Python-Package**: Nur eine Datei, kein Overhead durch setup.py/pyproject.toml. Fuer 1-2 Consumer reicht sys.path.insert(). - **Refresh via GLib**: GLib.timeout_add_seconds laeuft im GTK-Main-Loop — kein Threading noetig, kein Race Condition. ## Next Steps 1. Fallback implementieren falls ClaudeCodePanel/theme.py fehlt (eigene Mini-Palette) 2. `__init__.py` hinzufuegen damit `from shared_gui import BaseApp` sauber funktioniert 3. Bei mehr als 2 Consumern: als lokales pip-Package installierbar machen