feat(编辑能力): 完善复合对象编辑,修复撤销后的粘贴路径和裁剪状态
build.yaml / build (push) Successful in 37s

This commit is contained in:
xiaoqidun committed 2026-09-17 18:05:16 +08:00
1 parent 2ddde73b65
commit fa8fec9830
9 files changed
+737 -71

No files matched your search

+28 -17
View File
@@ -60,23 +60,9 @@ func (e *Editor) CopyCompositeObjects(page int, path ObjectPath, indexes []int,
}
}
slices.SortFunc(nodes, func(a, b *editorCompositeNode) int { return a.index - b.index })
ids := make(map[string]string)
for _, node := range nodes {
if err := e.collectCompositeIDs(node.node, ids); err != nil {
return err
}
}
var data []byte
for _, node := range nodes {
copy := *node
if err := e.transformCompositeMember(renderer, &copy, TranslationMatrix(dx, dy)); err != nil {
return err
}
fragment, err := editorXMLRemapIDs(copy.data, copy.node, ids)
if err != nil {
return err
}
data = append(data, fragment...)
data, err := e.copyCompositeNodes(renderer, nodes, dx, dy)
if err != nil {
return err
}
owner := nodes[0].owner
owner.patches = append(owner.patches, editorXMLPatch{container.close, container.close, data})
@@ -97,6 +83,31 @@ func (e *Editor) CopyCompositeObjects(page int, path ObjectPath, indexes []int,
return result, nil
}
// copyCompositeNodes 复制成员原文并统一重映射标识,保持副本之间的引用
// 入参: renderer 渲染器, nodes 快照, dx、dy 页面位移
// 返回: []byte 副本XML, error 错误信息
func (e *Editor) copyCompositeNodes(renderer *Renderer, nodes []*editorCompositeNode, dx, dy float64) ([]byte, error) {
ids := make(map[string]string)
for _, node := range nodes {
if err := e.collectCompositeIDs(node.node, ids); err != nil {
return nil, err
}
}
var data []byte
for _, node := range nodes {
copy := *node
if err := e.transformCompositeMember(renderer, &copy, TranslationMatrix(dx, dy)); err != nil {
return nil, err
}
fragment, err := editorXMLRemapIDs(copy.data, copy.node, ids)
if err != nil {
return nil, err
}
data = append(data, fragment...)
}
return data, nil
}
// OrderCompositeObjects 调整同一直接容器内的绘制顺序,不改变页块和其他实例
// 入参: page 页面索引, path 父复合路径, indexes 成员序号, order 为up、down、top或bottom
// 返回: []int 调整后的选区序号, error 错误信息