aldehyde 0.2.473 → 0.2.475

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 (203) hide show
  1. package/lib/controls/action/utils.d.ts +1 -1
  2. package/lib/controls/entity-select/entity-select.d.ts +2 -2
  3. package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
  4. package/lib/controls/entity-select/entity-select.js +16 -7
  5. package/lib/controls/entity-select/entity-select.js.map +1 -1
  6. package/lib/controls/entry-control.d.ts.map +1 -1
  7. package/lib/controls/entry-control.js +3 -2
  8. package/lib/controls/entry-control.js.map +1 -1
  9. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
  10. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +12 -12
  11. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js.map +1 -1
  12. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
  13. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
  14. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
  15. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
  16. package/lib/controls/select/index.d.ts.map +1 -1
  17. package/lib/controls/select/index.js +13 -7
  18. package/lib/controls/select/index.js.map +1 -1
  19. package/lib/controls/text/index.less +1 -0
  20. package/lib/controls/view-control.d.ts.map +1 -1
  21. package/lib/controls/view-control.js +1 -0
  22. package/lib/controls/view-control.js.map +1 -1
  23. package/lib/detail/button/edit-button.d.ts.map +1 -1
  24. package/lib/detail/button/edit-button.js +23 -11
  25. package/lib/detail/button/edit-button.js.map +1 -1
  26. package/lib/detail/button/view-button.d.ts.map +1 -1
  27. package/lib/detail/button/view-button.js +21 -10
  28. package/lib/detail/button/view-button.js.map +1 -1
  29. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts +5 -0
  30. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -0
  31. package/lib/draw-canvas/edit/components/asset-bar/index.js +79 -0
  32. package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -0
  33. package/lib/draw-canvas/edit/components/asset-bar/index.less +36 -0
  34. package/lib/draw-canvas/edit/components/main-header/index.d.ts +19 -0
  35. package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -0
  36. package/lib/draw-canvas/edit/components/main-header/index.js +203 -0
  37. package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -0
  38. package/lib/draw-canvas/edit/components/main-header/index.less +21 -0
  39. package/lib/draw-canvas/edit/components/render/index.d.ts +90 -0
  40. package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -0
  41. package/lib/draw-canvas/edit/components/render/index.js +692 -0
  42. package/lib/draw-canvas/edit/components/render/index.js.map +1 -0
  43. package/lib/draw-canvas/edit/components/render/types.d.ts +247 -0
  44. package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -0
  45. package/lib/draw-canvas/edit/components/render/types.js +66 -0
  46. package/lib/draw-canvas/edit/components/render/types.js.map +1 -0
  47. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts +26 -0
  48. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts.map +1 -0
  49. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js +83 -0
  50. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js.map +1 -0
  51. package/lib/draw-canvas/edit/components/setting-form/index.d.ts +17 -0
  52. package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -0
  53. package/lib/draw-canvas/edit/components/setting-form/index.js +243 -0
  54. package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -0
  55. package/lib/draw-canvas/edit/constant.d.ts +7 -0
  56. package/lib/draw-canvas/edit/constant.d.ts.map +1 -0
  57. package/lib/draw-canvas/edit/constant.js +7 -0
  58. package/lib/draw-canvas/edit/constant.js.map +1 -0
  59. package/lib/draw-canvas/edit/index.d.ts +8 -0
  60. package/lib/draw-canvas/edit/index.d.ts.map +1 -0
  61. package/lib/draw-canvas/edit/index.js +165 -0
  62. package/lib/draw-canvas/edit/index.js.map +1 -0
  63. package/lib/draw-canvas/edit/index.less +49 -0
  64. package/lib/draw-canvas/view/index.d.ts +8 -0
  65. package/lib/draw-canvas/view/index.d.ts.map +1 -0
  66. package/lib/draw-canvas/view/index.js +50 -0
  67. package/lib/draw-canvas/view/index.js.map +1 -0
  68. package/lib/draw-canvas/view/index.less +60 -0
  69. package/lib/draw-canvas/view/view.d.ts +10 -0
  70. package/lib/draw-canvas/view/view.d.ts.map +1 -0
  71. package/lib/draw-canvas/view/view.js +104 -0
  72. package/lib/draw-canvas/view/view.js.map +1 -0
  73. package/lib/form/form-Item-group.d.ts.map +1 -1
  74. package/lib/form/form-Item-group.js +4 -4
  75. package/lib/form/form-Item-group.js.map +1 -1
  76. package/lib/icon/local-aliIcon/iconfont.js +5 -5
  77. package/lib/icon/local-aliIcon/iconfont.js.map +1 -1
  78. package/lib/lowcode-components/index.d.ts +2 -0
  79. package/lib/lowcode-components/index.d.ts.map +1 -1
  80. package/lib/lowcode-components/index.js +2 -1
  81. package/lib/lowcode-components/index.js.map +1 -1
  82. package/lib/lowcode-components/lowcode-view/component/assets.d.ts.map +1 -1
  83. package/lib/lowcode-components/lowcode-view/component/assets.js +8 -0
  84. package/lib/lowcode-components/lowcode-view/component/assets.js.map +1 -1
  85. package/lib/lowcode-components/radar-chart/index.d.ts +51 -0
  86. package/lib/lowcode-components/radar-chart/index.d.ts.map +1 -0
  87. package/lib/lowcode-components/radar-chart/index.js +276 -0
  88. package/lib/lowcode-components/radar-chart/index.js.map +1 -0
  89. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  90. package/lib/module/dtmpl-edit-card.js +18 -1
  91. package/lib/module/dtmpl-edit-card.js.map +1 -1
  92. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  93. package/lib/module/dtmpl-edit-page.js +19 -2
  94. package/lib/module/dtmpl-edit-page.js.map +1 -1
  95. package/lib/routable/ltmpl-route.d.ts +2 -0
  96. package/lib/routable/ltmpl-route.d.ts.map +1 -1
  97. package/lib/routable/ltmpl-route.js +20 -4
  98. package/lib/routable/ltmpl-route.js.map +1 -1
  99. package/lib/table/act-table.d.ts +2 -0
  100. package/lib/table/act-table.d.ts.map +1 -1
  101. package/lib/table/act-table.js +4 -4
  102. package/lib/table/act-table.js.map +1 -1
  103. package/lib/table/column/column-builder.d.ts.map +1 -1
  104. package/lib/table/column/column-builder.js +23 -8
  105. package/lib/table/column/column-builder.js.map +1 -1
  106. package/lib/table/relation-table.d.ts +7 -0
  107. package/lib/table/relation-table.d.ts.map +1 -1
  108. package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
  109. package/lib/tmpl/control-type-supportor.js +1 -0
  110. package/lib/tmpl/control-type-supportor.js.map +1 -1
  111. package/lib/tmpl/hcservice-v3.d.ts +3 -0
  112. package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
  113. package/lib/tmpl/hcservice-v3.js +61 -0
  114. package/lib/tmpl/hcservice-v3.js.map +1 -1
  115. package/lib/tmpl/interface.d.ts +17 -1
  116. package/lib/tmpl/interface.d.ts.map +1 -1
  117. package/lib/tmpl/interface.js.map +1 -1
  118. package/lib/tmpl/tmpl-config-analysis.js +1 -1
  119. package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
  120. package/lib/units/index.d.ts +3 -1
  121. package/lib/units/index.d.ts.map +1 -1
  122. package/lib/units/index.js +33 -3
  123. package/lib/units/index.js.map +1 -1
  124. package/package.json +4 -1
  125. package/src/aldehyde/controls/entity-select/entity-select.tsx +18 -8
  126. package/src/aldehyde/controls/entry-control.tsx +3 -2
  127. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
  128. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +1 -1
  129. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
  130. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
  131. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
  132. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
  133. package/src/aldehyde/controls/select/index.tsx +7 -6
  134. package/src/aldehyde/controls/text/index.less +1 -0
  135. package/src/aldehyde/controls/view-control.tsx +1 -0
  136. package/src/aldehyde/detail/button/edit-button.tsx +21 -22
  137. package/src/aldehyde/detail/button/view-button.tsx +23 -21
  138. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.less +36 -0
  139. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +95 -0
  140. package/src/aldehyde/draw-canvas/edit/components/main-header/index.less +21 -0
  141. package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +233 -0
  142. package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +163 -0
  143. package/src/aldehyde/draw-canvas/edit/components/render/draws/contextmenu-draw.ts +307 -0
  144. package/src/aldehyde/draw-canvas/edit/components/render/draws/graph-draw.ts +251 -0
  145. package/src/aldehyde/draw-canvas/edit/components/render/draws/index.ts +7 -0
  146. package/src/aldehyde/draw-canvas/edit/components/render/draws/link-draw.ts +1416 -0
  147. package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +275 -0
  148. package/src/aldehyde/draw-canvas/edit/components/render/draws/ref-line-draw.ts +72 -0
  149. package/src/aldehyde/draw-canvas/edit/components/render/draws/ruler-draw.ts +167 -0
  150. package/src/aldehyde/draw-canvas/edit/components/render/graphs/base-graph.ts +241 -0
  151. package/src/aldehyde/draw-canvas/edit/components/render/graphs/bezier.ts +542 -0
  152. package/src/aldehyde/draw-canvas/edit/components/render/graphs/circle.ts +700 -0
  153. package/src/aldehyde/draw-canvas/edit/components/render/graphs/curve.ts +501 -0
  154. package/src/aldehyde/draw-canvas/edit/components/render/graphs/index.ts +6 -0
  155. package/src/aldehyde/draw-canvas/edit/components/render/graphs/line.ts +494 -0
  156. package/src/aldehyde/draw-canvas/edit/components/render/graphs/rect.ts +681 -0
  157. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-handlers.ts +69 -0
  158. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +159 -0
  159. package/src/aldehyde/draw-canvas/edit/components/render/handlers/graph-handlers.ts +108 -0
  160. package/src/aldehyde/draw-canvas/edit/components/render/handlers/index.ts +9 -0
  161. package/src/aldehyde/draw-canvas/edit/components/render/handlers/key-move-handlers.ts +50 -0
  162. package/src/aldehyde/draw-canvas/edit/components/render/handlers/link-handlers.ts +46 -0
  163. package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +393 -0
  164. package/src/aldehyde/draw-canvas/edit/components/render/handlers/shutcut-handlers.ts +46 -0
  165. package/src/aldehyde/draw-canvas/edit/components/render/handlers/text-handlers.ts +82 -0
  166. package/src/aldehyde/draw-canvas/edit/components/render/handlers/zoom-handlers.ts +60 -0
  167. package/src/aldehyde/draw-canvas/edit/components/render/index.ts +776 -0
  168. package/src/aldehyde/draw-canvas/edit/components/render/tools/align-tool.ts +91 -0
  169. package/src/aldehyde/draw-canvas/edit/components/render/tools/asset-tool.ts +142 -0
  170. package/src/aldehyde/draw-canvas/edit/components/render/tools/attract-tool.ts +440 -0
  171. package/src/aldehyde/draw-canvas/edit/components/render/tools/copy-tool.ts +269 -0
  172. package/src/aldehyde/draw-canvas/edit/components/render/tools/import-export-tool.ts +603 -0
  173. package/src/aldehyde/draw-canvas/edit/components/render/tools/index.ts +9 -0
  174. package/src/aldehyde/draw-canvas/edit/components/render/tools/link-tool.ts +225 -0
  175. package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +194 -0
  176. package/src/aldehyde/draw-canvas/edit/components/render/tools/selection-tool.ts +132 -0
  177. package/src/aldehyde/draw-canvas/edit/components/render/tools/z-index-tool.ts +227 -0
  178. package/src/aldehyde/draw-canvas/edit/components/render/types.ts +291 -0
  179. package/src/aldehyde/draw-canvas/edit/components/render/utils/a-star.ts +116 -0
  180. package/src/aldehyde/draw-canvas/edit/components/render/utils/bezier-scene-func.ts +73 -0
  181. package/src/aldehyde/draw-canvas/edit/components/setting-form/imag-upload.tsx +118 -0
  182. package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +295 -0
  183. package/src/aldehyde/draw-canvas/edit/constant.ts +6 -0
  184. package/src/aldehyde/draw-canvas/edit/index.less +49 -0
  185. package/src/aldehyde/draw-canvas/edit/index.tsx +197 -0
  186. package/src/aldehyde/draw-canvas/view/index.less +60 -0
  187. package/src/aldehyde/draw-canvas/view/index.tsx +48 -0
  188. package/src/aldehyde/draw-canvas/view/view.tsx +114 -0
  189. package/src/aldehyde/form/form-Item-group.tsx +5 -5
  190. package/src/aldehyde/icon/local-aliIcon/iconfont.js +1 -1
  191. package/src/aldehyde/lowcode-components/index.ts +4 -2
  192. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +8 -0
  193. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +323 -0
  194. package/src/aldehyde/module/dtmpl-edit-card.tsx +18 -1
  195. package/src/aldehyde/module/dtmpl-edit-page.tsx +19 -2
  196. package/src/aldehyde/routable/ltmpl-route.tsx +39 -3
  197. package/src/aldehyde/table/act-table.tsx +7 -4
  198. package/src/aldehyde/table/column/column-builder.tsx +29 -9
  199. package/src/aldehyde/tmpl/control-type-supportor.tsx +1 -0
  200. package/src/aldehyde/tmpl/hcservice-v3.tsx +44 -0
  201. package/src/aldehyde/tmpl/interface.tsx +15 -1
  202. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +1 -1
  203. package/src/aldehyde/units/index.tsx +31 -3
@@ -0,0 +1,225 @@
1
+ import { nanoid } from 'nanoid';
2
+ import Konva from 'konva';
3
+ import { Render } from '../index';
4
+ import { LinkDrawPoint, LinkDrawPair } from '../types';
5
+ import { LinkDraw, RulerDraw, PreviewDraw } from '../draws';
6
+
7
+ export class LinkTool {
8
+ // @ts-ignore
9
+ static readonly name = 'LinkTool';
10
+
11
+ private render: Render;
12
+ constructor(render: Render) {
13
+ this.render = render;
14
+ }
15
+
16
+ pointsVisible(visible: boolean, group?: Konva.Group) {
17
+ if (!this.render.config.readonly) {
18
+ const start = group ?? this.render.layer;
19
+ // 查找深层 points
20
+ for (const asset of [
21
+ ...(['asset', 'sub-asset'].includes(start.name()) ? [start] : []),
22
+ ...start.find('.asset'),
23
+ ...start.find('.sub-asset')
24
+ ]) {
25
+ const points = (asset as Konva.Node).getAttr('points') ?? [];
26
+ asset.setAttrs({
27
+ points: points.map((o: any) => ({ ...o, visible }))
28
+ });
29
+ }
30
+ // 拐点操作中,此处不重绘
31
+ if (!(this.render.draws[LinkDraw.name] as LinkDraw)?.state.linkManualing) {
32
+ // 重绘
33
+ this.render.redraw([LinkDraw.name, RulerDraw.name, PreviewDraw.name]);
34
+ }
35
+ }
36
+ }
37
+
38
+ remove(target?: Konva.Line) {
39
+ const line = target ?? this.linkCurrent;
40
+ if (line) {
41
+ const { groupId, pointId, pairId } = line.getAttrs();
42
+
43
+ if (groupId && pointId && pairId) {
44
+ const group = this.render.layer.findOne(`#${groupId}`) as Konva.Group;
45
+ if (group) {
46
+ const points = (group.getAttr('points') ?? []) as LinkDrawPoint[];
47
+ const point = points.find((o) => o.id === pointId);
48
+ if (point) {
49
+ const pairIndex = (point.pairs ?? ([] as LinkDrawPair[])).findIndex((o) => o.id === pairId);
50
+ if (pairIndex > -1) {
51
+ const pair = point.pairs.splice(pairIndex, 1)[0];
52
+
53
+ if (group.attrs.manualPointsMap && group.attrs.manualPointsMap[pair.id]) {
54
+ group.setAttr('manualPointsMap', {
55
+ ...group.attrs.manualPointsMap,
56
+ [pair.id]: undefined
57
+ });
58
+ }
59
+
60
+ // 重绘
61
+ this.render.redraw([
62
+ LinkDraw.name,
63
+ RulerDraw.name,
64
+ PreviewDraw.name
65
+ ]);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ // 刷新 json 的 id、事件
74
+ jsonIdCover(assets: any[]) {
75
+ let deepAssets = [...assets];
76
+ const idMap = new Map();
77
+
78
+ while (deepAssets.length > 0) {
79
+ const asset = deepAssets.shift();
80
+ if (asset) {
81
+ if (Array.isArray(asset.attrs.points)) {
82
+ for (const point of asset.attrs.points) {
83
+ if (Array.isArray(point.pairs)) {
84
+ for (const pair of point.pairs) {
85
+ if (pair.from.groupId && !idMap.has(pair.from.groupId)) {
86
+ idMap.set(pair.from.groupId, 'g:' + nanoid());
87
+ }
88
+ if (pair.to.groupId && !idMap.has(pair.to.groupId)) {
89
+ idMap.set(pair.to.groupId, 'g:' + nanoid());
90
+ }
91
+ if (pair.from.pointId && !idMap.has(pair.from.pointId)) {
92
+ idMap.set(pair.from.pointId, 'p:' + nanoid());
93
+ }
94
+ if (pair.to.pointId && !idMap.has(pair.to.pointId)) {
95
+ idMap.set(pair.to.pointId, 'p:' + nanoid());
96
+ }
97
+ }
98
+ }
99
+ if (point.id) {
100
+ if (!idMap.has(point.id)) {
101
+ idMap.set(point.id, 'p:' + nanoid());
102
+ }
103
+ }
104
+ if (point.groupId) {
105
+ if (!idMap.has(point.groupId)) {
106
+ idMap.set(point.groupId, 'g:' + nanoid());
107
+ }
108
+ }
109
+ }
110
+ }
111
+ if (asset.attrs.id) {
112
+ if (!idMap.has(asset.attrs.id)) {
113
+ idMap.set(asset.attrs.id, 'n:' + nanoid());
114
+ }
115
+ }
116
+ if (Array.isArray(asset.children)) {
117
+ deepAssets.push(...asset.children);
118
+ }
119
+ }
120
+ }
121
+
122
+ deepAssets = [...assets];
123
+
124
+ while (deepAssets.length > 0) {
125
+ const asset = deepAssets.shift();
126
+ if (asset) {
127
+ if (idMap.has(asset.attrs.id)) {
128
+ asset.attrs.id = idMap.get(asset.attrs.id);
129
+ }
130
+
131
+ if (Array.isArray(asset.attrs.points)) {
132
+ for (const point of asset.attrs.points) {
133
+ if (Array.isArray(point.pairs)) {
134
+ for (const pair of point.pairs) {
135
+ pair.disabled = true;
136
+ if (pair.id) {
137
+ pair.id = 'pr:' + nanoid();
138
+ }
139
+ if (idMap.has(pair.from.groupId)) {
140
+ pair.from.groupId = idMap.get(pair.from.groupId);
141
+ }
142
+ if (idMap.has(pair.to.groupId)) {
143
+ pair.to.groupId = idMap.get(pair.to.groupId);
144
+ }
145
+ if (idMap.has(pair.from.pointId)) {
146
+ pair.from.pointId = idMap.get(pair.from.pointId);
147
+ }
148
+ if (idMap.has(pair.to.pointId)) {
149
+ pair.to.pointId = idMap.get(pair.to.pointId);
150
+ }
151
+ }
152
+ }
153
+
154
+ if (idMap.has(point.id)) {
155
+ const anchor = asset.children.find((o: any) => o.attrs.id === point.id);
156
+ point.id = idMap.get(point.id);
157
+ if (anchor) {
158
+ anchor.attrs.id = point.id;
159
+ }
160
+ }
161
+
162
+ if (idMap.has(point.groupId)) {
163
+ point.groupId = idMap.get(point.groupId);
164
+ }
165
+ }
166
+ }
167
+
168
+ if (Array.isArray(asset.children)) {
169
+ deepAssets.push(...asset.children);
170
+ }
171
+ }
172
+ }
173
+ }
174
+
175
+ // 把深层 group 的 id 统一为顶层 group 的 id
176
+ groupIdCover(group: Konva.Group) {
177
+ const groupId = group.id();
178
+ const subGroups = group.find('.sub-asset') as Konva.Group[];
179
+ while (subGroups.length > 0) {
180
+ const subGroup = subGroups.shift() as Konva.Group | undefined;
181
+ if (subGroup) {
182
+ const points = subGroup.attrs.points;
183
+ if (Array.isArray(points)) {
184
+ for (const point of points) {
185
+ point.rawGroupId = point.groupId;
186
+ point.groupId = groupId;
187
+ for (const pair of point.pairs) {
188
+ pair.from.rawGroupId = pair.from.groupId;
189
+ pair.from.groupId = groupId;
190
+ pair.to.rawGroupId = pair.to.groupId;
191
+ pair.to.groupId = groupId;
192
+ }
193
+ }
194
+ }
195
+ subGroups.push(...(subGroup.find('.sub-asset') as Konva.Group[]));
196
+ }
197
+ }
198
+ }
199
+
200
+ // 选中连接线
201
+ linkCurrent: Konva.Line | undefined = undefined;
202
+
203
+ // 选中
204
+ select(link: Konva.Line) {
205
+ this.render.selectionTool.selectingClear();
206
+ this.linkCurrent = link;
207
+ this.render.emit('link-selection-change', this.linkCurrent);
208
+ // 重绘
209
+ this.render.redraw([
210
+ LinkDraw.name, // 更新连线
211
+ RulerDraw.name // 更新比例尺
212
+ ]);
213
+ }
214
+
215
+ // 清空选中
216
+ selectingClear() {
217
+ this.linkCurrent = undefined;
218
+ this.render.emit('link-selection-change', undefined);
219
+ // 重绘
220
+ this.render.redraw([
221
+ LinkDraw.name, // 更新连线
222
+ RulerDraw.name
223
+ ]);
224
+ }
225
+ }
@@ -0,0 +1,194 @@
1
+ import Konva from 'konva';
2
+ import { Render } from '../index';
3
+ import { GraphDraw, LinkDraw, RulerDraw, PreviewDraw, RefLineDraw, BgDraw } from '../draws';
4
+
5
+ export class PositionTool {
6
+ // @ts-ignore
7
+ static readonly name = 'PositionTool';
8
+
9
+ private render: Render;
10
+ constructor(render: Render) {
11
+ this.render = render;
12
+ }
13
+
14
+ // 自适应大小
15
+ positionFit() {
16
+ const { pageWidth, pageHeight } = this.render.getPageSettings();
17
+ const children = [
18
+ ...this.render.layer.getChildren(),
19
+ ...this.render.layerCover.find('.link-line')
20
+ ];
21
+
22
+ let minX = Infinity,
23
+ maxX = -Infinity,
24
+ minY = Infinity,
25
+ maxY = -Infinity;
26
+
27
+ const stageState = this.render.getStageState();
28
+ for (const node of children) {
29
+ if (node instanceof Konva.Group) {
30
+ const { x, y, width, height } = ((rect) => ({
31
+ x: this.render.toStageValue(rect.x - stageState.x),
32
+ y: this.render.toStageValue(rect.y - stageState.y),
33
+ width: this.render.toStageValue(rect.width),
34
+ height: this.render.toStageValue(rect.height)
35
+ }))(node.getClientRect());
36
+ if (x < minX) minX = x;
37
+ if (x + width > maxX) maxX = x + width;
38
+ if (y < minY) minY = y;
39
+ if (y + height > maxY) maxY = y + height;
40
+ } else if (node instanceof Konva.Line && node.name() === 'link-line') {
41
+ // 连线占用空间
42
+ const points = node.points();
43
+ for (let i = 0; i < points.length; i += 2) {
44
+ const [px, py] = [points[i], points[i + 1]];
45
+ if (px < minX) minX = px - 1;
46
+ if (px > maxX) maxX = px + 1;
47
+ if (py < minY) minY = py - 1;
48
+ if (py > maxY) maxY = py + 1;
49
+ }
50
+ }
51
+ }
52
+
53
+ // 把画布区域也纳入计算范围(画布从 (0,0) 到 (pageWidth, pageHeight))
54
+ if (0 < minX) minX = 0;
55
+ if (pageWidth > maxX) maxX = pageWidth;
56
+ if (0 < minY) minY = 0;
57
+ if (pageHeight > maxY) maxY = pageHeight;
58
+
59
+ // 没有素材时,以画布自身为准
60
+ if (minX === Infinity) minX = 0;
61
+ if (maxX === -Infinity) maxX = pageWidth;
62
+ if (minY === Infinity) minY = 0;
63
+ if (maxY === -Infinity) maxY = pageHeight;
64
+
65
+ const contentSize = {
66
+ width: maxX - minX,
67
+ height: maxY - minY
68
+ };
69
+ const contentRate = contentSize.width / contentSize.height;
70
+
71
+ const viewSize = {
72
+ width: this.render.stage.width() - (this.render.config.readonly ? 0 : this.render.rulerSize),
73
+ height: this.render.stage.height() - (this.render.config.readonly ? 0 : this.render.rulerSize)
74
+ };
75
+ const viewRate = viewSize.width / viewSize.height;
76
+ let scale = 1;
77
+
78
+ // 设置padding,避免边缘紧贴
79
+ const padding = 20;
80
+ const effectiveWidth = viewSize.width - padding * 2;
81
+ const effectiveHeight = viewSize.height - padding * 2;
82
+
83
+ if (viewRate > contentRate) { // 视口比内容更"扁",以高度为基准
84
+ scale = effectiveHeight / contentSize.height;
85
+ } else { // 视口比内容更"长",以宽度为基准
86
+ scale = effectiveWidth / contentSize.width;
87
+ }
88
+
89
+ scale = Math.max(0.2, scale);
90
+ scale = Math.floor(scale * 100) / 100;
91
+
92
+ // 设置缩放比例最大为1(暂时隐藏)
93
+ // if (contentSize.width * scale <= viewSize.width && contentSize.height * scale <= viewSize.height) {
94
+ // scale = Math.min(1, scale);
95
+ // }
96
+
97
+ this.render.stage.setAttrs({
98
+ scale: { x: scale, y: scale },
99
+ position: {
100
+ x:
101
+ (this.render.config.readonly ? 0 : this.render.rulerSize) -
102
+ minX * scale +
103
+ (viewSize.width - contentSize.width * scale) / 2,
104
+ y:
105
+ (this.render.config.readonly ? 0 : this.render.rulerSize) -
106
+ minY * scale +
107
+ (viewSize.height - contentSize.height * scale) / 2
108
+ }
109
+ });
110
+
111
+ this.render.emit('scale-change', scale);
112
+
113
+ // 重绘
114
+ this.render.redraw([
115
+ BgDraw.name,
116
+ GraphDraw.name,
117
+ LinkDraw.name,
118
+ RulerDraw.name,
119
+ RefLineDraw.name,
120
+ PreviewDraw.name
121
+ ]);
122
+ }
123
+
124
+ // 恢复位置大小
125
+ positionZoomReset() {
126
+ this.render.stage.setAttrs({
127
+ scale: { x: 1, y: 1 }
128
+ });
129
+ this.render.emit('scale-change', 1);
130
+ this.positionReset();
131
+ }
132
+
133
+ // 恢复位置
134
+ positionReset() {
135
+ this.render.stage.setAttrs({
136
+ x: this.render.rulerSize,
137
+ y: this.render.rulerSize
138
+ });
139
+ // 重绘
140
+ this.render.redraw([
141
+ BgDraw.name,
142
+ GraphDraw.name,
143
+ LinkDraw.name,
144
+ RulerDraw.name,
145
+ RefLineDraw.name,
146
+ PreviewDraw.name
147
+ ]);
148
+ }
149
+
150
+ // 更新中心位置
151
+ updateCenter(x = 0, y = 0) {
152
+ // stage 状态
153
+ const stageState = this.render.getStageState();
154
+ // 提取节点
155
+ const nodes = this.render.layer.getChildren((node) => !this.render.ignore(node));
156
+
157
+ // 计算节点占用的区域(计算起点即可)
158
+ let minX = 0;
159
+ let minY = 0;
160
+ for (const node of nodes) {
161
+ const x = node.x();
162
+ const y = node.y();
163
+ if (x < minX) {
164
+ minX = x;
165
+ }
166
+ if (y < minY) {
167
+ minY = y;
168
+ }
169
+ }
170
+
171
+ // 居中画布
172
+ this.render.stage.setAttrs({
173
+ x:
174
+ stageState.width / 2 -
175
+ this.render.toBoardValue(minX) -
176
+ this.render.toBoardValue(x) +
177
+ this.render.rulerSize,
178
+ y:
179
+ stageState.height / 2 -
180
+ this.render.toBoardValue(minY) -
181
+ this.render.toBoardValue(y) +
182
+ this.render.rulerSize
183
+ });
184
+ // 重绘
185
+ this.render.redraw([
186
+ BgDraw.name,
187
+ GraphDraw.name,
188
+ LinkDraw.name,
189
+ RulerDraw.name,
190
+ RefLineDraw.name,
191
+ PreviewDraw.name
192
+ ]);
193
+ }
194
+ }
@@ -0,0 +1,132 @@
1
+ import Konva from 'konva';
2
+ import { Render } from '../index';
3
+ import { GraphDraw, LinkDraw } from '../draws';
4
+ import { AssetType } from '../types';
5
+
6
+ export class SelectionTool {
7
+ // @ts-ignore
8
+ static readonly name = 'SelectionTool';
9
+
10
+ private render: Render;
11
+ constructor(render: Render) {
12
+ this.render = render;
13
+ }
14
+ // 【被选中的】
15
+ selectingNodes: Konva.Node[] = [];
16
+ // 清空已选
17
+ selectingClear(slient = false) {
18
+ // 选择变化了
19
+ if (this.selectingNodes.length > 0) {
20
+ !slient && this.render.emit('selection-change', []);
21
+ }
22
+ // 清空选择
23
+ this.render.transformer.nodes([]);
24
+ // 恢复透明度、层次、可交互
25
+ for (const node of [...this.selectingNodes].sort(
26
+ (a, b) => a.attrs.lastZIndex - b.attrs.lastZIndex
27
+ )) {
28
+ node.setAttrs({
29
+ listening: true,
30
+ opacity: node.attrs.lastOpacity ?? 1,
31
+ zIndex: node.attrs.lastZIndex
32
+ });
33
+ }
34
+ // 清空状态
35
+ for (const node of this.selectingNodes) {
36
+ node.setAttrs({
37
+ nodeMousedownPos: undefined,
38
+ lastOpacity: undefined,
39
+ lastZIndex: undefined,
40
+ selectingZIndex: undefined,
41
+ selected: false
42
+ });
43
+ }
44
+ // 清空选择节点
45
+ this.selectingNodes = [];
46
+ // 隐藏 连接点
47
+ this.render.linkTool.pointsVisible(false);
48
+ // 重绘
49
+ this.render.redraw([GraphDraw.name, LinkDraw.name]);
50
+ }
51
+
52
+ // 选择节点
53
+ select(nodes: Konva.Node[]) {
54
+ if (nodes.length > 1) {
55
+ // 多选 不能改变大小/旋转
56
+ this.render.transformer.resizeEnabled(false);
57
+ this.render.transformer.rotateEnabled(false);
58
+ } else {
59
+ if (nodes.length === 1) {
60
+ const target = nodes[0];
61
+ // 图形 不能改变大小
62
+ this.render.transformer.resizeEnabled(
63
+ target.attrs.assetType === AssetType.Graph ? false : true
64
+ );
65
+ this.render.transformer.rotateEnabled(
66
+ target.attrs.assetType === AssetType.Graph &&
67
+ ["Line", "Curve", "Bezier"].includes(target.attrs.graphType)
68
+ ? false
69
+ : true
70
+ );
71
+ } else {
72
+ this.render.transformer.resizeEnabled(true);
73
+ }
74
+ }
75
+
76
+ // 清除连接线选中
77
+ this.render.linkTool.selectingClear();
78
+ // 选择变化了
79
+ this.render.emit('selection-change', nodes);
80
+ this.selectingClear(true);
81
+
82
+ if (nodes.length > 0) {
83
+ // 最大zIndex
84
+ const maxZIndex = Math.max(
85
+ ...this.render.layer
86
+ .getChildren((node) => !this.render.ignore(node))
87
+ .map((o) => o.zIndex())
88
+ );
89
+
90
+ // 记录状态
91
+ for (const node of nodes) {
92
+ node.setAttrs({
93
+ nodeMousedownPos: node.position(), // 后面用于移动所选
94
+ lastOpacity: node.opacity(), // 选中时,下面会使其变透明,记录原有的透明度
95
+ lastZIndex: node.zIndex(), // 记录原有的层次,后面暂时提升所选节点的层次
96
+ selectingZIndex: undefined,
97
+ selected: true, // 选择中
98
+ listening: false, // 不可交互
99
+ opacity: node.opacity() * 0.8 // 设置透明度
100
+ });
101
+ }
102
+
103
+ // 提升层次
104
+ for (const node of nodes.sort((a, b) => a.zIndex() - b.zIndex())) {
105
+ node.setAttrs({
106
+ zIndex: maxZIndex // 提升层次
107
+ });
108
+ }
109
+ // 选中的节点
110
+ this.selectingNodes = nodes;
111
+ // 选中的节点,放进 transformer
112
+ this.render.transformer.nodes(this.selectingNodes);
113
+ }
114
+ // 重绘
115
+ this.render.redraw([GraphDraw.name, LinkDraw.name]);
116
+ }
117
+
118
+ // 更新节点位置
119
+ selectingNodesMove(offset: Konva.Vector2d) {
120
+ for (const node of this.render.selectionTool.selectingNodes) {
121
+ node.x(node.x() + offset.x);
122
+ node.y(node.y() + offset.y);
123
+ }
124
+ this.render.emit('asset-position-change', this.render.selectionTool.selectingNodes);
125
+ }
126
+
127
+ // 选择所有节点
128
+ selectAll() {
129
+ const nodes = this.render.layer.find('.asset') as Konva.Node[];
130
+ this.select(nodes);
131
+ }
132
+ }