@idraw/core 0.4.0-beta.4 → 0.4.0-beta.41

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 (87) hide show
  1. package/dist/esm/board/index.d.ts +44 -0
  2. package/dist/esm/board/index.js +358 -0
  3. package/dist/esm/board/sharer.d.ts +21 -0
  4. package/dist/esm/board/sharer.js +101 -0
  5. package/dist/esm/board/viewer.d.ts +32 -0
  6. package/dist/esm/board/viewer.js +165 -0
  7. package/dist/esm/board/watcher.d.ts +15 -0
  8. package/dist/esm/board/watcher.js +218 -0
  9. package/dist/esm/config.d.ts +28 -0
  10. package/dist/esm/config.js +34 -0
  11. package/dist/esm/index.d.ts +37 -8
  12. package/dist/esm/index.js +265 -10
  13. package/dist/esm/lib/cursor-image.d.ts +1 -0
  14. package/dist/esm/lib/cursor-image.js +1 -0
  15. package/dist/esm/lib/cursor.d.ts +3 -12
  16. package/dist/esm/lib/cursor.js +137 -112
  17. package/dist/esm/middleware/dragger/index.d.ts +2 -2
  18. package/dist/esm/middleware/dragger/index.js +5 -3
  19. package/dist/esm/middleware/info/config.d.ts +5 -0
  20. package/dist/esm/middleware/info/config.js +9 -0
  21. package/dist/esm/middleware/info/draw-info.d.ts +29 -0
  22. package/dist/esm/middleware/info/draw-info.js +113 -0
  23. package/dist/esm/middleware/info/index.d.ts +9 -0
  24. package/dist/esm/middleware/info/index.js +131 -0
  25. package/dist/esm/middleware/info/types.d.ts +3 -0
  26. package/dist/esm/middleware/info/types.js +1 -0
  27. package/dist/esm/middleware/layout-selector/config.d.ts +11 -0
  28. package/dist/esm/middleware/layout-selector/config.js +12 -0
  29. package/dist/esm/middleware/layout-selector/index.d.ts +5 -0
  30. package/dist/esm/middleware/layout-selector/index.js +371 -0
  31. package/dist/esm/middleware/layout-selector/types.d.ts +17 -0
  32. package/dist/esm/middleware/layout-selector/types.js +2 -0
  33. package/dist/esm/middleware/layout-selector/util.d.ts +9 -0
  34. package/dist/esm/middleware/layout-selector/util.js +78 -0
  35. package/dist/esm/middleware/pointer/index.d.ts +3 -0
  36. package/dist/esm/middleware/pointer/index.js +42 -0
  37. package/dist/esm/middleware/pointer/types.d.ts +3 -0
  38. package/dist/esm/middleware/pointer/types.js +1 -0
  39. package/dist/esm/middleware/ruler/config.d.ts +7 -0
  40. package/dist/esm/middleware/ruler/config.js +21 -0
  41. package/dist/esm/middleware/ruler/index.d.ts +3 -3
  42. package/dist/esm/middleware/ruler/index.js +33 -14
  43. package/dist/esm/middleware/ruler/types.d.ts +3 -0
  44. package/dist/esm/middleware/ruler/types.js +1 -0
  45. package/dist/esm/middleware/ruler/util.d.ts +20 -4
  46. package/dist/esm/middleware/ruler/util.js +99 -26
  47. package/dist/esm/middleware/scaler/index.d.ts +2 -3
  48. package/dist/esm/middleware/scaler/index.js +3 -2
  49. package/dist/esm/middleware/scroller/config.d.ts +4 -0
  50. package/dist/esm/middleware/scroller/config.js +10 -0
  51. package/dist/esm/middleware/scroller/index.d.ts +3 -2
  52. package/dist/esm/middleware/scroller/index.js +48 -6
  53. package/dist/esm/middleware/scroller/types.d.ts +11 -0
  54. package/dist/esm/middleware/scroller/types.js +1 -0
  55. package/dist/esm/middleware/scroller/util.d.ts +3 -2
  56. package/dist/esm/middleware/scroller/util.js +33 -44
  57. package/dist/esm/middleware/selector/config.d.ts +9 -1
  58. package/dist/esm/middleware/selector/config.js +17 -1
  59. package/dist/esm/middleware/selector/draw-auxiliary.d.ts +1 -0
  60. package/dist/esm/middleware/selector/draw-auxiliary.js +12 -0
  61. package/dist/esm/middleware/selector/draw-base.d.ts +30 -0
  62. package/dist/esm/middleware/selector/draw-base.js +100 -0
  63. package/dist/esm/middleware/selector/draw-debug.d.ts +5 -0
  64. package/dist/esm/middleware/selector/draw-debug.js +30 -0
  65. package/dist/esm/middleware/selector/draw-reference.d.ts +7 -0
  66. package/dist/esm/middleware/selector/draw-reference.js +31 -0
  67. package/dist/esm/middleware/selector/draw-wrapper.d.ts +16 -1
  68. package/dist/esm/middleware/selector/draw-wrapper.js +70 -38
  69. package/dist/esm/middleware/selector/index.d.ts +11 -4
  70. package/dist/esm/middleware/selector/index.js +450 -70
  71. package/dist/esm/middleware/selector/pattern/icon-rotate.d.ts +4 -0
  72. package/dist/esm/middleware/selector/pattern/icon-rotate.js +88 -0
  73. package/dist/esm/middleware/selector/pattern/index.d.ts +8 -0
  74. package/dist/esm/middleware/selector/pattern/index.js +38 -0
  75. package/dist/esm/middleware/selector/reference.d.ts +13 -0
  76. package/dist/esm/middleware/selector/reference.js +267 -0
  77. package/dist/esm/middleware/selector/types.d.ts +11 -5
  78. package/dist/esm/middleware/selector/types.js +2 -1
  79. package/dist/esm/middleware/selector/util.d.ts +14 -7
  80. package/dist/esm/middleware/selector/util.js +45 -43
  81. package/dist/esm/middleware/text-editor/index.d.ts +20 -3
  82. package/dist/esm/middleware/text-editor/index.js +168 -28
  83. package/dist/esm/record.d.ts +5 -0
  84. package/dist/esm/record.js +38 -0
  85. package/dist/index.global.js +5729 -1519
  86. package/dist/index.global.min.js +1 -1
  87. package/package.json +5 -6
@@ -0,0 +1,371 @@
1
+ import { calcLayoutSizeController, isViewPointInVertexes, getViewScaleInfoFromSnapshot, isViewPointInElementSize, calcViewElementSize, getElementSize, toFlattenLayout } from '@idraw/util';
2
+ import { keyLayoutActionType, keyLayoutController, keyLayoutControlType, keyLayoutIsHoverContent, keyLayoutIsHoverController, keyLayoutIsSelected, keyLayoutIsBusyMoving, controllerSize, defaultStyle } from './config';
3
+ import { keyActionType as keyElementActionType } from '../selector';
4
+ import { drawLayoutController, drawLayoutHover } from './util';
5
+ import { coreEventKeys } from '../../config';
6
+ export { keyLayoutIsSelected, keyLayoutIsBusyMoving };
7
+ export const MiddlewareLayoutSelector = (opts, config) => {
8
+ const { sharer, boardContent, calculator, viewer, eventHub } = opts;
9
+ const { overlayContext } = boardContent;
10
+ let innerConfig = Object.assign(Object.assign({}, defaultStyle), config);
11
+ let prevPoint = null;
12
+ let prevIsHoverContent = null;
13
+ let prevIsSelected = null;
14
+ let pointStartLayoutSize = null;
15
+ const clear = () => {
16
+ prevPoint = null;
17
+ sharer.setSharedStorage(keyLayoutActionType, null);
18
+ sharer.setSharedStorage(keyLayoutControlType, null);
19
+ sharer.setSharedStorage(keyLayoutController, null);
20
+ sharer.setSharedStorage(keyLayoutIsHoverContent, null);
21
+ sharer.setSharedStorage(keyLayoutIsHoverController, null);
22
+ sharer.setSharedStorage(keyLayoutIsSelected, null);
23
+ sharer.setSharedStorage(keyLayoutIsBusyMoving, null);
24
+ prevIsHoverContent = null;
25
+ prevIsSelected = null;
26
+ };
27
+ const isInElementAction = () => {
28
+ const elementActionType = sharer.getSharedStorage(keyElementActionType);
29
+ if (elementActionType && elementActionType !== 'area') {
30
+ clear();
31
+ return true;
32
+ }
33
+ return false;
34
+ };
35
+ const getLayoutSize = () => {
36
+ const data = sharer.getActiveStorage('data');
37
+ if (data === null || data === void 0 ? void 0 : data.layout) {
38
+ const { x, y, w, h } = data.layout;
39
+ return { x, y, w, h };
40
+ }
41
+ return null;
42
+ };
43
+ const isInLayout = (p) => {
44
+ const size = getLayoutSize();
45
+ if (size) {
46
+ const { x, y, w, h } = size;
47
+ const viewScaleInfo = sharer.getActiveViewScaleInfo();
48
+ const viewSize = calcViewElementSize({
49
+ x: x - controllerSize / 2,
50
+ y: y - controllerSize / 2,
51
+ w: w + controllerSize,
52
+ h: h + controllerSize
53
+ }, { viewScaleInfo });
54
+ return isViewPointInElementSize(p, viewSize);
55
+ }
56
+ return false;
57
+ };
58
+ const resetController = () => {
59
+ const viewScaleInfo = sharer.getActiveViewScaleInfo();
60
+ const size = getLayoutSize();
61
+ if (size) {
62
+ const controller = calcLayoutSizeController(size, { viewScaleInfo, controllerSize: 10 });
63
+ sharer.setSharedStorage(keyLayoutController, controller);
64
+ }
65
+ else {
66
+ sharer.setSharedStorage(keyLayoutController, null);
67
+ }
68
+ };
69
+ const resetControlType = (e) => {
70
+ const data = sharer.getActiveStorage('data');
71
+ const controller = sharer.getSharedStorage(keyLayoutController);
72
+ let controllerType = null;
73
+ if (controller && (data === null || data === void 0 ? void 0 : data.layout) && (e === null || e === void 0 ? void 0 : e.point)) {
74
+ let layoutControlType = null;
75
+ if (controller) {
76
+ const { topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left } = controller;
77
+ const list = [topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left];
78
+ for (let i = 0; i < list.length; i++) {
79
+ const item = list[i];
80
+ if (isViewPointInVertexes(e.point, item.vertexes)) {
81
+ layoutControlType = `${item.type}`;
82
+ break;
83
+ }
84
+ }
85
+ if (layoutControlType) {
86
+ sharer.setSharedStorage(keyLayoutControlType, layoutControlType);
87
+ eventHub.trigger(coreEventKeys.CLEAR_SELECT);
88
+ controllerType = layoutControlType;
89
+ }
90
+ }
91
+ }
92
+ if (controllerType) {
93
+ sharer.setSharedStorage(keyLayoutIsHoverController, true);
94
+ }
95
+ else {
96
+ sharer.setSharedStorage(keyLayoutIsHoverController, false);
97
+ }
98
+ return controllerType;
99
+ };
100
+ const updateCursor = (controlType) => {
101
+ if (sharer.getSharedStorage(keyLayoutIsBusyMoving) === true) {
102
+ return;
103
+ }
104
+ eventHub.trigger(coreEventKeys.CURSOR, {
105
+ type: controlType ? `resize-${controlType}` : controlType,
106
+ groupQueue: [],
107
+ element: getLayoutSize()
108
+ });
109
+ };
110
+ return {
111
+ name: '@middleware/layout-selector',
112
+ use: () => {
113
+ clear();
114
+ resetController();
115
+ },
116
+ resetConfig(config) {
117
+ innerConfig = Object.assign(Object.assign({}, innerConfig), config);
118
+ },
119
+ hover: (e) => {
120
+ if (sharer.getSharedStorage(keyLayoutIsBusyMoving) === true) {
121
+ return;
122
+ }
123
+ if (isInElementAction()) {
124
+ return;
125
+ }
126
+ if (isInLayout(e.point)) {
127
+ sharer.setSharedStorage(keyLayoutIsHoverContent, true);
128
+ }
129
+ else {
130
+ sharer.setSharedStorage(keyLayoutIsHoverContent, false);
131
+ if (prevIsHoverContent === true) {
132
+ viewer.drawFrame();
133
+ prevIsHoverContent = false;
134
+ }
135
+ }
136
+ if (sharer.getSharedStorage(keyLayoutIsSelected) === true) {
137
+ const prevLayoutActionType = sharer.getSharedStorage(keyLayoutActionType);
138
+ const data = sharer.getActiveStorage('data');
139
+ if (data === null || data === void 0 ? void 0 : data.layout) {
140
+ if (prevLayoutActionType !== 'resize') {
141
+ resetController();
142
+ const layoutControlType = resetControlType(e);
143
+ if (layoutControlType) {
144
+ updateCursor(layoutControlType);
145
+ }
146
+ else {
147
+ updateCursor();
148
+ sharer.setSharedStorage(keyLayoutActionType, null);
149
+ }
150
+ }
151
+ else {
152
+ const layoutControlType = resetControlType(e);
153
+ updateCursor(layoutControlType);
154
+ }
155
+ }
156
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
157
+ return false;
158
+ }
159
+ return;
160
+ }
161
+ if (sharer.getSharedStorage(keyLayoutIsHoverContent) && !prevIsHoverContent) {
162
+ viewer.drawFrame();
163
+ }
164
+ prevIsHoverContent = sharer.getSharedStorage(keyLayoutIsHoverContent);
165
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
166
+ return false;
167
+ }
168
+ },
169
+ pointStart: (e) => {
170
+ if (isInElementAction()) {
171
+ return;
172
+ }
173
+ if (isInLayout(e.point)) {
174
+ sharer.setSharedStorage(keyLayoutIsSelected, true);
175
+ }
176
+ else {
177
+ if (prevIsSelected === true) {
178
+ clear();
179
+ viewer.drawFrame();
180
+ }
181
+ sharer.setSharedStorage(keyLayoutIsSelected, false);
182
+ }
183
+ const data = sharer.getActiveStorage('data');
184
+ if (data === null || data === void 0 ? void 0 : data.layout) {
185
+ pointStartLayoutSize = getElementSize(data.layout);
186
+ }
187
+ else {
188
+ pointStartLayoutSize = null;
189
+ }
190
+ resetController();
191
+ const layoutControlType = resetControlType(e);
192
+ prevPoint = e.point;
193
+ if (layoutControlType) {
194
+ sharer.setSharedStorage(keyLayoutActionType, 'resize');
195
+ }
196
+ if (sharer.getSharedStorage(keyLayoutIsSelected) === true && !prevIsSelected) {
197
+ viewer.drawFrame();
198
+ eventHub.trigger(coreEventKeys.SELECT_LAYOUT);
199
+ }
200
+ prevIsSelected = sharer.getSharedStorage(keyLayoutIsSelected);
201
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
202
+ return false;
203
+ }
204
+ },
205
+ pointMove: (e) => {
206
+ if (!sharer.getSharedStorage(keyLayoutIsSelected)) {
207
+ if (isInElementAction()) {
208
+ return;
209
+ }
210
+ }
211
+ const layoutActionType = sharer.getSharedStorage(keyLayoutActionType);
212
+ const layoutControlType = sharer.getSharedStorage(keyLayoutControlType);
213
+ const data = sharer.getActiveStorage('data');
214
+ if (layoutActionType === 'resize' && layoutControlType && (data === null || data === void 0 ? void 0 : data.layout)) {
215
+ if (prevPoint) {
216
+ sharer.setSharedStorage(keyLayoutIsBusyMoving, true);
217
+ const scale = sharer.getActiveStorage('scale');
218
+ const viewMoveX = e.point.x - prevPoint.x;
219
+ const viewMoveY = e.point.y - prevPoint.y;
220
+ const moveX = viewMoveX / scale;
221
+ const moveY = viewMoveY / scale;
222
+ const { x, y, w, h, operations = {} } = data.layout;
223
+ const { position = 'absolute' } = operations;
224
+ if (layoutControlType === 'top') {
225
+ if (position === 'relative') {
226
+ data.layout.h = calculator.toGridNum(h - moveY);
227
+ viewer.scroll({ moveY: viewMoveY });
228
+ }
229
+ else {
230
+ data.layout.y = calculator.toGridNum(y + moveY);
231
+ data.layout.h = calculator.toGridNum(h - moveY);
232
+ }
233
+ }
234
+ else if (layoutControlType === 'right') {
235
+ data.layout.w = calculator.toGridNum(w + moveX);
236
+ }
237
+ else if (layoutControlType === 'bottom') {
238
+ data.layout.h = calculator.toGridNum(h + moveY);
239
+ }
240
+ else if (layoutControlType === 'left') {
241
+ if (position === 'relative') {
242
+ data.layout.w = calculator.toGridNum(w - moveX);
243
+ viewer.scroll({ moveX: viewMoveX });
244
+ }
245
+ else {
246
+ data.layout.x = calculator.toGridNum(x + moveX);
247
+ data.layout.w = calculator.toGridNum(w - moveX);
248
+ }
249
+ }
250
+ else if (layoutControlType === 'top-left') {
251
+ if (position === 'relative') {
252
+ data.layout.w = calculator.toGridNum(w - moveX);
253
+ data.layout.h = calculator.toGridNum(h - moveY);
254
+ viewer.scroll({ moveX: viewMoveX, moveY: viewMoveY });
255
+ }
256
+ else {
257
+ data.layout.x = calculator.toGridNum(x + moveX);
258
+ data.layout.y = calculator.toGridNum(y + moveY);
259
+ data.layout.w = calculator.toGridNum(w - moveX);
260
+ data.layout.h = calculator.toGridNum(h - moveY);
261
+ }
262
+ }
263
+ else if (layoutControlType === 'top-right') {
264
+ if (position === 'relative') {
265
+ viewer.scroll({
266
+ moveY: viewMoveY
267
+ });
268
+ data.layout.w = calculator.toGridNum(w + moveX);
269
+ data.layout.h = calculator.toGridNum(h - moveY);
270
+ }
271
+ else {
272
+ data.layout.y = calculator.toGridNum(y + moveY);
273
+ data.layout.w = calculator.toGridNum(w + moveX);
274
+ data.layout.h = calculator.toGridNum(h - moveY);
275
+ }
276
+ }
277
+ else if (layoutControlType === 'bottom-right') {
278
+ data.layout.w = calculator.toGridNum(w + moveX);
279
+ data.layout.h = calculator.toGridNum(h + moveY);
280
+ }
281
+ else if (layoutControlType === 'bottom-left') {
282
+ if (position === 'relative') {
283
+ viewer.scroll({
284
+ moveX: viewMoveX
285
+ });
286
+ data.layout.w = calculator.toGridNum(w - moveX);
287
+ data.layout.h = calculator.toGridNum(h + moveY);
288
+ }
289
+ else {
290
+ data.layout.x = calculator.toGridNum(x + moveX);
291
+ data.layout.w = calculator.toGridNum(w - moveX);
292
+ data.layout.h = calculator.toGridNum(h + moveY);
293
+ }
294
+ }
295
+ }
296
+ prevPoint = e.point;
297
+ resetController();
298
+ viewer.drawFrame();
299
+ return false;
300
+ }
301
+ if (['resize'].includes(layoutActionType)) {
302
+ return false;
303
+ }
304
+ },
305
+ pointEnd: () => {
306
+ sharer.setSharedStorage(keyLayoutIsBusyMoving, false);
307
+ const layoutActionType = sharer.getSharedStorage(keyLayoutActionType);
308
+ const layoutControlType = sharer.getSharedStorage(keyLayoutControlType);
309
+ const data = sharer.getActiveStorage('data');
310
+ if (data && layoutActionType === 'resize' && layoutControlType) {
311
+ let modifyRecord = undefined;
312
+ if (pointStartLayoutSize) {
313
+ modifyRecord = {
314
+ type: 'modifyLayout',
315
+ time: Date.now(),
316
+ content: {
317
+ method: 'modifyLayout',
318
+ before: toFlattenLayout(pointStartLayoutSize),
319
+ after: toFlattenLayout(getElementSize(data.layout))
320
+ }
321
+ };
322
+ }
323
+ eventHub.trigger(coreEventKeys.CHANGE, {
324
+ type: 'dragLayout',
325
+ data,
326
+ modifyRecord
327
+ });
328
+ }
329
+ pointStartLayoutSize = null;
330
+ sharer.setSharedStorage(keyLayoutActionType, null);
331
+ sharer.setSharedStorage(keyLayoutControlType, null);
332
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
333
+ return false;
334
+ }
335
+ },
336
+ beforeDrawFrame: ({ snapshot }) => {
337
+ var _a;
338
+ if (isInElementAction()) {
339
+ return;
340
+ }
341
+ const { activeColor } = innerConfig;
342
+ const style = { activeColor };
343
+ const { sharedStore, activeStore } = snapshot;
344
+ const layoutActionType = sharedStore[keyLayoutActionType];
345
+ const layoutIsHover = sharedStore[keyLayoutIsHoverContent];
346
+ const layoutIsSelected = sharedStore[keyLayoutIsSelected];
347
+ if ((_a = activeStore.data) === null || _a === void 0 ? void 0 : _a.layout) {
348
+ const { x, y, w, h } = activeStore.data.layout;
349
+ const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
350
+ const size = { x, y, w, h };
351
+ const controller = calcLayoutSizeController(size, { viewScaleInfo, controllerSize });
352
+ if (layoutIsHover === true) {
353
+ const viewSize = calcViewElementSize(size, { viewScaleInfo });
354
+ drawLayoutHover(overlayContext, { layoutSize: viewSize, style });
355
+ }
356
+ if ((layoutActionType && ['resize'].includes(layoutActionType)) || layoutIsSelected === true) {
357
+ drawLayoutController(overlayContext, { controller, style });
358
+ }
359
+ }
360
+ },
361
+ scrollX: () => {
362
+ clear();
363
+ },
364
+ scrollY: () => {
365
+ clear();
366
+ },
367
+ wheelScale: () => {
368
+ clear();
369
+ }
370
+ };
371
+ };
@@ -0,0 +1,17 @@
1
+ import type { LayoutSizeController, Element } from '@idraw/types';
2
+ import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHoverContent, keyLayoutIsHoverController, keyLayoutIsSelected, keyLayoutIsBusyMoving } from './config';
3
+ import { keyActionType as keyElementActionType, keyHoverElement } from '../selector';
4
+ import type { ActionType as ElementActionType } from '../selector';
5
+ export type ActionType = 'resize' | null;
6
+ export type ControlType = 'left' | 'right' | 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
7
+ export type LayoutSelectorSharedStorage = {
8
+ [keyLayoutActionType]: ActionType | null;
9
+ [keyLayoutControlType]: ControlType | null;
10
+ [keyLayoutController]: LayoutSizeController | null;
11
+ [keyElementActionType]: ElementActionType | null;
12
+ [keyHoverElement]: Element | null;
13
+ [keyLayoutIsHoverContent]: boolean | null;
14
+ [keyLayoutIsHoverController]: boolean | null;
15
+ [keyLayoutIsSelected]: boolean | null;
16
+ [keyLayoutIsBusyMoving]: boolean | null;
17
+ };
@@ -0,0 +1,2 @@
1
+ import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHoverContent, keyLayoutIsHoverController, keyLayoutIsSelected, keyLayoutIsBusyMoving } from './config';
2
+ import { keyActionType as keyElementActionType, keyHoverElement } from '../selector';
@@ -0,0 +1,9 @@
1
+ import type { ViewContext2D, LayoutSizeController, ElementSize, MiddlewareLayoutSelectorStyle } from '@idraw/types';
2
+ export declare function drawLayoutController(ctx: ViewContext2D, opts: {
3
+ controller: LayoutSizeController;
4
+ style: MiddlewareLayoutSelectorStyle;
5
+ }): void;
6
+ export declare function drawLayoutHover(ctx: ViewContext2D, opts: {
7
+ layoutSize: ElementSize;
8
+ style: MiddlewareLayoutSelectorStyle;
9
+ }): void;
@@ -0,0 +1,78 @@
1
+ function drawControllerBox(ctx, boxVertexes, style) {
2
+ const { activeColor } = style;
3
+ ctx.setLineDash([]);
4
+ ctx.fillStyle = '#FFFFFF';
5
+ ctx.beginPath();
6
+ ctx.moveTo(boxVertexes[0].x, boxVertexes[0].y);
7
+ ctx.lineTo(boxVertexes[1].x, boxVertexes[1].y);
8
+ ctx.lineTo(boxVertexes[2].x, boxVertexes[2].y);
9
+ ctx.lineTo(boxVertexes[3].x, boxVertexes[3].y);
10
+ ctx.closePath();
11
+ ctx.fill('nonzero');
12
+ ctx.strokeStyle = activeColor;
13
+ ctx.lineWidth = 2;
14
+ ctx.beginPath();
15
+ ctx.moveTo(boxVertexes[0].x, boxVertexes[0].y);
16
+ ctx.lineTo(boxVertexes[1].x, boxVertexes[1].y);
17
+ ctx.lineTo(boxVertexes[2].x, boxVertexes[2].y);
18
+ ctx.lineTo(boxVertexes[3].x, boxVertexes[3].y);
19
+ ctx.closePath();
20
+ ctx.stroke();
21
+ }
22
+ function drawControllerLine(ctx, opts) {
23
+ const { start, end, style } = opts;
24
+ const { activeColor } = style;
25
+ const lineWidth = 2;
26
+ const strokeStyle = activeColor;
27
+ ctx.setLineDash([]);
28
+ ctx.strokeStyle = strokeStyle;
29
+ ctx.lineWidth = lineWidth;
30
+ ctx.beginPath();
31
+ ctx.moveTo(start.x, start.y);
32
+ ctx.lineTo(end.x, end.y);
33
+ ctx.closePath();
34
+ ctx.stroke();
35
+ }
36
+ export function drawLayoutController(ctx, opts) {
37
+ const { controller, style } = opts;
38
+ const { topLeft, topRight, bottomLeft, bottomRight, topMiddle, rightMiddle, bottomMiddle, leftMiddle } = controller;
39
+ drawControllerLine(ctx, { start: topLeft.center, end: topRight.center, centerVertexes: topMiddle.vertexes, style });
40
+ drawControllerLine(ctx, {
41
+ start: topRight.center,
42
+ end: bottomRight.center,
43
+ centerVertexes: rightMiddle.vertexes,
44
+ style
45
+ });
46
+ drawControllerLine(ctx, {
47
+ start: bottomRight.center,
48
+ end: bottomLeft.center,
49
+ centerVertexes: bottomMiddle.vertexes,
50
+ style
51
+ });
52
+ drawControllerLine(ctx, {
53
+ start: bottomLeft.center,
54
+ end: topLeft.center,
55
+ centerVertexes: leftMiddle.vertexes,
56
+ style
57
+ });
58
+ drawControllerBox(ctx, topLeft.vertexes, style);
59
+ drawControllerBox(ctx, topRight.vertexes, style);
60
+ drawControllerBox(ctx, bottomRight.vertexes, style);
61
+ drawControllerBox(ctx, bottomLeft.vertexes, style);
62
+ }
63
+ export function drawLayoutHover(ctx, opts) {
64
+ const { layoutSize, style } = opts;
65
+ const { activeColor } = style;
66
+ const { x, y, w, h } = layoutSize;
67
+ ctx.setLineDash([]);
68
+ ctx.strokeStyle = activeColor;
69
+ ctx.lineWidth = 1;
70
+ ctx.beginPath();
71
+ ctx.moveTo(x, y);
72
+ ctx.lineTo(x + w, y);
73
+ ctx.lineTo(x + w, y + h);
74
+ ctx.lineTo(x, y + h);
75
+ ctx.lineTo(x, y);
76
+ ctx.closePath();
77
+ ctx.stroke();
78
+ }
@@ -0,0 +1,3 @@
1
+ import type { Middleware, CoreEventMap } from '@idraw/types';
2
+ import type { DeepPointerSharedStorage } from './types';
3
+ export declare const MiddlewarePointer: Middleware<DeepPointerSharedStorage, CoreEventMap>;
@@ -0,0 +1,42 @@
1
+ import { keySelectedElementList } from '../selector';
2
+ import { coreEventKeys } from '../../config';
3
+ export const MiddlewarePointer = (opts) => {
4
+ const { boardContent, eventHub, sharer } = opts;
5
+ const canvas = boardContent.boardContext.canvas;
6
+ const container = opts.container || document.body;
7
+ const id = `idraw-middleware-pointer-${Math.random().toString(26).substring(2)}`;
8
+ const getCanvasRect = () => {
9
+ const clientRect = canvas.getBoundingClientRect();
10
+ const { left, top, width, height } = clientRect;
11
+ return { left, top, width, height };
12
+ };
13
+ let contextMenuPointer = document.createElement('div');
14
+ return {
15
+ name: '@middleware/pointer',
16
+ use() {
17
+ contextMenuPointer.setAttribute('id', id);
18
+ contextMenuPointer.style.position = 'fixed';
19
+ contextMenuPointer.style.top = '0';
20
+ contextMenuPointer.style.bottom = 'unset';
21
+ contextMenuPointer.style.left = '0';
22
+ contextMenuPointer.style.right = 'unset';
23
+ container.appendChild(contextMenuPointer);
24
+ },
25
+ disuse() {
26
+ container.removeChild(contextMenuPointer);
27
+ contextMenuPointer.remove();
28
+ contextMenuPointer = null;
29
+ },
30
+ contextMenu(e) {
31
+ const { point } = e;
32
+ const { left, top } = getCanvasRect();
33
+ contextMenuPointer.style.left = `${left + point.x}px`;
34
+ contextMenuPointer.style.top = `${top + point.y}px`;
35
+ const selectedElements = sharer.getSharedStorage(keySelectedElementList);
36
+ eventHub.trigger(coreEventKeys.CONTEXT_MENU, {
37
+ pointerContainer: contextMenuPointer,
38
+ selectedElements: selectedElements || []
39
+ });
40
+ }
41
+ };
42
+ };
@@ -0,0 +1,3 @@
1
+ import { keySelectedElementList } from '../selector';
2
+ import type { DeepSelectorSharedStorage } from '../selector';
3
+ export type DeepPointerSharedStorage = Pick<DeepSelectorSharedStorage, typeof keySelectedElementList>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { MiddlewareRulerStyle } from '@idraw/types';
2
+ export declare const rulerSize = 16;
3
+ export declare const fontSize = 10;
4
+ export declare const fontWeight = 100;
5
+ export declare const lineSize = 1;
6
+ export declare const fontFamily = "monospace";
7
+ export declare const defaultStyle: MiddlewareRulerStyle;
@@ -0,0 +1,21 @@
1
+ export const rulerSize = 16;
2
+ export const fontSize = 10;
3
+ export const fontWeight = 100;
4
+ export const lineSize = 1;
5
+ export const fontFamily = 'monospace';
6
+ const background = '#FFFFFFA8';
7
+ const borderColor = '#00000080';
8
+ const scaleColor = '#000000';
9
+ const textColor = '#00000080';
10
+ const gridColor = '#AAAAAA20';
11
+ const gridPrimaryColor = '#AAAAAA40';
12
+ const selectedAreaColor = '#19609780';
13
+ export const defaultStyle = {
14
+ background,
15
+ borderColor,
16
+ scaleColor,
17
+ textColor,
18
+ gridColor,
19
+ gridPrimaryColor,
20
+ selectedAreaColor
21
+ };
@@ -1,3 +1,3 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
2
- export declare const middlewareEventRuler = "@middleware/show-ruler";
3
- export declare const MiddlewareRuler: BoardMiddleware<Record<string, any>, CoreEvent>;
1
+ import type { Middleware, CoreEventMap, MiddlewareRulerConfig } from '@idraw/types';
2
+ import type { DeepRulerSharedStorage } from './types';
3
+ export declare const MiddlewareRuler: Middleware<DeepRulerSharedStorage, CoreEventMap, MiddlewareRulerConfig>;
@@ -1,9 +1,11 @@
1
1
  import { getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot } from '@idraw/util';
2
- import { drawRulerBackground, drawXRuler, drawYRuler, calcXRulerScaleList, calcYRulerScaleList, drawUnderGrid } from './util';
3
- export const middlewareEventRuler = '@middleware/show-ruler';
4
- export const MiddlewareRuler = (opts) => {
5
- const { boardContent, viewer, eventHub } = opts;
6
- const { helperContext, underContext } = boardContent;
2
+ import { drawRulerBackground, drawXRuler, drawYRuler, calcXRulerScaleList, calcYRulerScaleList, drawGrid, drawScrollerSelectedArea } from './util';
3
+ import { defaultStyle } from './config';
4
+ import { coreEventKeys } from '../../config';
5
+ export const MiddlewareRuler = (opts, config) => {
6
+ const { boardContent, viewer, eventHub, calculator } = opts;
7
+ const { overlayContext, underlayContext } = boardContent;
8
+ let innerConfig = Object.assign(Object.assign({}, defaultStyle), config);
7
9
  let show = true;
8
10
  let showGrid = true;
9
11
  const rulerCallback = (e) => {
@@ -18,27 +20,44 @@ export const MiddlewareRuler = (opts) => {
18
20
  }
19
21
  };
20
22
  return {
23
+ name: '@middleware/ruler',
21
24
  use() {
22
- eventHub.on(middlewareEventRuler, rulerCallback);
25
+ eventHub.on(coreEventKeys.RULER, rulerCallback);
23
26
  },
24
27
  disuse() {
25
- eventHub.off(middlewareEventRuler, rulerCallback);
28
+ eventHub.off(coreEventKeys.RULER, rulerCallback);
29
+ },
30
+ resetConfig(config) {
31
+ innerConfig = Object.assign(Object.assign({}, innerConfig), config);
26
32
  },
27
33
  beforeDrawFrame: ({ snapshot }) => {
34
+ const { background, borderColor, scaleColor, textColor, gridColor, gridPrimaryColor, selectedAreaColor } = innerConfig;
35
+ const style = {
36
+ background,
37
+ borderColor,
38
+ scaleColor,
39
+ textColor,
40
+ gridColor,
41
+ gridPrimaryColor,
42
+ selectedAreaColor
43
+ };
28
44
  if (show === true) {
29
45
  const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
30
46
  const viewSizeInfo = getViewSizeInfoFromSnapshot(snapshot);
31
- drawRulerBackground(helperContext, { viewScaleInfo, viewSizeInfo });
32
- const xList = calcXRulerScaleList({ viewScaleInfo, viewSizeInfo });
33
- drawXRuler(helperContext, { scaleList: xList });
34
- const yList = calcYRulerScaleList({ viewScaleInfo, viewSizeInfo });
35
- drawYRuler(helperContext, { scaleList: yList });
47
+ drawRulerBackground(overlayContext, { viewScaleInfo, viewSizeInfo, style });
48
+ drawScrollerSelectedArea(overlayContext, { snapshot, calculator, style });
49
+ const { list: xList, rulerUnit } = calcXRulerScaleList({ viewScaleInfo, viewSizeInfo });
50
+ drawXRuler(overlayContext, { scaleList: xList, style });
51
+ const { list: yList } = calcYRulerScaleList({ viewScaleInfo, viewSizeInfo });
52
+ drawYRuler(overlayContext, { scaleList: yList, style });
36
53
  if (showGrid === true) {
37
- drawUnderGrid(underContext, {
54
+ const ctx = rulerUnit === 1 ? overlayContext : underlayContext;
55
+ drawGrid(ctx, {
38
56
  xList,
39
57
  yList,
40
58
  viewScaleInfo,
41
- viewSizeInfo
59
+ viewSizeInfo,
60
+ style
42
61
  });
43
62
  }
44
63
  }
@@ -0,0 +1,3 @@
1
+ import { keySelectedElementList, keyActionType } from '../selector';
2
+ import type { DeepSelectorSharedStorage } from '../selector';
3
+ export type DeepRulerSharedStorage = Pick<DeepSelectorSharedStorage, typeof keySelectedElementList | typeof keyActionType>;
@@ -0,0 +1 @@
1
+ export {};