@idraw/core 0.4.0-beta.3 → 0.4.0-beta.30

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 (63) hide show
  1. package/dist/esm/config.d.ts +1 -0
  2. package/dist/esm/config.js +1 -0
  3. package/dist/esm/index.d.ts +15 -5
  4. package/dist/esm/index.js +29 -8
  5. package/dist/esm/lib/cursor-image.d.ts +1 -0
  6. package/dist/esm/lib/cursor-image.js +1 -0
  7. package/dist/esm/lib/cursor.d.ts +3 -12
  8. package/dist/esm/lib/cursor.js +136 -112
  9. package/dist/esm/middleware/dragger/index.d.ts +2 -2
  10. package/dist/esm/middleware/dragger/index.js +1 -0
  11. package/dist/esm/middleware/info/draw-info.d.ts +31 -0
  12. package/dist/esm/middleware/info/draw-info.js +110 -0
  13. package/dist/esm/middleware/info/index.d.ts +3 -0
  14. package/dist/esm/middleware/info/index.js +110 -0
  15. package/dist/esm/middleware/info/types.d.ts +3 -0
  16. package/dist/esm/middleware/info/types.js +1 -0
  17. package/dist/esm/middleware/layout-selector/config.d.ts +9 -0
  18. package/dist/esm/middleware/layout-selector/config.js +9 -0
  19. package/dist/esm/middleware/layout-selector/index.d.ts +5 -0
  20. package/dist/esm/middleware/layout-selector/index.js +332 -0
  21. package/dist/esm/middleware/layout-selector/types.d.ts +15 -0
  22. package/dist/esm/middleware/layout-selector/types.js +2 -0
  23. package/dist/esm/middleware/layout-selector/util.d.ts +8 -0
  24. package/dist/esm/middleware/layout-selector/util.js +108 -0
  25. package/dist/esm/middleware/ruler/index.d.ts +3 -2
  26. package/dist/esm/middleware/ruler/index.js +12 -9
  27. package/dist/esm/middleware/ruler/types.d.ts +3 -0
  28. package/dist/esm/middleware/ruler/types.js +1 -0
  29. package/dist/esm/middleware/ruler/util.d.ts +15 -4
  30. package/dist/esm/middleware/ruler/util.js +81 -4
  31. package/dist/esm/middleware/scaler/index.d.ts +2 -2
  32. package/dist/esm/middleware/scaler/index.js +1 -0
  33. package/dist/esm/middleware/scroller/config.d.ts +2 -0
  34. package/dist/esm/middleware/scroller/config.js +2 -0
  35. package/dist/esm/middleware/scroller/index.d.ts +2 -1
  36. package/dist/esm/middleware/scroller/index.js +33 -5
  37. package/dist/esm/middleware/scroller/types.d.ts +11 -0
  38. package/dist/esm/middleware/scroller/types.js +1 -0
  39. package/dist/esm/middleware/scroller/util.d.ts +1 -1
  40. package/dist/esm/middleware/scroller/util.js +22 -17
  41. package/dist/esm/middleware/selector/config.d.ts +12 -0
  42. package/dist/esm/middleware/selector/config.js +12 -0
  43. package/dist/esm/middleware/selector/draw-auxiliary.d.ts +7 -0
  44. package/dist/esm/middleware/selector/draw-auxiliary.js +46 -0
  45. package/dist/esm/middleware/selector/draw-base.d.ts +30 -0
  46. package/dist/esm/middleware/selector/draw-base.js +100 -0
  47. package/dist/esm/middleware/selector/draw-reference.d.ts +5 -0
  48. package/dist/esm/middleware/selector/draw-reference.js +31 -0
  49. package/dist/esm/middleware/selector/draw-wrapper.d.ts +9 -1
  50. package/dist/esm/middleware/selector/draw-wrapper.js +34 -26
  51. package/dist/esm/middleware/selector/index.d.ts +7 -4
  52. package/dist/esm/middleware/selector/index.js +280 -45
  53. package/dist/esm/middleware/selector/reference.d.ts +13 -0
  54. package/dist/esm/middleware/selector/reference.js +267 -0
  55. package/dist/esm/middleware/selector/types.d.ts +9 -4
  56. package/dist/esm/middleware/selector/types.js +2 -1
  57. package/dist/esm/middleware/selector/util.d.ts +11 -2
  58. package/dist/esm/middleware/selector/util.js +36 -14
  59. package/dist/esm/middleware/text-editor/index.d.ts +20 -2
  60. package/dist/esm/middleware/text-editor/index.js +92 -16
  61. package/dist/index.global.js +3685 -953
  62. package/dist/index.global.min.js +1 -1
  63. package/package.json +5 -5
@@ -0,0 +1,110 @@
1
+ import { formatNumber, getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot, createUUID, limitAngle, rotatePoint, parseAngleToRadian } from '@idraw/util';
2
+ import { keySelectedElementList, keyActionType, keyGroupQueue } from '../selector';
3
+ import { drawSizeInfoText, drawPositionInfoText, drawAngleInfoText } from './draw-info';
4
+ const infoBackground = '#1973bac6';
5
+ const infoTextColor = '#ffffff';
6
+ const infoFontSize = 10;
7
+ const infoLineHeight = 16;
8
+ export const MiddlewareInfo = (opts) => {
9
+ const { boardContent, calculator } = opts;
10
+ const { overlayContext } = boardContent;
11
+ return {
12
+ name: '@middleware/info',
13
+ beforeDrawFrame({ snapshot }) {
14
+ const { sharedStore } = snapshot;
15
+ const selectedElementList = sharedStore[keySelectedElementList];
16
+ const actionType = sharedStore[keyActionType];
17
+ const groupQueue = sharedStore[keyGroupQueue] || [];
18
+ if (selectedElementList.length === 1) {
19
+ const elem = selectedElementList[0];
20
+ if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
21
+ const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
22
+ const viewSizeInfo = getViewSizeInfoFromSnapshot(snapshot);
23
+ const { x, y, w, h, angle } = elem;
24
+ const totalGroupQueue = [
25
+ ...groupQueue,
26
+ ...[
27
+ {
28
+ uuid: createUUID(),
29
+ x,
30
+ y,
31
+ w,
32
+ h,
33
+ angle,
34
+ type: 'group',
35
+ detail: { children: [] }
36
+ }
37
+ ]
38
+ ];
39
+ const calcOpts = { viewScaleInfo, viewSizeInfo };
40
+ const rangeRectInfo = calculator.calcViewRectInfoFromOrigin(elem.uuid, calcOpts);
41
+ let totalAngle = 0;
42
+ totalGroupQueue.forEach((group) => {
43
+ totalAngle += group.angle || 0;
44
+ });
45
+ const totalRadian = parseAngleToRadian(limitAngle(0 - totalAngle));
46
+ if (rangeRectInfo) {
47
+ const elemCenter = rangeRectInfo === null || rangeRectInfo === void 0 ? void 0 : rangeRectInfo.center;
48
+ const rectInfo = {
49
+ topLeft: rotatePoint(elemCenter, rangeRectInfo.topLeft, totalRadian),
50
+ topRight: rotatePoint(elemCenter, rangeRectInfo.topRight, totalRadian),
51
+ bottomRight: rotatePoint(elemCenter, rangeRectInfo.bottomRight, totalRadian),
52
+ bottomLeft: rotatePoint(elemCenter, rangeRectInfo.bottomLeft, totalRadian),
53
+ center: rotatePoint(elemCenter, rangeRectInfo.center, totalRadian),
54
+ top: rotatePoint(elemCenter, rangeRectInfo.top, totalRadian),
55
+ right: rotatePoint(elemCenter, rangeRectInfo.right, totalRadian),
56
+ bottom: rotatePoint(elemCenter, rangeRectInfo.bottom, totalRadian),
57
+ left: rotatePoint(elemCenter, rangeRectInfo.left, totalRadian)
58
+ };
59
+ const x = formatNumber(elem.x, { decimalPlaces: 2 });
60
+ const y = formatNumber(elem.y, { decimalPlaces: 2 });
61
+ const w = formatNumber(elem.w, { decimalPlaces: 2 });
62
+ const h = formatNumber(elem.h, { decimalPlaces: 2 });
63
+ const xyText = `${formatNumber(x, { decimalPlaces: 0 })},${formatNumber(y, { decimalPlaces: 0 })}`;
64
+ const whText = `${formatNumber(w, { decimalPlaces: 0 })}x${formatNumber(h, { decimalPlaces: 0 })}`;
65
+ const angleText = `${formatNumber(elem.angle || 0, { decimalPlaces: 0 })}°`;
66
+ drawSizeInfoText(overlayContext, {
67
+ point: {
68
+ x: rectInfo.bottom.x,
69
+ y: rectInfo.bottom.y + infoFontSize
70
+ },
71
+ rotateCenter: rectInfo.center,
72
+ angle: totalAngle,
73
+ text: whText,
74
+ fontSize: infoFontSize,
75
+ lineHeight: infoLineHeight,
76
+ color: infoTextColor,
77
+ background: infoBackground
78
+ });
79
+ drawPositionInfoText(overlayContext, {
80
+ point: {
81
+ x: rectInfo.topLeft.x,
82
+ y: rectInfo.topLeft.y - infoFontSize * 2
83
+ },
84
+ rotateCenter: rectInfo.center,
85
+ angle: totalAngle,
86
+ text: xyText,
87
+ fontSize: infoFontSize,
88
+ lineHeight: infoLineHeight,
89
+ color: infoTextColor,
90
+ background: infoBackground
91
+ });
92
+ drawAngleInfoText(overlayContext, {
93
+ point: {
94
+ x: rectInfo.top.x + infoFontSize,
95
+ y: rectInfo.top.y - infoFontSize * 2
96
+ },
97
+ rotateCenter: rectInfo.center,
98
+ angle: totalAngle,
99
+ text: angleText,
100
+ fontSize: infoFontSize,
101
+ lineHeight: infoLineHeight,
102
+ color: infoTextColor,
103
+ background: infoBackground
104
+ });
105
+ }
106
+ }
107
+ }
108
+ }
109
+ };
110
+ };
@@ -0,0 +1,3 @@
1
+ import { keySelectedElementList, keyActionType, keyGroupQueue } from '../selector';
2
+ import type { DeepSelectorSharedStorage } from '../selector';
3
+ export type DeepInfoSharedStorage = Pick<DeepSelectorSharedStorage, typeof keySelectedElementList | typeof keyActionType | typeof keyGroupQueue>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ export declare const key = "LAYOUT_SELECT";
2
+ export declare const keyLayoutActionType: unique symbol;
3
+ export declare const keyLayoutControlType: unique symbol;
4
+ export declare const keyLayoutController: unique symbol;
5
+ export declare const keyLayoutIsHover: unique symbol;
6
+ export declare const keyLayoutIsSelected: unique symbol;
7
+ export declare const selectColor = "#b331c9";
8
+ export declare const disableColor = "#5b5959b5";
9
+ export declare const controllerSize = 10;
@@ -0,0 +1,9 @@
1
+ export const key = 'LAYOUT_SELECT';
2
+ export const keyLayoutActionType = Symbol(`${key}_layoutActionType`);
3
+ export const keyLayoutControlType = Symbol(`${key}_layoutControlType`);
4
+ export const keyLayoutController = Symbol(`${key}_layoutController`);
5
+ export const keyLayoutIsHover = Symbol(`${key}_layoutIsHover`);
6
+ export const keyLayoutIsSelected = Symbol(`${key}_layoutIsSelected`);
7
+ export const selectColor = '#b331c9';
8
+ export const disableColor = '#5b5959b5';
9
+ export const controllerSize = 10;
@@ -0,0 +1,5 @@
1
+ import type { BoardMiddleware } from '@idraw/types';
2
+ import type { LayoutSelectorSharedStorage } from './types';
3
+ import { keyLayoutIsSelected } from './config';
4
+ export { keyLayoutIsSelected };
5
+ export declare const MiddlewareLayoutSelector: BoardMiddleware<LayoutSelectorSharedStorage>;
@@ -0,0 +1,332 @@
1
+ import { calcLayoutSizeController, isViewPointInVertexes, getViewScaleInfoFromSnapshot, isViewPointInElementSize, calcViewElementSize } from '@idraw/util';
2
+ import { keyLayoutActionType, keyLayoutController, keyLayoutControlType, keyLayoutIsHover, keyLayoutIsSelected, controllerSize } from './config';
3
+ import { keyActionType as keyElementActionType, keyHoverElement, middlewareEventSelectClear } from '../selector';
4
+ import { drawLayoutController, drawLayoutHover } from './util';
5
+ import { eventChange } from '../../config';
6
+ export { keyLayoutIsSelected };
7
+ export const MiddlewareLayoutSelector = (opts) => {
8
+ const { sharer, boardContent, calculator, viewer, eventHub } = opts;
9
+ const { overlayContext } = boardContent;
10
+ let prevPoint = null;
11
+ let prevIsHover = null;
12
+ let prevIsSelected = null;
13
+ let isBusy = null;
14
+ const clear = () => {
15
+ prevPoint = null;
16
+ sharer.setSharedStorage(keyLayoutActionType, null);
17
+ sharer.setSharedStorage(keyLayoutControlType, null);
18
+ sharer.setSharedStorage(keyLayoutController, null);
19
+ sharer.setSharedStorage(keyLayoutIsHover, null);
20
+ sharer.setSharedStorage(keyLayoutIsSelected, null);
21
+ prevIsHover = null;
22
+ prevIsSelected = null;
23
+ isBusy = null;
24
+ };
25
+ const isInElementHover = () => {
26
+ const hoverElement = sharer.getSharedStorage(keyHoverElement);
27
+ if (hoverElement) {
28
+ clear();
29
+ return true;
30
+ }
31
+ return false;
32
+ };
33
+ const isInElementAction = () => {
34
+ const elementActionType = sharer.getSharedStorage(keyElementActionType);
35
+ if (elementActionType && elementActionType !== 'area') {
36
+ clear();
37
+ return true;
38
+ }
39
+ return false;
40
+ };
41
+ const getLayoutSize = () => {
42
+ const data = sharer.getActiveStorage('data');
43
+ if (data === null || data === void 0 ? void 0 : data.layout) {
44
+ const { x, y, w, h } = data.layout;
45
+ return { x, y, w, h };
46
+ }
47
+ return null;
48
+ };
49
+ const isInLayout = (p) => {
50
+ const size = getLayoutSize();
51
+ if (size) {
52
+ const { x, y, w, h } = size;
53
+ const viewScaleInfo = sharer.getActiveViewScaleInfo();
54
+ const viewSize = calcViewElementSize({
55
+ x: x - controllerSize / 2,
56
+ y: y - controllerSize / 2,
57
+ w: w + controllerSize,
58
+ h: h + controllerSize
59
+ }, { viewScaleInfo });
60
+ return isViewPointInElementSize(p, viewSize);
61
+ }
62
+ return false;
63
+ };
64
+ const resetController = () => {
65
+ const viewScaleInfo = sharer.getActiveViewScaleInfo();
66
+ const size = getLayoutSize();
67
+ if (size) {
68
+ const controller = calcLayoutSizeController(size, { viewScaleInfo, controllerSize: 10 });
69
+ sharer.setSharedStorage(keyLayoutController, controller);
70
+ }
71
+ else {
72
+ sharer.setSharedStorage(keyLayoutController, null);
73
+ }
74
+ };
75
+ const resetControlType = (e) => {
76
+ const data = sharer.getActiveStorage('data');
77
+ const controller = sharer.getSharedStorage(keyLayoutController);
78
+ if (controller && (data === null || data === void 0 ? void 0 : data.layout) && (e === null || e === void 0 ? void 0 : e.point)) {
79
+ let layoutControlType = null;
80
+ if (controller) {
81
+ const { topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left } = controller;
82
+ const list = [topLeft, top, topRight, right, bottomRight, bottom, bottomLeft, left];
83
+ for (let i = 0; i < list.length; i++) {
84
+ const item = list[i];
85
+ if (isViewPointInVertexes(e.point, item.vertexes)) {
86
+ layoutControlType = `${item.type}`;
87
+ break;
88
+ }
89
+ }
90
+ if (layoutControlType) {
91
+ sharer.setSharedStorage(keyLayoutControlType, layoutControlType);
92
+ eventHub.trigger(middlewareEventSelectClear, {});
93
+ return layoutControlType;
94
+ }
95
+ }
96
+ }
97
+ return null;
98
+ };
99
+ const updateCursor = (controlType) => {
100
+ if (isBusy === true) {
101
+ return;
102
+ }
103
+ eventHub.trigger('cursor', {
104
+ type: controlType ? `resize-${controlType}` : controlType,
105
+ groupQueue: [],
106
+ element: getLayoutSize()
107
+ });
108
+ };
109
+ return {
110
+ name: '@middleware/layout-selector',
111
+ use: () => {
112
+ clear();
113
+ resetController();
114
+ },
115
+ hover: (e) => {
116
+ if (isBusy === true) {
117
+ return;
118
+ }
119
+ if (isInElementAction()) {
120
+ return;
121
+ }
122
+ if (isInElementHover()) {
123
+ return;
124
+ }
125
+ if (isInLayout(e.point)) {
126
+ sharer.setSharedStorage(keyLayoutIsHover, true);
127
+ }
128
+ else {
129
+ sharer.setSharedStorage(keyLayoutIsHover, false);
130
+ if (prevIsHover === true) {
131
+ viewer.drawFrame();
132
+ prevIsHover = false;
133
+ }
134
+ }
135
+ if (sharer.getSharedStorage(keyLayoutIsSelected) === true) {
136
+ const prevLayoutActionType = sharer.getSharedStorage(keyLayoutActionType);
137
+ const data = sharer.getActiveStorage('data');
138
+ if (data === null || data === void 0 ? void 0 : data.layout) {
139
+ if (prevLayoutActionType !== 'resize') {
140
+ resetController();
141
+ const layoutControlType = resetControlType(e);
142
+ if (layoutControlType) {
143
+ updateCursor(layoutControlType);
144
+ }
145
+ else {
146
+ updateCursor();
147
+ sharer.setSharedStorage(keyLayoutActionType, null);
148
+ }
149
+ }
150
+ else {
151
+ const layoutControlType = resetControlType(e);
152
+ updateCursor(layoutControlType);
153
+ }
154
+ }
155
+ return;
156
+ }
157
+ if (sharer.getSharedStorage(keyLayoutIsHover) && !prevIsHover) {
158
+ viewer.drawFrame();
159
+ }
160
+ prevIsHover = sharer.getSharedStorage(keyLayoutIsHover);
161
+ },
162
+ pointStart: (e) => {
163
+ if (isInElementAction()) {
164
+ return;
165
+ }
166
+ if (isInLayout(e.point)) {
167
+ sharer.setSharedStorage(keyLayoutIsSelected, true);
168
+ }
169
+ else {
170
+ if (prevIsSelected === true) {
171
+ clear();
172
+ viewer.drawFrame();
173
+ }
174
+ sharer.setSharedStorage(keyLayoutIsSelected, false);
175
+ }
176
+ resetController();
177
+ const layoutControlType = resetControlType(e);
178
+ prevPoint = e.point;
179
+ if (layoutControlType) {
180
+ sharer.setSharedStorage(keyLayoutActionType, 'resize');
181
+ }
182
+ if (sharer.getSharedStorage(keyLayoutIsSelected) === true && !prevIsSelected) {
183
+ viewer.drawFrame();
184
+ }
185
+ prevIsSelected = sharer.getSharedStorage(keyLayoutIsSelected);
186
+ },
187
+ pointMove: (e) => {
188
+ if (!sharer.getSharedStorage(keyLayoutIsSelected)) {
189
+ if (isInElementAction()) {
190
+ return;
191
+ }
192
+ }
193
+ const layoutActionType = sharer.getSharedStorage(keyLayoutActionType);
194
+ const layoutControlType = sharer.getSharedStorage(keyLayoutControlType);
195
+ const data = sharer.getActiveStorage('data');
196
+ if (layoutActionType === 'resize' && layoutControlType && (data === null || data === void 0 ? void 0 : data.layout)) {
197
+ if (prevPoint) {
198
+ isBusy = true;
199
+ const scale = sharer.getActiveStorage('scale');
200
+ const viewMoveX = e.point.x - prevPoint.x;
201
+ const viewMoveY = e.point.y - prevPoint.y;
202
+ const moveX = viewMoveX / scale;
203
+ const moveY = viewMoveY / scale;
204
+ const { x, y, w, h, operations = {} } = data.layout;
205
+ const { position = 'absolute' } = operations;
206
+ if (layoutControlType === 'top') {
207
+ if (position === 'relative') {
208
+ data.layout.h = calculator.toGridNum(h - moveY);
209
+ viewer.scroll({ moveY: viewMoveY });
210
+ }
211
+ else {
212
+ data.layout.y = calculator.toGridNum(y + moveY);
213
+ data.layout.h = calculator.toGridNum(h - moveY);
214
+ }
215
+ }
216
+ else if (layoutControlType === 'right') {
217
+ data.layout.w = calculator.toGridNum(w + moveX);
218
+ }
219
+ else if (layoutControlType === 'bottom') {
220
+ data.layout.h = calculator.toGridNum(h + moveY);
221
+ }
222
+ else if (layoutControlType === 'left') {
223
+ if (position === 'relative') {
224
+ data.layout.w = calculator.toGridNum(w - moveX);
225
+ viewer.scroll({ moveX: viewMoveX });
226
+ }
227
+ else {
228
+ data.layout.x = calculator.toGridNum(x + moveX);
229
+ data.layout.w = calculator.toGridNum(w - moveX);
230
+ }
231
+ }
232
+ else if (layoutControlType === 'top-left') {
233
+ if (position === 'relative') {
234
+ data.layout.w = calculator.toGridNum(w - moveX);
235
+ data.layout.h = calculator.toGridNum(h - moveY);
236
+ viewer.scroll({ moveX: viewMoveX, moveY: viewMoveY });
237
+ }
238
+ else {
239
+ data.layout.x = calculator.toGridNum(x + moveX);
240
+ data.layout.y = calculator.toGridNum(y + moveY);
241
+ data.layout.w = calculator.toGridNum(w - moveX);
242
+ data.layout.h = calculator.toGridNum(h - moveY);
243
+ }
244
+ }
245
+ else if (layoutControlType === 'top-right') {
246
+ if (position === 'relative') {
247
+ viewer.scroll({
248
+ moveY: viewMoveY
249
+ });
250
+ data.layout.w = calculator.toGridNum(w + moveX);
251
+ data.layout.h = calculator.toGridNum(h - moveY);
252
+ }
253
+ else {
254
+ data.layout.y = calculator.toGridNum(y + moveY);
255
+ data.layout.w = calculator.toGridNum(w + moveX);
256
+ data.layout.h = calculator.toGridNum(h - moveY);
257
+ }
258
+ }
259
+ else if (layoutControlType === 'bottom-right') {
260
+ data.layout.w = calculator.toGridNum(w + moveX);
261
+ data.layout.h = calculator.toGridNum(h + moveY);
262
+ }
263
+ else if (layoutControlType === 'bottom-left') {
264
+ if (position === 'relative') {
265
+ viewer.scroll({
266
+ moveX: viewMoveX
267
+ });
268
+ data.layout.w = calculator.toGridNum(w - moveX);
269
+ data.layout.h = calculator.toGridNum(h + moveY);
270
+ }
271
+ else {
272
+ data.layout.x = calculator.toGridNum(x + moveX);
273
+ data.layout.w = calculator.toGridNum(w - moveX);
274
+ data.layout.h = calculator.toGridNum(h + moveY);
275
+ }
276
+ }
277
+ }
278
+ prevPoint = e.point;
279
+ resetController();
280
+ viewer.drawFrame();
281
+ return false;
282
+ }
283
+ if (['resize'].includes(layoutActionType)) {
284
+ return false;
285
+ }
286
+ },
287
+ pointEnd: () => {
288
+ isBusy = false;
289
+ const layoutActionType = sharer.getSharedStorage(keyLayoutActionType);
290
+ const layoutControlType = sharer.getSharedStorage(keyLayoutControlType);
291
+ const data = sharer.getActiveStorage('data');
292
+ if (data && layoutActionType === 'resize' && layoutControlType) {
293
+ eventHub.trigger(eventChange, {
294
+ type: 'changeLayout',
295
+ data
296
+ });
297
+ }
298
+ },
299
+ beforeDrawFrame: ({ snapshot }) => {
300
+ var _a;
301
+ if (isInElementAction()) {
302
+ return;
303
+ }
304
+ const { sharedStore, activeStore } = snapshot;
305
+ const layoutActionType = sharedStore[keyLayoutActionType];
306
+ const layoutIsHover = sharedStore[keyLayoutIsHover];
307
+ const layoutIsSelected = sharedStore[keyLayoutIsSelected];
308
+ if ((_a = activeStore.data) === null || _a === void 0 ? void 0 : _a.layout) {
309
+ const { x, y, w, h } = activeStore.data.layout;
310
+ const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
311
+ const size = { x, y, w, h };
312
+ const controller = calcLayoutSizeController(size, { viewScaleInfo, controllerSize });
313
+ if (layoutIsHover === true) {
314
+ const viewSize = calcViewElementSize(size, { viewScaleInfo });
315
+ drawLayoutHover(overlayContext, { layoutSize: viewSize });
316
+ }
317
+ if ((layoutActionType && ['resize'].includes(layoutActionType)) || layoutIsSelected === true) {
318
+ drawLayoutController(overlayContext, { controller, operations: activeStore.data.layout.operations || {} });
319
+ }
320
+ }
321
+ },
322
+ scrollX: () => {
323
+ clear();
324
+ },
325
+ scrollY: () => {
326
+ clear();
327
+ },
328
+ wheelScale: () => {
329
+ clear();
330
+ }
331
+ };
332
+ };
@@ -0,0 +1,15 @@
1
+ import type { LayoutSizeController, Element } from '@idraw/types';
2
+ import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHover, keyLayoutIsSelected } 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
+ [keyLayoutIsHover]: boolean | null;
14
+ [keyLayoutIsSelected]: boolean | null;
15
+ };
@@ -0,0 +1,2 @@
1
+ import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHover, keyLayoutIsSelected } from './config';
2
+ import { keyActionType as keyElementActionType, keyHoverElement } from '../selector';
@@ -0,0 +1,8 @@
1
+ import type { ViewContext2D, LayoutSizeController, DataLayout, ElementSize } from '@idraw/types';
2
+ export declare function drawLayoutController(ctx: ViewContext2D, opts: {
3
+ controller: LayoutSizeController;
4
+ operations: DataLayout['operations'];
5
+ }): void;
6
+ export declare function drawLayoutHover(ctx: ViewContext2D, opts: {
7
+ layoutSize: ElementSize;
8
+ }): void;
@@ -0,0 +1,108 @@
1
+ import { selectColor, disableColor } from './config';
2
+ function drawControllerBox(ctx, boxVertexes) {
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();
12
+ ctx.strokeStyle = selectColor;
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 drawControllerCross(ctx, opts) {
23
+ const { vertexes, strokeStyle, lineWidth } = opts;
24
+ ctx.setLineDash([]);
25
+ ctx.strokeStyle = strokeStyle;
26
+ ctx.lineWidth = lineWidth;
27
+ ctx.beginPath();
28
+ ctx.moveTo(vertexes[0].x, vertexes[0].y);
29
+ ctx.lineTo(vertexes[2].x, vertexes[2].y);
30
+ ctx.closePath();
31
+ ctx.stroke();
32
+ ctx.beginPath();
33
+ ctx.moveTo(vertexes[1].x, vertexes[1].y);
34
+ ctx.lineTo(vertexes[3].x, vertexes[3].y);
35
+ ctx.closePath();
36
+ ctx.stroke();
37
+ }
38
+ function drawControllerLine(ctx, opts) {
39
+ const { start, end, centerVertexes, disabled } = opts;
40
+ const lineWidth = disabled === true ? 1 : 2;
41
+ const strokeStyle = disabled === true ? disableColor : selectColor;
42
+ ctx.setLineDash([]);
43
+ ctx.strokeStyle = strokeStyle;
44
+ ctx.lineWidth = lineWidth;
45
+ ctx.beginPath();
46
+ ctx.moveTo(start.x, start.y);
47
+ ctx.lineTo(end.x, end.y);
48
+ ctx.closePath();
49
+ ctx.stroke();
50
+ if (disabled === true) {
51
+ drawControllerCross(ctx, {
52
+ vertexes: centerVertexes,
53
+ lineWidth,
54
+ strokeStyle
55
+ });
56
+ }
57
+ }
58
+ export function drawLayoutController(ctx, opts) {
59
+ const { controller, operations } = opts;
60
+ const { topLeft, topRight, bottomLeft, bottomRight, topMiddle, rightMiddle, bottomMiddle, leftMiddle } = controller;
61
+ drawControllerLine(ctx, { start: topLeft.center, end: topRight.center, centerVertexes: topMiddle.vertexes, disabled: !!(operations === null || operations === void 0 ? void 0 : operations.disabledTop) });
62
+ drawControllerLine(ctx, { start: topRight.center, end: bottomRight.center, centerVertexes: rightMiddle.vertexes, disabled: !!(operations === null || operations === void 0 ? void 0 : operations.disabledRight) });
63
+ drawControllerLine(ctx, { start: bottomRight.center, end: bottomLeft.center, centerVertexes: bottomMiddle.vertexes, disabled: !!(operations === null || operations === void 0 ? void 0 : operations.disabledBottom) });
64
+ drawControllerLine(ctx, { start: bottomLeft.center, end: topLeft.center, centerVertexes: leftMiddle.vertexes, disabled: !!(operations === null || operations === void 0 ? void 0 : operations.disabledLeft) });
65
+ const disabledOpts = {
66
+ lineWidth: 1,
67
+ strokeStyle: disableColor
68
+ };
69
+ if ((operations === null || operations === void 0 ? void 0 : operations.disabledTopLeft) === true) {
70
+ drawControllerCross(ctx, Object.assign({ vertexes: topLeft.vertexes }, disabledOpts));
71
+ }
72
+ else {
73
+ drawControllerBox(ctx, topLeft.vertexes);
74
+ }
75
+ if ((operations === null || operations === void 0 ? void 0 : operations.disabledTopRight) === true) {
76
+ drawControllerCross(ctx, Object.assign({ vertexes: topRight.vertexes }, disabledOpts));
77
+ }
78
+ else {
79
+ drawControllerBox(ctx, topRight.vertexes);
80
+ }
81
+ if ((operations === null || operations === void 0 ? void 0 : operations.disabledBottomRight) === true) {
82
+ drawControllerCross(ctx, Object.assign({ vertexes: bottomRight.vertexes }, disabledOpts));
83
+ }
84
+ else {
85
+ drawControllerBox(ctx, bottomRight.vertexes);
86
+ }
87
+ if ((operations === null || operations === void 0 ? void 0 : operations.disabledBottomLeft) === true) {
88
+ drawControllerCross(ctx, Object.assign({ vertexes: bottomLeft.vertexes }, disabledOpts));
89
+ }
90
+ else {
91
+ drawControllerBox(ctx, bottomLeft.vertexes);
92
+ }
93
+ }
94
+ export function drawLayoutHover(ctx, opts) {
95
+ const { layoutSize } = opts;
96
+ const { x, y, w, h } = layoutSize;
97
+ ctx.setLineDash([]);
98
+ ctx.strokeStyle = selectColor;
99
+ ctx.lineWidth = 1;
100
+ ctx.beginPath();
101
+ ctx.moveTo(x, y);
102
+ ctx.lineTo(x + w, y);
103
+ ctx.lineTo(x + w, y + h);
104
+ ctx.lineTo(x, y + h);
105
+ ctx.lineTo(x, y);
106
+ ctx.closePath();
107
+ ctx.stroke();
108
+ }
@@ -1,3 +1,4 @@
1
- import type { BoardMiddleware, CoreEvent } from '@idraw/types';
1
+ import type { BoardMiddleware, CoreEventMap } from '@idraw/types';
2
+ import type { DeepRulerSharedStorage } from './types';
2
3
  export declare const middlewareEventRuler = "@middleware/show-ruler";
3
- export declare const MiddlewareRuler: BoardMiddleware<Record<string, any>, CoreEvent>;
4
+ export declare const MiddlewareRuler: BoardMiddleware<DeepRulerSharedStorage, CoreEventMap>;
@@ -1,9 +1,9 @@
1
1
  import { getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot } from '@idraw/util';
2
- import { drawRulerBackground, drawXRuler, drawYRuler, calcXRulerScaleList, calcYRulerScaleList, drawUnderGrid } from './util';
2
+ import { drawRulerBackground, drawXRuler, drawYRuler, calcXRulerScaleList, calcYRulerScaleList, drawGrid, drawScrollerSelectedArea } from './util';
3
3
  export const middlewareEventRuler = '@middleware/show-ruler';
4
4
  export const MiddlewareRuler = (opts) => {
5
- const { boardContent, viewer, eventHub } = opts;
6
- const { helperContext, underContext } = boardContent;
5
+ const { boardContent, viewer, eventHub, calculator } = opts;
6
+ const { overlayContext, underlayContext } = boardContent;
7
7
  let show = true;
8
8
  let showGrid = true;
9
9
  const rulerCallback = (e) => {
@@ -18,6 +18,7 @@ export const MiddlewareRuler = (opts) => {
18
18
  }
19
19
  };
20
20
  return {
21
+ name: '@middleware/ruler',
21
22
  use() {
22
23
  eventHub.on(middlewareEventRuler, rulerCallback);
23
24
  },
@@ -28,13 +29,15 @@ export const MiddlewareRuler = (opts) => {
28
29
  if (show === true) {
29
30
  const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
30
31
  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 });
32
+ drawScrollerSelectedArea(overlayContext, { snapshot, calculator });
33
+ drawRulerBackground(overlayContext, { viewScaleInfo, viewSizeInfo });
34
+ const { list: xList, rulerUnit } = calcXRulerScaleList({ viewScaleInfo, viewSizeInfo });
35
+ drawXRuler(overlayContext, { scaleList: xList });
36
+ const { list: yList } = calcYRulerScaleList({ viewScaleInfo, viewSizeInfo });
37
+ drawYRuler(overlayContext, { scaleList: yList });
36
38
  if (showGrid === true) {
37
- drawUnderGrid(underContext, {
39
+ const ctx = rulerUnit === 1 ? overlayContext : underlayContext;
40
+ drawGrid(ctx, {
38
41
  xList,
39
42
  yList,
40
43
  viewScaleInfo,