Состояния иконки в строке меню

Автор: steipete · Обновлено: 2025-12-06 · Область: приложение macOS (apps/macos)

  • Бездействие: Обычная анимация иконки (мигание, случайное покачивание).
  • Пауза: Элемент статуса использует appearsDisabled; без движения.
  • Голосовой триггер (большие уши): Детектор голосовой активации вызывает AppState.triggerVoiceEars(ttl: nil) при обнаружении слова-триггера, поддерживая earBoostActive=true во время захвата речи. Уши увеличиваются (1.9x), получают круглые отверстия для читаемости, затем опускаются через stopVoiceEars() после 1 секунды тишины. Срабатывает только из внутреннего голосового конвейера приложения.
  • Работа (агент запущен): AppState.isWorking=true управляет микродвижением "суета хвоста/лап": более быстрое покачивание лап и небольшое смещение во время выполнения работы. В настоящее время переключается вокруг запусков агента WebChat; добавьте тот же переключатель вокруг других длительных задач, когда вы их подключите.

Точки подключения

  • Голосовая активация: runtime/tester вызывает AppState.triggerVoiceEars(ttl: nil) при триггере и stopVoiceEars() после 1 секунды тишины для соответствия окну захвата.
  • Активность агента: установите AppStateStore.shared.setWorking(true/false) вокруг рабочих промежутков (уже сделано в вызове агента WebChat). Держите промежутки короткими и сбрасывайте в блоках defer, чтобы избежать застрявших анимаций.

Формы и размеры

  • Базовая иконка рисуется в CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:).
  • Масштаб уха по умолчанию 1.0; голосовое усиление устанавливает earScale=1.9 и включает earHoles=true без изменения общей рамки (шаблонное изображение 18×18 pt рендерится в Retina backing store 36×36 px).
  • Суета использует покачивание лап до ~1.0 с небольшим горизонтальным дрожанием; оно добавляется к любому существующему покачиванию бездействия.

Поведенческие примечания

  • Нет внешнего переключателя CLI/broker для ушей/работы; держите его внутренним для собственных сигналов приложения, чтобы избежать случайного мигания.
  • Держите TTL короткими (<10s), чтобы иконка быстро возвращалась к базовому состоянию, если задача зависла.