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

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions