@gedit/editor-2d 0.1.114 → 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/lib/browser/editor2d-context-key-service.js +24 -35
- package/lib/browser/editor2d-context-key-service.js.map +1 -1
- package/lib/browser/editor2d-contribution.js +89 -139
- package/lib/browser/editor2d-contribution.js.map +1 -1
- package/lib/browser/editor2d-frontend-module.js +20 -20
- package/lib/browser/editor2d-frontend-module.js.map +1 -1
- package/lib/browser/editor2d-label-provider.d.ts +0 -1
- package/lib/browser/editor2d-label-provider.d.ts.map +1 -1
- package/lib/browser/editor2d-label-provider.js +37 -58
- package/lib/browser/editor2d-label-provider.js.map +1 -1
- package/lib/browser/editor2d-model-provider.js +61 -127
- package/lib/browser/editor2d-model-provider.js.map +1 -1
- package/lib/browser/editor2d-ref-provider-contribution.d.ts +1 -1
- package/lib/browser/editor2d-ref-provider-contribution.d.ts.map +1 -1
- package/lib/browser/editor2d-ref-provider-contribution.js +46 -112
- package/lib/browser/editor2d-ref-provider-contribution.js.map +1 -1
- package/lib/browser/editor2d-service.js +66 -85
- package/lib/browser/editor2d-service.js.map +1 -1
- package/lib/browser/model/editor2d-document.d.ts +46 -20
- package/lib/browser/model/editor2d-document.d.ts.map +1 -1
- package/lib/browser/model/editor2d-document.js +602 -549
- package/lib/browser/model/editor2d-document.js.map +1 -1
- package/lib/browser/model/editor2d-iterator.js +27 -67
- package/lib/browser/model/editor2d-iterator.js.map +1 -1
- package/lib/browser/model/editor2d-model-container.js +10 -21
- package/lib/browser/model/editor2d-model-container.js.map +1 -1
- package/lib/browser/model/editor2d-model.js +77 -92
- package/lib/browser/model/editor2d-model.js.map +1 -1
- package/lib/browser/model/editor2d-selection.js +16 -43
- package/lib/browser/model/editor2d-selection.js.map +1 -1
- package/lib/browser/model/editor2d-widget.js +71 -90
- package/lib/browser/model/editor2d-widget.js.map +1 -1
- package/lib/browser/model/editor2d.d.ts +8 -4
- package/lib/browser/model/editor2d.d.ts.map +1 -1
- package/lib/browser/model/editor2d.js +61 -128
- package/lib/browser/model/editor2d.js.map +1 -1
- package/lib/browser/model/utils/anim.utils.d.ts +3 -0
- package/lib/browser/model/utils/anim.utils.d.ts.map +1 -1
- package/lib/browser/model/utils/anim.utils.js +24 -18
- package/lib/browser/model/utils/anim.utils.js.map +1 -1
- package/lib/browser/playground/canvas-draw.d.ts +8 -0
- package/lib/browser/playground/canvas-draw.d.ts.map +1 -1
- package/lib/browser/playground/canvas-draw.js +164 -252
- package/lib/browser/playground/canvas-draw.js.map +1 -1
- package/lib/browser/playground/canvas-layer.d.ts +10 -2
- package/lib/browser/playground/canvas-layer.d.ts.map +1 -1
- package/lib/browser/playground/canvas-layer.js +78 -102
- package/lib/browser/playground/canvas-layer.js.map +1 -1
- package/lib/browser/playground/entities/document-entity.js +8 -28
- package/lib/browser/playground/entities/document-entity.js.map +1 -1
- package/lib/browser/playground/entities/editor2d-entity.js +14 -37
- package/lib/browser/playground/entities/editor2d-entity.js.map +1 -1
- package/lib/browser/playground/entities/extend-entity.d.ts +10 -0
- package/lib/browser/playground/entities/extend-entity.d.ts.map +1 -0
- package/lib/browser/playground/entities/extend-entity.js +34 -0
- package/lib/browser/playground/entities/extend-entity.js.map +1 -0
- package/lib/browser/playground/entities/index.d.ts +1 -0
- package/lib/browser/playground/entities/index.d.ts.map +1 -1
- package/lib/browser/playground/entities/index.js +1 -0
- package/lib/browser/playground/entities/index.js.map +1 -1
- package/lib/browser/playground/extend-edit-layer-point-event.d.ts +30 -0
- package/lib/browser/playground/extend-edit-layer-point-event.d.ts.map +1 -0
- package/lib/browser/playground/extend-edit-layer-point-event.js +50 -0
- package/lib/browser/playground/extend-edit-layer-point-event.js.map +1 -0
- package/lib/browser/playground/extend-edit-layer.d.ts +38 -0
- package/lib/browser/playground/extend-edit-layer.d.ts.map +1 -0
- package/lib/browser/playground/extend-edit-layer.js +335 -0
- package/lib/browser/playground/extend-edit-layer.js.map +1 -0
- package/lib/browser/playground/index.d.ts +1 -0
- package/lib/browser/playground/index.d.ts.map +1 -1
- package/lib/browser/playground/index.js +1 -0
- package/lib/browser/playground/index.js.map +1 -1
- package/lib/browser/playground/path-edit-layer-move-point.d.ts +15 -0
- package/lib/browser/playground/path-edit-layer-move-point.d.ts.map +1 -0
- package/lib/browser/playground/path-edit-layer-move-point.js +47 -0
- package/lib/browser/playground/path-edit-layer-move-point.js.map +1 -0
- package/lib/browser/playground/path-edit-layer-svg-path.d.ts +11 -0
- package/lib/browser/playground/path-edit-layer-svg-path.d.ts.map +1 -0
- package/lib/browser/playground/path-edit-layer-svg-path.js +21 -0
- package/lib/browser/playground/path-edit-layer-svg-path.js.map +1 -0
- package/lib/browser/playground/path-edit-layer.d.ts +36 -0
- package/lib/browser/playground/path-edit-layer.d.ts.map +1 -0
- package/lib/browser/playground/path-edit-layer.js +257 -0
- package/lib/browser/playground/path-edit-layer.js.map +1 -0
- package/lib/browser/playground/playground-context.d.ts +3 -1
- package/lib/browser/playground/playground-context.d.ts.map +1 -1
- package/lib/browser/playground/playground-context.js +49 -47
- package/lib/browser/playground/playground-context.js.map +1 -1
- package/lib/browser/playground/playground-contribution.d.ts +2 -0
- package/lib/browser/playground/playground-contribution.d.ts.map +1 -1
- package/lib/browser/playground/playground-contribution.js +100 -67
- package/lib/browser/playground/playground-contribution.js.map +1 -1
- package/lib/browser/playground/selection-entity-manager.js +74 -132
- package/lib/browser/playground/selection-entity-manager.js.map +1 -1
- package/lib/browser/playground/selector-extend-icons.js +15 -16
- package/lib/browser/playground/selector-extend-icons.js.map +1 -1
- package/lib/browser/playground/selector-extend-renderer.d.ts +3 -2
- package/lib/browser/playground/selector-extend-renderer.d.ts.map +1 -1
- package/lib/browser/playground/selector-extend-renderer.js +67 -52
- package/lib/browser/playground/selector-extend-renderer.js.map +1 -1
- package/lib/browser/utils/snapshot.d.ts.map +1 -1
- package/lib/browser/utils/snapshot.js +81 -172
- package/lib/browser/utils/snapshot.js.map +1 -1
- package/package.json +9 -7
- package/src/browser/editor2d-label-provider.ts +1 -15
- package/src/browser/editor2d-ref-provider-contribution.ts +8 -8
- package/src/browser/model/editor2d-document.ts +284 -51
- package/src/browser/model/editor2d.ts +21 -5
- package/src/browser/model/utils/anim.utils.ts +9 -2
- package/src/browser/playground/canvas-draw.ts +31 -17
- package/src/browser/playground/canvas-layer.ts +25 -3
- package/src/browser/playground/entities/extend-entity.ts +37 -0
- package/src/browser/playground/entities/index.ts +1 -0
- package/src/browser/playground/extend-edit-layer-point-event.tsx +71 -0
- package/src/browser/playground/extend-edit-layer.tsx +442 -0
- package/src/browser/playground/index.ts +1 -0
- package/src/browser/playground/path-edit-layer-move-point.tsx +71 -0
- package/src/browser/playground/path-edit-layer-svg-path.tsx +50 -0
- package/src/browser/playground/path-edit-layer.tsx +330 -0
- package/src/browser/playground/playground-context.ts +2 -0
- package/src/browser/playground/playground-contribution.ts +37 -3
- package/src/browser/playground/selector-extend-renderer.tsx +43 -10
- package/src/browser/style/canvas-layer.css +16 -0
- package/src/browser/style/extend-edit-layer.less +127 -0
- package/src/browser/style/index.less +2 -1
- package/src/browser/style/path-edit-layer.less +72 -0
- package/src/browser/svg/pen+.svg +24 -0
- package/src/browser/utils/snapshot.ts +1 -0
- package/lib/browser/playground/canvas-draw-layer.d.ts +0 -22
- package/lib/browser/playground/canvas-draw-layer.d.ts.map +0 -1
- package/lib/browser/playground/canvas-draw-layer.js +0 -126
- package/lib/browser/playground/canvas-draw-layer.js.map +0 -1
- package/src/browser/playground/canvas-draw-layer.tsx +0 -88
- package/src/browser/style/canvas-draw-layer.less +0 -24
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { inject, injectable } from 'inversify';
|
|
1
|
+
import { inject, injectable, optional } from 'inversify';
|
|
2
2
|
import { EditorDocument, EditorDocumentChangeEvent } from '@gedit/editor';
|
|
3
3
|
import {
|
|
4
4
|
Compare,
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
Disposable,
|
|
7
7
|
Emitter,
|
|
8
8
|
Event,
|
|
9
|
-
mapValues,
|
|
10
9
|
MaybePromise,
|
|
11
10
|
omit,
|
|
11
|
+
debounce,
|
|
12
12
|
PromiseDeferred,
|
|
13
13
|
URI,
|
|
14
14
|
} from '@gedit/utils';
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
Editor2dContent,
|
|
19
19
|
Editor2dModelOptions,
|
|
20
20
|
Editor2dNode,
|
|
21
|
+
// Editor2dNodeCache,
|
|
21
22
|
} from './editor2d';
|
|
22
23
|
import { GameObject, GameObjectBaseType, GameObjectType } from '@gedit/render-engine';
|
|
23
24
|
import { GameObjectDecoration, RenderEngineIDEService } from '@gedit/render-engine-ide';
|
|
@@ -29,10 +30,35 @@ import { WorkspaceResourceService } from '@gedit/workspace-2d';
|
|
|
29
30
|
import { ResourceProvider, ResourceRefError } from '@gedit/resource';
|
|
30
31
|
import { AppConfigService } from '@gedit/app-config';
|
|
31
32
|
import { Editor2dIterator } from './editor2d-iterator';
|
|
32
|
-
import { getAnimationKeys, getChangeAnimationData } from './utils';
|
|
33
|
+
// import { getAnimationKeys, getChangeAnimationData } from './utils';
|
|
34
|
+
|
|
35
|
+
export const maskShowArray: GameObjectType[] = [
|
|
36
|
+
GameObjectBaseType.IMAGE,
|
|
37
|
+
GameObjectBaseType.RECTANGLE,
|
|
38
|
+
GameObjectBaseType.PATH,
|
|
39
|
+
GameObjectBaseType.CIRCLE,
|
|
40
|
+
GameObjectBaseType.POLYGON,
|
|
41
|
+
GameObjectBaseType.TEXT,
|
|
42
|
+
GameObjectBaseType.TRIANGLE,
|
|
43
|
+
];
|
|
44
|
+
export const maskEnabledArray: GameObjectType[] = [
|
|
45
|
+
GameObjectBaseType.GROUP,
|
|
46
|
+
GameObjectBaseType.PARTICLES,
|
|
47
|
+
];
|
|
33
48
|
|
|
34
49
|
let versionId = 0;
|
|
35
50
|
|
|
51
|
+
export const Editor2dComponentProvider = Symbol('Editor2dComponentProvider');
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* 组件内容修改后触发
|
|
55
|
+
*/
|
|
56
|
+
export interface Editor2dComponentProvider {
|
|
57
|
+
getComponentContent(compPath: string, parentNode: Editor2dNode): Editor2dNode[] | undefined;
|
|
58
|
+
onComponentChanged: Event<URI>;
|
|
59
|
+
onLoad: Event<void>;
|
|
60
|
+
}
|
|
61
|
+
|
|
36
62
|
@injectable()
|
|
37
63
|
export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNode> implements Tree<Editor2dNode, Editor2dContainerNode>, EditorDocument {
|
|
38
64
|
readonly type: 'Editor2dTree';
|
|
@@ -45,7 +71,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
45
71
|
private _localVersion: number = 0;
|
|
46
72
|
private _saveVersion: number = 0;
|
|
47
73
|
protected errors: ResourceRefError[] = [];
|
|
48
|
-
protected componentContents: { [key: string]: Editor2dNode } = {};
|
|
74
|
+
// protected componentContents: { [key: string]: Editor2dNode } = {};
|
|
49
75
|
protected _snaplines: any[] = [];
|
|
50
76
|
public loading = true;
|
|
51
77
|
|
|
@@ -59,11 +85,12 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
59
85
|
constructor(
|
|
60
86
|
@inject(MessageService) protected readonly message: MessageService,
|
|
61
87
|
@inject(Editor2dModelOptions) protected readonly options: Editor2dModelOptions,
|
|
62
|
-
@inject(ResourceProvider) protected readonly
|
|
88
|
+
@inject(ResourceProvider) protected readonly resourceProvider: ResourceProvider,
|
|
63
89
|
@inject(ResourceAutoSaveService) protected readonly resourceAutoSaveService: ResourceAutoSaveService,
|
|
64
90
|
@inject(WorkspaceResourceService) protected readonly resourceService: WorkspaceResourceService,
|
|
65
91
|
@inject(RenderEngineIDEService) readonly engineService: RenderEngineIDEService,
|
|
66
92
|
@inject(AppConfigService) readonly appConfig: AppConfigService,
|
|
93
|
+
@inject(Editor2dComponentProvider) @optional() readonly componentProvider?: Editor2dComponentProvider,
|
|
67
94
|
) {
|
|
68
95
|
super();
|
|
69
96
|
this.toDispose.push(this.onContentChangedEmitter);
|
|
@@ -72,6 +99,21 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
72
99
|
// this.toDispose.push(this.resourceAutoSaveService);
|
|
73
100
|
this.toDispose.push(this.resourceAutoSaveService.onSyncContent(content => this.reloadContent(content || '')));
|
|
74
101
|
this.toDispose.push(this.onSaved(event => this.resourceAutoSaveService.fireDidChangeContent(event)));
|
|
102
|
+
// 组件数据加载
|
|
103
|
+
if (this.componentProvider) {
|
|
104
|
+
this.toDispose.push(this.componentProvider.onLoad(() => {
|
|
105
|
+
this.fireContentChanged([], 'update', true);
|
|
106
|
+
}));
|
|
107
|
+
// 组件数据更新
|
|
108
|
+
this.toDispose.push(this.componentProvider.onComponentChanged(debounce((compUri: URI) => {
|
|
109
|
+
if (this.uri === compUri.toString()) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (this.hasIncludesComponent(compUri)) {
|
|
113
|
+
this.fireContentChanged([], 'update', true);
|
|
114
|
+
}
|
|
115
|
+
}, 1000)));
|
|
116
|
+
}
|
|
75
117
|
// TODO
|
|
76
118
|
// this.toDispose.push(this.resourceService.onRefsChange(async () => {
|
|
77
119
|
// await this.loadRefInfos();
|
|
@@ -79,25 +121,37 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
79
121
|
// 同步数据
|
|
80
122
|
this.resourceAutoSaveService.sync();
|
|
81
123
|
}
|
|
124
|
+
protected hasIncludesComponent(compUri: URI): boolean {
|
|
125
|
+
if (!this.root) return false;
|
|
126
|
+
for (const node of new Editor2dIterator(this.root)) {
|
|
127
|
+
if (node !== this.root
|
|
128
|
+
&& node.displayType === GameObjectBaseType.COMPONENT
|
|
129
|
+
&& new URI((node as any).component?.id).displayName === compUri.displayName
|
|
130
|
+
) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
82
136
|
|
|
83
137
|
/**
|
|
84
138
|
* 切换资源, 只有模板编辑器需要用到
|
|
85
139
|
*/
|
|
86
140
|
async changeResource(uri: string): Promise<void> {
|
|
87
141
|
const uriObj = new URI(uri);
|
|
88
|
-
const resource = await this.
|
|
142
|
+
const resource = await this.resourceProvider(uriObj);
|
|
89
143
|
this.resourceAutoSaveService.changeResource(resource);
|
|
90
144
|
this.resourceAutoSaveService.sync();
|
|
91
145
|
}
|
|
92
146
|
|
|
93
|
-
/**
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
147
|
+
// /**
|
|
148
|
+
// * 获取依赖的组件的内容
|
|
149
|
+
// * @param compPath
|
|
150
|
+
// * @param parentNode
|
|
151
|
+
// */
|
|
98
152
|
getComponentContent(compPath: string, parentNode: Editor2dNode): Editor2dNode[] | undefined {
|
|
99
|
-
|
|
100
|
-
|
|
153
|
+
if (!this.componentProvider) return undefined;
|
|
154
|
+
return this.componentProvider.getComponentContent(compPath, parentNode);
|
|
101
155
|
}
|
|
102
156
|
|
|
103
157
|
createDisplayNode<E extends Editor2dNode = Editor2dNode>(
|
|
@@ -203,6 +257,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
203
257
|
this.updateNode(targetNode, { name });
|
|
204
258
|
}
|
|
205
259
|
addChildren(node: Editor2dNode, parentNode: Editor2dContainerNode, index: number = 0): void {
|
|
260
|
+
this.clearMask(node);
|
|
206
261
|
if (node.parent) {
|
|
207
262
|
this.delNode(node, true);
|
|
208
263
|
};
|
|
@@ -210,6 +265,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
210
265
|
parentNode.children.splice(index, 0, node);
|
|
211
266
|
CompositeTreeNode.setParent(node, index, parentNode);
|
|
212
267
|
(parentNode as ExpandableTreeNode).expanded = true;
|
|
268
|
+
this.nextMaskToNode(node);
|
|
213
269
|
this.refresh(parentNode);
|
|
214
270
|
this.fireContentChanged([node], node.parent ? 'update' : 'add');
|
|
215
271
|
}
|
|
@@ -250,11 +306,15 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
250
306
|
/**
|
|
251
307
|
* 检测节点名字,保证唯一
|
|
252
308
|
* @param siblings
|
|
253
|
-
* @param
|
|
309
|
+
* @param name
|
|
254
310
|
* @protected
|
|
255
311
|
*/
|
|
256
312
|
protected getUniqueName(siblings: Editor2dNode[], name: string, i: number = 0): string {
|
|
257
|
-
const
|
|
313
|
+
const numMatched = name.match(/[0-9]+$/);
|
|
314
|
+
let newName = i ? `${name}${i}` : name;
|
|
315
|
+
if (numMatched) {
|
|
316
|
+
newName = name.slice(0, numMatched.index) + (parseInt(numMatched[0]) + i);
|
|
317
|
+
}
|
|
258
318
|
if (siblings.some(n => n.name === newName)) {
|
|
259
319
|
return this.getUniqueName(siblings, name, i + 1);
|
|
260
320
|
}
|
|
@@ -298,7 +358,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
298
358
|
this._snaplines = data.snaplines;
|
|
299
359
|
}
|
|
300
360
|
this.refresh();
|
|
301
|
-
this.loadRefInfos();
|
|
361
|
+
// this.loadRefInfos();
|
|
302
362
|
this.fireContentChanged([], 'add', true);
|
|
303
363
|
}
|
|
304
364
|
reloadEnd(): void {
|
|
@@ -341,6 +401,173 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
341
401
|
get onDirtyChanged(): Event<void> {
|
|
342
402
|
return this.resourceAutoSaveService.onDirtyChanged;
|
|
343
403
|
}
|
|
404
|
+
/**
|
|
405
|
+
* @mask 操作说明
|
|
406
|
+
* 1. 当前 isMask 为 true, 移除 prevNode 上的 mask, 移到相应的图层后再设。
|
|
407
|
+
* 2. 当前 isMask 为 true 且 mask 有值,只清除 mask;
|
|
408
|
+
* 3. 当前是 mask child,先移除 mask, 拖到指定后再判断下一个是否 mask, 再附值;
|
|
409
|
+
* 4. 当前不是 mask, 移到 mask 树下,,设定下一个 node 上的 mask, 如果下一个 node 是 mask, 直接附值 id;
|
|
410
|
+
*/
|
|
411
|
+
protected clearMask(node: Editor2dNode): void {
|
|
412
|
+
// 只 mask 状态时, 移除 prevNode 上的 mask;
|
|
413
|
+
if (node.isMask && !node.mask) {
|
|
414
|
+
this.setPrevNodeMask(node.previousSibling);
|
|
415
|
+
}
|
|
416
|
+
// 当前忽略底层 mask 的,恢复上面的 mask;
|
|
417
|
+
if (node.mask && node.ignoreMask) {
|
|
418
|
+
this.setPrevNodeMask(node.previousSibling, node.mask);
|
|
419
|
+
}
|
|
420
|
+
if (node.mask) {
|
|
421
|
+
// 移除 mask;
|
|
422
|
+
node.mask = undefined;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
protected nextMaskToNode(node: Editor2dNode): void {
|
|
426
|
+
// 判断父级是否 mask 或 maskChild, 如果是则不用设
|
|
427
|
+
const nextNode = node.nextSibling as Editor2dNode;
|
|
428
|
+
const nextIsMask = nextNode && (nextNode.isMask || nextNode.mask);
|
|
429
|
+
// 如果底下有 mask;
|
|
430
|
+
if (nextIsMask) {
|
|
431
|
+
node.mask = nextNode.mask || nextNode.id;
|
|
432
|
+
// 底层忽略 mask 又是 mask 的情况,用底层的 id;
|
|
433
|
+
if (nextNode.ignoreMask && nextNode.isMask) {
|
|
434
|
+
node.mask = nextNode.id;
|
|
435
|
+
}
|
|
436
|
+
// 忽略 mask, 清除上一层的 mask;
|
|
437
|
+
if (node.ignoreMask) {
|
|
438
|
+
this.setPrevNodeMask(node.previousSibling);
|
|
439
|
+
}
|
|
440
|
+
//
|
|
441
|
+
// this.fireContentChanged([node], 'update', false, true);
|
|
442
|
+
} else if (node.isMask) {
|
|
443
|
+
// 不是 mask,且当前是 mask, 设定上一层为 mask child;
|
|
444
|
+
this.setPrevNodeMask(node.previousSibling, node.id);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
protected setPrevNodeMask(node?: TreeNode, id?: string): void {
|
|
449
|
+
if (!node) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
const n = node as Editor2dNode;
|
|
453
|
+
// 跳出不是 mask 实列
|
|
454
|
+
if (!maskShowArray.concat(maskEnabledArray).includes(n.displayType)) {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
// this.updateNode(n, { mask: id });
|
|
458
|
+
if (id !== n.mask) {
|
|
459
|
+
// n.version = (n.version || 0) + 1;
|
|
460
|
+
n.mask = id;
|
|
461
|
+
// this.updateNode(n, { mask: id }, true);
|
|
462
|
+
// this.fireContentChanged([n], 'update');
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* 断掉蒙板条件
|
|
466
|
+
* 1. 上一个忽略蒙板
|
|
467
|
+
* 2. 上一个类型不是图形或图片
|
|
468
|
+
* 3. 当前是蒙板,且 id 为 undefined
|
|
469
|
+
*/
|
|
470
|
+
const prevNode = node.previousSibling as Editor2dNode;
|
|
471
|
+
if (
|
|
472
|
+
prevNode &&
|
|
473
|
+
!n.ignoreMask &&
|
|
474
|
+
maskShowArray.concat(maskEnabledArray).includes(prevNode.displayType)
|
|
475
|
+
&& !(n.isMask && typeof id === 'undefined')
|
|
476
|
+
) {
|
|
477
|
+
this.setPrevNodeMask(node.previousSibling, id);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* 切换 mask 图层;
|
|
482
|
+
* 多选:取最后一个当 mask, 并创建编组;
|
|
483
|
+
* 单选:设定同级的 previousSibling 的 isMaskChild = true;
|
|
484
|
+
* @param nodes
|
|
485
|
+
* @param mask
|
|
486
|
+
*/
|
|
487
|
+
toggleMask(nodes: Editor2dNode[], mask?: boolean): void {
|
|
488
|
+
if (nodes.length === 1) {
|
|
489
|
+
const node = nodes[0];
|
|
490
|
+
// this.updateNode(node, { isMask: !!mask });
|
|
491
|
+
/**
|
|
492
|
+
* @设定mask
|
|
493
|
+
* 1. 无特殊情况直接设
|
|
494
|
+
* 2. 在 mask 中且没有忽略底层,只改 isMask 值;
|
|
495
|
+
* 3. 在 mask 中且忽略了底层,改 isMask 和上一层的值;
|
|
496
|
+
*/
|
|
497
|
+
node.isMask = mask;
|
|
498
|
+
// 1 和 3 处理
|
|
499
|
+
if (node.mask && node.ignoreMask || !node.mask) {
|
|
500
|
+
this.setPrevNodeMask(node.previousSibling, mask ? node.id : undefined);
|
|
501
|
+
}
|
|
502
|
+
this.fireContentChanged([node], 'update');
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* @多个处理
|
|
507
|
+
* 多个用 getSelectedNodes, 保持图层顺序
|
|
508
|
+
* 检查最底下一个是否是可当 mask 的元素
|
|
509
|
+
* 1. 是:建个分组将最后个设 mask
|
|
510
|
+
* 2. 不是:Enabled 设定 mask, hierarchy-contribution 里判断
|
|
511
|
+
*/
|
|
512
|
+
nodes = this.getSelectedNodes();
|
|
513
|
+
const group = this.combineNodes(nodes);
|
|
514
|
+
if (!group) {
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
const lastNode = nodes[nodes.length - 1];
|
|
518
|
+
const childNodes = nodes.splice(0, nodes.length - 1);
|
|
519
|
+
lastNode.isMask = true;
|
|
520
|
+
childNodes.forEach(c => {
|
|
521
|
+
if (c.mask !== lastNode.id) {
|
|
522
|
+
c.mask = lastNode.id;
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
const groupNextNode = group.nextSibling as Editor2dNode;
|
|
526
|
+
let id;
|
|
527
|
+
// 如果底层是 maskChild 且没忽略,group 同步底层的 mask
|
|
528
|
+
if (groupNextNode.mask && !groupNextNode.ignoreMask) {
|
|
529
|
+
id = groupNextNode.mask;
|
|
530
|
+
}
|
|
531
|
+
// 如果底层是 mask,且忽略了底层,group mask 设为底层 id
|
|
532
|
+
if (groupNextNode.isMask && groupNextNode.ignoreMask) {
|
|
533
|
+
id = groupNextNode.id;
|
|
534
|
+
}
|
|
535
|
+
if (id) {
|
|
536
|
+
group.mask = id;
|
|
537
|
+
}
|
|
538
|
+
this.fireContentChanged(childNodes.concat([lastNode, group]), 'update');
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* 忽略底层 mask
|
|
542
|
+
* 忽略层 mask 不删除,留着恢复用,
|
|
543
|
+
* 设定忽略层 ignoreMask 和 清除 prev 上的 mask;
|
|
544
|
+
* @param nodes length === 1, 多个忽略
|
|
545
|
+
* @param ignore
|
|
546
|
+
*/
|
|
547
|
+
ignoreMask(nodes: Editor2dNode[], ignore?: boolean): void {
|
|
548
|
+
const node = nodes[0];
|
|
549
|
+
/**
|
|
550
|
+
* @忽略处理
|
|
551
|
+
* 1. 无特殊直接处理
|
|
552
|
+
* 2. 当前是 mask, 设定上一层的 mask 为当前 id;
|
|
553
|
+
*/
|
|
554
|
+
if (ignore !== node.ignoreMask) {
|
|
555
|
+
node.ignoreMask = ignore;
|
|
556
|
+
}
|
|
557
|
+
const nextNode = node.nextSibling as Editor2dNode;
|
|
558
|
+
if (!ignore && nextNode && !(nextNode.mask || nextNode.isMask)) {
|
|
559
|
+
// 如果底层不是 mask, 清掉mask
|
|
560
|
+
node.mask = undefined;
|
|
561
|
+
}
|
|
562
|
+
// this.updateNode(node, { ignoreMask: ignore });
|
|
563
|
+
let id = ignore ? undefined : node.mask;
|
|
564
|
+
id = node.isMask && ignore ? node.id : id;
|
|
565
|
+
// id = node.isMask && !ignore ? node.mask : id;
|
|
566
|
+
// console.log(id, ignore);
|
|
567
|
+
this.setPrevNodeMask(node.previousSibling, id);
|
|
568
|
+
|
|
569
|
+
this.fireContentChanged([node], 'update');
|
|
570
|
+
}
|
|
344
571
|
toggleVisible(nodes: Editor2dNode[], visible?: boolean): void {
|
|
345
572
|
nodes.forEach(node => {
|
|
346
573
|
if (this.checkDecoration(node, 'hidable')) {
|
|
@@ -396,6 +623,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
396
623
|
*/
|
|
397
624
|
moveToNode(node: Editor2dNode, targetNode: Editor2dNode, toAfter?: boolean): void {
|
|
398
625
|
if (Editor2dNode.isRootNode(targetNode) || TreeNode.equals(node, targetNode)) return;
|
|
626
|
+
this.clearMask(node);
|
|
399
627
|
const parent = targetNode.parent! as Editor2dContainerNode;
|
|
400
628
|
const children = parent.children! as Editor2dNode[];
|
|
401
629
|
this.delNode(node, true);
|
|
@@ -434,6 +662,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
434
662
|
});
|
|
435
663
|
}
|
|
436
664
|
}
|
|
665
|
+
this.nextMaskToNode(node);
|
|
437
666
|
this.refresh(parent);
|
|
438
667
|
this.fireContentChanged([node], 'update');
|
|
439
668
|
}
|
|
@@ -509,13 +738,16 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
509
738
|
* 合并分组
|
|
510
739
|
* @param nodes
|
|
511
740
|
*/
|
|
512
|
-
combineNodes(
|
|
741
|
+
combineNodes(n?: Editor2dNode[]): Editor2dNode | undefined {
|
|
742
|
+
// 合成分组保持图层顺序
|
|
743
|
+
const nodes = n || this.getSelectedNodes();
|
|
513
744
|
if (nodes.length > 0) {
|
|
514
745
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
515
746
|
const parent = nodes[0].parent as any;
|
|
516
747
|
const index = CompositeTreeNode.indexOf(parent, nodes[0]);
|
|
517
748
|
const group = this.createDisplayNode(GameObjectBaseType.GROUP, parent as Editor2dNode, undefined, index);
|
|
518
749
|
this.moveToNodesAsChildren(nodes, group);
|
|
750
|
+
return group;
|
|
519
751
|
}
|
|
520
752
|
}
|
|
521
753
|
/**
|
|
@@ -583,16 +815,17 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
583
815
|
n.children && n.children.some((c: Editor2dContainerNode) => c.id === id || getNodesToChildrenById(c, id));
|
|
584
816
|
|
|
585
817
|
this.animationIds = animationIds();
|
|
586
|
-
|
|
818
|
+
// 缓存移到 timeline 里处理
|
|
819
|
+
/* const cache: Editor2dNode[] = this.animationIds
|
|
587
820
|
.map(id => this.getNodeById(id)).filter(n => !!n)
|
|
588
|
-
.map(node => this.cloneNodeData(node as Editor2dNode));
|
|
821
|
+
.map(node => this.cloneNodeData(node as Editor2dNode)); */
|
|
589
822
|
const toDispose = this.onContentChanged(e => {
|
|
590
823
|
this.animationIds = animationIds();
|
|
591
824
|
// TODO 删除动画元件后,动画面板清空数据
|
|
592
825
|
if (e.nodes) {
|
|
593
|
-
const nodes = e.nodes.filter((n: any) =>
|
|
594
|
-
|
|
595
|
-
if (n && n.animation && n.displayType === GameObjectBaseType.ANIMATION) {
|
|
826
|
+
const nodes = e.nodes.filter((n: any) =>
|
|
827
|
+
// 新建面板时,加入的元素先插入 cache 记录初始值
|
|
828
|
+
/* if (n && n.animation && n.displayType === GameObjectBaseType.ANIMATION) {
|
|
596
829
|
const { animation = {} } = n;
|
|
597
830
|
const { frames = {} } = animation || {};
|
|
598
831
|
frames.forEach((c: any) => {
|
|
@@ -601,9 +834,9 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
601
834
|
cache.push(node);
|
|
602
835
|
}
|
|
603
836
|
});
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
|
|
837
|
+
} */
|
|
838
|
+
this.animationIds.some(id => (id === n.id) || getNodesToChildrenById(n, id))
|
|
839
|
+
);
|
|
607
840
|
if (nodes.length) {
|
|
608
841
|
// TODO: 音乐素材变更
|
|
609
842
|
onNodeChange(nodes, e.type);
|
|
@@ -614,7 +847,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
614
847
|
dispose: () => {
|
|
615
848
|
toDispose.dispose();
|
|
616
849
|
// reset node data
|
|
617
|
-
cache.forEach(nodeData => {
|
|
850
|
+
/* cache.forEach(nodeData => {
|
|
618
851
|
const { displayType } = nodeData;
|
|
619
852
|
const currentNode = this.getNodeById(nodeData.id);
|
|
620
853
|
if (!currentNode) {
|
|
@@ -631,7 +864,7 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
631
864
|
const changeData: {[key: string]: any} = getChangeAnimationData(keysList, currentNode, nodeData);
|
|
632
865
|
changeData.name = currentNode?.name;
|
|
633
866
|
this.updateNode(nodeData.id, changeData, true);
|
|
634
|
-
});
|
|
867
|
+
}); */
|
|
635
868
|
// this.animationStarted = false;
|
|
636
869
|
this.animationIds = [];
|
|
637
870
|
}
|
|
@@ -674,30 +907,30 @@ export class Editor2dDocument extends TreeImpl<Editor2dNode, Editor2dContainerNo
|
|
|
674
907
|
return Object.keys(this.nodes).length;
|
|
675
908
|
}
|
|
676
909
|
|
|
677
|
-
/**
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
protected async loadRefInfos(): Promise<void> {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
}
|
|
910
|
+
// /**
|
|
911
|
+
// * 检测错误
|
|
912
|
+
// * @protected
|
|
913
|
+
// */
|
|
914
|
+
// protected async loadRefInfos(): Promise<void> {
|
|
915
|
+
// const componentContents = await this.resourceService.getDependenciesContent<Editor2dContent>(this.uri, u => !!u.match(/\.comp/));
|
|
916
|
+
// // 模板模式暂时不做资源依赖检测
|
|
917
|
+
// if (!this.options.isTemplate) {
|
|
918
|
+
// this.errors = await this.resourceService.checkRefsErrors(this.uri);
|
|
919
|
+
// }
|
|
920
|
+
// const normalize = (node: Editor2dNode, version?: number, parent?: Editor2dNode) => {
|
|
921
|
+
// if (parent) {
|
|
922
|
+
// node.parent = parent as Editor2dContainerNode;
|
|
923
|
+
// }
|
|
924
|
+
// if (version !== undefined) {
|
|
925
|
+
// node.version = version;
|
|
926
|
+
// }
|
|
927
|
+
// node.children = node.children ? node.children.map(c => normalize(c as Editor2dNode, version, node)) : undefined;
|
|
928
|
+
// return node;
|
|
929
|
+
// };
|
|
930
|
+
// this.componentContents = mapValues<Editor2dNode>(componentContents, (value: Editor2dContent) => value.content ? normalize(value.content!, value.version) : undefined);
|
|
931
|
+
// await this.refresh();
|
|
932
|
+
// this.fireContentChanged([], 'add', true);
|
|
933
|
+
// }
|
|
701
934
|
getWarningDesc(node: Editor2dNode): string | undefined {
|
|
702
935
|
if (node.error && node.error.message) return node.error.message;
|
|
703
936
|
let uris: string[] = [];
|
|
@@ -11,6 +11,7 @@ import { PlaygroundConfig, SelectorEntityRendererProps } from '@gedit/playground
|
|
|
11
11
|
import type { CanvasDraw } from '../playground/canvas-draw';
|
|
12
12
|
import type { PlaygroundContext2d } from '../playground/playground-context';
|
|
13
13
|
import { nanoid } from 'nanoid';
|
|
14
|
+
import { PathChild } from '@gedit/canvas-draw';
|
|
14
15
|
|
|
15
16
|
const stringify = require('json-stringify-pretty-compact');
|
|
16
17
|
|
|
@@ -50,12 +51,20 @@ function omitNode(node?: Editor2dNode | Editor2dContainerNode, omitKeys: string[
|
|
|
50
51
|
|
|
51
52
|
export namespace Editor2dContent {
|
|
52
53
|
export function parseToJSON(contentData: Editor2dContent): Editor2dContent {
|
|
54
|
+
const content = omitNode(contentData.content, [], node => {
|
|
55
|
+
node.selected = false;
|
|
56
|
+
// console.log('>>>>>>>>>>>>>>cache', node.cache);
|
|
57
|
+
// 不保存动画数据,,如果有 cache 直接用 cache 的,cache 为 timeline 专属
|
|
58
|
+
const { cache, ...n } = node;
|
|
59
|
+
if (cache) {
|
|
60
|
+
return { ...n, ...cache };
|
|
61
|
+
}
|
|
62
|
+
return n;
|
|
63
|
+
});
|
|
64
|
+
// console.log(content);
|
|
53
65
|
return {
|
|
54
66
|
version: contentData.version,
|
|
55
|
-
content
|
|
56
|
-
node.selected = false;
|
|
57
|
-
return node;
|
|
58
|
-
}),
|
|
67
|
+
content,
|
|
59
68
|
snaplines: contentData.snaplines,
|
|
60
69
|
};
|
|
61
70
|
}
|
|
@@ -64,10 +73,17 @@ export namespace Editor2dContent {
|
|
|
64
73
|
}
|
|
65
74
|
}
|
|
66
75
|
|
|
76
|
+
export interface Editor2dNodeCache extends Omit<Editor2dNode, 'parent' | 'previousSibling' | 'nextSibling' | 'selected' | 'canvasHide' | 'version'> {
|
|
77
|
+
}
|
|
78
|
+
|
|
67
79
|
export interface Editor2dNode extends TreeNode, EditorDocumentNode, Lockable, SelectableTreeNode, GameObjectData {
|
|
68
80
|
canvasHide: boolean // 画布上是否展示
|
|
69
81
|
version: number // 节点修改的版本,用于快速diff用, 刷新后丢失,不会存储到服务器
|
|
70
82
|
parent: Editor2dContainerNode | undefined
|
|
83
|
+
cache?: Editor2dNodeCache;
|
|
84
|
+
isMask?: boolean; // 是否 mask
|
|
85
|
+
mask?: string; // mask 的 id
|
|
86
|
+
ignoreMask?: boolean; // 是否忽略底层 mask;
|
|
71
87
|
}
|
|
72
88
|
|
|
73
89
|
/**
|
|
@@ -75,7 +91,7 @@ export interface Editor2dNode extends TreeNode, EditorDocumentNode, Lockable, Se
|
|
|
75
91
|
*/
|
|
76
92
|
export interface Editor2dPathNode extends Editor2dNode {
|
|
77
93
|
[GameObjectBaseType.PATH]: {
|
|
78
|
-
paths:
|
|
94
|
+
paths: PathChild[]
|
|
79
95
|
}
|
|
80
96
|
}
|
|
81
97
|
|
|
@@ -11,9 +11,15 @@ interface KeysValue {
|
|
|
11
11
|
}
|
|
12
12
|
// 添加进时间轴动画的条件;
|
|
13
13
|
const supportKeys: SchemaType[] = ['integer', 'float', 'color'];
|
|
14
|
+
// 三个数组 key 写死
|
|
15
|
+
export const animArrayKeys: {[key: string]: string} = {
|
|
16
|
+
'style.color': 'FillArray',
|
|
17
|
+
'style.line': 'LineArray',
|
|
18
|
+
'style.lineDash': 'LineDashArray',
|
|
19
|
+
};
|
|
14
20
|
function readAnimationKeys(
|
|
15
21
|
deco: SchemaDecoration,
|
|
16
|
-
keyList: { key: string; name: string }[],
|
|
22
|
+
keyList: { key: string; name: string; }[],
|
|
17
23
|
currentKey?: string,
|
|
18
24
|
parentName?: string,
|
|
19
25
|
parentKey?: string
|
|
@@ -36,8 +42,9 @@ function readAnimationKeys(
|
|
|
36
42
|
} else if (
|
|
37
43
|
currentLabel &&
|
|
38
44
|
currentKey &&
|
|
39
|
-
supportKeys.includes(deco.type) &&
|
|
45
|
+
(supportKeys.includes(deco.type) &&
|
|
40
46
|
!currentKey.match(/^(origin)/) // 干掉原点
|
|
47
|
+
|| animArrayKeys[currentKey])
|
|
41
48
|
) {
|
|
42
49
|
keyList.push({
|
|
43
50
|
key: currentKey,
|