Files
Just-DataInspector/Components
DeepSeek V4.1 Flash 5831a0ea0d 分组动画改「抽拉卷尺」式刚性平移 + 悬浮组名折起一边滚动一边收起 + 筛选态折叠三角修正 + 样式区「目标」行绘制/布局修正
① 分组折起/展开动画重做为「抽拉卷尺」式刚性平移(推翻上一轮的“按行缩放”):
   - 用户要求:折起时所有信号一起向上平移、逐条消失在组名栏里;展开时逐条从组名栏
     向下冒出;卷尺上的元素相对位置不变。
   - 旧实现按行高缩放 ⇒ 元素被压扁(相对位置改变),且每帧行高都在变、每帧都要重建
     行集合。
   - 新实现:整组作为一个刚性整体平移,只维护一个逐行平移量 m_rowShift;**行高永不改变**,
     平移只作用于“组名行之后”的行(组名是卷尺外壳,始终不动)。
     收起 = shift 从 fromShift 推到 blockHeight(全部藏进组名栏);展开 = 推到 0。
     ease-out cubic;时长 = clamp(115 + 6×行数, 150, 320) ms。
   - 动画期间**不重建行集合**(AdvanceGroupAnimations 不再设 m_rowsDirty)——这是流畅的关键。
   - 中途反向点击(折叠没播完就点展开)从**当前位移续接**(GroupAnim::fromShift),不再跳变。
   - m_contentHeight = 自然高度 − Σ位移;RowRect() 减去本行位移;
     HitRow() 改为逐行比较实际绘制位置(动画中行位置与内容坐标不再一一对应)。

② “藏进组名栏”的裁剪(新增 AnimationHideTopForRow / ClampRowClipTop):
   - 信号行越过组名**绘制位置**的下边界即被裁掉;已经完全越过的行整行跳过。
   - 除 GDI 裁剪(PaintRowText / FillRowRect 用的 m_rowClipRect)外,还必须用
     g.SetClip(clip, CombineModeIntersect) 收紧 GDI+ 裁剪 —— 行内的色块 / 复选框 /
     网格徽标走 GDI+、只受 SetClip 约束,不收紧就会画到组名栏上面去。

③ 悬浮组名折起改为“一边向上滚动一边收起”(推翻上一轮的“先滚动到位再折起”):
   - 用户要求:悬浮组名既然在最上方,就一边向上滚动一边收起,保证它始终在最上方;
     动画完成时滚动偏移恰好落在“组名正好在最上方”且信号已经收起。
   - 实现:GroupAnim::scrollSynced —— 滚动偏移与平移量按同一进度推进
     (m_scrollOffset = scrollFrom + (scrollTo − scrollFrom) × eased),二者合成让组名的
     屏幕位置恒定;目标 scrollTo = min(组名的内容偏移, 折起后可达的最大滚动量)
     (后者用于“折起后内容比列表还短”的情形,避免结束时被强行夹取 ⇒ 无跳变)。
   - 旧的 m_pendingGroupToggle 两段式机制与 StartScrollAnimationTo 的挂起参数已删除;
     用户滚轮 / 拖滚动条 ⇒ CancelScrollAnimation() 只解除同步,折叠/展开继续播放。

④ 筛选状态下折叠三角状态修正:
   - 根因:PaintFileRow 直接读 m_tab->IsCollapsed()(普通模式的折叠状态),而筛选模式用的是
     独立的 m_filterCollapsed ⇒ 筛选里折叠/展开时三角不变化。
   - 修法:改读统一的 IsGroupCollapsed()(按当前模式分派)。

⑤ 样式区「目标」行的绘制与布局修正:
   - 绘制:PaintTargetRow 误用列表裁剪版 PaintRowText(文本被裁到 m_listRect),而目标行在
     样式区、根本不在列表矩形内 ⇒ 信号名与 GX 标签文本被完全裁掉。改用不裁剪的 UiText,
     并在 PaintRowText 注释里写明“样式区不得使用”。
   - 布局:名称从内容列左边缘开始、GX 标签**右对齐到内容列右边缘**(与线宽滑轨/数值框同列宽
     同两端),两者不重叠;无 GX 标签时名称可用宽度 = 整个内容列(因此更宽,仍左对齐)。
   - 双击改名:EditFieldRect() 对目标行只返回 m_targetNameRect,不再返回内容列全宽
     (旧实现会把 GX 标签包进输入框)。

验证(全程离屏 SW_HIDE,不占用鼠标 / 键盘 / 屏幕;进程与线程均 BELOW_NORMAL):
   - .preflight/perf/panelanim_main.cpp 147/147 通过(连跑 3 次稳定):
     刚性平移(行高不变 / 间距恒定 / 组名行不动 / 可见行数单调减少 / 逐帧断言组名栏像素零变化 /
     中间帧无行集合重建 / 帧耗时)、中途反向切换续接不跳变、筛选态折起与项数、
     筛选态与普通态折叠三角逐像素 0 差异、悬浮组名命中(不穿透)、
     同步滚动(逐帧钉住 + 恰好落位 + 无跳变)、真实 MF4 单点信号两种自适应逐位一致、
     目标行文本像素存在 + 两端对齐 + 输入框不覆盖 GX 标签 + 无标签时名称更宽。
   - A/B 五组回退分别 4 / 6 / 6 / 2 / 1 项如实失败。
   - 既有 verify 49/49、datacheck 69/69、edgecheck 46/46;make clean && make all 零警告。

记忆:Documents/agent_mem.md 新增 §9.36、改写 §11.2 第 77–81 条并新增 82–84 条,
标注 §9.35 的“按行缩放动画”与“先滚动再折起”已被推翻。
2026-10-16 02:40:31 +08:00
..