Appearance
菜单栏图标状态
作者:steipete · 更新:2025-12-06 · 范围:macOS 应用(apps/macos)
- 空闲(Idle):正常图标动画(眨眼、偶尔摇摆)。
- 暂停(Paused):状态项启用
appearsDisabled,无任何动效。 - 语音触发(大耳朵):检测到唤醒词后,语音唤醒检测器调用
AppState.triggerVoiceEars(ttl: nil),在捕捉语音期间保持earBoostActive=true。耳朵缩放到 1.9 倍,出现圆形耳孔以提升辨识度,沉默 1 秒后通过stopVoiceEars()恢复原状。该状态只由应用内语音流水线触发。 - 工作中(Agent 运行中):
AppState.isWorking=true触发"尾巴/腿部快速抖动"微动效:腿部抖动加速并轻微偏移,表示任务正在进行。目前已在 WebChat Agent 调用时切换此状态,在接入其他长任务时同样需要加上切换。
接入点
你的小龙虾正在处理任务时,图标会跟着"动起来"——接入方法如下:
- 语音唤醒:运行时/测试器在触发时调用
AppState.triggerVoiceEars(ttl: nil),沉默 1 秒后调用stopVoiceEars(),与捕捉窗口保持一致。 - Agent 活动:在工作时间段前后调用
AppStateStore.shared.setWorking(true/false)(WebChat agent 调用中已实现)。时间段保持短小,并在defer块中重置,避免动画卡死。
形状与尺寸
- 基础图标由
CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:)绘制。 - 耳朵缩放默认为
1.0;语音激活时设置earScale=1.9并开启earHoles=true,不改变整体画框(18×18 pt 模板图像渲染到 36×36 px Retina 后备存储)。 - "快速抖动"使用腿部摆幅最大约 1.0 加小幅水平晃动,叠加在任何已有的空闲摆动上。
行为注意事项
- 没有外部 CLI/broker 接口来切换耳朵/工作状态;保持它只响应应用自身的信号,避免意外抖动。
- TTL 尽量短(<10s),确保任务挂起时图标能快速恢复到基准状态。