Состояния иконки в строке меню
Автор: 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), чтобы иконка быстро возвращалась к базовому состоянию, если задача зависла.