|
Download FOR_SMLFLG.md from smlflg/shared-gui: direct link, hf CLI and curl.
- Browser
- Download file 3.66 kB
-
https://huggingface.co/smlflg/shared-gui/resolve/main/FOR_SMLFLG.md
- Command line
-
hf download hf://smlflg/shared-gui/FOR_SMLFLG.md
-
curl -L -o FOR_SMLFLG.md https://huggingface.co/smlflg/shared-gui/resolve/main/FOR_SMLFLG.md
3.66 kB
| # 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 | |