@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,442 @@
1
+ import * as React from 'react';
2
+ import {
3
+ able,
4
+ EditorStateConfigEntity,
5
+ Entity,
6
+ entity,
7
+ Layer,
8
+ Selectable,
9
+ SelectState,
10
+ TransformData,
11
+ } from '@gedit/playground';
12
+ import { domUtils } from '@gedit/utils/lib/browser';
13
+ import clsx from 'clsx';
14
+ import { DocumentEntity, Editor2dEntity, ExtendEntity } from './entities';
15
+ import { Editor2dDocument } from '../model';
16
+ import {
17
+ asVec,
18
+ ColorRangSchemaKeys,
19
+ ColorSchema,
20
+ colorToValue,
21
+ defaultGradientRange,
22
+ getLineWidth,
23
+ } from '@gedit/canvas-draw';
24
+ import PointEvent, { DifferProps } from './extend-edit-layer-point-event';
25
+ import { deepClone, generateUuid } from '@gedit/utils';
26
+ import { getGradientColorByPercent } from '@gedit/ui/lib/browser/form-items/utils';
27
+
28
+ export const EXTEND_EDIT_STATE = 'EXTEND_EDIT_STATE';
29
+ /**
30
+ * 扩展编辑
31
+ */
32
+ export class ExtendEditLayer extends Layer {
33
+ node = domUtils.createDivWithClass('gedit-extend-edit-layer');
34
+ @entity(EditorStateConfigEntity)
35
+ protected editorState: EditorStateConfigEntity;
36
+ @entity(DocumentEntity) documentEntity: DocumentEntity;
37
+ @entity(ExtendEntity) extendEntity: ExtendEntity;
38
+ @able(Selectable) protected selectableNodes: Entity[];
39
+ protected selectKey: string;
40
+ get document(): Editor2dDocument | undefined {
41
+ return this.documentEntity.config.document;
42
+ }
43
+ get isEnabled(): boolean {
44
+ return this.editorState.is(EXTEND_EDIT_STATE);
45
+ }
46
+ get selectedEntity(): Editor2dEntity | undefined {
47
+ const nodes = this.selectableNodes.filter(
48
+ node => node.getData<SelectState>(SelectState)?.selected
49
+ );
50
+ // 只考虑单选模式
51
+ return nodes.length === 1 ? (nodes[0] as Editor2dEntity) : undefined;
52
+ }
53
+ onReady(): void {
54
+ this.editorState.onStateChange(({ event }: any) => {
55
+ this.selectKey = event ? event.key : undefined;
56
+ });
57
+ }
58
+ getNodeValue(): ColorSchema | null {
59
+ const node = this.selectedEntity;
60
+ if (!node) {
61
+ return null;
62
+ }
63
+ const keys = this.selectKey.split('.');
64
+ let n: any = node.node;
65
+ keys.forEach(c => {
66
+ n = n[c];
67
+ });
68
+ return colorToValue(n);
69
+ }
70
+
71
+ cloneData(value: any): { start: string; end: string; data: any } | null {
72
+ const node = this.selectedEntity;
73
+ if (!node) {
74
+ return null;
75
+ }
76
+ const keys = this.selectKey.split('.');
77
+ const start = keys.splice(0, 1)[0];
78
+ const end = keys.splice(keys.length - 1, 1)[0];
79
+ const data = deepClone(node.node?.[start]);
80
+ let n: any = data;
81
+ keys.forEach(c => {
82
+ n = n[c];
83
+ });
84
+ n[end] = value;
85
+ return {
86
+ start,
87
+ end,
88
+ data,
89
+ };
90
+ }
91
+
92
+ updateNode(data: any): void {
93
+ const node = this.selectedEntity;
94
+ if (!node) {
95
+ return;
96
+ }
97
+ const { start, data: d } = this.cloneData(JSON.stringify(data)) || {};
98
+ if (start && data) {
99
+ this.document?.updateNode(node.node!, { [start]: d });
100
+ }
101
+ }
102
+
103
+ protected getConicNode(
104
+ data: ColorSchema,
105
+ { width, height }: { width: number; height: number }
106
+ ): JSX.Element {
107
+ const { range, colors } = data;
108
+ const {
109
+ angle = defaultGradientRange.angle,
110
+ cx = defaultGradientRange.cx,
111
+ cy = defaultGradientRange.cy,
112
+ } = range || {};
113
+ const r2 = Math.max(width, height);
114
+ const r = r2 / 2;
115
+ return (
116
+ <>
117
+ <div
118
+ className="gedit-extend-radial-box gedit-extend-circle-box"
119
+ style={{
120
+ width: r2,
121
+ height: r2,
122
+ left: -r,
123
+ top: -r,
124
+ transform: `translate(${cx * width}px, ${
125
+ cy * height
126
+ }px) rotate(${angle}deg)`,
127
+ }}
128
+ >
129
+ <PointEvent
130
+ className="gedit-extend-angle-wrapper"
131
+ pointClassName="gedit-extend-angle"
132
+ style={{ transform: `translate(${r2}px, ${r}px)` }}
133
+ onChange={d => {
134
+ const sx = r + r * Math.cos((angle * Math.PI) / 180);
135
+ const sy = r + r * Math.sin((angle * Math.PI) / 180);
136
+ const nx = sx + d.x;
137
+ const ny = sy + d.y;
138
+ const newVec = asVec({ x: r, y: r }, { x: nx, y: ny });
139
+ const newAngle = ((newVec.ang / Math.PI) * 180 + 360) % 360;
140
+ const newRange = data.range || {};
141
+ newRange.angle = parseFloat(newAngle.toFixed(4));
142
+ data.range = newRange;
143
+ this.updateNode(data);
144
+ }}
145
+ />
146
+ {colors.map((item, i) => {
147
+ const { offset, color, uuid } = item;
148
+ const x = r + r * Math.cos(offset * Math.PI * 2);
149
+ const y = r + r * Math.sin(offset * Math.PI * 2);
150
+ return (
151
+ <PointEvent
152
+ key={uuid}
153
+ className="gedit-extend-color-point"
154
+ pointClassName={clsx({
155
+ 'gedit-extend-color-point-active': this.extendEntity.config
156
+ .selectColorUUid
157
+ ? item.uuid === this.extendEntity.config.selectColorUUid
158
+ : !i,
159
+ })}
160
+ pointStyle={{ backgroundColor: color }}
161
+ style={{
162
+ transform: `translate(${x}px, ${y}px)`,
163
+ }}
164
+ onChange={d => {
165
+ const currentVec = asVec({ x: r, y: r }, { x, y });
166
+ const sx =
167
+ r + r * Math.cos(currentVec.ang + (angle * Math.PI) / 180);
168
+ const sy =
169
+ r + r * Math.sin(currentVec.ang + (angle * Math.PI) / 180);
170
+ const nx = sx + d.x;
171
+ const ny = sy + d.y;
172
+ const newVec = asVec({ x: r, y: r }, { x: nx, y: ny });
173
+ const newAngle =
174
+ (newVec.ang - (angle * Math.PI) / 180 + Math.PI * 2) %
175
+ (Math.PI * 2);
176
+ const newOffset = newAngle / (Math.PI * 2);
177
+ item.offset = newOffset;
178
+ data.colors = colors.sort((a, b) => a.offset - b.offset);
179
+ this.updateNode(data);
180
+ }}
181
+ onMouseDown={() => {
182
+ this.extendEntity.updateConfig({ selectColorUUid: uuid });
183
+ }}
184
+ />
185
+ );
186
+ })}
187
+ </div>
188
+ <PointEvent
189
+ className="gedit-extend-origin-wrapper"
190
+ style={{
191
+ transform: `translate(${cx * width}px, ${cy * height}px)`,
192
+ }}
193
+ pointClassName="gedit-extend-origin"
194
+ onChange={d => {
195
+ const newRange = data.range || {};
196
+ newRange.cx = parseFloat((cx + d.x / width).toFixed(4));
197
+ newRange.cy = parseFloat((cy + d.y / height).toFixed(4));
198
+ data.range = newRange;
199
+ this.updateNode(data);
200
+ }}
201
+ />
202
+ </>
203
+ );
204
+ }
205
+
206
+ protected getLineAndRadialNode(
207
+ data: ColorSchema,
208
+ { width, height }: { width: number; height: number }
209
+ ): JSX.Element {
210
+ const { range, colors } = data;
211
+ const {
212
+ lx = defaultGradientRange.lx,
213
+ ly = defaultGradientRange.ly,
214
+ lx2 = defaultGradientRange.lx2,
215
+ ly2 = defaultGradientRange.ly2,
216
+ w = defaultGradientRange.w,
217
+ } = range || {};
218
+ const onRangeChange = (
219
+ p: { x: number; y: number },
220
+ c: { x: number; y: number },
221
+ keyP: { x: ColorRangSchemaKeys; y: ColorRangSchemaKeys }
222
+ ) => {
223
+ const x = c.x + p.x / width;
224
+ const y = c.y + p.y / height;
225
+ const range = data.range || {};
226
+ range[keyP.x] = parseFloat(x.toFixed(4));
227
+ range[keyP.y] = parseFloat(y.toFixed(4));
228
+ data.range = range;
229
+ this.updateNode(data);
230
+ };
231
+ const centerX = lx * width;
232
+ const centerY = ly * height;
233
+ const toX = lx2 * width;
234
+ const toY = ly2 * height;
235
+ const a = asVec({ x: centerX, y: centerY }, { x: toX, y: toY });
236
+ const r = (a.ang / Math.PI) * 180;
237
+
238
+ const colorPointToRender = colors.map((item, i) => {
239
+ const { offset, color, uuid } = item;
240
+ const x = lx * width + offset * (lx2 - lx) * width;
241
+ const y = ly * height + offset * (ly2 - ly) * height;
242
+ return (
243
+ <PointEvent
244
+ key={uuid}
245
+ className="gedit-extend-color-point"
246
+ pointClassName={clsx({
247
+ 'gedit-extend-color-point-active': this.extendEntity.config
248
+ .selectColorUUid
249
+ ? item.uuid === this.extendEntity.config.selectColorUUid
250
+ : !i,
251
+ })}
252
+ style={{
253
+ transform: `translate(${x}px, ${y}px)`,
254
+ }}
255
+ pointStyle={{ backgroundColor: color }}
256
+ onChange={(diff: DifferProps) => {
257
+ // Change 用的开始的 x,y, react state管理机制
258
+ const sx = x || 0;
259
+ const sy = y || 0;
260
+ let nx = sx + diff.x;
261
+ nx =
262
+ a.ang < Math.PI / 2 && a.ang > -Math.PI / 2 && nx < centerX
263
+ ? centerX
264
+ : nx;
265
+ nx =
266
+ (a.ang > Math.PI / 2 || a.ang < -Math.PI / 2) && nx > centerX
267
+ ? centerX
268
+ : nx;
269
+ let ny = sy + diff.y;
270
+ ny = a.ang < Math.PI && a.ang > 0 && ny < centerY ? centerY : ny;
271
+ ny = (a.ang > Math.PI || a.ang < 0) && ny > centerY ? centerY : ny;
272
+ const newLen = getLineWidth(
273
+ { x: centerX, y: centerY },
274
+ { x: nx, y: ny }
275
+ );
276
+ let newDiffer = newLen / a.len;
277
+ newDiffer = newDiffer < 0 ? 0 : newDiffer;
278
+ newDiffer = newDiffer > 1 ? 1 : newDiffer;
279
+ item.offset = newDiffer;
280
+ data.colors = colors.sort((a, b) => a.offset - b.offset);
281
+ this.updateNode(data);
282
+ }}
283
+ onMouseDown={() => {
284
+ this.extendEntity.updateConfig({ selectColorUUid: uuid });
285
+ }}
286
+ />
287
+ );
288
+ });
289
+ const radialGradientBox = data.mode === 'radialGradient' && (
290
+ <PointEvent
291
+ className="gedit-extend-radial-box"
292
+ style={{
293
+ width: w * a.len * 2,
294
+ height: a.len * 2,
295
+ left: -w * a.len,
296
+ top: -a.len,
297
+ transform: `translate(${centerX}px, ${centerY}px) rotate(${
298
+ r - 90
299
+ }deg)`,
300
+ }}
301
+ pointClassName="gedit-extend-radial-point"
302
+ onChange={p => {
303
+ const px = a.len * Math.cos(a.ang + Math.PI / 2) * w;
304
+ const py = a.len * Math.sin(a.ang + Math.PI / 2) * w;
305
+ let nx = px + p.x;
306
+ let ny = py + p.y;
307
+ nx = a.ang < Math.PI && a.ang > 0 && nx > 0 ? 0 : nx;
308
+ nx = (a.ang > Math.PI || a.ang < 0) && nx < 0 ? 0 : nx;
309
+ ny = a.ang < Math.PI / 2 && a.ang > -Math.PI / 2 && ny < 0 ? 0 : ny;
310
+ ny = (a.ang > Math.PI / 2 || a.ang < -Math.PI / 2) && ny > 0 ? 0 : ny;
311
+ const newVec = asVec({ x: nx, y: ny }, { x: 0, y: 0 });
312
+ const newW = newVec.len / a.len;
313
+ const range = data.range || {};
314
+ range.w = newW;
315
+ data.range = range;
316
+ this.updateNode(data);
317
+ }}
318
+ />
319
+ );
320
+ const lineBar = (
321
+ <div
322
+ className="gedit-extend-range-line"
323
+ style={{
324
+ width: a.len,
325
+ transform: `translate(${lx * width}px, ${
326
+ ly * height
327
+ }px) rotate(${r}deg)`,
328
+ }}
329
+ onClick={(e: React.MouseEvent) => {
330
+ const parentNode = (e.target as HTMLDivElement)
331
+ .parentNode as HTMLDivElement;
332
+ const rect = parentNode.getBoundingClientRect();
333
+ const x = e.clientX - rect.x;
334
+ const y = e.clientY - rect.y;
335
+ const newLen = getLineWidth({ x: centerX, y: centerY }, { x, y });
336
+ const percent = newLen / a.len;
337
+ const startColorArray = colors.filter(c => c.offset < percent);
338
+ const startColor = startColorArray[startColorArray.length - 1];
339
+ const endColor = colors.find(c => c.offset > percent)!;
340
+ let newColor;
341
+ if (endColor && startColor) {
342
+ const newPercent =
343
+ (1 / (endColor?.offset - startColor.offset)) *
344
+ (percent - startColor.offset);
345
+ newColor = getGradientColorByPercent(
346
+ newPercent,
347
+ startColor.color,
348
+ endColor.color
349
+ );
350
+ } else {
351
+ newColor = startColor ? startColor.color : endColor.color;
352
+ }
353
+ const color = {
354
+ offset: percent,
355
+ color: newColor,
356
+ uuid: generateUuid(),
357
+ };
358
+ this.extendEntity.updateConfig({
359
+ selectColorUUid: color.uuid,
360
+ });
361
+ const newColors = [...colors];
362
+ newColors.splice(startColorArray.length, 0, color);
363
+ data.colors = newColors;
364
+ this.updateNode(data);
365
+ }}
366
+ />
367
+ );
368
+ return (
369
+ <>
370
+ {radialGradientBox}
371
+ {lineBar}
372
+ <PointEvent
373
+ className="gedit-extend-range-point gedit-extend-center-point"
374
+ style={{
375
+ transform: `translate(${lx * width}px, ${ly * height}px) rotate(${
376
+ r - 90
377
+ }deg)` /* left: `${lx * 100}%`, top: ` ${ly * 100}%` */,
378
+ }}
379
+ onChange={p => {
380
+ onRangeChange(p, { x: lx, y: ly }, { x: 'lx', y: 'ly' });
381
+ }}
382
+ />
383
+ <PointEvent
384
+ className="gedit-extend-range-point gedit-extend-radius-point"
385
+ style={{
386
+ transform: `translate(${lx2 * width}px, ${ly2 * height}px) rotate(${
387
+ r - 90
388
+ }deg)`,
389
+ }}
390
+ onChange={p => {
391
+ onRangeChange(p, { x: lx2, y: ly2 }, { x: 'lx2', y: 'ly2' });
392
+ }}
393
+ />
394
+ {colorPointToRender}
395
+ </>
396
+ );
397
+ }
398
+
399
+ draw(): JSX.Element {
400
+ const node = this.selectedEntity;
401
+ if (!this.document || !node || !this.isEnabled) return <></>;
402
+ const transform = node.getData<TransformData>(TransformData)!;
403
+ const bounds = transform.boundsWithoutRotation;
404
+ const rotate = transform.worldDegree;
405
+ const scale = this.config.finalScale; // 画布缩放比例
406
+ const width = bounds.width * scale;
407
+ const height = bounds.height * scale;
408
+ const style = {
409
+ left: bounds.x * scale,
410
+ top: bounds.y * scale,
411
+ width,
412
+ height,
413
+ transform: rotate ? `rotate(${rotate}deg)` : undefined,
414
+ };
415
+ const data = this.getNodeValue();
416
+
417
+ let child = null;
418
+ if (data && typeof data === 'object') {
419
+ switch (data?.mode) {
420
+ case 'lineGradient':
421
+ case 'radialGradient':
422
+ child = this.getLineAndRadialNode(data, { width, height });
423
+ break;
424
+ case 'conicGradient':
425
+ child = this.getConicNode(data, { width, height });
426
+ break;
427
+ }
428
+ }
429
+
430
+ return (
431
+ <div
432
+ className="gedit-extend-edit-item"
433
+ style={style}
434
+ onMouseDown={e => {
435
+ e.stopPropagation();
436
+ }}
437
+ >
438
+ {child}
439
+ </div>
440
+ );
441
+ }
442
+ }
@@ -6,3 +6,4 @@ export * from './canvas-draw';
6
6
 
7
7
  export { SelectorExtendType } from './selector-extend-icons';
8
8
  export * from './selector-extend-renderer';
9
+ export * from './extend-edit-layer';
@@ -0,0 +1,71 @@
1
+ import * as React from 'react';
2
+ import { asVec, getLineWidth, PathChild } from '@gedit/canvas-draw';
3
+ import { PositionSchema } from '@gedit/playground';
4
+
5
+ export interface PointSchema extends PositionSchema {
6
+ id?: string;
7
+ }
8
+ export const PointDefault = ({
9
+ getPosFromMouseEvent,
10
+ paths,
11
+ scale,
12
+ }: {
13
+ getPosFromMouseEvent: (
14
+ event: {
15
+ clientX: number;
16
+ clientY: number;
17
+ },
18
+ addScale?: boolean
19
+ ) => PointSchema;
20
+ paths: PathChild[];
21
+ scale: number;
22
+ }) => {
23
+ const domRef = React.useRef<HTMLDivElement>(null);
24
+ const lineRef = React.useRef<HTMLDivElement>(null);
25
+ const pathsRef = React.useRef(paths);
26
+ const onMove = (e: MouseEvent) => {
27
+ const dom = domRef.current;
28
+ const line = lineRef.current;
29
+ if (!dom || !line) {
30
+ return;
31
+ }
32
+ const pos = getPosFromMouseEvent(e);
33
+ dom.style.transform = `translate(${pos.x}px, ${pos.y}px) scale(${
34
+ 1 / scale
35
+ })`;
36
+ const endPoint = pathsRef.current[pathsRef.current.length - 1];
37
+ if (endPoint) {
38
+ const width = getLineWidth(endPoint, pos);
39
+ const { ang } = asVec(endPoint, pos);
40
+ line.style.width = `${width}px`;
41
+ line.style.height = `${1 / scale}px`;
42
+ line.style.transform = `translate(${endPoint.x}px, ${
43
+ endPoint.y
44
+ }px) rotate(${(ang / Math.PI) * 180}deg)`;
45
+ }
46
+ };
47
+ React.useEffect(() => {
48
+ pathsRef.current = paths;
49
+ }, [paths]);
50
+ React.useEffect(() => {
51
+ const dom = domRef.current;
52
+ const line = lineRef.current;
53
+ if (dom && line) {
54
+ window.addEventListener('mousemove', onMove);
55
+ }
56
+ return () => {
57
+ if (dom && line) {
58
+ window.removeEventListener('mousemove', onMove);
59
+ }
60
+ };
61
+ }, []);
62
+ return (
63
+ <>
64
+ <div className="gedit-path-edit-layer-line" ref={lineRef} />
65
+ <div
66
+ className="gedit-path-edit-layer-point gedit-path-edit-layer-point-move gedit-path-edit-layer-pen"
67
+ ref={domRef}
68
+ />
69
+ </>
70
+ );
71
+ };
@@ -0,0 +1,50 @@
1
+ import * as React from 'react';
2
+ import { getPointsToPaths, PathChild } from '@gedit/canvas-draw';
3
+
4
+ export interface PathSVGProps {
5
+ width: number;
6
+ height: number;
7
+ scale: number;
8
+ paths: PathChild[];
9
+ pathProps?: any;
10
+ }
11
+
12
+ export const SvgPath = ({
13
+ width,
14
+ height,
15
+ paths,
16
+ scale,
17
+ pathProps,
18
+ }: PathSVGProps) => {
19
+ // const bezier = getXYToPath(paths);
20
+ const pathsStringArray = getPointsToPaths(paths);
21
+ console.log(getPointsToPaths(paths));
22
+ return (
23
+ <svg
24
+ width={width || 300}
25
+ height={height || 300}
26
+ className="gedit-path-edit-layer-svg"
27
+ >
28
+ {pathsStringArray.map((p, i) => (
29
+ <path
30
+ className="gedit-path-edit-layer-path"
31
+ key={i.toString()}
32
+ {...pathProps}
33
+ strokeLinecap="round"
34
+ strokeWidth={1.5 / scale}
35
+ d={p}
36
+ onMouseDown={e => {
37
+ e.preventDefault();
38
+ e.stopPropagation();
39
+ }}
40
+ onDoubleClick={e => {
41
+ e.preventDefault();
42
+ e.stopPropagation();
43
+ // this.onPathDoubleClick(i, p);
44
+ console.log(3123);
45
+ }}
46
+ />
47
+ ))}
48
+ </svg>
49
+ );
50
+ };