@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.
Files changed (134) hide show
  1. package/lib/browser/editor2d-context-key-service.js +24 -35
  2. package/lib/browser/editor2d-context-key-service.js.map +1 -1
  3. package/lib/browser/editor2d-contribution.js +89 -139
  4. package/lib/browser/editor2d-contribution.js.map +1 -1
  5. package/lib/browser/editor2d-frontend-module.js +20 -20
  6. package/lib/browser/editor2d-frontend-module.js.map +1 -1
  7. package/lib/browser/editor2d-label-provider.d.ts +0 -1
  8. package/lib/browser/editor2d-label-provider.d.ts.map +1 -1
  9. package/lib/browser/editor2d-label-provider.js +37 -58
  10. package/lib/browser/editor2d-label-provider.js.map +1 -1
  11. package/lib/browser/editor2d-model-provider.js +61 -127
  12. package/lib/browser/editor2d-model-provider.js.map +1 -1
  13. package/lib/browser/editor2d-ref-provider-contribution.d.ts +1 -1
  14. package/lib/browser/editor2d-ref-provider-contribution.d.ts.map +1 -1
  15. package/lib/browser/editor2d-ref-provider-contribution.js +46 -112
  16. package/lib/browser/editor2d-ref-provider-contribution.js.map +1 -1
  17. package/lib/browser/editor2d-service.js +66 -85
  18. package/lib/browser/editor2d-service.js.map +1 -1
  19. package/lib/browser/model/editor2d-document.d.ts +46 -20
  20. package/lib/browser/model/editor2d-document.d.ts.map +1 -1
  21. package/lib/browser/model/editor2d-document.js +602 -549
  22. package/lib/browser/model/editor2d-document.js.map +1 -1
  23. package/lib/browser/model/editor2d-iterator.js +27 -67
  24. package/lib/browser/model/editor2d-iterator.js.map +1 -1
  25. package/lib/browser/model/editor2d-model-container.js +10 -21
  26. package/lib/browser/model/editor2d-model-container.js.map +1 -1
  27. package/lib/browser/model/editor2d-model.js +77 -92
  28. package/lib/browser/model/editor2d-model.js.map +1 -1
  29. package/lib/browser/model/editor2d-selection.js +16 -43
  30. package/lib/browser/model/editor2d-selection.js.map +1 -1
  31. package/lib/browser/model/editor2d-widget.js +71 -90
  32. package/lib/browser/model/editor2d-widget.js.map +1 -1
  33. package/lib/browser/model/editor2d.d.ts +8 -4
  34. package/lib/browser/model/editor2d.d.ts.map +1 -1
  35. package/lib/browser/model/editor2d.js +61 -128
  36. package/lib/browser/model/editor2d.js.map +1 -1
  37. package/lib/browser/model/utils/anim.utils.d.ts +3 -0
  38. package/lib/browser/model/utils/anim.utils.d.ts.map +1 -1
  39. package/lib/browser/model/utils/anim.utils.js +24 -18
  40. package/lib/browser/model/utils/anim.utils.js.map +1 -1
  41. package/lib/browser/playground/canvas-draw.d.ts +8 -0
  42. package/lib/browser/playground/canvas-draw.d.ts.map +1 -1
  43. package/lib/browser/playground/canvas-draw.js +164 -252
  44. package/lib/browser/playground/canvas-draw.js.map +1 -1
  45. package/lib/browser/playground/canvas-layer.d.ts +10 -2
  46. package/lib/browser/playground/canvas-layer.d.ts.map +1 -1
  47. package/lib/browser/playground/canvas-layer.js +78 -102
  48. package/lib/browser/playground/canvas-layer.js.map +1 -1
  49. package/lib/browser/playground/entities/document-entity.js +8 -28
  50. package/lib/browser/playground/entities/document-entity.js.map +1 -1
  51. package/lib/browser/playground/entities/editor2d-entity.js +14 -37
  52. package/lib/browser/playground/entities/editor2d-entity.js.map +1 -1
  53. package/lib/browser/playground/entities/extend-entity.d.ts +10 -0
  54. package/lib/browser/playground/entities/extend-entity.d.ts.map +1 -0
  55. package/lib/browser/playground/entities/extend-entity.js +34 -0
  56. package/lib/browser/playground/entities/extend-entity.js.map +1 -0
  57. package/lib/browser/playground/entities/index.d.ts +1 -0
  58. package/lib/browser/playground/entities/index.d.ts.map +1 -1
  59. package/lib/browser/playground/entities/index.js +1 -0
  60. package/lib/browser/playground/entities/index.js.map +1 -1
  61. package/lib/browser/playground/extend-edit-layer-point-event.d.ts +30 -0
  62. package/lib/browser/playground/extend-edit-layer-point-event.d.ts.map +1 -0
  63. package/lib/browser/playground/extend-edit-layer-point-event.js +50 -0
  64. package/lib/browser/playground/extend-edit-layer-point-event.js.map +1 -0
  65. package/lib/browser/playground/extend-edit-layer.d.ts +38 -0
  66. package/lib/browser/playground/extend-edit-layer.d.ts.map +1 -0
  67. package/lib/browser/playground/extend-edit-layer.js +335 -0
  68. package/lib/browser/playground/extend-edit-layer.js.map +1 -0
  69. package/lib/browser/playground/index.d.ts +1 -0
  70. package/lib/browser/playground/index.d.ts.map +1 -1
  71. package/lib/browser/playground/index.js +1 -0
  72. package/lib/browser/playground/index.js.map +1 -1
  73. package/lib/browser/playground/path-edit-layer-move-point.d.ts +15 -0
  74. package/lib/browser/playground/path-edit-layer-move-point.d.ts.map +1 -0
  75. package/lib/browser/playground/path-edit-layer-move-point.js +47 -0
  76. package/lib/browser/playground/path-edit-layer-move-point.js.map +1 -0
  77. package/lib/browser/playground/path-edit-layer-svg-path.d.ts +11 -0
  78. package/lib/browser/playground/path-edit-layer-svg-path.d.ts.map +1 -0
  79. package/lib/browser/playground/path-edit-layer-svg-path.js +21 -0
  80. package/lib/browser/playground/path-edit-layer-svg-path.js.map +1 -0
  81. package/lib/browser/playground/path-edit-layer.d.ts +36 -0
  82. package/lib/browser/playground/path-edit-layer.d.ts.map +1 -0
  83. package/lib/browser/playground/path-edit-layer.js +257 -0
  84. package/lib/browser/playground/path-edit-layer.js.map +1 -0
  85. package/lib/browser/playground/playground-context.d.ts +3 -1
  86. package/lib/browser/playground/playground-context.d.ts.map +1 -1
  87. package/lib/browser/playground/playground-context.js +49 -47
  88. package/lib/browser/playground/playground-context.js.map +1 -1
  89. package/lib/browser/playground/playground-contribution.d.ts +2 -0
  90. package/lib/browser/playground/playground-contribution.d.ts.map +1 -1
  91. package/lib/browser/playground/playground-contribution.js +100 -67
  92. package/lib/browser/playground/playground-contribution.js.map +1 -1
  93. package/lib/browser/playground/selection-entity-manager.js +74 -132
  94. package/lib/browser/playground/selection-entity-manager.js.map +1 -1
  95. package/lib/browser/playground/selector-extend-icons.js +15 -16
  96. package/lib/browser/playground/selector-extend-icons.js.map +1 -1
  97. package/lib/browser/playground/selector-extend-renderer.d.ts +3 -2
  98. package/lib/browser/playground/selector-extend-renderer.d.ts.map +1 -1
  99. package/lib/browser/playground/selector-extend-renderer.js +67 -52
  100. package/lib/browser/playground/selector-extend-renderer.js.map +1 -1
  101. package/lib/browser/utils/snapshot.d.ts.map +1 -1
  102. package/lib/browser/utils/snapshot.js +81 -172
  103. package/lib/browser/utils/snapshot.js.map +1 -1
  104. package/package.json +9 -7
  105. package/src/browser/editor2d-label-provider.ts +1 -15
  106. package/src/browser/editor2d-ref-provider-contribution.ts +8 -8
  107. package/src/browser/model/editor2d-document.ts +284 -51
  108. package/src/browser/model/editor2d.ts +21 -5
  109. package/src/browser/model/utils/anim.utils.ts +9 -2
  110. package/src/browser/playground/canvas-draw.ts +31 -17
  111. package/src/browser/playground/canvas-layer.ts +25 -3
  112. package/src/browser/playground/entities/extend-entity.ts +37 -0
  113. package/src/browser/playground/entities/index.ts +1 -0
  114. package/src/browser/playground/extend-edit-layer-point-event.tsx +71 -0
  115. package/src/browser/playground/extend-edit-layer.tsx +442 -0
  116. package/src/browser/playground/index.ts +1 -0
  117. package/src/browser/playground/path-edit-layer-move-point.tsx +71 -0
  118. package/src/browser/playground/path-edit-layer-svg-path.tsx +50 -0
  119. package/src/browser/playground/path-edit-layer.tsx +330 -0
  120. package/src/browser/playground/playground-context.ts +2 -0
  121. package/src/browser/playground/playground-contribution.ts +37 -3
  122. package/src/browser/playground/selector-extend-renderer.tsx +43 -10
  123. package/src/browser/style/canvas-layer.css +16 -0
  124. package/src/browser/style/extend-edit-layer.less +127 -0
  125. package/src/browser/style/index.less +2 -1
  126. package/src/browser/style/path-edit-layer.less +72 -0
  127. package/src/browser/svg/pen+.svg +24 -0
  128. package/src/browser/utils/snapshot.ts +1 -0
  129. package/lib/browser/playground/canvas-draw-layer.d.ts +0 -22
  130. package/lib/browser/playground/canvas-draw-layer.d.ts.map +0 -1
  131. package/lib/browser/playground/canvas-draw-layer.js +0 -126
  132. package/lib/browser/playground/canvas-draw-layer.js.map +0 -1
  133. package/src/browser/playground/canvas-draw-layer.tsx +0 -88
  134. package/src/browser/style/canvas-draw-layer.less +0 -24
@@ -0,0 +1,330 @@
1
+ import * as React from 'react';
2
+ import { EditorStateConfigEntity, entity, Layer } from '@gedit/playground';
3
+ import { DocumentEntity } from './entities/document-entity';
4
+ import { domUtils } from '@gedit/utils/lib/browser';
5
+ import { GameObjectBaseType } from '@gedit/render-engine';
6
+ import {
7
+ Editor2dDocument,
8
+ Editor2dPathNode,
9
+ } from '../model';
10
+ import { PlaygroundContext2d } from './playground-context';
11
+ import { SelectableTreeNode, TreeSelection } from '@gedit/tree';
12
+ import { asVec, getLineWidth, PathChild } from '@gedit/canvas-draw';
13
+ import { generateUuid } from '@gedit/utils';
14
+ import { PointDefault, PointSchema } from './path-edit-layer-move-point';
15
+ import { SvgPath } from './path-edit-layer-svg-path';
16
+
17
+ const EDIT_PATH_STATE = 'ADD_PATH';
18
+
19
+ /**
20
+ * 动态绘制层
21
+ */
22
+ export class PathEditLayer extends Layer<PlaygroundContext2d> {
23
+ node = domUtils.createDivWithClass('gedit-path-edit-layer');
24
+ @entity(EditorStateConfigEntity)
25
+ protected editorState: EditorStateConfigEntity;
26
+ @entity(DocumentEntity) documentEntity: DocumentEntity;
27
+ protected hideMovePoint: boolean;
28
+
29
+ currentPathNode?: Editor2dPathNode;
30
+ currentPointId?: string;
31
+ startPos?: PathChild;
32
+ selectId?: string;
33
+
34
+ get isEnabled(): boolean {
35
+ return this.editorState.is(EDIT_PATH_STATE);
36
+ }
37
+
38
+ onZoom(scale: number): void {
39
+ domUtils.setStyle(this.node, {
40
+ transform: `scale(${scale})`,
41
+ });
42
+ }
43
+
44
+ onReady(): void {
45
+ this.toDispose.pushAll([
46
+ // 退出路径编辑
47
+ this.editorState.onCancel(EDIT_PATH_STATE, () => {
48
+ if (!this.currentPathNode) {
49
+ return;
50
+ }
51
+ // 如果只有一个点代表绘制不成功,则删除
52
+ /* if (
53
+ !this.currentPathNode.path ||
54
+ (this.currentPathNode.path &&
55
+ this.currentPathNode.path.paths.length <= 1)
56
+ ) {
57
+ this.document?.delNode(this.currentPathNode);
58
+ } */
59
+ this.selectId = undefined;
60
+ this.currentPathNode = undefined;
61
+ }),
62
+ this.listenPlaygroundEvent(
63
+ 'mousedown',
64
+ (e: MouseEvent) => {
65
+ // 当前编辑模式为路径编辑
66
+ if (this.editorState.is(EDIT_PATH_STATE)) {
67
+ this.startPos = this.getPosFromMouseEvent(e);
68
+ this.startPos.id = generateUuid();
69
+ this.currentPointId = this.startPos.id;
70
+ this.drawPath(this.startPos);
71
+ }
72
+ },
73
+ 10
74
+ ),
75
+ this.listenPlaygroundEvent('mousemove', (e: MouseEvent) => {
76
+ if (this.startPos) {
77
+ const pos = this.getPosFromMouseEvent(e);
78
+ const x1 = this.startPos.x * 2 - pos.x;
79
+ const y1 = this.startPos.y * 2 - pos.y;
80
+ this.startPos.x2 = pos.x;
81
+ this.startPos.y2 = pos.y;
82
+ this.startPos.x1 = x1;
83
+ this.startPos.y1 = y1;
84
+ this.document?.updateNode(this.currentPathNode!, {}, true);
85
+ }
86
+ }),
87
+ this.listenPlaygroundEvent('mouseup', (e: MouseEvent) => {
88
+ this.startPos = undefined;
89
+ }),
90
+ // 图层发生变化时退出模式
91
+ this.selectionService?.onSelectionChanged(e => {
92
+ if (this.editorState.is(EDIT_PATH_STATE)) {
93
+ const selectNodes = this.document?.getSelectedNodes() || [];
94
+ if (
95
+ selectNodes.length &&
96
+ (selectNodes[0].displayType !== GameObjectBaseType.PATH ||
97
+ selectNodes.length !== 1)
98
+ ) {
99
+ this.editorState.toDefaultState();
100
+ }
101
+ }
102
+ })!,
103
+ ]);
104
+ }
105
+
106
+ /**
107
+ * 创建路径
108
+ * @param pos - 当前鼠标点击的位置
109
+ */
110
+ drawPath(pos: PointSchema): void {
111
+ if (!this.document) return;
112
+ // 判断当前 select 是否 path 路径
113
+ const selectedNodes = this.document?.getSelectedNodes() || [];
114
+ if (selectedNodes.length === 1 && selectedNodes[0].displayType === 'path') {
115
+ this.currentPathNode = selectedNodes[0] as Editor2dPathNode;
116
+ }
117
+ // 创建一个空的路径节点,用于存储数据
118
+ if (!this.currentPathNode) {
119
+ this.currentPathNode = this.document.createDisplayNode<Editor2dPathNode>(
120
+ GameObjectBaseType.PATH
121
+ );
122
+ this.currentPathNode.selected = true;
123
+ this.context.selection.addSelection({
124
+ node: this.currentPathNode as Readonly<SelectableTreeNode>,
125
+ type: TreeSelection.SelectionType.TOGGLE,
126
+ });
127
+ }
128
+ this.selectId = this.currentPathNode.id;
129
+ this.currentPathNode.path.paths.push(pos);
130
+ this.document.updateNode(this.currentPathNode, {}, true);
131
+ /* this.document.updateNode(
132
+ this.currentPathNode,
133
+ {
134
+ path: {
135
+ ...this.currentPathNode.path,
136
+ paths: (this.currentPathNode.path.paths || []).concat(pos),
137
+ },
138
+ },
139
+ true
140
+ ); */
141
+ }
142
+
143
+ get document(): Editor2dDocument | undefined {
144
+ return this.documentEntity.config.document;
145
+ }
146
+
147
+ protected onBezierPointMouseDown(e: React.MouseEvent, p: PathChild, key: string): void {
148
+ e.preventDefault();
149
+ e.stopPropagation();
150
+ }
151
+
152
+ protected onPointMouseDown(
153
+ e: React.MouseEvent,
154
+ node: Editor2dPathNode,
155
+ p: PathChild
156
+ ): void {
157
+ const document = this.document!;
158
+ this.startDrag(e.clientX, e.clientY, {
159
+ // 拖动
160
+ onDrag(dragEvent): void {
161
+ const pos = dragEvent.endPos;
162
+ const x = pos.x / (this.config?.finalScale || 1);
163
+ const y = pos.y / (this.config?.finalScale || 1);
164
+ if (typeof p.x1 === 'number') {
165
+ p.x1 = p.x1 - p.x + x;
166
+ }
167
+ if (typeof p.x2 === 'number') {
168
+ p.x2 = p.x2 - p.x + x;
169
+ }
170
+ if (typeof p.y1 === 'number') {
171
+ p.y1 = p.y1 - p.y + y;
172
+ }
173
+ if (typeof p.y2 === 'number') {
174
+ p.y2 = p.y2 - p.y + y;
175
+ }
176
+ p.x = x;
177
+ p.y = y;
178
+
179
+ document.updateNode(node, {}, true);
180
+ },
181
+ });
182
+ this.currentPointId = p.id;
183
+ e.preventDefault();
184
+ e.stopPropagation();
185
+ }
186
+
187
+ protected onHideMovePoint(): void {
188
+ this.hideMovePoint = true;
189
+ this.draw();
190
+ }
191
+ protected onShowMovePoint(): void {
192
+ this.hideMovePoint = false;
193
+ this.draw();
194
+ }
195
+
196
+ protected getBezierPoint(node?: Editor2dPathNode): JSX.Element[] {
197
+ if (!node) {
198
+ return [];
199
+ }
200
+ const { paths } = node.path;
201
+ const children: JSX.Element[] = [];
202
+ const points: PathChild[] = [];
203
+ // 在最后点
204
+ if (!this.currentPointId) {
205
+ points.push(paths[paths.length - 1]);
206
+ } else {
207
+ const index = paths.findIndex(c => c.id === this.currentPointId);
208
+ points.push(...paths.filter((_, i) => i >= index - 1 && i <= index + 1));
209
+ }
210
+ points.forEach((p, i) => {
211
+ if ('x1' in p && 'y1' in p) {
212
+ children.push(
213
+ <div
214
+ key={`x1-line_${i}`}
215
+ className="gedit-path-edit-layer-point-bezier-line"
216
+ style={{
217
+ width: getLineWidth({ x: p.x1 || 0, y: p.y1 || 0 }, p),
218
+ transform: `translate(${p.x}px, ${p.y}px) rotate(${
219
+ (asVec({ x: p.x1 || 0, y: p.y1 || 0 }, p).ang / Math.PI) * 180
220
+ }deg)`,
221
+ }}
222
+ />,
223
+ <div
224
+ key={`x1_${i}`}
225
+ className="gedit-path-edit-layer-point-bezier"
226
+ style={{
227
+ transform: `translate(${p.x1}px, ${p.y1}px) scale(${
228
+ 1 / this.config.finalScale
229
+ })`,
230
+ }}
231
+ onMouseDown={e => {
232
+ this.onBezierPointMouseDown(e, p, '1');
233
+ }}
234
+ onMouseEnter={this.onHideMovePoint.bind(this)}
235
+ onMouseLeave={this.onShowMovePoint.bind(this)}
236
+ />
237
+ );
238
+ }
239
+ if ('x2' in p && 'y2' in p) {
240
+ children.push(
241
+ <div
242
+ key={`x2-line_${i}`}
243
+ className="gedit-path-edit-layer-point-bezier-line"
244
+ style={{
245
+ width: getLineWidth({ x: p.x2 || 0, y: p.y2 || 0 }, p),
246
+ transform: `translate(${p.x}px, ${p.y}px) rotate(${
247
+ (asVec({ x: p.x2 || 0, y: p.y2 || 0 }, p).ang / Math.PI) * 180
248
+ }deg)`,
249
+ }}
250
+ />,
251
+ <div
252
+ key={`x2_${i}`}
253
+ className="gedit-path-edit-layer-point-bezier"
254
+ style={{
255
+ transform: `translate(${p.x2}px, ${p.y2}px) scale(${
256
+ 1 / this.config.finalScale
257
+ })`,
258
+ }}
259
+ onMouseEnter={this.onHideMovePoint.bind(this)}
260
+ onMouseLeave={this.onShowMovePoint.bind(this)}
261
+ />
262
+ );
263
+ }
264
+ });
265
+ return children;
266
+ }
267
+
268
+ draw(): JSX.Element {
269
+ const selectNodes = this.document?.getSelectedNodes() || [];
270
+ if (
271
+ selectNodes.length > 1 ||
272
+ (selectNodes[0] && selectNodes[0].displayType !== 'path') ||
273
+ !this.document ||
274
+ !this.isEnabled
275
+ ) {
276
+ // this.editorState.toDefaultState();
277
+ return <></>;
278
+ }
279
+ const node: Editor2dPathNode | undefined = selectNodes[0] as
280
+ | Editor2dPathNode
281
+ | undefined;
282
+
283
+ const allPoints: JSX.Element[] = [];
284
+ // 只管当前点相邻的两个点的 bezier;
285
+ const bezierPoint: JSX.Element[] = this.getBezierPoint(node);
286
+
287
+ const { paths = [] } = node ? node.path : {};
288
+ paths.forEach((p, i) => {
289
+ allPoints.push(
290
+ <div
291
+ className="gedit-path-edit-layer-point"
292
+ key={`${node?.id}.${i}`}
293
+ style={{
294
+ transform: `translate(${p.x}px, ${p.y}px) scale(${
295
+ 1 / this.config.finalScale
296
+ })`,
297
+ }}
298
+ onMouseDown={e => {
299
+ this.onPointMouseDown(e, node!, p);
300
+ }}
301
+ onMouseEnter={this.onHideMovePoint.bind(this)}
302
+ onMouseLeave={this.onShowMovePoint.bind(this)}
303
+ />
304
+ );
305
+ });
306
+ return (
307
+ <>
308
+ {!this.hideMovePoint && (
309
+ <PointDefault
310
+ getPosFromMouseEvent={this.getPosFromMouseEvent.bind(this)}
311
+ paths={paths}
312
+ scale={this.config.finalScale}
313
+ />
314
+ )}
315
+ <SvgPath
316
+ width={this.config.config.pageBounds?.width || 300}
317
+ height={this.config.config.pageBounds?.height || 300}
318
+ paths={paths}
319
+ scale={this.config.finalScale}
320
+ pathProps={{
321
+ onMouseEnter: this.onHideMovePoint.bind(this),
322
+ onMouseLeave: this.onShowMovePoint.bind(this),
323
+ }}
324
+ />
325
+ {allPoints}
326
+ {bezierPoint}
327
+ </>
328
+ );
329
+ }
330
+ }
@@ -13,6 +13,7 @@ import { SelectionService } from '@gedit/application-common';
13
13
  import { Editor2dContextKeyService } from '../editor2d-context-key-service';
14
14
  import type { CanvasDraw } from './canvas-draw';
15
15
  import SelectionType = TreeSelection.SelectionType;
16
+ import { FormService } from '@gedit/ui';
16
17
 
17
18
  export const Editor2dPlayGround = Symbol('Editor2dPlayGround');
18
19
 
@@ -32,6 +33,7 @@ export class PlaygroundContext2d {
32
33
  @inject(SelectionService) readonly selectionService: SelectionService,
33
34
  @inject(AppConfigService) readonly appConfig: AppConfigService,
34
35
  @inject(Editor2dModelOptions) readonly options: Editor2dModelOptions,
36
+ @inject(FormService) readonly formService: FormService,
35
37
  @inject(Editor2dContextKeyService) readonly contextKeyService: Editor2dContextKeyService
36
38
  ) {
37
39
  this.document.toDispose.push(this.onCanvasDataChangedEmitter);
@@ -10,7 +10,7 @@ import {
10
10
  ToolbarConfigEntity
11
11
  } from '@gedit/playground';
12
12
  import { CanvasLayer } from './canvas-layer';
13
- import { CanvasDrawLayer } from './canvas-draw-layer';
13
+ import { PathEditLayer } from './path-edit-layer';
14
14
  // import { SelectionLayer } from './selection-layer';
15
15
  import { AppConfigData, AppConfigService } from '@gedit/app-config';
16
16
  import { HistoryService } from '@gedit/history';
@@ -18,6 +18,8 @@ import { Editor2dModelOptions, Editor2dNode } from '../model/editor2d';
18
18
  import { ContextMenuRenderer } from '@gedit/layout';
19
19
  import { CommandService } from '@gedit/command';
20
20
  import { CommonCommands } from '@gedit/application-common/lib/browser';
21
+ import { ExtendEditLayer, EXTEND_EDIT_STATE } from './extend-edit-layer';
22
+ import { Editor2dSelection } from '../model';
21
23
 
22
24
  @injectable()
23
25
  export class PlaygroundContribution2d implements PlaygroundContribution {
@@ -27,9 +29,11 @@ export class PlaygroundContribution2d implements PlaygroundContribution {
27
29
  @inject(PlaygroundConfig) readonly config: PlaygroundConfig;
28
30
  @inject(CommandService) readonly commandService: CommandService;
29
31
  @inject(ContextMenuRenderer) readonly menuRender: ContextMenuRenderer;
32
+ @inject(Editor2dSelection) readonly editor2dSelection: Editor2dSelection;
30
33
  registerPlayground(registry: PlaygroundRegistry): void {
31
34
  registry.registerLayer(CanvasLayer);
32
- registry.registerLayer(CanvasDrawLayer);
35
+ registry.registerLayer(PathEditLayer);
36
+ registry.registerLayer(ExtendEditLayer);
33
37
  // registry.registerLayer(SelectionLayer);
34
38
  }
35
39
  onDispose(playground: Playground): void {
@@ -50,6 +54,7 @@ export class PlaygroundContribution2d implements PlaygroundContribution {
50
54
  gridVisible: false,
51
55
  });
52
56
  }
57
+ const isComponent = this.modelOpts.autoSaveService.resource.uri.path.ext === '.comp';
53
58
  if (stateEntity) {
54
59
  stateEntity.registerState({
55
60
  id: 'FULL_SCREEN',
@@ -64,6 +69,14 @@ export class PlaygroundContribution2d implements PlaygroundContribution {
64
69
  }, 10);
65
70
  }
66
71
  });
72
+ stateEntity.registerState({
73
+ id: EXTEND_EDIT_STATE,
74
+ icon: '',
75
+ title: '扩展编辑',
76
+ hidden: true, // 该模式为内部模式
77
+ disableSelector: true,
78
+ cancelMode: 'hold'
79
+ });
67
80
  stateEntity.registerState({
68
81
  id: 'ADD_ELEMENT',
69
82
  icon: 'gedit-toolbar-add',
@@ -83,6 +96,27 @@ export class PlaygroundContribution2d implements PlaygroundContribution {
83
96
  });
84
97
  }
85
98
  });
99
+ /* stateEntity.registerState({
100
+ id: 'ADD_PATH',
101
+ icon: 'gedit-toolbar-pen',
102
+ title: '失量',
103
+ shortcut: 'P',
104
+ // cursor: 'url(https://gw.alipayobjects.com/zos/bmw-prod/8dc2fcc4-279b-408c-886c-60fdba4c1f1e.svg), copy',
105
+ // shortcutAutoEsc: true,
106
+ disableSelector: true,
107
+ priority: 0,
108
+ order: 1,
109
+ cancelMode: 'esc',
110
+ handle: (a, b) => {
111
+ const currentSelectedNodes = this.editor2dSelection.selectedNodes;
112
+ console.log(currentSelectedNodes);
113
+ if (currentSelectedNodes.length !== 1 || currentSelectedNodes[0].displayType !== 'path') {
114
+ // 路径选中时先取消所有 selection;
115
+ this.editor2dSelection.clearSelection();
116
+ }
117
+
118
+ }
119
+ }); */
86
120
  }
87
121
  // 模板编辑器模式
88
122
  if (this.modelOpts.isTemplate) {
@@ -96,7 +130,7 @@ export class PlaygroundContribution2d implements PlaygroundContribution {
96
130
  });
97
131
  }
98
132
  playground.getConfigEntity<SnaplineConfigEntity>(SnaplineConfigEntity).updateConfig({
99
- originlineVisible: false, // 隐藏原点
133
+ originlineVisible: isComponent, // 是否隐藏原点线条,如果是组件模式则显示
100
134
  });
101
135
  playground.toDispose.push(
102
136
  // TODO 放在这里处理会增加复杂度
@@ -1,19 +1,20 @@
1
1
  import * as React from 'react';
2
2
 
3
3
  import clsx from 'clsx';
4
- import { Form, Popover, Tooltip } from '@gedit/ui';
4
+ import { Popover, Tooltip } from '@gedit/ui';
5
5
 
6
6
  import { selectIcon, SelectorExtendType } from './selector-extend-icons';
7
7
  import { GameObjectIDERegister, GameObjectSelectorExtend as SelectorExtend } from '@gedit/render-engine-ide';
8
- import { PlaygroundContext, SelectorEntityRendererProps, } from '@gedit/playground';
8
+ import { SelectorEntityRendererProps, } from '@gedit/playground';
9
9
  import type { Editor2dEntity } from './entities/editor2d-entity';
10
10
  import { Editor2dNode } from '../model';
11
+ import { PlaygroundContext2d } from './playground-context';
11
12
 
12
13
  const getClassName = (str: string) => `gedit-selector-extend-${str}`;
13
14
 
14
15
  export interface SelectorExtendProps extends SelectorEntityRendererProps {
15
16
  register?: GameObjectIDERegister;
16
- context?: PlaygroundContext;
17
+ context: PlaygroundContext2d;
17
18
  }
18
19
 
19
20
  const defaultExtends: SelectorExtend[] = [
@@ -24,14 +25,38 @@ const defaultExtends: SelectorExtend[] = [
24
25
  order: 0,
25
26
  visible: (node: Editor2dNode, register: GameObjectIDERegister) => register?.getDisableKeys().indexOf('link') === -1,
26
27
  event: {
27
- title: '跳转链接配置',
28
+ title: '跳转配置',
28
29
  type: 'selectorExtendAttr',
29
30
  children: [
31
+ {
32
+ type: 'radio',
33
+ key: 'linkType',
34
+ label: '类型',
35
+ renderProps: {
36
+ defaultValue: 'url',
37
+ items: [{value: 'url', label: 'URL'}, {value: 'scene', label: '场景'}]
38
+ }
39
+ },
30
40
  {
31
41
  type: 'text',
32
42
  key: 'link',
43
+ visible: (v, key, node: Editor2dNode) => (
44
+ node && !node.linkType || node.linkType === 'url'
45
+ ),
33
46
  label: '链接',
34
- placeholder: '请输出 url 地址',
47
+ placeholder: '请输入 url 地址',
48
+ },
49
+ {
50
+ type: 'mindmapSelect',
51
+ key: 'link',
52
+ visible: (v, key, node: Editor2dNode) => (
53
+ node && node.linkType === 'scene'
54
+ ),
55
+ renderProps: {
56
+ filterTypes: ['scene']
57
+ },
58
+ label: '场景',
59
+ placeholder: '请选择场景',
35
60
  },
36
61
  ],
37
62
  },
@@ -89,6 +114,7 @@ const sortData = (data: SelectorExtend[]) => {
89
114
  const SelectorIcon = (props: {
90
115
  item: SelectorExtend;
91
116
  onChange: (type: SelectorExtendType | 'updateData', value?: any) => void;
117
+ context: PlaygroundContext2d,
92
118
  node: any;
93
119
  }) => {
94
120
  const {item, onChange, node} = props;
@@ -110,7 +136,7 @@ const SelectorIcon = (props: {
110
136
  if (item.event) {
111
137
  return (
112
138
  <Popover
113
- content={Form.renderBySchema({
139
+ content={props.context.formService.renderSchema({
114
140
  ...item.event,
115
141
  context: {
116
142
  node,
@@ -144,6 +170,8 @@ export const SelectorExtendRender = (props: SelectorExtendProps) => {
144
170
  const {entity, register, context} = props;
145
171
  const {node} = entity as Editor2dEntity;
146
172
  const {selectorExtends = []} = register?.decoration || {};
173
+ const [t, update] = React.useState(0);
174
+ if (!node) return <></>;
147
175
 
148
176
  const childData = sortData(
149
177
  ([] as SelectorExtend[])
@@ -151,7 +179,7 @@ export const SelectorExtendRender = (props: SelectorExtendProps) => {
151
179
  .filter(c => (c.visible ? c.visible(node, register) : true))
152
180
  );
153
181
  const onChange = (type: SelectorExtendType | 'updateData', value?: any) => {
154
- const {document} = context;
182
+ const {document} = context!;
155
183
  switch (type) {
156
184
  case SelectorExtendType.TO_TOP:
157
185
  document.moveUp(node);
@@ -162,14 +190,14 @@ export const SelectorExtendRender = (props: SelectorExtendProps) => {
162
190
  case SelectorExtendType.FLIP_X:
163
191
  document.updateNode(
164
192
  node,
165
- {flip: {...node?.flip, x: !node?.flip?.x}},
193
+ {flip: {...node.flip!, x: !node?.flip?.x}},
166
194
  true
167
195
  );
168
196
  break;
169
197
  case SelectorExtendType.FLIP_Y:
170
198
  document.updateNode(
171
199
  node,
172
- {flip: {...node?.flip, y: !node?.flip?.y}},
200
+ {flip: {...node.flip!, y: !node?.flip?.y}},
173
201
  true
174
202
  );
175
203
  break;
@@ -177,8 +205,12 @@ export const SelectorExtendRender = (props: SelectorExtendProps) => {
177
205
  document.delNodes(node);
178
206
  break;
179
207
  case 'updateData':
180
- console.log(value);
208
+ // 修改linkType则清空link
209
+ if (value.linkType) {
210
+ value.link = '';
211
+ }
181
212
  document.updateNode(node, value, true);
213
+ update(t + 1);
182
214
  break;
183
215
  default:
184
216
  console.warn(`无效类型: ${type}.`);
@@ -199,6 +231,7 @@ export const SelectorExtendRender = (props: SelectorExtendProps) => {
199
231
  {c.map(item => (
200
232
  <SelectorIcon
201
233
  item={item}
234
+ context={context}
202
235
  onChange={onChange}
203
236
  node={node}
204
237
  key={item.type}
@@ -6,6 +6,22 @@
6
6
  z-index: 10
7
7
  }
8
8
 
9
+ .gedit-canvas-viewport {
10
+ width: 100%;
11
+ height: 100%;
12
+ overflow: hidden;
13
+ position: relative;
14
+ }
15
+ .gedit-canvas-viewport canvas {
16
+ position: absolute;
17
+ }
18
+ .gedit-viewport-mask, .gedit-viewport-bg {
19
+ position: absolute;
20
+ }
21
+ .gedit-viewport-mask {
22
+ background-color: var(--g-editor-background);;
23
+ opacity: 0.4;
24
+ }
9
25
  .gedit-canvas-layer canvas {
10
26
  position: absolute;
11
27
  display: none;