File size: 3,661 Bytes
74f57c5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# 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