shared-gui / FOR_SMLFLG.md
smlflg's picture
Initial public upload from Projekte/shared-gui
74f57c5 verified
|
Raw History Blame Contribute Delete
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:

# 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