@gedit/editor-2d 0.1.115 → 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 (100) hide show
  1. package/lib/browser/editor2d-context-key-service.js.map +1 -1
  2. package/lib/browser/editor2d-contribution.js.map +1 -1
  3. package/lib/browser/editor2d-label-provider.js.map +1 -1
  4. package/lib/browser/editor2d-model-provider.js.map +1 -1
  5. package/lib/browser/editor2d-ref-provider-contribution.d.ts +1 -1
  6. package/lib/browser/editor2d-ref-provider-contribution.d.ts.map +1 -1
  7. package/lib/browser/editor2d-ref-provider-contribution.js +8 -8
  8. package/lib/browser/editor2d-ref-provider-contribution.js.map +1 -1
  9. package/lib/browser/editor2d-service.js.map +1 -1
  10. package/lib/browser/model/editor2d-document.d.ts +45 -19
  11. package/lib/browser/model/editor2d-document.d.ts.map +1 -1
  12. package/lib/browser/model/editor2d-document.js +291 -70
  13. package/lib/browser/model/editor2d-document.js.map +1 -1
  14. package/lib/browser/model/editor2d-model.js.map +1 -1
  15. package/lib/browser/model/editor2d-selection.js.map +1 -1
  16. package/lib/browser/model/editor2d-widget.js.map +1 -1
  17. package/lib/browser/model/editor2d.d.ts +8 -4
  18. package/lib/browser/model/editor2d.d.ts.map +1 -1
  19. package/lib/browser/model/editor2d.js +23 -4
  20. package/lib/browser/model/editor2d.js.map +1 -1
  21. package/lib/browser/model/utils/anim.utils.d.ts +3 -0
  22. package/lib/browser/model/utils/anim.utils.d.ts.map +1 -1
  23. package/lib/browser/model/utils/anim.utils.js +10 -4
  24. package/lib/browser/model/utils/anim.utils.js.map +1 -1
  25. package/lib/browser/playground/canvas-draw.d.ts +8 -0
  26. package/lib/browser/playground/canvas-draw.d.ts.map +1 -1
  27. package/lib/browser/playground/canvas-draw.js +29 -15
  28. package/lib/browser/playground/canvas-draw.js.map +1 -1
  29. package/lib/browser/playground/canvas-layer.d.ts +10 -2
  30. package/lib/browser/playground/canvas-layer.d.ts.map +1 -1
  31. package/lib/browser/playground/canvas-layer.js +25 -2
  32. package/lib/browser/playground/canvas-layer.js.map +1 -1
  33. package/lib/browser/playground/entities/extend-entity.d.ts +10 -0
  34. package/lib/browser/playground/entities/extend-entity.d.ts.map +1 -0
  35. package/lib/browser/playground/entities/extend-entity.js +34 -0
  36. package/lib/browser/playground/entities/extend-entity.js.map +1 -0
  37. package/lib/browser/playground/entities/index.d.ts +1 -0
  38. package/lib/browser/playground/entities/index.d.ts.map +1 -1
  39. package/lib/browser/playground/entities/index.js +1 -0
  40. package/lib/browser/playground/entities/index.js.map +1 -1
  41. package/lib/browser/playground/extend-edit-layer-point-event.d.ts +30 -0
  42. package/lib/browser/playground/extend-edit-layer-point-event.d.ts.map +1 -0
  43. package/lib/browser/playground/extend-edit-layer-point-event.js +50 -0
  44. package/lib/browser/playground/extend-edit-layer-point-event.js.map +1 -0
  45. package/lib/browser/playground/extend-edit-layer.d.ts +38 -0
  46. package/lib/browser/playground/extend-edit-layer.d.ts.map +1 -0
  47. package/lib/browser/playground/extend-edit-layer.js +335 -0
  48. package/lib/browser/playground/extend-edit-layer.js.map +1 -0
  49. package/lib/browser/playground/index.d.ts +1 -0
  50. package/lib/browser/playground/index.d.ts.map +1 -1
  51. package/lib/browser/playground/index.js +1 -0
  52. package/lib/browser/playground/index.js.map +1 -1
  53. package/lib/browser/playground/path-edit-layer-move-point.d.ts +15 -0
  54. package/lib/browser/playground/path-edit-layer-move-point.d.ts.map +1 -0
  55. package/lib/browser/playground/path-edit-layer-move-point.js +47 -0
  56. package/lib/browser/playground/path-edit-layer-move-point.js.map +1 -0
  57. package/lib/browser/playground/path-edit-layer-svg-path.d.ts +11 -0
  58. package/lib/browser/playground/path-edit-layer-svg-path.d.ts.map +1 -0
  59. package/lib/browser/playground/path-edit-layer-svg-path.js +21 -0
  60. package/lib/browser/playground/path-edit-layer-svg-path.js.map +1 -0
  61. package/lib/browser/playground/path-edit-layer.d.ts +36 -0
  62. package/lib/browser/playground/path-edit-layer.d.ts.map +1 -0
  63. package/lib/browser/playground/path-edit-layer.js +257 -0
  64. package/lib/browser/playground/path-edit-layer.js.map +1 -0
  65. package/lib/browser/playground/playground-context.js.map +1 -1
  66. package/lib/browser/playground/playground-contribution.d.ts +2 -0
  67. package/lib/browser/playground/playground-contribution.d.ts.map +1 -1
  68. package/lib/browser/playground/playground-contribution.js +40 -3
  69. package/lib/browser/playground/playground-contribution.js.map +1 -1
  70. package/lib/browser/utils/snapshot.d.ts.map +1 -1
  71. package/lib/browser/utils/snapshot.js +1 -1
  72. package/lib/browser/utils/snapshot.js.map +1 -1
  73. package/package.json +9 -7
  74. package/src/browser/editor2d-ref-provider-contribution.ts +8 -8
  75. package/src/browser/model/editor2d-document.ts +278 -49
  76. package/src/browser/model/editor2d.ts +21 -5
  77. package/src/browser/model/utils/anim.utils.ts +9 -2
  78. package/src/browser/playground/canvas-draw.ts +31 -17
  79. package/src/browser/playground/canvas-layer.ts +25 -3
  80. package/src/browser/playground/entities/extend-entity.ts +37 -0
  81. package/src/browser/playground/entities/index.ts +1 -0
  82. package/src/browser/playground/extend-edit-layer-point-event.tsx +71 -0
  83. package/src/browser/playground/extend-edit-layer.tsx +442 -0
  84. package/src/browser/playground/index.ts +1 -0
  85. package/src/browser/playground/path-edit-layer-move-point.tsx +71 -0
  86. package/src/browser/playground/path-edit-layer-svg-path.tsx +50 -0
  87. package/src/browser/playground/path-edit-layer.tsx +330 -0
  88. package/src/browser/playground/playground-contribution.ts +37 -3
  89. package/src/browser/style/canvas-layer.css +16 -0
  90. package/src/browser/style/extend-edit-layer.less +127 -0
  91. package/src/browser/style/index.less +2 -1
  92. package/src/browser/style/path-edit-layer.less +72 -0
  93. package/src/browser/svg/pen+.svg +24 -0
  94. package/src/browser/utils/snapshot.ts +1 -0
  95. package/lib/browser/playground/canvas-draw-layer.d.ts +0 -22
  96. package/lib/browser/playground/canvas-draw-layer.d.ts.map +0 -1
  97. package/lib/browser/playground/canvas-draw-layer.js +0 -102
  98. package/lib/browser/playground/canvas-draw-layer.js.map +0 -1
  99. package/src/browser/playground/canvas-draw-layer.tsx +0 -88
  100. 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
+ };