Skip to content

feat(canvas): 节点右键菜单(生成 / 复制一份 / 存为角色 / 加入泳道 / 在序列中定位 / 删除)+ 适应全部 / 适应选中 + Ctrl D / Ctrl ↵ - #292

Merged
KerroKapple merged 3 commits into
mainfrom
feat/canvas-node-menu
Oct 14, 2026
Merged

KerroKapple merged 3 commits into
mainfrom
feat/canvas-node-menu

Conversation

@KerroKapple

Copy link
Copy Markdown
Owner

做了什么

画布交互的第二批,对应设计稿「右键菜单」与「快捷键」两节。这是画布重设计的 PR-8b。

节点右键菜单

  • 复用 8a 的菜单宿主,外观与空白处右键菜单相同。
  • 右键一张没被选中的卡,会先把选中换成它;右键多选里的某一张,保持多选。
  • 菜单项从上到下:
    • 生成(Ctrl+Enter / ⌘↵)
      • 只对 image / video 配置节点开放,且提示词非空、恰好一张、当前不忙。
      • 和提示词条「生成」走同一个提交入口。区别是会先把防抖中的提示词写入落库,再提交,因为画布节点在内存里的提示词可能比用户刚敲的旧。
    • 复制一份(Ctrl+D)
      • 只复制配置节点:类型、typeConfig、泳道都相同,名字加「副本」,位置往右下偏移。
      • 不复制边和产物。
      • 复制完新节点被选中,相机不动。多选时整批复制。
    • 存为角色
      • 只对有图的产物开放,恰好一张。
      • 走角色库「从图片新建」那条路:先起名,再调 createFromImage。
    • 加入泳道 ›
      • 子菜单列出本画布的泳道(带色点)和「移出泳道」,当前所在的泳道打勾。
      • 卡片会被收进目标泳道带里。只改泳道 id、不动位置的话,卡片会按新泳道的锚定画到带外。
      • 多选时整批移动。
    • 在序列中定位
      • 节点(或产物所属的那一镜)在叙事链上时可点:切到序列标签,播放头跳到那一镜。
      • 逻辑从标签栏的「在序列中查看」抽成共用函数(sequence/util/view_in_sequence.dart),两边行为一致。
    • 删除(Delete):danger 色,走现有带撤销通知卡的删除,多选整批。
  • 不可用的项置灰,不隐藏。

适应全部 / 适应选中

  • 原来缩放条上的「适应」只是把相机复位。现在改成真的按内容框住:
    • 适应全部(Shift+1、缩放条「适应」、空白处右键「适应视图」):把所有节点框进视口。顶部让出工具条那一条,底部让出缩放条那一截。只缩小、不放大。
    • 适应选中(Shift+2):只框选中的节点。
  • 节点矩形和卡片实际画出来的位置同源,泳道里的分道位移也算进去了。
  • ⌘0 / Ctrl+0 仍然是「缩放复位」,回到初始相机,有测试守着。

快捷键

  • 新增 Ctrl+D、Ctrl+Enter、Shift+1、Shift+2,都已进设置的「快捷键」页。
  • 打字时这几个键让位。提示词条里按 Ctrl+Enter 只触发提示词条自己的「生成」,不会触发两次。

刻意没做的(已记进 BOARD)

  • 剪切 / 复制:没有剪贴板。
  • 「当下一镜的首帧」:下一镜已经有首帧时该替换还是新建,语义还没定。

截图

节点右键菜单 / 加入泳道子菜单 / 适应全部前后

截图由 widget test 渲染,界面是英文。

验证

  • flutter analyze lib test:无问题。
  • flutter test --exclude-tags golden:3285 通过,0 失败。
  • 变异实测 10 条全部变红:
    • 空提示词也可生成
    • 适应时允许放大
    • Ctrl+D 打字时也触发
    • 菜单只作用于右键的那张
    • 复制后挪相机
    • 生成前不落库防抖写入
    • 缩放条「适应」无效
    • Ctrl+0 变成适应
    • 右键不换选中
    • 多选也能生成

已知限制(已记进 BOARD)

  • 适应全部时,底部只扣了缩放条那一截,没扣提示词条。提示词条的高度随内容在变,没法用固定令牌表达。恰好选中一张配置卡、提示词条正在显示时,最下面一排卡可能被它压住。
  • 缩小到 50% 以下时,横向泳道的标题栏会压住道顶附近卡片的标题。标题栏画在视口层,像素尺寸固定,不随缩放变;任何缩小操作都会出现,不是这次引入的。

画布重设计 PR-8b,这批交互到这里全部完成。

🤖 Generated with Claude Code

KerroKapple and others added 3 commits October 15, 2026 03:27
节点右键菜单(复用 PR-8a 的 CanvasMenuHost / CanvasMenuPanel,宽 196、不带搜索框):卡片上右键,没选中的先单选它,已在多选里的保持多选。生成 · 复制一份 | 存为角色 · 加入泳道 › · 在序列中定位 | 删除,不可用的置灰不隐藏(判据 util/node_menu_model.dart)。生成先冲挂起的防抖写入再交空补丁走 InspectorSubmitController.submit(提示词以库里那一行为准,不拿可能过期的内存节点去盖);复制一份同类型 / typeConfig / 泳道、右下偏一个 lg、只单选不挪相机、不复制边与产物;存为角色走 InkNameDialog + createFromImage;加入泳道是子菜单(色点 + 名称、当前那条打勾不可点、移出泳道),多选整批走 moveNode,位置一并挪进目标道的带里;在序列中定位与标签栏「在序列中查看」共用 sequence/util/view_in_sequence.dart(从 shell_tab_bar 原样搬出);删除走 deleteNodesWithUndo。菜单本体加置灰(↑↓ 跳过)、危险色、打勾、子菜单(第二个 OverlayPortal,同一个点击区组,右 / 下放不下翻转)。

适应全部(Shift+1,缩放条「适应」与空白处「适应视图」同一个动作)/ 适应选中(Shift+2):纯函数 util/viewport_fit.dart,只缩小不放大、扣掉顶部工具条那一条与底部缩放条那一截,泳道卡片的包围盒随缩放变(按缩放二分,矩形走 nodeStageRect)。⌘0 仍是缩放复位。Ctrl+D / Ctrl+↵ / Shift+1 / Shift+2 都对文本编辑让位(提示词条里的 ⌘↵ 只提交一次),进设置快捷键页,菜单行尾键位从同一张表取。剪切 / 复制、「当下一镜的首帧」、提示词条那一截的令牌记进 BOARD。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant