@flowgram-vue/core 0.2.0
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.
- package/LICENSE +22 -0
- package/dist/index.cjs +0 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +0 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
- package/src/common/config-entity.ts +80 -0
- package/src/common/entity-data.ts +171 -0
- package/src/common/entity-manager-contribution.ts +12 -0
- package/src/common/entity-manager.ts +475 -0
- package/src/common/entity.ts +482 -0
- package/src/common/index.ts +22 -0
- package/src/common/playground-context.ts +35 -0
- package/src/common/playground-decorator-helper.ts +113 -0
- package/src/common/playground-decorators.ts +85 -0
- package/src/common/playground-schedule.ts +30 -0
- package/src/common/protect-wheel-area.ts +11 -0
- package/src/common/schema/index.ts +14 -0
- package/src/common/schema/node.ts +15 -0
- package/src/common/schema/opacity-schema.ts +19 -0
- package/src/common/schema/origin-schema.ts +35 -0
- package/src/common/schema/position-schema.ts +35 -0
- package/src/common/schema/rotation-schema.ts +19 -0
- package/src/common/schema/scale-schema.ts +35 -0
- package/src/common/schema/size-schema.ts +42 -0
- package/src/common/schema/skew-schema.ts +35 -0
- package/src/common/schema/transform-schema.ts +613 -0
- package/src/common/utils/bounds.spec.ts +229 -0
- package/src/common/utils/bounds.ts +176 -0
- package/src/common/utils/index.ts +6 -0
- package/src/composables/index.ts +16 -0
- package/src/composables/use-config-entity.ts +31 -0
- package/src/composables/use-entities.ts +26 -0
- package/src/composables/use-entity-data-from-context.ts +34 -0
- package/src/composables/use-entity-from-context.ts +31 -0
- package/src/composables/use-listen-events.ts +22 -0
- package/src/composables/use-playground-container.ts +16 -0
- package/src/composables/use-playground-context.ts +15 -0
- package/src/composables/use-playground-drag.ts +31 -0
- package/src/composables/use-playground.ts +16 -0
- package/src/composables/use-refresh.ts +6 -0
- package/src/composables/use-service.ts +17 -0
- package/src/core/index.ts +8 -0
- package/src/core/layer/config/editor-state-config-entity.ts +180 -0
- package/src/core/layer/config/index.ts +7 -0
- package/src/core/layer/config/playground-config-entity.ts +604 -0
- package/src/core/layer/index.ts +8 -0
- package/src/core/layer/layer.ts +248 -0
- package/src/core/layer/playground-layer.ts +547 -0
- package/src/core/pipeline/index.ts +10 -0
- package/src/core/pipeline/pipeline-entities-selector.ts +200 -0
- package/src/core/pipeline/pipeline-entities.ts +230 -0
- package/src/core/pipeline/pipeline-registry.ts +344 -0
- package/src/core/pipeline/pipeline-renderer.ts +248 -0
- package/src/core/pipeline/pipeline-vue-utils.ts +96 -0
- package/src/core/pipeline/pipeline.ts +28 -0
- package/src/core/utils/index.ts +12 -0
- package/src/core/utils/inject-provider-decorators.ts +27 -0
- package/src/core/utils/lazy-inject-decorators.ts +38 -0
- package/src/core/utils/mouse-touch-event.ts +120 -0
- package/src/core/utils/playground-drag.ts +511 -0
- package/src/core/utils/playground-gesture.spec.ts +135 -0
- package/src/core/utils/playground-gesture.ts +118 -0
- package/src/core/utils/tween.ts +156 -0
- package/src/core/utils/use-gesture/core/Controller.ts +212 -0
- package/src/core/utils/use-gesture/core/EventStore.ts +46 -0
- package/src/core/utils/use-gesture/core/TimeoutStore.ts +28 -0
- package/src/core/utils/use-gesture/core/actions.ts +63 -0
- package/src/core/utils/use-gesture/core/config/commonConfigResolver.ts +86 -0
- package/src/core/utils/use-gesture/core/config/coordinatesConfigResolver.ts +48 -0
- package/src/core/utils/use-gesture/core/config/dragConfigResolver.ts +140 -0
- package/src/core/utils/use-gesture/core/config/hoverConfigResolver.ts +11 -0
- package/src/core/utils/use-gesture/core/config/moveConfigResolver.ts +11 -0
- package/src/core/utils/use-gesture/core/config/pinchConfigResolver.ts +59 -0
- package/src/core/utils/use-gesture/core/config/resolver.ts +70 -0
- package/src/core/utils/use-gesture/core/config/scrollConfigResolver.ts +8 -0
- package/src/core/utils/use-gesture/core/config/sharedConfigResolver.ts +28 -0
- package/src/core/utils/use-gesture/core/config/support.ts +52 -0
- package/src/core/utils/use-gesture/core/config/wheelConfigResolver.ts +8 -0
- package/src/core/utils/use-gesture/core/engines/CoordinatesEngine.ts +78 -0
- package/src/core/utils/use-gesture/core/engines/DragEngine.ts +403 -0
- package/src/core/utils/use-gesture/core/engines/Engine.ts +406 -0
- package/src/core/utils/use-gesture/core/engines/HoverEngine.ts +43 -0
- package/src/core/utils/use-gesture/core/engines/MoveEngine.ts +52 -0
- package/src/core/utils/use-gesture/core/engines/PinchEngine.ts +345 -0
- package/src/core/utils/use-gesture/core/engines/ScrollEngine.ts +42 -0
- package/src/core/utils/use-gesture/core/engines/WheelEngine.ts +48 -0
- package/src/core/utils/use-gesture/core/index.ts +7 -0
- package/src/core/utils/use-gesture/core/parser.ts +92 -0
- package/src/core/utils/use-gesture/core/types/action.ts +19 -0
- package/src/core/utils/use-gesture/core/types/config.ts +255 -0
- package/src/core/utils/use-gesture/core/types/handlers.ts +73 -0
- package/src/core/utils/use-gesture/core/types/index.ts +11 -0
- package/src/core/utils/use-gesture/core/types/internalConfig.ts +80 -0
- package/src/core/utils/use-gesture/core/types/state.ts +275 -0
- package/src/core/utils/use-gesture/core/types/utils.ts +204 -0
- package/src/core/utils/use-gesture/core/types.ts +8 -0
- package/src/core/utils/use-gesture/core/utils/events.ts +158 -0
- package/src/core/utils/use-gesture/core/utils/fn.ts +32 -0
- package/src/core/utils/use-gesture/core/utils/maths.ts +63 -0
- package/src/core/utils/use-gesture/core/utils/state.ts +24 -0
- package/src/core/utils/use-gesture/core/utils.ts +8 -0
- package/src/core/utils/use-gesture/index.ts +6 -0
- package/src/core/utils/use-gesture/vanilla/DragGesture.ts +27 -0
- package/src/core/utils/use-gesture/vanilla/Gesture.ts +45 -0
- package/src/core/utils/use-gesture/vanilla/HoverGesture.ts +27 -0
- package/src/core/utils/use-gesture/vanilla/MoveGesture.ts +27 -0
- package/src/core/utils/use-gesture/vanilla/PinchGesture.ts +27 -0
- package/src/core/utils/use-gesture/vanilla/Recognizer.ts +43 -0
- package/src/core/utils/use-gesture/vanilla/ScrollGesture.ts +27 -0
- package/src/core/utils/use-gesture/vanilla/WheelGesture.ts +27 -0
- package/src/core/utils/use-gesture/vanilla/createGesture.ts +18 -0
- package/src/core/utils/use-gesture/vanilla/index.ts +18 -0
- package/src/env.d.ts +10 -0
- package/src/index.ts +17 -0
- package/src/playground-config.ts +70 -0
- package/src/playground-container.ts +129 -0
- package/src/playground-contribution.ts +81 -0
- package/src/playground-mock-tools.ts +143 -0
- package/src/playground.ts +401 -0
- package/src/plugin/index.ts +6 -0
- package/src/plugin/plugin.ts +226 -0
- package/src/services/clipboard-service.ts +40 -0
- package/src/services/context-menu-service.ts +25 -0
- package/src/services/index.ts +10 -0
- package/src/services/logger-service.ts +49 -0
- package/src/services/selection-service.ts +54 -0
- package/src/services/storage-service.ts +65 -0
- package/src/vue/index.ts +8 -0
- package/src/vue/playground-vue-context.ts +22 -0
- package/src/vue/playground-vue-provider.ts +115 -0
- package/src/vue/playground-vue-renderer.vue +44 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { inject, injectable } from 'inversify';
|
|
7
|
+
|
|
8
|
+
import { type Layer } from '../layer';
|
|
9
|
+
import {
|
|
10
|
+
// AbleManager,
|
|
11
|
+
// type AbleRegistry,
|
|
12
|
+
type Entity,
|
|
13
|
+
type EntityData,
|
|
14
|
+
type EntityDataRegistry,
|
|
15
|
+
EntityManager,
|
|
16
|
+
type EntityRegistry,
|
|
17
|
+
} from '../../common';
|
|
18
|
+
|
|
19
|
+
type SelectorVersion = Map<string, number>;
|
|
20
|
+
|
|
21
|
+
export interface LayerEntitiesSelector {
|
|
22
|
+
// lastAbleVersion?: SelectorVersion;
|
|
23
|
+
lastEntityVersion?: SelectorVersion;
|
|
24
|
+
lastDataVersion?: SelectorVersion;
|
|
25
|
+
entities: EntityRegistry[];
|
|
26
|
+
// ables: AbleRegistry[];
|
|
27
|
+
datas: [EntityRegistry, EntityDataRegistry][]; // entity-data
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 选择器用来在 pipeline 绘制之前,筛选并注入 entities
|
|
32
|
+
*/
|
|
33
|
+
@injectable()
|
|
34
|
+
export class PipelineEntitiesSelector {
|
|
35
|
+
protected layerEntitiesSelectorMap: WeakMap<Layer, LayerEntitiesSelector> = new WeakMap();
|
|
36
|
+
|
|
37
|
+
readonly entityLayerMap: Map<string, Set<Layer>> = new Map();
|
|
38
|
+
|
|
39
|
+
readonly ableLayerMap: Map<string, Set<Layer>> = new Map();
|
|
40
|
+
|
|
41
|
+
// @inject(AbleManager) ableManager: AbleManager;
|
|
42
|
+
|
|
43
|
+
@inject(EntityManager) entityManager: EntityManager;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 订阅关联的 entity,会影响 autorun
|
|
47
|
+
*/
|
|
48
|
+
subscribeEntities(layer: Layer, entities: EntityRegistry[]): void {
|
|
49
|
+
const selector = this.getSelector(layer);
|
|
50
|
+
entities.forEach(e => {
|
|
51
|
+
if (!selector.entities.includes(e)) selector.entities.push(e);
|
|
52
|
+
let layers = this.entityLayerMap.get(e.type);
|
|
53
|
+
if (!layers) {
|
|
54
|
+
layers = new Set();
|
|
55
|
+
this.entityLayerMap.set(e.type, layers);
|
|
56
|
+
}
|
|
57
|
+
layers.add(layer);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// /**
|
|
62
|
+
// * 订阅关联的 able, 会影响 autorun
|
|
63
|
+
// */
|
|
64
|
+
// subscribeAbles(layer: Layer, ables: AbleRegistry[]): void {
|
|
65
|
+
// const selector = this.getSelector(layer);
|
|
66
|
+
// ables.forEach(able => {
|
|
67
|
+
// if (!selector.ables.includes(able)) selector.ables.push(able);
|
|
68
|
+
// let layers = this.ableLayerMap.get(able.type);
|
|
69
|
+
// if (!layers) {
|
|
70
|
+
// layers = new Set();
|
|
71
|
+
// this.ableLayerMap.set(able.type, layers);
|
|
72
|
+
// }
|
|
73
|
+
// layers.add(layer);
|
|
74
|
+
// });
|
|
75
|
+
// }
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 订阅 data 数据
|
|
79
|
+
* @param layer
|
|
80
|
+
* @param entity
|
|
81
|
+
* @param data
|
|
82
|
+
*/
|
|
83
|
+
subscribleEntityByData(layer: Layer, entity: EntityRegistry, data: EntityDataRegistry): void {
|
|
84
|
+
const selector = this.getSelector(layer);
|
|
85
|
+
// Entity 和 layer 做关联
|
|
86
|
+
let layers = this.entityLayerMap.get(entity.type);
|
|
87
|
+
if (!layers) {
|
|
88
|
+
layers = new Set();
|
|
89
|
+
this.entityLayerMap.set(entity.type, layers);
|
|
90
|
+
}
|
|
91
|
+
layers.add(layer);
|
|
92
|
+
const item: [EntityRegistry, EntityDataRegistry] = [entity, data];
|
|
93
|
+
if (!selector.datas.find(i => i[0] === entity && i[1] === data)) selector.datas.push(item);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
protected getSelector(layer: Layer): LayerEntitiesSelector {
|
|
97
|
+
let selector = this.layerEntitiesSelectorMap.get(layer);
|
|
98
|
+
if (!selector) {
|
|
99
|
+
selector = { entities: [], datas: [] };
|
|
100
|
+
this.layerEntitiesSelectorMap.set(layer, selector);
|
|
101
|
+
}
|
|
102
|
+
return selector;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 查询 layer 关联的实体
|
|
107
|
+
*/
|
|
108
|
+
getLayerEntities(layer: Layer): { entities: Entity[]; changed: boolean } {
|
|
109
|
+
const selector = this.layerEntitiesSelectorMap.get(layer);
|
|
110
|
+
/* v8 ignore next 1 */
|
|
111
|
+
if (!selector) return { entities: [], changed: false };
|
|
112
|
+
const allEntities: Set<Entity> = new Set();
|
|
113
|
+
const entityVersion: SelectorVersion = new Map();
|
|
114
|
+
let entityChanged = false;
|
|
115
|
+
selector.entities.forEach(registry => {
|
|
116
|
+
const entities = this.entityManager.getEntities(registry);
|
|
117
|
+
const version = this.entityManager.getEntityVersion(registry);
|
|
118
|
+
entityVersion.set(registry.type, version);
|
|
119
|
+
for (const item of entities) {
|
|
120
|
+
allEntities.add(item);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// selector.ables.forEach(registry => {
|
|
124
|
+
// const entities = this.ableManager.getEntitiesByAble(registry);
|
|
125
|
+
// for (const item of entities) {
|
|
126
|
+
// if (!entityVersion.has(item.type)) {
|
|
127
|
+
// const version = this.entityManager.getEntityVersion(item.type);
|
|
128
|
+
// entityVersion.set(item.type, version);
|
|
129
|
+
// }
|
|
130
|
+
// allEntities.add(item);
|
|
131
|
+
// }
|
|
132
|
+
// });
|
|
133
|
+
// To array
|
|
134
|
+
const result: Entity[] = [];
|
|
135
|
+
for (const item of allEntities.values()) {
|
|
136
|
+
result.push(item);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 检查版本变化
|
|
140
|
+
*/
|
|
141
|
+
if (checkChanged(entityVersion, selector.lastEntityVersion)) {
|
|
142
|
+
selector.lastEntityVersion = entityVersion;
|
|
143
|
+
entityChanged = true;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
entities: result,
|
|
147
|
+
changed: entityChanged,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
getLayerEntityDatas(layer: Layer): { datas: EntityData[]; changed: boolean } {
|
|
152
|
+
const selector = this.layerEntitiesSelectorMap.get(layer);
|
|
153
|
+
/* v8 ignore next 1 */
|
|
154
|
+
if (!selector) return { datas: [], changed: false };
|
|
155
|
+
const allDatas: EntityData[] = [];
|
|
156
|
+
const dataVersion: SelectorVersion = new Map();
|
|
157
|
+
let dataChanged = false;
|
|
158
|
+
selector.datas.forEach(registries => {
|
|
159
|
+
const [entityRegistry, entityDataRegistry] = registries;
|
|
160
|
+
const entityDatas = this.entityManager.getEntityDatas(entityRegistry, entityDataRegistry);
|
|
161
|
+
const version = this.entityManager.getEntityDataVersion(entityDataRegistry);
|
|
162
|
+
dataVersion.set(entityDataRegistry.type, version);
|
|
163
|
+
/* v8 ignore next 3 */
|
|
164
|
+
for (const item of entityDatas) {
|
|
165
|
+
allDatas.push(item);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
if (checkChanged(dataVersion, selector.lastDataVersion)) {
|
|
169
|
+
selector.lastDataVersion = dataVersion;
|
|
170
|
+
dataChanged = true;
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
datas: allDatas,
|
|
174
|
+
changed: dataChanged,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
getLayerData(layer: Layer): {
|
|
179
|
+
observeEntities: Entity[];
|
|
180
|
+
observeDatas: EntityData[];
|
|
181
|
+
changed: boolean;
|
|
182
|
+
} {
|
|
183
|
+
const entitiesSelector = this.getLayerEntities(layer);
|
|
184
|
+
const datasSelector = this.getLayerEntityDatas(layer);
|
|
185
|
+
return {
|
|
186
|
+
observeEntities: entitiesSelector.entities,
|
|
187
|
+
observeDatas: datasSelector.datas,
|
|
188
|
+
changed: datasSelector.changed || entitiesSelector.changed,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function checkChanged(v1: SelectorVersion = new Map(), v2: SelectorVersion = new Map()): boolean {
|
|
194
|
+
if (v1.size !== v2.size) return true;
|
|
195
|
+
for (const key of v1.keys()) {
|
|
196
|
+
/* v8 ignore next 1 */
|
|
197
|
+
if (v1.get(key) !== v2.get(key)) return true;
|
|
198
|
+
}
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
// type AbleRegistry,
|
|
8
|
+
type ConfigEntity,
|
|
9
|
+
type Entity,
|
|
10
|
+
type EntityData,
|
|
11
|
+
type EntityManager,
|
|
12
|
+
type EntityRegistry,
|
|
13
|
+
} from '../../common';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 注入到 Layer 中的实体选择器
|
|
17
|
+
*/
|
|
18
|
+
export interface PipelineEntities extends Iterable<Entity> {
|
|
19
|
+
/**
|
|
20
|
+
* 获取单个实体,如果该实体是单例且被注册过,则会自动创建
|
|
21
|
+
* @param registry
|
|
22
|
+
*/
|
|
23
|
+
get<T extends Entity>(registry: EntityRegistry, id?: string): T | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* 获取多个实体
|
|
26
|
+
* @param registry
|
|
27
|
+
*/
|
|
28
|
+
getEntities<T extends Entity>(registry: EntityRegistry): T[];
|
|
29
|
+
|
|
30
|
+
// /**
|
|
31
|
+
// * 通过 Able 获取多个实体
|
|
32
|
+
// * @param registry
|
|
33
|
+
// */
|
|
34
|
+
// getEntitiesByAble<T extends Entity>(registry: AbleRegistry): T[];
|
|
35
|
+
// /**
|
|
36
|
+
// * 通过多个 Ables 获取多个实体
|
|
37
|
+
// * @param andAbles - 多个 able,条件且
|
|
38
|
+
// * @param orAbles - 多个 able,条件或
|
|
39
|
+
// */
|
|
40
|
+
// getEntitiesByAbles<T extends Entity>(andAbles: AbleRegistry[], orAbles?: AbleRegistry[]): T[];
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 获取 entity
|
|
44
|
+
* @param entityRegistry
|
|
45
|
+
* @param dataRegistry
|
|
46
|
+
*/
|
|
47
|
+
getEntityDatas<T extends EntityData>(entityRegistry: EntityRegistry, dataRegistry: T): T[];
|
|
48
|
+
/**
|
|
49
|
+
* 是否存在
|
|
50
|
+
* @param registry
|
|
51
|
+
*/
|
|
52
|
+
has(registry: EntityRegistry): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* 获取配置信息
|
|
55
|
+
* @param registry
|
|
56
|
+
*/
|
|
57
|
+
getConfig<E extends ConfigEntity>(registry: EntityRegistry): E['config'] | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* 更新配置数据
|
|
60
|
+
*/
|
|
61
|
+
updateConfig<E extends ConfigEntity>(registry: EntityRegistry, props: Partial<E['config']>): void;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 创建实体
|
|
65
|
+
*/
|
|
66
|
+
createEntity: <E extends Entity>(
|
|
67
|
+
registry: EntityRegistry,
|
|
68
|
+
opts?: Omit<E['__opts_type__'], 'entityManager'>,
|
|
69
|
+
) => E;
|
|
70
|
+
/**
|
|
71
|
+
* 批量删除实体
|
|
72
|
+
*/
|
|
73
|
+
removeEntities: (registry: EntityRegistry) => void;
|
|
74
|
+
/**
|
|
75
|
+
* 当前画布订阅的实体数目
|
|
76
|
+
*/
|
|
77
|
+
readonly size: number;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export class PipelineEntitiesImpl implements PipelineEntities {
|
|
81
|
+
protected observeEntities: Entity[] = [];
|
|
82
|
+
|
|
83
|
+
protected observeDatas: EntityData[] = [];
|
|
84
|
+
|
|
85
|
+
// @Action 这里要加多个缓存的原因是,每次 decorator 触发都会频繁调用获取方法,"this.xxx" 也会触发 decorator 方法
|
|
86
|
+
protected entitiesTypeCache: Map<EntityRegistry, Entity[]> = new Map();
|
|
87
|
+
|
|
88
|
+
protected entitiesAbleCache: Map<string, Entity[]> = new Map();
|
|
89
|
+
|
|
90
|
+
protected entitiyDataCache: Map<string, EntityData[]> = new Map();
|
|
91
|
+
|
|
92
|
+
constructor(protected readonly entityManager: EntityManager) {}
|
|
93
|
+
|
|
94
|
+
get size(): number {
|
|
95
|
+
return this.observeEntities.length;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* 加载订阅数据,会缓存到 layer 内部,layer 只能拿到订阅数据的子集
|
|
100
|
+
* @param observeEntites
|
|
101
|
+
* @param observeDatas
|
|
102
|
+
*/
|
|
103
|
+
load(observeEntites: Entity[], observeDatas: EntityData[]): void {
|
|
104
|
+
this.observeEntities = observeEntites;
|
|
105
|
+
this.observeDatas = observeDatas;
|
|
106
|
+
// clear cache
|
|
107
|
+
this.entitiesTypeCache.clear();
|
|
108
|
+
this.entitiesAbleCache.clear();
|
|
109
|
+
this.entitiyDataCache.clear();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
get<T extends Entity>(registry: EntityRegistry, id?: string): T | undefined {
|
|
113
|
+
const entities = this.getEntities(registry) as T[];
|
|
114
|
+
if (id !== undefined) {
|
|
115
|
+
return entities.find(e => e.id === id);
|
|
116
|
+
}
|
|
117
|
+
return entities[0];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
has(registy: EntityRegistry): boolean {
|
|
121
|
+
return !!this.get(registy);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
getEntities<T extends Entity>(registry: EntityRegistry): T[] {
|
|
125
|
+
let result = this.entitiesTypeCache.get(registry) as T[];
|
|
126
|
+
// 缓存查询结果
|
|
127
|
+
if (!result) {
|
|
128
|
+
result = [];
|
|
129
|
+
this.observeEntities.forEach(e => {
|
|
130
|
+
if (e.type === registry.type) result!.push(e as T);
|
|
131
|
+
});
|
|
132
|
+
this.entitiesTypeCache.set(registry, result);
|
|
133
|
+
}
|
|
134
|
+
// 可能会出现延迟更新
|
|
135
|
+
return result.filter(r => !r.disposed);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
getEntityDatas<T extends EntityData = EntityData>(
|
|
139
|
+
entityRegistry: EntityRegistry,
|
|
140
|
+
dataRegistry: T,
|
|
141
|
+
): T[] {
|
|
142
|
+
const dataKey = `${entityRegistry.type}:${dataRegistry.type}`;
|
|
143
|
+
let result = this.entitiyDataCache.get(dataKey) as T[];
|
|
144
|
+
if (result) {
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
result = this.observeDatas.filter(
|
|
148
|
+
data => data.type === dataRegistry.type && data.entity.type === entityRegistry.type,
|
|
149
|
+
) as T[];
|
|
150
|
+
this.entitiyDataCache.set(dataKey, result);
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// getEntitiesByAble<T extends Entity = Entity>(able: AbleRegistry): T[] {
|
|
155
|
+
// return this.getEntitiesByAbles([able]);
|
|
156
|
+
// }
|
|
157
|
+
|
|
158
|
+
// getEntitiesByAbles<T extends Entity = Entity>(
|
|
159
|
+
// andAbles: AbleRegistry[] = [],
|
|
160
|
+
// orAbles: AbleRegistry[] = [],
|
|
161
|
+
// ): T[] {
|
|
162
|
+
// const ableKey = `${andAbles.map(a => a.type).join(':')}_${orAbles.map(a => a.type).join(':')}`;
|
|
163
|
+
// let result = this.entitiesAbleCache.get(ableKey) as T[];
|
|
164
|
+
// // 缓存查询结果
|
|
165
|
+
// if (!result) {
|
|
166
|
+
// result = [];
|
|
167
|
+
// this.observeEntities.forEach(entity => {
|
|
168
|
+
// const checkAnd = andAbles.length === 0 || !andAbles.find(able => !entity.ables.has(able));
|
|
169
|
+
// const checkOr = orAbles.length === 0 || orAbles.find(able => entity.ables.has(able));
|
|
170
|
+
// if (checkAnd && checkOr) {
|
|
171
|
+
// result.push(entity as T);
|
|
172
|
+
// }
|
|
173
|
+
// });
|
|
174
|
+
// this.entitiesAbleCache.set(ableKey, result);
|
|
175
|
+
// }
|
|
176
|
+
// // 可能会出现延迟更新
|
|
177
|
+
// return result.filter(r => !r.disposed);
|
|
178
|
+
// }
|
|
179
|
+
|
|
180
|
+
updateConfig<E extends ConfigEntity>(
|
|
181
|
+
registry: EntityRegistry,
|
|
182
|
+
props: Partial<E['config']>,
|
|
183
|
+
): void {
|
|
184
|
+
const entity = this.get(registry) as ConfigEntity;
|
|
185
|
+
/* v8 ignore next 3 */
|
|
186
|
+
if (entity && entity.updateConfig) {
|
|
187
|
+
entity.updateConfig(props);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
getConfig<E extends ConfigEntity>(registry: EntityRegistry): E['config'] | undefined {
|
|
192
|
+
const entity = this.get(registry) as ConfigEntity;
|
|
193
|
+
/* v8 ignore next 3 */
|
|
194
|
+
if (entity) {
|
|
195
|
+
return entity.config;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* 创建实体
|
|
201
|
+
*/
|
|
202
|
+
createEntity<E extends Entity>(
|
|
203
|
+
registry: EntityRegistry,
|
|
204
|
+
opts?: Omit<E['__opts_type__'], 'entityManager'>,
|
|
205
|
+
): E {
|
|
206
|
+
return this.entityManager.createEntity<E>(registry, opts);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 批量删除实体
|
|
211
|
+
*/
|
|
212
|
+
removeEntities(registry: EntityRegistry): void {
|
|
213
|
+
this.entityManager.removeEntities(registry);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
[Symbol.iterator](): Iterator<Entity> {
|
|
217
|
+
let index = 0;
|
|
218
|
+
const len = this.observeEntities.length;
|
|
219
|
+
return {
|
|
220
|
+
next: () => {
|
|
221
|
+
const current = index++;
|
|
222
|
+
const done = current === len;
|
|
223
|
+
return {
|
|
224
|
+
value: this.observeEntities[current],
|
|
225
|
+
done,
|
|
226
|
+
};
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|