ice-render 1.3.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,14 +10,6 @@ import EventBus from '../event/EventBus.mjs';
10
10
  import ICEEventTarget from '../event/ICEEventTarget.mjs';
11
11
  import ICEBoundingBox from '../geometry/ICEBoundingBox.mjs';
12
12
  import ICE from '../ICE.mjs';
13
- /**
14
- * @class ICEComponent
15
- *
16
- * 最顶级的抽象类,Canvas 内部所有可见的组件都是它的子类。
17
- *
18
- * @abstract
19
- * @author 大漠穷秋<damoqiongqiu@126.com>
20
- */
21
13
  declare abstract class ICEComponent extends ICEEventTarget {
22
14
  ice: ICE;
23
15
  root: any;
@@ -337,6 +329,18 @@ declare abstract class ICEComponent extends ICEEventTarget {
337
329
  protected doRender(): void;
338
330
  /** 判断两个边界盒是否在视觉上重合(用于避免重复绘制几乎相同的 min/max 框)。 */
339
331
  private __areBoundingBoxesNearlyEqual;
332
+ /**
333
+ * 内部子组件是否为「由自身 state 派生」的。
334
+ *
335
+ * 复合组件(构造时按 state 建立内部子组件的组件,如「卡片 = 底框 + 标题」)应当返回 true:
336
+ * 这些子组件在反序列化时会被构造函数重建,序列化它们只会造成**重复挂载**
337
+ * (先由构造函数建一份、再由 Deserializer 挂一份)、并且子组件的自动 zIndex 每次都会变,
338
+ * 让同一份数据的两次序列化结果不稳定。返回 true 后,Serializer / Deserializer 都会跳过
339
+ * 该组件的 childNodes —— 只持久化它自己的 state(真相源),子组件视为派生结果。
340
+ *
341
+ * 默认为 false(普通容器/叶子组件的子节点是「真数据」,必须序列化)。
342
+ */
343
+ hasDerivedChildren(): boolean;
340
344
  /**
341
345
  * 获取组件的最小包围盒,此盒子的变换矩阵与组件自身完全相同。
342
346
  * 此方法需要在 render() 之后调用,组件没有渲染时无法计算最小包围盒。
@@ -10,14 +10,6 @@ import EventBus from '../event/EventBus';
10
10
  import ICEEventTarget from '../event/ICEEventTarget';
11
11
  import ICEBoundingBox from '../geometry/ICEBoundingBox';
12
12
  import ICE from '../ICE';
13
- /**
14
- * @class ICEComponent
15
- *
16
- * 最顶级的抽象类,Canvas 内部所有可见的组件都是它的子类。
17
- *
18
- * @abstract
19
- * @author 大漠穷秋<damoqiongqiu@126.com>
20
- */
21
13
  declare abstract class ICEComponent extends ICEEventTarget {
22
14
  ice: ICE;
23
15
  root: any;
@@ -337,6 +329,18 @@ declare abstract class ICEComponent extends ICEEventTarget {
337
329
  protected doRender(): void;
338
330
  /** 判断两个边界盒是否在视觉上重合(用于避免重复绘制几乎相同的 min/max 框)。 */
339
331
  private __areBoundingBoxesNearlyEqual;
332
+ /**
333
+ * 内部子组件是否为「由自身 state 派生」的。
334
+ *
335
+ * 复合组件(构造时按 state 建立内部子组件的组件,如「卡片 = 底框 + 标题」)应当返回 true:
336
+ * 这些子组件在反序列化时会被构造函数重建,序列化它们只会造成**重复挂载**
337
+ * (先由构造函数建一份、再由 Deserializer 挂一份)、并且子组件的自动 zIndex 每次都会变,
338
+ * 让同一份数据的两次序列化结果不稳定。返回 true 后,Serializer / Deserializer 都会跳过
339
+ * 该组件的 childNodes —— 只持久化它自己的 state(真相源),子组件视为派生结果。
340
+ *
341
+ * 默认为 false(普通容器/叶子组件的子节点是「真数据」,必须序列化)。
342
+ */
343
+ hasDerivedChildren(): boolean;
340
344
  /**
341
345
  * 获取组件的最小包围盒,此盒子的变换矩阵与组件自身完全相同。
342
346
  * 此方法需要在 render() 之后调用,组件没有渲染时无法计算最小包围盒。
@@ -79,6 +79,16 @@ declare class ICEGroup extends ICERect {
79
79
  */
80
80
  addChild(child: ICEComponent, markDirty?: boolean): void;
81
81
  addChildren(arr: Array<ICEComponent>): void;
82
+ /**
83
+ * 把某个组件迁移到本容器下(**不销毁**它)。
84
+ *
85
+ * 为什么需要单独的 API:`removeChild()` 末尾会调用 `child.destory()`(清事件、清子节点),
86
+ * 所以「先 removeChild 再 addChild」式的重父级会把组件连同内部子树一起毁掉
87
+ * (BPMN 池/泳道里嵌节点时就踩到这个坑:标题、角标全没了)。
88
+ * 本方法只从旧父级的 childNodes / 去重集合里摘除,再挂到本容器,组件本体与子树保持完好。
89
+ * **坐标不换算**:调用方若要保持世界位置,请自行换算 left/top。
90
+ */
91
+ adoptChild(child: ICEComponent, markDirty?: boolean): void;
82
92
  removeChild(child: ICEComponent, markDirty?: boolean): void;
83
93
  removeChildren(arr: Array<ICEComponent>): void;
84
94
  /**
@@ -79,6 +79,16 @@ declare class ICEGroup extends ICERect {
79
79
  */
80
80
  addChild(child: ICEComponent, markDirty?: boolean): void;
81
81
  addChildren(arr: Array<ICEComponent>): void;
82
+ /**
83
+ * 把某个组件迁移到本容器下(**不销毁**它)。
84
+ *
85
+ * 为什么需要单独的 API:`removeChild()` 末尾会调用 `child.destory()`(清事件、清子节点),
86
+ * 所以「先 removeChild 再 addChild」式的重父级会把组件连同内部子树一起毁掉
87
+ * (BPMN 池/泳道里嵌节点时就踩到这个坑:标题、角标全没了)。
88
+ * 本方法只从旧父级的 childNodes / 去重集合里摘除,再挂到本容器,组件本体与子树保持完好。
89
+ * **坐标不换算**:调用方若要保持世界位置,请自行换算 left/top。
90
+ */
91
+ adoptChild(child: ICEComponent, markDirty?: boolean): void;
82
92
  removeChild(child: ICEComponent, markDirty?: boolean): void;
83
93
  removeChildren(arr: Array<ICEComponent>): void;
84
94
  /**
@@ -51,5 +51,7 @@ export { default as ICE } from './ICE.mjs';
51
51
  export { default as CanvasRenderer } from './renderer/CanvasRenderer.mjs';
52
52
  export { default as PluginHost } from './plugin/PluginHost.mjs';
53
53
  export type { ICEPlugin, ICEPluginTool, ICERenderHook, ICERenderFrame } from './plugin/PluginHost.mjs';
54
+ export { default as Serializer, SERIALIZATION_VERSION } from './persistence/Serializer.mjs';
55
+ export { default as Deserializer, SERIALIZATION_MIGRATIONS } from './persistence/Deserializer.mjs';
54
56
  export { buildAccessibilityTree } from './a11y/accessibility.mjs';
55
57
  export type { ICEAccessibleNode, ICEAccessibleRole, ICEAccessibilityOptions } from './a11y/accessibility.mjs';
@@ -51,5 +51,7 @@ export { default as ICE } from './ICE';
51
51
  export { default as CanvasRenderer } from './renderer/CanvasRenderer';
52
52
  export { default as PluginHost } from './plugin/PluginHost';
53
53
  export type { ICEPlugin, ICEPluginTool, ICERenderHook, ICERenderFrame } from './plugin/PluginHost';
54
+ export { default as Serializer, SERIALIZATION_VERSION } from './persistence/Serializer';
55
+ export { default as Deserializer, SERIALIZATION_MIGRATIONS } from './persistence/Deserializer';
54
56
  export { buildAccessibilityTree } from './a11y/accessibility';
55
57
  export type { ICEAccessibleNode, ICEAccessibleRole, ICEAccessibilityOptions } from './a11y/accessibility';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "author": "大漠穷秋",
3
3
  "name": "ice-render",
4
- "version": "1.3.0",
4
+ "version": "1.4.1",
5
5
  "description": "A canvas engine for interactive graphics.",
6
6
  "repository": {
7
7
  "type": "git",