Menüleisten-Icon-Zustände

Autor: steipete · Aktualisiert: 06.12.2025 · Bereich: macOS-App (apps/macos)

  • Idle: Normale Icon-Animation (Blinzeln, gelegentliches Wackeln).
  • Pausiert: Status-Item nutzt appearsDisabled; keine Bewegung.
  • Sprachauslöser (große Ohren): Der Voice-Wake-Detector ruft AppState.triggerVoiceEars(ttl: nil) auf, wenn das Wake-Word erkannt wird, und hält earBoostActive=true während die Äußerung erfasst wird. Die Ohren skalieren hoch (1,9×), bekommen kreisförmige Ohrlöcher für bessere Lesbarkeit und fallen dann über stopVoiceEars() nach 1 s Stille wieder ab. Wird nur von der In-App-Voice-Pipeline ausgelöst.
  • Arbeitet (Agent läuft): AppState.isWorking=true steuert eine “Schwanz/Bein-Wusel”-Mikrobewegung: schnelleres Beinwackeln und leichter Versatz während Arbeit läuft. Wird aktuell bei WebChat-Agent-Aufrufen umgeschaltet; füge denselben Toggle bei anderen längeren Tasks hinzu, wenn du sie verdrahtest.

Verdrahtungspunkte

  • Voice-Wake: Runtime/Tester rufen AppState.triggerVoiceEars(ttl: nil) beim Trigger auf und stopVoiceEars() nach 1 s Stille, um das Erfassungsfenster zu matchen.
  • Agent-Aktivität: Setze AppStateStore.shared.setWorking(true/false) um Arbeitsspannen herum (bereits bei WebChat-Agent-Aufrufen gemacht). Halte Spannen kurz und setze in defer-Blöcken zurück, um hängende Animationen zu vermeiden.

Formen & Größen

  • Basis-Icon wird in CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:) gezeichnet.
  • Ohrskalierung ist standardmäßig 1.0; Voice-Boost setzt earScale=1.9 und schaltet earHoles=true ohne den Gesamtrahmen zu ändern (18×18 pt Template-Image gerendert in einen 36×36 px Retina-Backing-Store).
  • Scurry nutzt Beinwackeln bis ~1,0 mit kleinem horizontalem Ruckeln; es ist additiv zu jedem bestehenden Idle-Wackeln.

Verhaltenshinweise

  • Kein externer CLI/Broker-Toggle für Ohren/Arbeiten; halte es intern zu den eigenen Signalen der App, um versehentliches Flattern zu vermeiden.
  • Halte TTLs kurz (<10 s), damit das Icon schnell zur Baseline zurückkehrt, wenn ein Job hängt.