macOS companion app
Значок в строке меню
Состояния значка в строке меню
Область: приложение macOS (apps/macos). Отрисовка: CritterIconRenderer.makeIcon(...). Связь анимации и состояний: CritterStatusLabel + CritterStatusLabel+Behavior.swift.
Состояния
| Состояние | Условие срабатывания | Визуальное представление |
|---|---|---|
| Бездействие | По умолчанию | Обычная анимация моргания и покачивания; в открытых глазах сохраняется глянцевый блик |
| Приостановлено | isPaused=true |
Антенны опущены («не на службе»), глаза открыты; движения отсутствуют |
| Сон | Gateway отключён или не настроен | Антенны опущены, а глаза закрываются веками ⌣ ⌣; движения отсутствуют |
| Празднование | Сообщение отправлено (sendCelebrationTick) |
Глаза примерно на 0,9 с превращаются в радостные дуги ∩ ∩, одновременно происходит взмах ногой |
| Голосовая активация (уши) | Распознано слово активации | Антенны выпрямляются и вытягиваются вверх (earScale=1.9); после периода тишины возвращаются в исходное положение |
| Работа | isWorking=true или активный IconState |
Более быстрое движение ног (от legWiggle до 1.0) с небольшим смещением по горизонтали поверх обычного покачивания |
Поверх того же значка существа может отображаться индикатор активности инструмента (плашка с символом SF, например chevron.left.slash.chevron.right для выполнения), когда в сеансе активно задание или инструмент. Этот индикатор поступает из IconState/ActivityKind; полную модель состояний см. в разделе Строка меню.
Антенны при голосовой активации
- Запуск:
AppStateStore.shared.triggerVoiceEars(ttl: nil), вызывается из конвейера захвата голосовой активации (VoiceWakeRuntime) и из средств отладки и тестирования голосовой активации (VoiceWakeTester,VoiceWakeOverlayController). - Остановка:
stopVoiceEars(), вызывается при завершении захвата. - Период тишины перед завершением: обычно
2.0s, либо5.0s, если было распознано только слово активации и за ним не последовала речь (VoiceWakeRuntime.silenceWindow/triggerOnlySilenceWindow). - В активированном состоянии таймеры моргания, покачивания, движения ног и антенн при бездействии приостанавливаются (
earBoostActiveуправляет выполнением задачи анимации вCritterStatusLabel+Behavior).
Формы и размеры
- Холст: шаблонное изображение размером 18x18 pt, отрисовываемое в растровый буфер размером 36x36 px (2x), чтобы значок оставался чётким на дисплеях Retina.
- По умолчанию масштаб антенн равен
1.0; при голосовой активации устанавливаетсяearScale=1.9без изменения общего размера рамки. antennaDroop(0–1) опускает антенны для состояний приостановки и сна.- Быстрое движение ног использует значения от
legWiggleдо1.0с небольшим покачиванием по горизонтали.
Примечания о поведении
- Внешнего переключателя CLI или брокера для антенн и рабочего состояния нет; оба состояния управляются внутренними сигналами приложения (
AppState.setWorking,AppState.triggerVoiceEars), чтобы избежать случайного переключения. - Для любого нового TTL задавайте короткое значение (значительно меньше 10 с), чтобы значок быстро возвращался к исходному состоянию, если задание зависнет.
Связанные разделы
Was this useful?