优化编辑器 Code Vision、Git Blame、Gutter 对齐与设置页背景 - #189
Conversation
|
CI 挂了啊 |
1. 建议修改:Fold 控件和 breakpoint 的区域发生了重叠现在: standardGutterWidth = 45
foldIndicatorX = editorGutterOriginX + standardGutterWidth - 13所以 fold 控件的命中范围实际上是: 但 breakpoint 被画在: x: editorGutterOriginX + 29
width: 8也就是: 两者在 32...37 有直接重叠。 更关键的是 if git change ...
else if fold ...
else if implementation ...
else if breakpoint ...所以一行如果既是可折叠行又有 breakpoint,用户点 breakpoint 右半部分时会触发 fold,而不是 breakpoint。视觉上 breakpoint 圆点和 fold chevron 也可能叠在一起。相关绘制和点击逻辑就在同一个 gutter 实现里。 另外,行号本身还是: x: editorGutterOriginX
+ (standardGutterWidth - size.width) / 2也就是继续在完整 45pt 内居中,但 fold 又占了最后 13pt。四位、五位行号越来越容易侵入 fold 区域。 建议不要继续在 45pt 里面塞所有东西。明确拆列: 比如把 gutter 稍微扩宽,或者至少定义: lineNumberWidth
foldIndicatorWidth然后: standardGutterWidth = lineNumberWidth + foldIndicatorWidth绘制、hover、hitTest 都用相同的 rect。 2. 建议修改:System 模式下系统自动切换 Light/Dark,标题栏可能不刷新这里 Light → System 的修复思路是对的: window.appearance = nilAppKit 在 appearance 为 问题出在后面: let settingsSurface = LitheTheme.settingsSurfaceNSColor(
for: window.effectiveAppearance
)
window.backgroundColor = settingsSurface
...
current.layer?.backgroundColor = color.cgColor
...
backgroundView.layer?.backgroundColor = color.cgColor这里已经把动态 appearance 解析成了当前时刻的静态颜色 / CGColor。 场景:
AppKit 本身专门提供了: viewDidChangeEffectiveAppearance()就是让 NSView 响应这种 appearance 变化的。([Apple Developer][2]) 我会这么改让 override func viewDidChangeEffectiveAppearance() {
super.viewDidChangeEffectiveAppearance()
updateBackground()
}或者由 accessor/probe 监听 effective appearance 后重新执行 特别是这些: layer?.backgroundColor = color.cgColor必须在 effective appearance 改变之后重新 resolve。 这个也是我建议合并前修的。 3. 小问题:Code Vision 作者名 hover 下划线逻辑有 bug这里很容易漏掉。 现在为了实现: hover 时只给 if let separator = linkTitle.firstIndex(of: " ") {
prefix // 不划线
suffix // 划线
}问题是 author 也传了: underlinesOnHover: true所以: hover 后会变成: Git 作者名带空格非常正常。代码目前确实对 usage 和 author 共用了同一个「第一个空格之后下划线」规则。 建议不要用 Bool: enum HoverUnderlineStyle {
case none
case all
case afterFirstSpace
}然后: 顺便现在 这个属于 P3,非 blocker。 4. Scrollbar 这里不是明显 bug,但代码语义最好再确认这个实现叫: CompactOverlayScroller注释也一直强调 overlay,但: let scrollerStyle: NSScroller.Style =
alwaysShowVertical ? .legacy : .overlay而设置页现在全部是: alwaysShowVertical: true,
usesCompactScrollers: true所以实际上这些页面运行的是: 并不是 overlay。 这倒不一定是你们写错了,因为 Apple 明确说明:overlay-style scroller 的自动隐藏行为不受 但代码注释:
和实际: alwaysShowVertical ? .legacy : .overlay是矛盾的。 所以这里我建议至少明确产品需求:
|
|
@arkleselect 有空麻烦修一下上述几个阻塞点 以及ci |
|
正在改 |
1lck
left a comment
There was a problem hiding this comment.
审查发现 3 个需要处理的交互回归,具体影响和建议修复方式见 inline comments。
变更说明
Code Vision 交互优化
NSTextView默认 I-beam 光标与 Code Vision 链接光标之间的竞争,避免鼠标移动过程中光标在文本选择和链接状态之间闪烁。Git Blame 信息优化
lick · 2026/8/2等 Blame metadata 使用与代码正文一致的编辑器字体和字号。NSLayoutManager提供的实际行片段高度定位 Blame 信息,使其与对应代码行保持一致的垂直对齐。编辑器字体与基线对齐
NSAttributedString.baselineOffset导致行高被意外撑大的问题。NSLayoutManager的行片段基线阶段,避免基线调整参与行高计算。折叠控件优化
当前行高亮修复
设置页面主题与窗口外观优化
#28292C#ECEEF1#3871E1。#2B4271。NSTitlebarContainerView、NSTitlebarView和NSThemeFrame的背景层级,使标题栏与设置页面内容区域保持连续。.preferredColorScheme(...)与 AppKitNSWindow.appearance的冲突,由原生窗口外观统一管理 Light、Dark 和 System 状态。技术实现
NSButton、NSTrackingArea、cursor rect 和cursorUpdate(with:)管理 Code Vision 与折叠控件的交互状态。NSAttributedString对 Code Vision 中的数量、链接文本和行内图标分别应用字体、下划线与基线属性。NSLayoutManager的 line fragment 信息定位 gutter 元素、Git Blame metadata 和当前行背景。NSLayoutManagerDelegate的行片段布局阶段调整代码基线,使垂直校正不再改变段落行高。pointSize和行号字体的capHeight动态计算折叠 chevron 的视觉尺寸。minicontrol size 和自定义NSScroller绘制实现接近 IntelliJ IDEA 的滚动条样式。EditorLayoutMetrics中,统一管理标准 gutter、Blame metadata 区域和组合宽度。NSColor根据NSAppearance解析设置页面背景色,确保 Light、Dark 和 System 模式切换时颜色及时刷新。NSViewRepresentable访问设置窗口并同步原生NSWindow.appearance、标题栏透明度和标题栏背景容器。验证
git diff --check通过。Testing模块而未能执行;该问题属于本机工具链配置,与本次 UI 修改无关。