Các Trạng Thái Icon Thanh Menu

Tác giả: steipete · Cập nhật: 06/12/2025 · Phạm vi: ứng dụng macOS (apps/macos)

  • Idle (Nghỉ): Hiệu ứng icon bình thường (chớp mắt, thỉnh thoảng lắc lư).
  • Paused (Tạm dừng): Status item dùng appearsDisabled; không có chuyển động.
  • Voice trigger (tai to): Bộ phát hiện giọng nói gọi AppState.triggerVoiceEars(ttl: nil) khi nghe thấy wake word, giữ earBoostActive=true trong khi đang thu âm. Tai phóng to (1.9x), có lỗ tai hình tròn để dễ nhìn, sau đó thu nhỏ lại qua stopVoiceEars() sau 1 giây im lặng. Chỉ kích hoạt từ voice pipeline trong ứng dụng.
  • Working (agent đang chạy): AppState.isWorking=true tạo hiệu ứng “đuôi/chân chạy rón rén”: chân lắc nhanh hơn và hơi lệch trong khi đang làm việc. Hiện tại được bật/tắt khi WebChat agent chạy; các bạn thêm toggle tương tự cho các tác vụ dài khác khi tích hợp nhé.

Điểm kết nối

  • Voice wake: runtime/tester gọi AppState.triggerVoiceEars(ttl: nil) khi kích hoạt và stopVoiceEars() sau 1 giây im lặng để khớp với cửa sổ thu âm.
  • Hoạt động Agent: set AppStateStore.shared.setWorking(true/false) xung quanh các khoảng thời gian làm việc (đã làm trong WebChat agent call). Giữ khoảng thời gian ngắn và reset trong các block defer để tránh hiệu ứng bị kẹt.

Hình dạng & kích thước

  • Icon cơ bản được vẽ trong CritterIconRenderer.makeIcon(blink:legWiggle:earWiggle:earScale:earHoles:).
  • Ear scale mặc định là 1.0; voice boost set earScale=1.9 và bật earHoles=true mà không thay đổi khung tổng thể (template image 18×18 pt được render thành Retina backing store 36×36 px).
  • Scurry dùng leg wiggle lên đến ~1.0 với một chút jiggle ngang; nó cộng thêm vào idle wiggle hiện có.

Lưu ý hành vi

  • Không có toggle CLI/broker bên ngoài cho ears/working; giữ nó nội bộ trong các tín hiệu của chính ứng dụng để tránh flapping không mong muốn.
  • Giữ TTL ngắn (<10s) để icon quay về trạng thái cơ bản nhanh chóng nếu một job bị treo.