Repository navigation
Replies: 1 comment
|
引擎层早已支持 column 轴:packages/client/ui-dockkit/src/contract/types.ts:30 —— SplitAxis = 'row' | 'column';只是规划器的默认分栏取 row(planner.ts:152)。所以「只支持左右分栏」不是引擎能力问题,而是侧栏默认轴的取法问题 —— 把轴向用户开放(或按可用宽度自动选择)在引擎层没有任何障碍。你给的 halvesFit 约束分析正是「左右分栏经常用不了」的机制解释。把轴写死的具体调用点我建议用你抓到的 class 名在 ui-sidebar-right 里再定位一次 —— 我没有逐行钉死那个点。(基于 0.1.5-rc.2 源码核对;未核实的调用点已在文中说明。) |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Motivation
右侧栏是一列又高又窄的区域,而它当前只支持左右分栏(
SplitAxis = 'row'),这在两个层面都错配:halvesFit)要求分栏后每一半都容得下 tab 条的固定部分(内边距、间隙、添加控件、分栏控件;右上格还要容纳全屏/收起两个面板控件)再加一枚最小宽度 100px 的 tab 胶囊。dsh-client-ui-dockkit的 README 给出的控件足印是「带 chrome 约 130px,不带约 72px」,据此两格并排大致需要 340–460px 以上的栏宽。常见右栏宽度往往达不到,于是分栏控件被直接隐藏(侧边栏开着hideSplitWhenBlocked)——用户连「分栏」这个入口都看不到。这不是想要一项新能力,而是「右栏的形态」与「默认轴」的错配。
Behavior
期望的用户可观察行为(任一方案都可以,A 优先):
两种方案都需要配套的三处行为:
成本与依据:这不是一次布局引擎重写
引擎本来就支持 column 轴,配套件也都在:
SplitAxis = 'row' | 'column'与LayoutOp的split.axis;.splitColumn(含row-resize光标与横向细线),PaneTree按轴渲染;halvesFit.column(按高度的空间规则)、zoneSplit('top' | 'bottom')已映射到 column;topRightPaneId()已按轴取值,所以全屏/收起两个面板控件会自动落在顶格。缺的只是三处策略点:
ui-dockkit/src/engine/planner.ts的planSplitPane()写死axis: 'row'(DockController.splitPane()同样);ui-dockkit/src/components/DockSurface.tsx的dropZones只有'edges' | 'horizontal'(正文拖放没有上下半区),且splitBlock只读fit.row;ui-sidebar-right/src/client/{stores.ts, shell/SidebarRight.tsx}把轴、落区几何、空间规则各自写死为row/horizontal/.row。可行性证据(本地已实现并验证过)
我在本地检出(
master,HEADc291e7961a515f6d7af9304e7fd1d257929aef26,dsh 0.1.5-rc.2)上以小改动实现了方案 B:planSplitPane/DockController.splitPane增加可选axis(默认'row',对其它的嵌入方零影响);dropZones增加'vertical'模式,且该模式同时决定分栏控件做出哪种分栏(于是空间规则自然按轴取值);SplitBlock的'width'改为按轴的'room';PaneCallbacks.horizontalDrops泛化为bodyDrops: 'horizontal' | 'vertical';结果:
packages/client/ui-dockkit与packages/client/ui-sidebar-right共 17 个测试文件 / 368 项测试全部通过,oxlint、tsc -b tsconfig.client.json、导出 JSDoc 门禁与 README 格式门禁均干净;改动集中在 4 个源文件与对应测试/文档,默认行为对其它嵌入方保持不变。All reactions