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,275 @@
1
+ import Konva from 'konva';
2
+ import { BaseDraw, Draw, Render, MouseButton } from '../types';
3
+ import { LinkDraw } from '../draws';
4
+
5
+ // 编辑页预览框
6
+
7
+ export interface PreviewDrawOption {
8
+ size: number
9
+ }
10
+
11
+ export class PreviewDraw extends BaseDraw implements Draw {
12
+ // @ts-ignore
13
+ static override readonly name = 'preview';
14
+ option: PreviewDrawOption;
15
+
16
+ state: { [index: string]: any } = {
17
+ moving: false // 正在预览框内部拖动
18
+ }
19
+
20
+ constructor(render: Render, layer: Konva.Layer, option: PreviewDrawOption) {
21
+ super(render, layer);
22
+ this.option = option;
23
+ }
24
+
25
+ override draw() {
26
+ this.clear();
27
+ const stageState = this.render.getStageState();
28
+ const { pageWidth, pageHeight, background, backgroundImg } = this.render.getPageSettings(); // 画布尺寸
29
+ const previewMargin = 20; // 预览框的外边距
30
+ // 预览框 group
31
+ const group = new Konva.Group({
32
+ name: 'preview',
33
+ scale: {
34
+ x: this.render.toStageValue(this.option.size),
35
+ y: this.render.toStageValue(this.option.size)
36
+ },
37
+ width: stageState.width,
38
+ height: stageState.height
39
+ });
40
+ const main = this.render.stage.find('#main')[0] as Konva.Layer;
41
+ const cover = this.render.stage.find('#cover')[0] as Konva.Layer;
42
+ // 提取节点
43
+ const nodes = [
44
+ ...main.getChildren((node) => !this.render.ignore(node)),
45
+ // 补充连线
46
+ ...cover.getChildren((node) => node.name() === LinkDraw.name)
47
+ ]
48
+ // 计算节点占用的区域
49
+ let minX = 0;
50
+ let maxX = group.width();
51
+ let minY = 0;
52
+ let maxY = group.height();
53
+
54
+ for (const node of nodes) {
55
+ const { x, y, width, height } = ((rect) => ({
56
+ x: this.render.toStageValue(rect.x - stageState.x),
57
+ y: this.render.toStageValue(rect.y - stageState.y),
58
+ width: this.render.toStageValue(rect.width),
59
+ height: this.render.toStageValue(rect.height)
60
+ }))(node.getClientRect());
61
+ if (x < minX) {
62
+ minX = x;
63
+ }
64
+ if (x + width > maxX) {
65
+ maxX = x + width;
66
+ }
67
+ if (y < minY) {
68
+ minY = y;
69
+ }
70
+ if (y + height > maxY) {
71
+ maxY = y + height;
72
+ }
73
+ }
74
+
75
+ // 根据占用的区域调整预览框的大小
76
+ group.setAttrs({
77
+ x: this.render.toStageValue(
78
+ -stageState.x +
79
+ this.render.rulerSize +
80
+ stageState.width -
81
+ maxX * this.option.size -
82
+ previewMargin
83
+ ),
84
+ y: this.render.toStageValue(
85
+ -stageState.y +
86
+ this.render.rulerSize +
87
+ stageState.height -
88
+ maxY * this.option.size -
89
+ previewMargin
90
+ ),
91
+ width: maxX - minX,
92
+ height: maxY - minY
93
+ });
94
+
95
+ // 预览框背景
96
+ const bg = new Konva.Rect({
97
+ name: this.constructor.name,
98
+ x: minX,
99
+ y: minY,
100
+ width: group.width(),
101
+ height: group.height(),
102
+ stroke: '#666',
103
+ strokeWidth: this.render.toStageValue(1),
104
+ });
105
+
106
+ // 根据预览框内部拖动,同步画布的移动
107
+ const move = () => {
108
+ this.state.moving = true;
109
+ const pos = this.render.stage.getPointerPosition();
110
+ if (pos) {
111
+ const pWidth = group.width() * this.option.size;
112
+ const pHeight = group.height() * this.option.size;
113
+ const pOffsetX = pWidth - (stageState.width - pos.x - previewMargin);
114
+ const pOffsetY = pHeight - (stageState.height - pos.y - previewMargin);
115
+ const offsetX = pOffsetX / this.option.size;
116
+ const offsetY = pOffsetY / this.option.size;
117
+ // 点击预览框,点击位置作为画布中心
118
+ this.render.positionTool.updateCenter(
119
+ offsetX - this.render.rulerSize / this.option.size,
120
+ offsetY - this.render.rulerSize / this.option.size
121
+ );
122
+ }
123
+ }
124
+ // 预览框内拖动事件处理
125
+ bg.on('mousedown', (e) => {
126
+ if (e.evt.button === MouseButton.左键) {
127
+ move();
128
+ }
129
+ e.evt.preventDefault();
130
+ });
131
+ bg.on('mousemove', (e) => {
132
+ if (this.state.moving) {
133
+ move();
134
+ }
135
+ e.evt.preventDefault();
136
+ })
137
+ bg.on('mouseup', () => {
138
+ this.state.moving = false;
139
+ })
140
+ group.add(bg);
141
+ // 预览框 画布
142
+ const canvas = new Konva.Rect({
143
+ name: this.constructor.name,
144
+ x: 0,
145
+ y: 0,
146
+ width: this.render.toStageValue(pageWidth * stageState.scale),
147
+ height: this.render.toStageValue(pageHeight * stageState.scale),
148
+ stroke: 'rgba(255,0,0,0.2)',
149
+ strokeWidth: 1 / this.option.size,
150
+ listening: false,
151
+ fill: !background ? "#ffffff" : background
152
+ });
153
+
154
+ group.add(canvas);
155
+
156
+ // // 处理背景图(异步)
157
+ // if (backgroundImg?.src) {
158
+ // const img = new Image();
159
+ // img.crossOrigin = 'anonymous'; // 如果图片在 CDN 上,必须加上此属性防止跨域问题
160
+ // img.src = backgroundImg.src;
161
+ // img.onload = () => {
162
+ // canvas.fill(null);
163
+ // canvas.fillPatternImage(img);
164
+ // canvas.fillPatternRepeat('no-repeat');
165
+ // // 让图片自适应填满矩形(等比缩放裁剪效果)
166
+ // const scaleX = pageWidth / img.width;
167
+ // const scaleY = pageHeight / img.height;
168
+ // canvas.fillPatternScaleX(scaleX);
169
+ // canvas.fillPatternScaleY(scaleY);
170
+ // };
171
+ // }
172
+
173
+ // 复制提取的节点,用作预览
174
+ for (const node of nodes) {
175
+ const copy = node.clone();
176
+ // 消除连接线选中状态
177
+ copy.find('.link-line').forEach((link: Konva.Line) => {
178
+ const dash = link.dash();
179
+ if (dash && dash.length === 2 && dash.every((o) => o === 1)) {
180
+ link.dash([]);
181
+ }
182
+ });
183
+ // 不显示 调整点
184
+ copy.find('.link-point').map((o: Konva.Shape) => o.destroy());
185
+ copy.find('.link-manual-point').map((o: Konva.Shape) => o.destroy());
186
+ // 不可交互
187
+ copy.listening(false);
188
+ // 设置名称用于 ignore
189
+ copy.name(this.constructor.name);
190
+ group.add(copy);
191
+ }
192
+ // 放大的时候,显示当前可视区域提示框
193
+ if (stageState.scale > 1) {
194
+ // 画布可视区域起点坐标(左上)
195
+ let x1 = this.render.toStageValue(-stageState.x + this.render.rulerSize);
196
+ let y1 = this.render.toStageValue(-stageState.y + this.render.rulerSize);
197
+ // 限制可视区域提示框不能超出预览区域
198
+ x1 = x1 > minX ? x1 : minX;
199
+ x1 = x1 < maxX ? x1 : maxX;
200
+ y1 = y1 > minY ? y1 : minY;
201
+ y1 = y1 < maxY ? y1 : maxY;
202
+ // 画布可视区域起点坐标(右下)
203
+ let x2 =
204
+ this.render.toStageValue(-stageState.x + this.render.rulerSize) +
205
+ this.render.toStageValue(stageState.width);
206
+ let y2 =
207
+ this.render.toStageValue(-stageState.y + this.render.rulerSize) +
208
+ this.render.toStageValue(stageState.height);
209
+ // 限制可视区域提示框不能超出预览区域
210
+ x2 = x2 > minX ? x2 : minX;
211
+ x2 = x2 < maxX ? x2 : maxX;
212
+ y2 = y2 > minY ? y2 : minY;
213
+ y2 = y2 < maxY ? y2 : maxY;
214
+ // 可视区域提示框 连线坐标序列
215
+ let points: Array<[x: number, y: number]> = [];
216
+
217
+ // 可视区域提示框“超出”预览区域影响的“边”不做绘制
218
+ // "超出"(上面实际处理:把超过的坐标设置为上/下线,判断方式如[以正则表达式表示]:(x|y)(1|2) === (min|max)(X|Y))
219
+ // 简单直接穷举 9 种情况:
220
+ // 不超出
221
+ // 上超出 下超出
222
+ // 左超出 右超出
223
+ // 左上超出 右上超出
224
+ // 左下超出 右下超出
225
+
226
+ // 不超出,绘制完整矩形
227
+ if (x1 > minX && x1 < maxX && x2 > minX && x2 < maxX && y1 > minY && y1 < maxY && y2 > minY && y2 < maxY) {
228
+ points = [[x1, y1], [x2, y1], [x2, y2], [x1, y2], [x1, y1]];
229
+ }
230
+ // 上超出,不绘制“上边”
231
+ if (x1 > minX && x1 < maxX && x2 > minX && x2 < maxX && y1 === minY && y1 < maxY && y2 > minY && y2 < maxY) {
232
+ points = [[x2, y1], [x2, y2], [x1, y2], [x1, y1]];
233
+ }
234
+ // 下超出,不绘制“下边”
235
+ if (x1 > minX && x1 < maxX && x2 > minX && x2 < maxX && y1 > minY && y1 < maxY && y2 > minY && y2 === maxY) {
236
+ points = [[x1, y2], [x1, y1], [x2, y1], [x2, y2]];
237
+ }
238
+ // 左超出,不绘制“左边”
239
+ if (x1 === minX && x1 < maxX && x2 > minX && x2 < maxX && y1 > minY && y1 < maxY && y2 > minY && y2 < maxY) {
240
+ points = [[x1, y1], [x2, y1], [x2, y2], [x1, y2]];
241
+ }
242
+ // 右超出,不绘制“右边”
243
+ if (x1 > minX && x1 < maxX && x2 > minX && x2 === maxX && y1 > minY && y1 < maxY && y2 > minY && y2 < maxY) {
244
+ points = [[x2, y1], [x1, y1], [x1, y2], [x2, y2]];
245
+ }
246
+ // 左上超出,不绘制“上边”、“左边”
247
+ if (x1 === minX && x1 < maxX && x2 > minX && x2 < maxX && y1 === minY && y1 < maxY && y2 > minY && y2 < maxY) {
248
+ points = [[x2, y1], [x2, y2], [x1, y2]];
249
+ }
250
+ // 右上超出,不绘制“上边”、“右边”
251
+ if (x1 > minX && x1 < maxX && x2 > minX && x2 === maxX && y1 === minY && y1 < maxY && y2 > minY && y2 < maxY) {
252
+ points = [[x2, y2], [x1, y2], [x1, y1]];
253
+ }
254
+ // 左下超出,不绘制“下边”、“左边”
255
+ if (x1 === minX && x1 < maxX && x2 > minX && x2 < maxX && y1 > minY && y1 < maxY && y2 > minY && y2 === maxY) {
256
+ points = [[x1, y1], [x2, y1], [x2, y2]];
257
+ }
258
+ // 右下超出,不绘制“下边”、“右边”
259
+ if (x1 > minX && x1 < maxX && x2 > minX && x2 === maxX && y1 > minY && y1 < maxY && y2 > minY && y2 === maxY) {
260
+ points = [[x2, y1], [x1, y1], [x1, y2]];
261
+ }
262
+ // 可视区域提示框
263
+ group.add(
264
+ new Konva.Line({
265
+ name: this.constructor.name,
266
+ points: points.flat(),
267
+ stroke: 'blue',
268
+ strokeWidth: 1 / this.option.size,
269
+ listening: false
270
+ })
271
+ );
272
+ }
273
+ this.group.add(group);
274
+ }
275
+ }
@@ -0,0 +1,72 @@
1
+ import Konva from 'konva';
2
+ import { BaseDraw, Draw, Handler, Render } from '../types';
3
+
4
+ // 参考线
5
+
6
+ export interface RefLineDrawOption {
7
+ padding: number
8
+ }
9
+
10
+ export class RefLineDraw extends BaseDraw implements Draw, Handler {
11
+ // @ts-ignore
12
+ static override readonly name = 'refLine';
13
+ option: RefLineDrawOption;
14
+
15
+ constructor(render: Render, layer: Konva.Layer, option: RefLineDrawOption) {
16
+ super(render, layer);
17
+ this.option = option;
18
+ this.group.listening(false);
19
+ }
20
+
21
+ override draw() {
22
+ this.clear();
23
+ const stageState = this.render.getStageState();
24
+ const group = new Konva.Group();
25
+ const pos = this.render.stage.getPointerPosition();
26
+ if (pos) {
27
+ if (pos.y >= this.option.padding) {
28
+ // 横
29
+ group.add(
30
+ new Konva.Line({
31
+ name: this.constructor.name,
32
+ points: [
33
+ [this.render.toStageValue(-stageState.x), this.render.toStageValue(pos.y - stageState.y)],
34
+ [this.render.toStageValue(stageState.width - stageState.x + this.render.rulerSize), this.render.toStageValue(pos.y - stageState.y)]
35
+ ].flat(),
36
+ stroke: 'rgba(255,0,0,0.2)',
37
+ strokeWidth: this.render.toStageValue(1),
38
+ listening: false
39
+ })
40
+ );
41
+ }
42
+ if (pos.x >= this.option.padding) {
43
+ // 竖
44
+ group.add(
45
+ new Konva.Line({
46
+ name: this.constructor.name,
47
+ points: [
48
+ [this.render.toStageValue(pos.x - stageState.x), this.render.toStageValue(-stageState.y)],
49
+ [this.render.toStageValue(pos.x - stageState.x), this.render.toStageValue(stageState.height - stageState.y + this.render.rulerSize)]
50
+ ].flat(),
51
+ stroke: 'rgba(255,0,0,0.2)',
52
+ strokeWidth: this.render.toStageValue(1),
53
+ listening: false
54
+ })
55
+ );
56
+ }
57
+ }
58
+ this.group.add(group);
59
+ }
60
+ handlers = {
61
+ dom: {
62
+ mousemove: () => {
63
+ // 更新参考线
64
+ this.draw();
65
+ },
66
+ mouseout: () => {
67
+ // 清除参考线
68
+ this.clear();
69
+ }
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,167 @@
1
+ import Konva from 'konva';
2
+ import { BaseDraw, Render, Draw } from '../types';
3
+
4
+ // 画布比例尺
5
+
6
+ export interface RulerDrawOption {
7
+ size: number
8
+ }
9
+
10
+ export class RulerDraw extends BaseDraw implements Draw {
11
+ // @ts-ignore
12
+ static override readonly name = 'ruler';
13
+ option: RulerDrawOption;
14
+
15
+ constructor(render: Render, layer: Konva.Layer, option: RulerDrawOption) {
16
+ super(render, layer);
17
+ this.option = option;
18
+ this.group.listening(false);
19
+ }
20
+
21
+ override draw() {
22
+ this.clear();
23
+ const stageState = this.render.getStageState();
24
+ // 格子大小
25
+ const cellSize = 20;
26
+ const fontSizeMax = 12;
27
+ const lenX = Math.ceil(this.render.toStageValue(stageState.width) / cellSize); // 列数
28
+ const lenY = Math.ceil(this.render.toStageValue(stageState.height) / cellSize); // 行数
29
+ const startX = -Math.ceil(this.render.toStageValue(stageState.x - this.option.size) / cellSize);
30
+ const startY = -Math.ceil(this.render.toStageValue(stageState.y - this.option.size) / cellSize);
31
+ const group = new Konva.Group();
32
+ // 比例尺 - 上
33
+ const groupTop = new Konva.Group({
34
+ x: this.render.toStageValue(-stageState.x + this.option.size),
35
+ y: this.render.toStageValue(-stageState.y),
36
+ width: this.render.toStageValue(stageState.width - this.option.size + this.render.rulerSize),
37
+ height: this.render.toStageValue(this.option.size)
38
+ });
39
+ // 比例尺 - 左
40
+ const groupLeft = new Konva.Group({
41
+ x: this.render.toStageValue(-stageState.x),
42
+ y: this.render.toStageValue(-stageState.y + this.option.size),
43
+ width: this.render.toStageValue(this.option.size),
44
+ height: this.render.toStageValue(stageState.height - this.option.size + this.render.rulerSize)
45
+ });
46
+ {
47
+ groupTop.add(
48
+ // 上
49
+ new Konva.Rect({
50
+ name: this.constructor.name,
51
+ x: 0,
52
+ y: 0,
53
+ width: groupTop.width(),
54
+ height: groupTop.height(),
55
+ fill: '#ddd'
56
+ })
57
+ );
58
+ for (let x = lenX + startX - 1; x >= startX; x--) {
59
+ const nx = -groupTop.x() + cellSize * x;
60
+ const long = (this.render.toStageValue(this.option.size) / 5) * 4;
61
+ const short = (this.render.toStageValue(this.option.size) / 5) * 3;
62
+ if (nx >= 0) {
63
+ groupTop.add(
64
+ new Konva.Line({
65
+ name: this.constructor.name,
66
+ points: [
67
+ [nx, x % 5 ? long : short],
68
+ [nx, this.render.toStageValue(this.option.size)]
69
+ ].flat(),
70
+ stroke: '#999',
71
+ strokeWidth: this.render.toStageValue(1),
72
+ listening: false
73
+ })
74
+ );
75
+ if (x % 5 === 0) {
76
+ let fontSize = fontSizeMax;
77
+ const text = new Konva.Text({
78
+ name: this.constructor.name,
79
+ y: this.render.toStageValue(this.option.size / 2 - fontSize),
80
+ text: (x * cellSize).toString(),
81
+ fontSize: this.render.toStageValue(fontSize),
82
+ fill: '#999',
83
+ align: 'center',
84
+ verticalAlign: 'middle',
85
+ lineHeight: 1.6
86
+ });
87
+ while (this.render.toStageValue(text.width()) > this.render.toStageValue(cellSize) * 4.6) {
88
+ fontSize -= 1;
89
+ text.fontSize(this.render.toStageValue(fontSize));
90
+ text.y(this.render.toStageValue(this.option.size / 2 - fontSize));
91
+ }
92
+ text.x(nx - text.width() / 2);
93
+ groupTop.add(text);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ {
99
+ groupLeft.add(
100
+ // 左
101
+ new Konva.Rect({
102
+ name: this.constructor.name,
103
+ x: 0,
104
+ y: 0,
105
+ width: groupLeft.width(),
106
+ height: groupLeft.height(),
107
+ fill: '#ddd'
108
+ })
109
+ );
110
+ for (let y = lenY + startY - 1; y >= startY; y--) {
111
+ const ny = -groupLeft.y() + cellSize * y;
112
+ const long = (this.render.toStageValue(this.option.size) / 5) * 4;
113
+ const short = (this.render.toStageValue(this.option.size) / 5) * 3;
114
+ if (ny >= 0) {
115
+ groupLeft.add(
116
+ new Konva.Line({
117
+ name: this.constructor.name,
118
+ points: [
119
+ [y % 5 ? long : short, ny],
120
+ [this.render.toStageValue(this.option.size), ny]
121
+ ].flat(),
122
+ stroke: '#999',
123
+ strokeWidth: this.render.toStageValue(1),
124
+ listening: false
125
+ })
126
+ );
127
+ if (y % 5 === 0) {
128
+ let fontSize = fontSizeMax;
129
+ const text = new Konva.Text({
130
+ name: this.constructor.name,
131
+ x: 0,
132
+ y: ny,
133
+ text: (y * cellSize).toString(),
134
+ fontSize: this.render.toStageValue(fontSize),
135
+ fill: '#999',
136
+ align: 'right',
137
+ verticalAlign: 'bottom',
138
+ lineHeight: 1.6,
139
+ wrap: 'none'
140
+ });
141
+ while (text.width() > short * 0.8) {
142
+ fontSize -= 1;
143
+ text.fontSize(this.render.toStageValue(fontSize));
144
+ }
145
+ text.y(ny - text.height() / 2);
146
+ text.width(short - this.render.toStageValue(1));
147
+ groupLeft.add(text);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ group.add(
153
+ // 角
154
+ new Konva.Rect({
155
+ name: this.constructor.name,
156
+ x: this.render.toStageValue(-stageState.x),
157
+ y: this.render.toStageValue(-stageState.y),
158
+ width: this.render.toStageValue(this.option.size),
159
+ height: this.render.toStageValue(this.option.size),
160
+ fill: '#ddd'
161
+ })
162
+ );
163
+ group.add(groupTop);
164
+ group.add(groupLeft);
165
+ this.group.add(group);
166
+ }
167
+ }