Skip to content

[feature][ux] 增加风格卡片快捷键 Alt+1~9 快速切换风格,并修复托盘右键菜单输出风格显示问题 #759

Description

@FFFxueGawaine

问题概述

一、功能请求:增加风格快捷键 Alt+1~9

现状:
当前仅支持一个"切换到上一个风格"的全局快捷键(默认 Ctrl+Shift+S),对应函数 switch_to_previous_style()hotkey_loops.rs:831),只能向后循环切换启用的风格包(style packs)。在 coordinator.rs:340-344ActionHotkeyKind 仅有 SwitchStyleOpenApp 两种。

需求:
支持 Alt+1 ~ Alt+9 快速切换到对应的第 1~9 个已启用风格包(按列表顺序),类似浏览器标签页切换的 UX 模式。

涉及改动:

  • types.rs: 在 UserPreferences 中增加 9 个 style shortcut 字段,每个可绑定一个 style pack ID
  • hotkey_loops.rs: 增加 switch_to_style_by_index() 函数,从 ActionHotkeyKind 扩展或新增 hotkey 注册
  • commands/hotkeys.rs: 增加后端绑定/解绑接口
  • ShortcutsSection.tsx: 前端快捷键设置 UI 展示 9 个风格槽位
  • style-packs.ts: 前端 IPC 桥接

期望行为:

  • 用户可在设置中为每个风格槽位绑定快捷键(默认 Alt+1~9)
  • 按下快捷键直接切换到对应风格,而非循环切换
  • 如果对应槽位无风格绑定则无操作
  • 切换后托盘菜单同步更新选中状态

二、Bug 修复:托盘右键菜单输出风格问题

问题 1 —— 托盘菜单仅展示 4 个内置 PolishMode,不显示自定义/导入风格包:

tray_polish_mode_menu_entries()lib.rs:770-785)硬编码了 4 个条目(Raw/Light/Structured/Formal),未读取用户已启用的自定义风格包列表。build_style_tray_menu()lib.rs:825-845)的 selected 通过 pack.base_mode 而非 pack.id 判断选中状态,当用户有多个同 base_mode 的自定义风格包时,菜单勾选状态会错乱。

问题 2 —— 托盘切换风格始终激活内置包,丢失自定义包:

handle_style_tray_menu_event()lib.rs:1040-1053)调用 activate_builtin_style_mode(),该函数只激活 builtin.* 系列的内置风格包。如果用户当前使用的是从风格市场导入的自定义包(如 imported.xxx),通过托盘切换后会"回退"到内置包,无法再通过托盘切回自定义包。这可能也是 #742(风格选择会自动回到正式表达)的根因之一。

问题 3 —— 切换风格后托盘菜单刷新的日志/函数名不准确:

switch_to_previous_style()hotkey_loops.rs:869)中调用 refresh_tray_microphone_menu 来重建整个托盘菜单(包括风格子菜单),功能上可行但函数名只字不提 style,容易误导维护者。建议重命名为 refresh_tray_menu 或拆出独立的 refresh_tray_style_menu

涉及改动:

  • lib.rs: tray_polish_mode_menu_entries() 改为读取 style_packs().list() 中所有 enabled 的自定义包
  • lib.rs: build_style_tray_menu() 使用 pack.id 判断选中状态
  • lib.rs: handle_style_tray_menu_event() 改为通过 pack.id 而非 PolishMode 定位并激活风格包
  • lib.rs: 函数重命名 refresh_tray_microphone_menurefresh_tray_menu(可选,拆为独立 PR)

受影响文件

文件 相关行
src-tauri/src/types.rs 22-42 (PolishMode), 311-336 (StylePack), 584-688 (UserPreferences), 1307-1312 (default shortcut)
src-tauri/src/lib.rs 762-845 (tray style menu), 1040-1053 (tray handler)
src-tauri/src/coordinator/hotkey_loops.rs 831-875 (switch_to_previous_style)
src-tauri/src/coordinator.rs 340-344 (ActionHotkeyKind)
src-tauri/src/commands/hotkeys.rs 73-101 (set_switch_style_hotkey)
src-tauri/src/commands/style_packs.rs 3-10 (refresh_tray_menu_async)
app/src/pages/settings/ShortcutsSection.tsx 118-143 (settings UI)
app/src/lib/ipc/hotkeys.ts 67-69 (IPC bridge)
app/src/lib/hotkey.ts 17-23 (defaults)

上下文

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions