@gedit/editor-2d 0.3.4 → 0.3.6

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 (160) hide show
  1. package/LICENSE +21 -0
  2. package/lib/browser/editor2d-anim-path-selection-service.d.ts +24 -0
  3. package/lib/browser/editor2d-anim-path-selection-service.d.ts.map +1 -0
  4. package/lib/browser/editor2d-anim-path-selection-service.js +52 -0
  5. package/lib/browser/editor2d-anim-path-selection-service.js.map +1 -0
  6. package/lib/browser/editor2d-context-key-service.js +7 -10
  7. package/lib/browser/editor2d-context-key-service.js.map +1 -1
  8. package/lib/browser/editor2d-contribution.js +25 -28
  9. package/lib/browser/editor2d-contribution.js.map +1 -1
  10. package/lib/browser/editor2d-frontend-module.d.ts.map +1 -1
  11. package/lib/browser/editor2d-frontend-module.js +38 -38
  12. package/lib/browser/editor2d-frontend-module.js.map +1 -1
  13. package/lib/browser/editor2d-label-provider.js +18 -21
  14. package/lib/browser/editor2d-label-provider.js.map +1 -1
  15. package/lib/browser/editor2d-model-provider.js +16 -19
  16. package/lib/browser/editor2d-model-provider.js.map +1 -1
  17. package/lib/browser/editor2d-ref-provider-contribution.js +13 -16
  18. package/lib/browser/editor2d-ref-provider-contribution.js.map +1 -1
  19. package/lib/browser/editor2d-service.d.ts +2 -0
  20. package/lib/browser/editor2d-service.d.ts.map +1 -1
  21. package/lib/browser/editor2d-service.js +28 -27
  22. package/lib/browser/editor2d-service.js.map +1 -1
  23. package/lib/browser/index.d.ts +2 -0
  24. package/lib/browser/index.d.ts.map +1 -1
  25. package/lib/browser/index.js +6 -20
  26. package/lib/browser/index.js.map +1 -1
  27. package/lib/browser/model/editor2d-document.d.ts +22 -9
  28. package/lib/browser/model/editor2d-document.d.ts.map +1 -1
  29. package/lib/browser/model/editor2d-document.js +248 -133
  30. package/lib/browser/model/editor2d-document.js.map +1 -1
  31. package/lib/browser/model/editor2d-iterator.js +1 -5
  32. package/lib/browser/model/editor2d-iterator.js.map +1 -1
  33. package/lib/browser/model/editor2d-model-container.js +22 -26
  34. package/lib/browser/model/editor2d-model-container.js.map +1 -1
  35. package/lib/browser/model/editor2d-model.js +21 -24
  36. package/lib/browser/model/editor2d-model.js.map +1 -1
  37. package/lib/browser/model/editor2d-selection.js +7 -10
  38. package/lib/browser/model/editor2d-selection.js.map +1 -1
  39. package/lib/browser/model/editor2d-widget.js +17 -20
  40. package/lib/browser/model/editor2d-widget.js.map +1 -1
  41. package/lib/browser/model/editor2d.d.ts.map +1 -1
  42. package/lib/browser/model/editor2d.js +37 -35
  43. package/lib/browser/model/editor2d.js.map +1 -1
  44. package/lib/browser/model/index.js +7 -23
  45. package/lib/browser/model/index.js.map +1 -1
  46. package/lib/browser/model/utils/anim.utils.d.ts +2 -1
  47. package/lib/browser/model/utils/anim.utils.d.ts.map +1 -1
  48. package/lib/browser/model/utils/anim.utils.js +14 -16
  49. package/lib/browser/model/utils/anim.utils.js.map +1 -1
  50. package/lib/browser/model/utils/index.js +1 -17
  51. package/lib/browser/model/utils/index.js.map +1 -1
  52. package/lib/browser/playground/anim-path-edit-layer.d.ts +33 -0
  53. package/lib/browser/playground/anim-path-edit-layer.d.ts.map +1 -0
  54. package/lib/browser/playground/anim-path-edit-layer.js +352 -0
  55. package/lib/browser/playground/anim-path-edit-layer.js.map +1 -0
  56. package/lib/browser/playground/canvas-draw.d.ts +3 -0
  57. package/lib/browser/playground/canvas-draw.d.ts.map +1 -1
  58. package/lib/browser/playground/canvas-draw.js +57 -39
  59. package/lib/browser/playground/canvas-draw.js.map +1 -1
  60. package/lib/browser/playground/canvas-layer.d.ts.map +1 -1
  61. package/lib/browser/playground/canvas-layer.js +29 -32
  62. package/lib/browser/playground/canvas-layer.js.map +1 -1
  63. package/lib/browser/playground/entities/document-entity.js +2 -6
  64. package/lib/browser/playground/entities/document-entity.js.map +1 -1
  65. package/lib/browser/playground/entities/editor2d-entity.js +3 -7
  66. package/lib/browser/playground/entities/editor2d-entity.js.map +1 -1
  67. package/lib/browser/playground/entities/extend-entity.js +2 -6
  68. package/lib/browser/playground/entities/extend-entity.js.map +1 -1
  69. package/lib/browser/playground/entities/index.js +3 -19
  70. package/lib/browser/playground/entities/index.js.map +1 -1
  71. package/lib/browser/playground/extend-edit/gradient-conic-node.d.ts +4 -0
  72. package/lib/browser/playground/extend-edit/gradient-conic-node.d.ts.map +1 -0
  73. package/lib/browser/playground/extend-edit/gradient-conic-node.js +69 -0
  74. package/lib/browser/playground/extend-edit/gradient-conic-node.js.map +1 -0
  75. package/lib/browser/playground/{extend-edit-layer-point-event.d.ts → extend-edit/gradient-edit-layer-point-event.d.ts} +1 -1
  76. package/lib/browser/playground/extend-edit/gradient-edit-layer-point-event.d.ts.map +1 -0
  77. package/lib/browser/playground/{extend-edit-layer-point-event.js → extend-edit/gradient-edit-layer-point-event.js} +3 -28
  78. package/lib/browser/playground/extend-edit/gradient-edit-layer-point-event.js.map +1 -0
  79. package/lib/browser/playground/extend-edit/gradient-node.d.ts +13 -0
  80. package/lib/browser/playground/extend-edit/gradient-node.d.ts.map +1 -0
  81. package/lib/browser/playground/extend-edit/gradient-node.js +154 -0
  82. package/lib/browser/playground/extend-edit/gradient-node.js.map +1 -0
  83. package/lib/browser/playground/extend-edit-layer.d.ts +0 -8
  84. package/lib/browser/playground/extend-edit-layer.d.ts.map +1 -1
  85. package/lib/browser/playground/extend-edit-layer.js +30 -249
  86. package/lib/browser/playground/extend-edit-layer.js.map +1 -1
  87. package/lib/browser/playground/index.js +11 -30
  88. package/lib/browser/playground/index.js.map +1 -1
  89. package/lib/browser/playground/path-edit/anim-path-edit-svg.d.ts +17 -0
  90. package/lib/browser/playground/path-edit/anim-path-edit-svg.d.ts.map +1 -0
  91. package/lib/browser/playground/path-edit/anim-path-edit-svg.js +58 -0
  92. package/lib/browser/playground/path-edit/anim-path-edit-svg.js.map +1 -0
  93. package/lib/browser/playground/path-edit/index.js +3 -19
  94. package/lib/browser/playground/path-edit/index.js.map +1 -1
  95. package/lib/browser/playground/path-edit/path-edit-layer-move-point.d.ts +1 -1
  96. package/lib/browser/playground/path-edit/path-edit-layer-move-point.d.ts.map +1 -1
  97. package/lib/browser/playground/path-edit/path-edit-layer-move-point.js +9 -39
  98. package/lib/browser/playground/path-edit/path-edit-layer-move-point.js.map +1 -1
  99. package/lib/browser/playground/path-edit/path-edit-layer-svg-path.d.ts +2 -6
  100. package/lib/browser/playground/path-edit/path-edit-layer-svg-path.d.ts.map +1 -1
  101. package/lib/browser/playground/path-edit/path-edit-layer-svg-path.js +20 -50
  102. package/lib/browser/playground/path-edit/path-edit-layer-svg-path.js.map +1 -1
  103. package/lib/browser/playground/path-edit/utils.js +64 -100
  104. package/lib/browser/playground/path-edit/utils.js.map +1 -1
  105. package/lib/browser/playground/path-edit-layer.d.ts.map +1 -1
  106. package/lib/browser/playground/path-edit-layer.js +67 -95
  107. package/lib/browser/playground/path-edit-layer.js.map +1 -1
  108. package/lib/browser/playground/playground-context.d.ts +3 -3
  109. package/lib/browser/playground/playground-context.d.ts.map +1 -1
  110. package/lib/browser/playground/playground-context.js +48 -54
  111. package/lib/browser/playground/playground-context.js.map +1 -1
  112. package/lib/browser/playground/playground-contribution.d.ts.map +1 -1
  113. package/lib/browser/playground/playground-contribution.js +41 -42
  114. package/lib/browser/playground/playground-contribution.js.map +1 -1
  115. package/lib/browser/playground/selection-entity-manager.d.ts.map +1 -1
  116. package/lib/browser/playground/selection-entity-manager.js +26 -54
  117. package/lib/browser/playground/selection-entity-manager.js.map +1 -1
  118. package/lib/browser/playground/selector-extend-icons.js +12 -39
  119. package/lib/browser/playground/selector-extend-icons.js.map +1 -1
  120. package/lib/browser/playground/selector-extend-renderer.js +22 -52
  121. package/lib/browser/playground/selector-extend-renderer.js.map +1 -1
  122. package/lib/browser/utils/bezier.path.utils.d.ts +23 -0
  123. package/lib/browser/utils/bezier.path.utils.d.ts.map +1 -0
  124. package/lib/browser/utils/bezier.path.utils.js +64 -0
  125. package/lib/browser/utils/bezier.path.utils.js.map +1 -0
  126. package/lib/browser/utils/bounds.d.ts.map +1 -1
  127. package/lib/browser/utils/bounds.js +17 -22
  128. package/lib/browser/utils/bounds.js.map +1 -1
  129. package/lib/browser/utils/snapshot.js +17 -20
  130. package/lib/browser/utils/snapshot.js.map +1 -1
  131. package/lib/i18n/zh-CN.js +1 -3
  132. package/lib/i18n/zh-CN.js.map +1 -1
  133. package/package.json +11 -10
  134. package/src/browser/editor2d-anim-path-selection-service.ts +48 -0
  135. package/src/browser/editor2d-frontend-module.ts +2 -0
  136. package/src/browser/editor2d-service.ts +2 -0
  137. package/src/browser/index.ts +2 -1
  138. package/src/browser/model/editor2d-document.ts +198 -20
  139. package/src/browser/model/editor2d.ts +13 -2
  140. package/src/browser/model/utils/anim.utils.ts +10 -6
  141. package/src/browser/playground/anim-path-edit-layer.tsx +435 -0
  142. package/src/browser/playground/canvas-draw.ts +37 -2
  143. package/src/browser/playground/canvas-layer.ts +1 -0
  144. package/src/browser/playground/extend-edit/gradient-conic-node.tsx +106 -0
  145. package/src/browser/playground/extend-edit/gradient-node.tsx +232 -0
  146. package/src/browser/playground/extend-edit-layer.tsx +32 -312
  147. package/src/browser/playground/path-edit/anim-path-edit-svg.tsx +168 -0
  148. package/src/browser/playground/path-edit/path-edit-layer-move-point.tsx +1 -1
  149. package/src/browser/playground/path-edit/path-edit-layer-svg-path.tsx +3 -7
  150. package/src/browser/playground/path-edit/utils.tsx +1 -1
  151. package/src/browser/playground/path-edit-layer.tsx +4 -4
  152. package/src/browser/playground/playground-context.ts +2 -6
  153. package/src/browser/playground/playground-contribution.ts +2 -0
  154. package/src/browser/playground/selection-entity-manager.tsx +7 -7
  155. package/src/browser/style/path-edit-layer.less +13 -5
  156. package/src/browser/utils/bezier.path.utils.ts +89 -0
  157. package/src/browser/utils/bounds.ts +0 -1
  158. package/lib/browser/playground/extend-edit-layer-point-event.d.ts.map +0 -1
  159. package/lib/browser/playground/extend-edit-layer-point-event.js.map +0 -1
  160. /package/src/browser/playground/{extend-edit-layer-point-event.tsx → extend-edit/gradient-edit-layer-point-event.tsx} +0 -0
@@ -0,0 +1,232 @@
1
+ import * as React from 'react';
2
+ import clsx from 'clsx';
3
+ import {
4
+ asVec,
5
+ ColorRangSchemaKeys,
6
+ ColorSchema,
7
+ defaultGradientRange,
8
+ getLineWidth,
9
+ } from '@gedit/canvas-draw';
10
+ import PointEvent, { DifferProps } from './gradient-edit-layer-point-event';
11
+ import { ExtendEntity } from '../entities';
12
+ import { generateUuid } from '@gedit/utils';
13
+ import { getGradientColorByPercent } from '@gedit/ui/lib/browser/form-items/utils';
14
+
15
+ export interface GradientNodeProps {
16
+ data: ColorSchema;
17
+ width: number;
18
+ height: number;
19
+ extendEntity: ExtendEntity;
20
+ isRadialDom?: boolean;
21
+ onChange: (d: ColorSchema) => void;
22
+ }
23
+
24
+ export const GradientNode = (props: GradientNodeProps): JSX.Element => {
25
+ const { data, width, height, extendEntity, onChange, isRadialDom } = props;
26
+ const { range, colors } = data;
27
+ const {
28
+ lx = defaultGradientRange.lx,
29
+ ly = defaultGradientRange.ly,
30
+ lx2 = defaultGradientRange.lx2,
31
+ ly2 = defaultGradientRange.ly2,
32
+ w = defaultGradientRange.w,
33
+ } = range || {};
34
+ const onRangeChange = (
35
+ p: { x?: number; y?: number },
36
+ c: { x?: number; y?: number },
37
+ keyP: { x?: ColorRangSchemaKeys; y?: ColorRangSchemaKeys },
38
+ follow?: { v: ColorRangSchemaKeys; ref: ColorRangSchemaKeys }
39
+ ) => {
40
+ const range = data.range || {};
41
+ if (typeof p.x === 'number' && typeof c.x === 'number' && keyP.x) {
42
+ const x = c.x + p.x / width;
43
+ range[keyP.x] = parseFloat(x.toFixed(4));
44
+ } else if (keyP.x) {
45
+ range[keyP.x] = lx;
46
+ }
47
+ if (typeof p.y === 'number' && typeof c.y === 'number' && keyP.y) {
48
+ const y = c.y + p.y / height;
49
+ range[keyP.y] = parseFloat(y.toFixed(4));
50
+ } else if (keyP.y) {
51
+ range[keyP.y] = ly;
52
+ }
53
+ if (follow) {
54
+ range[follow.v] = range[follow.ref];
55
+ }
56
+ data.range = range;
57
+ onChange(data);
58
+ };
59
+ const centerX = lx * width;
60
+ const centerY = ly * height;
61
+ const toX = lx2 * width;
62
+ const toY = ly2 * height;
63
+ const a = asVec({ x: centerX, y: centerY }, { x: toX, y: toY });
64
+ const r = (a.ang / Math.PI) * 180;
65
+
66
+ const colorPointToRender = colors.map((item, i) => {
67
+ const { offset, color, uuid } = item;
68
+ const x = lx * width + offset * (lx2 - lx) * width;
69
+ const y = ly * height + offset * (ly2 - ly) * height;
70
+ return (
71
+ <PointEvent
72
+ key={uuid}
73
+ className="gedit-extend-color-point"
74
+ pointClassName={clsx({
75
+ 'gedit-extend-color-point-active': extendEntity.config.selectColorUUid
76
+ ? item.uuid === extendEntity.config.selectColorUUid
77
+ : !i,
78
+ })}
79
+ style={{
80
+ transform: `translate(${x}px, ${y}px)`,
81
+ }}
82
+ pointStyle={{ backgroundColor: color }}
83
+ onChange={(diff: DifferProps) => {
84
+ // Change 用的开始的 x,y, react state管理机制
85
+ const sx = x || 0;
86
+ const sy = y || 0;
87
+ let nx = sx + diff.x;
88
+ nx =
89
+ a.ang < Math.PI / 2 && a.ang > -Math.PI / 2 && nx < centerX
90
+ ? centerX
91
+ : nx;
92
+ nx =
93
+ (a.ang > Math.PI / 2 || a.ang < -Math.PI / 2) && nx > centerX
94
+ ? centerX
95
+ : nx;
96
+ let ny = sy + diff.y;
97
+ ny = a.ang < Math.PI && a.ang > 0 && ny < centerY ? centerY : ny;
98
+ ny = (a.ang > Math.PI || a.ang < 0) && ny > centerY ? centerY : ny;
99
+ const newLen = getLineWidth(
100
+ { x: centerX, y: centerY },
101
+ { x: nx, y: ny }
102
+ );
103
+ let newDiffer = newLen / a.len;
104
+ newDiffer = newDiffer < 0 ? 0 : newDiffer;
105
+ newDiffer = newDiffer > 1 ? 1 : newDiffer;
106
+ item.offset = newDiffer;
107
+ data.colors = colors.sort((a, b) => a.offset - b.offset);
108
+ onChange(data);
109
+ }}
110
+ onMouseDown={() => {
111
+ extendEntity.updateConfig({ selectColorUUid: uuid });
112
+ }}
113
+ />
114
+ );
115
+ });
116
+ const radialGradientBox = data.mode === 'radialGradient' && (
117
+ <PointEvent
118
+ className="gedit-extend-radial-box"
119
+ style={{
120
+ width: w * a.len * 2,
121
+ height: a.len * 2,
122
+ left: -w * a.len,
123
+ top: -a.len,
124
+ transform: `translate(${centerX}px, ${centerY}px) rotate(${r - 90}deg)`,
125
+ }}
126
+ pointClassName="gedit-extend-radial-point"
127
+ onChange={p => {
128
+ const px = a.len * Math.cos(a.ang + Math.PI / 2) * w;
129
+ const py = a.len * Math.sin(a.ang + Math.PI / 2) * w;
130
+ let nx = px + p.x;
131
+ let ny = py + p.y;
132
+ nx = a.ang < Math.PI && a.ang > 0 && nx > 0 ? 0 : nx;
133
+ nx = (a.ang > Math.PI || a.ang < 0) && nx < 0 ? 0 : nx;
134
+ ny = a.ang < Math.PI / 2 && a.ang > -Math.PI / 2 && ny < 0 ? 0 : ny;
135
+ ny = (a.ang > Math.PI / 2 || a.ang < -Math.PI / 2) && ny > 0 ? 0 : ny;
136
+ const newVec = asVec({ x: nx, y: ny }, { x: 0, y: 0 });
137
+ const newW = newVec.len / a.len;
138
+ const range = data.range || {};
139
+ range.w = newW;
140
+ data.range = range;
141
+ onChange(data);
142
+ }}
143
+ />
144
+ );
145
+ const lineBar = (
146
+ <div
147
+ className="gedit-extend-range-line"
148
+ style={{
149
+ width: a.len,
150
+ transform: `translate(${lx * width}px, ${
151
+ ly * height
152
+ }px) rotate(${r}deg)`,
153
+ }}
154
+ onClick={(e: React.MouseEvent) => {
155
+ const parentNode = (e.target as HTMLDivElement)
156
+ .parentNode as HTMLDivElement;
157
+ const rect = parentNode.getBoundingClientRect();
158
+ const x = e.clientX - rect.x;
159
+ const y = e.clientY - rect.y;
160
+ const newLen = getLineWidth({ x: centerX, y: centerY }, { x, y });
161
+ const percent = newLen / a.len;
162
+ const startColorArray = colors.filter(c => c.offset < percent);
163
+ const startColor = startColorArray[startColorArray.length - 1];
164
+ const endColor = colors.find(c => c.offset > percent)!;
165
+ let newColor;
166
+ if (endColor && startColor) {
167
+ const newPercent =
168
+ (1 / (endColor?.offset - startColor.offset)) *
169
+ (percent - startColor.offset);
170
+ newColor = getGradientColorByPercent(
171
+ newPercent,
172
+ startColor.color,
173
+ endColor.color
174
+ );
175
+ } else {
176
+ newColor = startColor ? startColor.color : endColor.color;
177
+ }
178
+ const color = {
179
+ offset: percent,
180
+ color: newColor,
181
+ uuid: generateUuid(),
182
+ };
183
+ extendEntity.updateConfig({
184
+ selectColorUUid: color.uuid,
185
+ });
186
+ const newColors = [...colors];
187
+ newColors.splice(startColorArray.length, 0, color);
188
+ data.colors = newColors;
189
+ onChange(data);
190
+ }}
191
+ />
192
+ );
193
+ return (
194
+ <>
195
+ {radialGradientBox}
196
+ {lineBar}
197
+ <PointEvent
198
+ className="gedit-extend-range-point gedit-extend-center-point"
199
+ style={{
200
+ transform: `translate(${lx * width}px, ${ly * height}px) rotate(${
201
+ r - 90
202
+ }deg)` /* left: `${lx * 100}%`, top: ` ${ly * 100}%` */,
203
+ }}
204
+ onChange={p => {
205
+ onRangeChange(
206
+ p,
207
+ { x: lx, y: ly },
208
+ { x: 'lx', y: 'ly' },
209
+ isRadialDom ? { v: 'ly2', ref: 'lx2' } : undefined
210
+ );
211
+ }}
212
+ />
213
+ <PointEvent
214
+ className="gedit-extend-range-point gedit-extend-radius-point"
215
+ style={{
216
+ transform: `translate(${lx2 * width}px, ${ly2 * height}px) rotate(${
217
+ r - 90
218
+ }deg)`,
219
+ }}
220
+ onChange={p => {
221
+ // isDom 下, 判断角度,0, 180 只能移动 x, 90, 270 只能移动 y
222
+ if (isRadialDom) {
223
+ onRangeChange(p, { x: lx2 }, { x: 'lx2', y: 'ly2' });
224
+ return;
225
+ }
226
+ onRangeChange(p, { x: lx2, y: ly2 }, { x: 'lx2', y: 'ly2' });
227
+ }}
228
+ />
229
+ {colorPointToRender}
230
+ </>
231
+ );
232
+ };
@@ -10,22 +10,15 @@ import {
10
10
  TransformData,
11
11
  } from '@gedit/playground';
12
12
  import { domUtils } from '@gedit/utils/lib/browser';
13
- import clsx from 'clsx';
14
13
  import { DocumentEntity, Editor2dEntity, ExtendEntity } from './entities';
15
14
  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';
15
+ import { ColorSchema, colorToValue } from '@gedit/canvas-draw';
16
+ import { deepClone } from '@gedit/utils';
17
+ import { GradientNode } from './extend-edit/gradient-node';
18
+ import { GradientConicNode } from './extend-edit/gradient-conic-node';
27
19
 
28
20
  export const EXTEND_EDIT_STATE = 'EXTEND_EDIT_STATE';
21
+
29
22
  /**
30
23
  * 扩展编辑
31
24
  */
@@ -100,302 +93,6 @@ export class ExtendEditLayer extends Layer {
100
93
  }
101
94
  }
102
95
 
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
96
  draw(): JSX.Element {
400
97
  const node = this.selectedEntity;
401
98
  if (!this.document || !node || !this.isEnabled) return <></>;
@@ -410,7 +107,9 @@ export class ExtendEditLayer extends Layer {
410
107
  top: bounds.y * scale,
411
108
  width,
412
109
  height,
413
- transformOrigin: `${transform.origin.x * 100}% ${transform.origin.y * 100}%`,
110
+ transformOrigin: `${transform.origin.x * 100}% ${
111
+ transform.origin.y * 100
112
+ }%`,
414
113
  transform: rotate ? `rotate(${rotate}deg)` : undefined,
415
114
  };
416
115
  const data = this.getNodeValue();
@@ -419,11 +118,32 @@ export class ExtendEditLayer extends Layer {
419
118
  if (data && typeof data === 'object') {
420
119
  switch (data?.mode) {
421
120
  case 'lineGradient':
422
- case 'radialGradient':
423
- child = this.getLineAndRadialNode(data, { width, height });
121
+ case 'radialGradient': {
122
+ const isDom =
123
+ node.gameObject.rendererObject.tagName?.toLocaleUpperCase() ===
124
+ 'DIV';
125
+ child = (
126
+ <GradientNode
127
+ data={data}
128
+ extendEntity={this.extendEntity}
129
+ onChange={this.updateNode.bind(this)}
130
+ width={width}
131
+ height={height}
132
+ isRadialDom={isDom}
133
+ />
134
+ );
424
135
  break;
136
+ }
425
137
  case 'conicGradient':
426
- child = this.getConicNode(data, { width, height });
138
+ child = (
139
+ <GradientConicNode
140
+ data={data}
141
+ extendEntity={this.extendEntity}
142
+ onChange={this.updateNode.bind(this)}
143
+ width={width}
144
+ height={height}
145
+ />
146
+ );
427
147
  break;
428
148
  }
429
149
  }