Skip to content

feat(desktop): 工具窗口栏换成 IDEA New UI 图标和尺寸,纯图标按钮悬停显示名称 - #1897

Merged
xiaoyumuxi merged 1 commit into
previewfrom
feat/desktop-stripe-idea-icons
Nov 14, 2026
Merged

xiaoyumuxi merged 1 commit into
previewfrom
feat/desktop-stripe-idea-icons

Conversation

@xiaoyumuxi

Copy link
Copy Markdown
Collaborator

关联 Issue / Linked issue

PR 类型 / Type

  • feat:新功能或用户可见的改进
  • fix:缺陷修复
  • docs:文档、Agent Note、Skill 等规则文件
  • release:稳定版发布准备

改动说明 / What changes

背景 / Why

Viva 桌面端的左右工具窗口栏和 IntelliJ IDEA 差距明显:图标是 Lucide 通用图标,按钮和图标都偏小(28pt 按钮、16pt 图标),纯图标按钮悬停时也不显示名称,用户只能靠猜。本 PR 让工具窗口栏的图标、尺寸和悬停提示向 IDEA New UI 看齐。

改动 / Changes

图标

  • 新包 desktop/internal/toolicons:项目、提交、结构、查找、Git(vcs)、终端、问题、运行、调试、构建、通知、服务这 12 个入口改用 IntelliJ Community 的 20×20 New UI 工具窗口图标(platform/icons/src/expui/toolwind,修订 c7f91397daa3a961b4e78bc634fe467a0a7d9ade,Apache-2.0)。svg/ 保存原始 SVG,NOTICE 写明来源、修订和许可(许可正文复用 fileicons/LICENSE-APACHE-2.0.txt),icons.go 是生成结果。浅色和深色主题的 IDEA 图标几何形状相同,只保留浅色版,颜色由主题着色。
  • IDEA 没有对应图标的入口(引用、测试、安全、更新、背景)继续用 Lucide,catalog.go 新增 stripeLucide 把描边从 2 减到 1.8,接近 IDEA 的线宽。
  • plugintools.go:插件工具窗口声明的通用图标名(services/database、terminal、search、run、debug、git、problems)映射到同一套 IDEA 图标,其余用描边 1.8 的 Lucide;VCS 相关入口用 toolicons.Vcs。

尺寸(chrome.go、chrome_view.go)

  • 工具窗口栏改为 IDEA New UI 的尺寸:40pt 工具栏、30pt 按钮(chromeToolButton)、20pt 图标(chromeToolIcon)、按钮间距 10pt(chromeToolGap),按钮由 Pad(chromeToolInset)(5pt)在工具栏内居中。标题栏按钮保持 28pt / 16pt 不变。
  • chromeGlyph 改为接收 glyphLayout(按钮边长、图标边长、提示方向),标题栏用 titleGlyph,左右工具栏用 stripeGlyph(left)。
  • drag.go:拖动预览里的图标按 20pt 居中;插入线按工具栏的 10pt 间距落在两个按钮正中(标题栏和状态栏仍按原间距)。

悬停提示

  • 左右工具栏和标题栏的纯图标按钮悬停时显示名称(Viva Tooltip + TooltipOn):左栏提示开在按钮右边,右栏开在左边,标题栏开在下方;没有空间时 Viva 自动翻到对侧。按下或拖动时不显示提示(Viva HoverTooltip 的行为)。
  • 标题栏搜索按钮的提示在名称后附随处搜索的快捷键(默认 ⇧⌘O,取自用户当前快捷键方案)。catalog 新增 shortcut 字段,只给点击效果与快捷键目录中某个动作完全相同的按钮填写:内置工具窗口没有切换快捷键;标题栏运行和调试走 titleStart,与 run.selected、debug.start 的效果不同,所以不附快捷键。
  • 新增 i18n 词条 desktop.tools.withShortcut({name} {keys},中英文都补齐),已重新生成 shared.generated.go。
  • Viva 会把 Tooltip 文字作为命中的 Hint 交给辅助技术,所以纯图标按钮原来放在 Hint 里的拖动说明改放 Description,屏幕阅读器先读名称再读拖动说明。

生成脚本(scripts/desktop/generate-desktop-file-icons.sh)

  • 新增 --tools-only,只生成工具窗口图标;原有的 --tree-only 保留;不带参数时生成全部三组图标。工具图标用 picosvg 展平后,再用 skia-pathops 合并重叠形状(否则 debug 图标合成单一 nonzero 路径时会丢覆盖区域),最后用 viva icons 生成 toolicons/icons.go。完整运行时文件树图标的输出与改动前逐字节一致。

测试与功能矩阵

  • 新增 desktop/internal/workbench/stripe_test.go:
    • TestToolStripeButtonsHaveTheToolWindowBarSizes:左右工具栏宽 40,按钮 30×30、距工具栏边缘 5、相邻按钮相距 40。
    • TestIconButtonsNameThemselvesInATipBesideThem:项目(左栏)、构建(右栏)、搜索(标题栏)的命中 Hint 与提示文字一致,拖动说明在 Description;悬停后提示层只有这一条,方向分别在右、左、下;搜索提示带 ⇧⌘O;拖动按钮时不显示提示。
  • 功能矩阵:
    • 新增 workbench-tool-stripe-icons(两端 implemented / pending)。
    • 修正 workbench-activity-tooltips 的 Viva 说明:原文说 chromeBox 把 label 作为悬停说明,实际此前并不显示提示。同时更新验证步骤和证据。
    • workbench-activity-rail-window-edge 的说明从 Pad(chromeGap) 更新为新尺寸。

不在本 PR 范围内 / Out of scope


类型专属:feat

多平台对齐

Lithe 的目标是 macOS 与 Windows 能力对齐。必须选下面一项:

  • 两端都具备:合入后 macOS 与 Windows 都具备该能力(本 PR 同时实现,或本 PR 补齐另一端)
  • 只实现了 macOS:已为 Windows 提交跟进 Issue:#
  • 只实现了 Windows:已为 macOS 提交跟进 Issue:#
  • 刻意只属于某个平台(功能矩阵中另一端记为 platform-specific),理由:

改动全部在 macOS 和 Windows 共用的 Viva 桌面端代码(desktop/internal/)里,两端行为一致;Windows 实机尚未验收,矩阵中保持 pending。


范围检查 / Scope checks

功能矩阵 / Feature matrix

  • 已更新 shared/platform-feature-matrix/features/<id>.json:两端的实现状态和验证状态、证据路径、owner、验证动作都如实填写;没有运行验证的保持 pending
  • 已运行 ./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh;改了平台实现路径的,还运行了 ./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD
  • 没有提交 .artifacts/ 下生成的矩阵视图
  • [N/A] 没有更新矩阵的,理由:已更新矩阵

统一日志系统 / Structured logging

N/A:只改图标、尺寸和悬停提示,没有新增或改动生命周期里程碑、操作终态、降级、恢复或失败路径。

界面文案 / i18n

  • 文案都走共享 i18n:在 shared/i18n/ 补齐中英词条,运行 node scripts/i18n/generate-i18n.mjs 并提交生成结果,没有手改生成文件;macOS 视图外使用 L10n.string
  • 已运行 node scripts/i18n/verify-app-language-localization.mjs 和 node scripts/i18n/generate-i18n.mjs --check,没有放宽脚本或扩大豁免名单

逻辑归属 / Logic placement

  • [N/A] 可共享的逻辑在 Rust Core:本 PR 只有呈现(图标、尺寸、提示位置),提示里的快捷键直接读宿主已有的快捷键方案,没有新增业务规则
  • [N/A] 修改平台层已有的可共享逻辑时已迁入 Core:没有修改可共享逻辑
  • 工具或运行时专属的知识放在插件或成熟上游,宿主和 Core 没有按工具名加分支(插件图标按插件声明的通用图标名映射,原有机制,未按插件名分支)

性能与内存 / Performance and memory

N/A:没有新增后台功能、子进程、缓存、定时器或依赖;图标编译进二进制,提示由 Viva 在悬停时绘制,空闲时不请求帧。

设置 / Settings

N/A:没有新增或修改设置项。

插件契约 / Plugin contract

N/A:没有改动插件契约、能力版本或宿主方法;插件图标名映射只是宿主呈现。

发行包与资源 / Bundle and resources

N/A:没有运行时资源,图标编译进二进制,运行时不读写文件(verify-runtime-bundle-immutability.sh 已通过)。生成脚本的 Python 虚拟环境只建在脚本自己的临时目录、用完即删,产物是提交进仓库的 Go 源码,没有新增 .artifacts 资源或可跨 worktree 复用的缓存。

无用代码与重构 / Dead code and refactoring

  • 本次改动导致变成无用的代码已在本 PR 删除(原来工具栏用的 Lucide 图标引用已替换;chromeGap、chromeIconButton、chromeIconSize 仍被标题栏和状态栏使用)
  • [N/A] 本次之前就存在的无用代码或可重构之处:本次没有发现

验证 / Verification

命令或操作 平台 结果
./scripts/desktop/desktop-go.sh test -count=1 ./internal/workbench/ ./internal/toolicons/ ./internal/i18n/ macOS 通过(workbench 155 s,i18n 通过;toolicons 无测试文件)。此前一次全量运行中 TestProjectTreeCreatesRenamesAndDeletes、TestNoticesKeepTheirKindAndShowAtMostThreeToasts 各失败一次,单独运行和之后两次全量运行都通过,与本 PR 无关的偶发失败
test-stability-macos.sh --package ./internal/workbench --filter 'TestToolStripeButtonsHaveTheToolWindowBarSizes|TestIconButtonsNameThemselvesInATipBesideThem' macOS 通过,最慢 310 ms
verify-test-stability.sh,verify-test-stability.sh --base origin/preview macOS 通过
./scripts/desktop/desktop-go.sh build ./...,vet ./internal/workbench/ ./internal/toolicons/ macOS 通过
gofmt -l desktop/internal/workbench desktop/internal/toolicons macOS 无输出
node scripts/i18n/verify-app-language-localization.mjs,node scripts/i18n/generate-i18n.mjs --check — 通过(中英 11083/11083)
verify-platform-feature-matrix.sh,verify-platform-feature-matrix-change.sh origin/preview HEAD — 通过(223 项)
./scripts/desktop/verify/verify-runtime-bundle-immutability.sh — 通过
generate-desktop-file-icons.sh(all) macOS 文件树图标输出与改动前逐字节一致,toolicons/icons.go 可重复生成
Viva headless 截图(深色、浅色;静止、悬停项目、Git、构建、搜索) macOS 图标为 IDEA 样式,选中按钮为蓝色圆角底配白色图标;左栏提示在右、右栏在左、标题栏在下,搜索显示“搜索 ⇧⌘O”

未能执行的检查和原因:

  • Windows 实机未验证(本机为 macOS),矩阵保持 pending。
  • 没有在原生 macOS 窗口里手动悬停验收,只做了 headless 截图;截图未附在 PR 上(gh CLI 不能上传图片附件),评审时可按矩阵里的验证步骤查看。
  • 英文界面没有截图;英文词条已由 i18n 检查覆盖。

提交前确认 / Final checks

  • 分支从当时最新的 preview(cfe056fa3)创建,之后 preview 合入了 feat(desktop): Build 窗口可运行的行常驻绿色运行按钮,依赖标题加 ⓘ #1896,git merge-tree 确认与本分支无冲突;目标分支:feat、fix、docs 为 preview,release 以发布流程要求为准
  • 以 Draft 提交,本地验证通过后才标记 ready
  • 没有无关改动,没有提交 .build/、target/、dist/、.artifacts/ 等产物,没有凭据、个人路径和未脱敏的日志或截图
  • 本次构建、测试或预览启动的 Lithe 应用和子进程已全部关闭,没有进程残留(本 PR 只运行了 headless 测试,没有启动应用;机器上有一个从主检出目录启动的 lithe 进程,不属于本 PR,未动)

- 项目、提交、结构、查找、Git、终端、问题、运行、调试、构建、通知、服务改用
  IntelliJ Community(Apache-2.0)的 20×20 New UI 工具窗口图标,新包
  desktop/internal/toolicons 附 NOTICE;IDEA 没有对应图标的入口仍用 Lucide,
  描边减到 1.8;插件声明的通用图标名映射到同一套图标。
- 工具栏按 IDEA 尺寸布局:40pt 工具栏、30pt 按钮、20pt 图标、10pt 间距;
  拖动预览的图标居中和插入线位置随之调整。
- 左右工具栏和标题栏的纯图标按钮悬停显示名称:左栏提示开在右边、右栏开在
  左边、标题栏开在下方;标题栏搜索的提示附随处搜索快捷键(新增 i18n 词条
  desktop.tools.withShortcut)。拖动说明改作辅助技术的 Description。
- generate-desktop-file-icons.sh 新增 --tools-only,用 picosvg 和
  skia-pathops 合并路径后生成 toolicons/icons.go。
- 新增 stripe_test.go 覆盖尺寸、提示文字和方向、拖动时不显示提示;
  更新功能矩阵。
@ghfind-review ghfind-review Bot added the review: high ghfind author score; see https://ghfind.com label Nov 14, 2026
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 14, 2026 05:26
@xiaoyumuxi
xiaoyumuxi merged commit 52604be into preview Nov 14, 2026
5 of 7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: high ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant