✨feat(mac/tray/lyric): 新增 macOS 状态栏歌词与托盘图标适配#843
Conversation
- 新增 macOS 状态栏歌词功能:在 macOS 平台,歌词将显示在系统状态栏区域,并根据播放进度实时更新,同时通过 IPC 消息进>行控制和同步。 - 实现 macOS 风格托盘图标适配:引入 `getTrayIcon()` 和 `getMenuIcon()` 方法,支持 macOS 模板图像,实现托盘和菜单图标 随系统亮/暗模式自动切换,提供更好的视觉集成。 - 维护跨平台兼容性:通过 `isMac` 判断进行逻辑隔离,确保 Windows 及其他平台原有的任务栏歌词窗口功能不受影响。 ~
Summary of ChangesHello @Pissofdvpe, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 此拉取请求的核心目标是增强应用程序在 macOS 平台的用户体验,通过引入原生的状态栏歌词显示功能,并优化托盘图标和菜单图标的视觉风格,使其更好地融入 macOS 生态系统。同时,所有这些改进都经过精心设计,以确保不会影响现有 Windows 用户的任务栏歌词功能,从而保持了良好的跨平台兼容性。 Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
本次 PR 主要为 macOS 平台增加了状态栏歌词功能,并对托盘图标进行了适配,使其风格与系统更加统一。代码实现考虑了平台差异性,保证了 Windows 等其他平台原有功能不受影响,整体改动清晰。
我在代码中发现了一些可以优化的地方:
- 在
ipc-taskbar.ts中,存在几处代码重复和一处性能问题,可以通过重构来提升代码质量和运行效率。 - 在
ipc-tray.ts中,一处逻辑可以简化,避免冗余的函数调用。 - 在
tray/index.ts中,有一处未使用的变量和相关的死代码逻辑。
具体的修改建议请见各文件的评论。这些修改将有助于提升代码的可维护性和性能。
|
这个 “状态栏歌词” 和现有的任务栏歌词实现看起来并没有什么关联,只是将托盘上应用图标旁边的名称换成了元数据和歌词。这个实现无法拥有任何动画效果或者自定义功能,也无法使用设置中的任务栏歌词选项。 建议改名并在设置里面添加一个 MacOS 专属的选项,比如 “在托盘上显示歌词” 之类的,或者至少让它和现有的任务栏歌词解耦 |
- 将 macOS 状态栏歌词功能从 模块完全迁移至新增的 独立模块,显著提升模块化和可维护性。 - 现已专用于处理 Windows/Linux 平台的任务栏歌词逻辑,消除了平台间的耦合。 - 更新为根据操作系统平台动态加载 或 。 - 调整了 对 事件的响应逻辑,并移除了冗余的 监听器,确保托盘标题管理与歌词功能的独立控制。 - 歌词和播放状态数据(如 等)的底层 IPC 事件保持共享,无需修改渲染进程的数据发送逻辑。
- 引入 macOS 专属状态栏歌词开关,并将其集成到 Electron Store 和 Pinia Store 中,实现独立配置。 - 在设置界面中为 macOS 平台添加了专属开关,以直观控制状态栏歌词的启用与禁用。 - 更新了主进程 IPC 逻辑 (),使其响应新的 macOS 状态栏歌词设置。 - 优化了托盘菜单歌词切换逻辑 (),使其根据平台智能路由 IPC 事件,并统一了切换提示文本。 - 实现了托盘菜单与设置界面开关状态的双向同步,确保用户操作的一致性。
- 统一了 macOS 歌词相关 IPC 的类型定义,将 移至 并导入 IPC payload 类型。
- 优化了 macOS 状态栏歌词更新逻辑:
- 移除了歌词更新的 200ms 防抖延迟。
- 实现了下一行歌词提前 300ms 预显示,以提高流畅度。
- 引入了 50ms 间隔的歌词插值,以实现更平滑的进度更新,尤其是在主进程接收到渲染器防抖更新时。
- 为 macOS 状态栏歌词数据请求创建了专用的 IPC 通道 ,增强了关注点分离。
- 恢复了 中缺失的注释,以提高代码可读性和可维护性。
- 修复了开启macOS状态栏歌词时,先快速闪烁logo和错误歌词文本的问题 - 移除了在启用歌词时立即清空歌词列表的逻辑 - 确保在新歌词数据到达后立即更新状态栏显示 - 优化了 setInterval 的使用方式: - 彻底废弃了 setInterval 内部的时间推移逻辑 - 转而完全依赖渲染进程通过 IPC 同步的精确时间来更新歌词进度 - 解决了 IPC 延迟导致的歌词抢跑问题 - 在主进程的 mac-statusbar:update-progress 处理器中引入了进度同步阈值 (100ms) - 只有当 IPC 传递的 currentTime 与主进程本地 macCurrentTime 差异超出阈值时才进行同步,以平滑歌词显示,避免微小跳动 - 修正了注释以提高代码可读性 - 更新了 ipcMain.on(taskbar:update-state) 处理器中的注释,使其更准确、清晰,并反映了当前逻辑
- 引入 Date.now() 驱动的内部时间推进机制,减少 CPU 空转并提高同步健壮性: - 新增 macLastUpdateTime 变量,记录 macCurrentTime 上次更新时间戳。 - 修改 startInterpolation 函数的 setInterval 回调,通过计算 elapsedTime 累加到 macCurrentTime。 - 优化 IPC 进度同步为校准机制: - 在 mac-statusbar:update-progress IPC 事件处理器中,当 currentTime 与 macCurrentTime 差异超过阈值或非播放状态时,才进行时间校准。 - 确保 PROGRESS_SYNC_THRESHOLD_MS 阈值正常发挥作用,避免不必要的微小同步。 - 清理冗余调试日志,提升代码整洁度。
新增 macOS 状态栏歌词功能:
ipc-taskbar.ts新增 macOS 歌词处理逻辑,包括查找当前歌词、更新进度和播放状态,并通过 IPC 发送至主进程。ipc-tray.ts新增mac-toggle-statusbar-lyric和mac-update-statusbar-lyricIPC处理器,用于控制状态栏歌词的显示与内容更新。
实现 macOS 风格托盘图标与菜单图标适配:
tray/index.ts引入getTrayIcon()方法,用于为 macOS创建符合系统风格的模板图像托盘图标,使其能自适应亮/暗模式。
getMenuIcon()方法现在处理 macOS 菜单项图标的加载和尺寸调整,同样适应系统主题。CreateTray构造函数中的托盘图标加载逻辑,实现平台差异化。维护跨平台兼容性:
isMac判断进行逻辑隔离。先前Mac菜单栏(状态栏)效果:

新增特性效果:

