@idraw/core 0.4.0-beta.35 → 0.4.0-beta.37

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 (30) hide show
  1. package/dist/esm/index.js +1 -0
  2. package/dist/esm/middleware/info/config.d.ts +1 -0
  3. package/dist/esm/middleware/info/config.js +1 -0
  4. package/dist/esm/middleware/info/draw-info.d.ts +1 -1
  5. package/dist/esm/middleware/info/index.d.ts +7 -1
  6. package/dist/esm/middleware/info/index.js +27 -14
  7. package/dist/esm/middleware/layout-selector/config.d.ts +3 -1
  8. package/dist/esm/middleware/layout-selector/config.js +3 -1
  9. package/dist/esm/middleware/layout-selector/index.d.ts +2 -2
  10. package/dist/esm/middleware/layout-selector/index.js +40 -32
  11. package/dist/esm/middleware/layout-selector/types.d.ts +4 -2
  12. package/dist/esm/middleware/layout-selector/types.js +1 -1
  13. package/dist/esm/middleware/selector/config.d.ts +2 -0
  14. package/dist/esm/middleware/selector/config.js +2 -0
  15. package/dist/esm/middleware/selector/draw-debug.d.ts +5 -0
  16. package/dist/esm/middleware/selector/draw-debug.js +30 -0
  17. package/dist/esm/middleware/selector/draw-wrapper.d.ts +1 -0
  18. package/dist/esm/middleware/selector/draw-wrapper.js +8 -6
  19. package/dist/esm/middleware/selector/index.d.ts +6 -1
  20. package/dist/esm/middleware/selector/index.js +46 -30
  21. package/dist/esm/middleware/selector/pattern/icon-rotate.d.ts +4 -0
  22. package/dist/esm/middleware/selector/pattern/icon-rotate.js +88 -0
  23. package/dist/esm/middleware/selector/pattern/index.d.ts +5 -0
  24. package/dist/esm/middleware/selector/pattern/index.js +38 -0
  25. package/dist/esm/middleware/selector/types.d.ts +2 -1
  26. package/dist/esm/middleware/selector/types.js +1 -1
  27. package/dist/esm/middleware/selector/util.js +1 -1
  28. package/dist/index.global.js +760 -551
  29. package/dist/index.global.min.js +1 -1
  30. package/package.json +5 -5
package/dist/esm/index.js CHANGED
@@ -32,6 +32,7 @@ export class Core {
32
32
  const { devicePixelRatio = 1, width, height, createCustomContext2D } = opts;
33
33
  __classPrivateFieldSet(this, _Core_container, container, "f");
34
34
  const canvas = document.createElement('canvas');
35
+ canvas.setAttribute('tabindex', '0');
35
36
  __classPrivateFieldSet(this, _Core_canvas, canvas, "f");
36
37
  __classPrivateFieldGet(this, _Core_instances, "m", _Core_initContainer).call(this);
37
38
  container.appendChild(canvas);
@@ -1,4 +1,5 @@
1
1
  import type { MiddlewareInfoStyle } from '@idraw/types';
2
2
  export declare const infoFontSize = 10;
3
3
  export declare const infoLineHeight = 16;
4
+ export declare const MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE = "@middleware/internal-event/show-info-angle";
4
5
  export declare const defaltStyle: MiddlewareInfoStyle;
@@ -2,6 +2,7 @@ const infoBackground = '#1973bac6';
2
2
  const infoTextColor = '#ffffff';
3
3
  export const infoFontSize = 10;
4
4
  export const infoLineHeight = 16;
5
+ export const MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE = '@middleware/internal-event/show-info-angle';
5
6
  export const defaltStyle = {
6
7
  textBackground: infoBackground,
7
8
  textColor: infoTextColor
@@ -1,5 +1,5 @@
1
1
  import type { PointSize, ViewContext2D } from '@idraw/types';
2
- import type { MiddlewareInfoStyle } from './types';
2
+ import type { MiddlewareInfoStyle } from '@idraw/types';
3
3
  export declare function drawSizeInfoText(ctx: ViewContext2D, opts: {
4
4
  point: PointSize;
5
5
  rotateCenter: PointSize;
@@ -1,3 +1,9 @@
1
1
  import type { BoardMiddleware, MiddlewareInfoConfig, CoreEventMap } from '@idraw/types';
2
2
  import type { DeepInfoSharedStorage } from './types';
3
- export declare const MiddlewareInfo: BoardMiddleware<DeepInfoSharedStorage, CoreEventMap, MiddlewareInfoConfig>;
3
+ import { MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE } from './config';
4
+ export { MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE };
5
+ export declare const MiddlewareInfo: BoardMiddleware<DeepInfoSharedStorage, CoreEventMap & {
6
+ [MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE]: {
7
+ show: boolean;
8
+ };
9
+ }, MiddlewareInfoConfig>;
@@ -1,11 +1,12 @@
1
1
  import { formatNumber, getViewScaleInfoFromSnapshot, getViewSizeInfoFromSnapshot, createUUID, limitAngle, rotatePoint, parseAngleToRadian } from '@idraw/util';
2
2
  import { keySelectedElementList, keyActionType, keyGroupQueue } from '../selector';
3
3
  import { drawSizeInfoText, drawPositionInfoText, drawAngleInfoText } from './draw-info';
4
- import { defaltStyle } from './config';
4
+ import { defaltStyle, MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE } from './config';
5
+ export { MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE };
5
6
  const infoFontSize = 10;
6
7
  const infoLineHeight = 16;
7
8
  export const MiddlewareInfo = (opts, config) => {
8
- const { boardContent, calculator } = opts;
9
+ const { boardContent, calculator, eventHub } = opts;
9
10
  const { overlayContext } = boardContent;
10
11
  const innerConfig = Object.assign(Object.assign({}, defaltStyle), config);
11
12
  const { textBackground, textColor } = innerConfig;
@@ -13,8 +14,18 @@ export const MiddlewareInfo = (opts, config) => {
13
14
  textBackground,
14
15
  textColor
15
16
  };
17
+ let showAngleInfo = true;
18
+ const showInfoAngleCallback = ({ show }) => {
19
+ showAngleInfo = show;
20
+ };
16
21
  return {
17
22
  name: '@middleware/info',
23
+ use() {
24
+ eventHub.on(MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE, showInfoAngleCallback);
25
+ },
26
+ disuse() {
27
+ eventHub.off(MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE, showInfoAngleCallback);
28
+ },
18
29
  beforeDrawFrame({ snapshot }) {
19
30
  const { sharedStore } = snapshot;
20
31
  const selectedElementList = sharedStore[keySelectedElementList];
@@ -92,18 +103,20 @@ export const MiddlewareInfo = (opts, config) => {
92
103
  lineHeight: infoLineHeight,
93
104
  style
94
105
  });
95
- drawAngleInfoText(overlayContext, {
96
- point: {
97
- x: rectInfo.top.x + infoFontSize,
98
- y: rectInfo.top.y - infoFontSize * 2
99
- },
100
- rotateCenter: rectInfo.center,
101
- angle: totalAngle,
102
- text: angleText,
103
- fontSize: infoFontSize,
104
- lineHeight: infoLineHeight,
105
- style
106
- });
106
+ if (showAngleInfo) {
107
+ drawAngleInfoText(overlayContext, {
108
+ point: {
109
+ x: rectInfo.top.x + infoFontSize + 4,
110
+ y: rectInfo.top.y - infoFontSize * 2 - 18
111
+ },
112
+ rotateCenter: rectInfo.center,
113
+ angle: totalAngle,
114
+ text: angleText,
115
+ fontSize: infoFontSize,
116
+ lineHeight: infoLineHeight,
117
+ style
118
+ });
119
+ }
107
120
  }
108
121
  }
109
122
  }
@@ -3,7 +3,9 @@ export declare const key = "LAYOUT_SELECT";
3
3
  export declare const keyLayoutActionType: unique symbol;
4
4
  export declare const keyLayoutControlType: unique symbol;
5
5
  export declare const keyLayoutController: unique symbol;
6
- export declare const keyLayoutIsHover: unique symbol;
6
+ export declare const keyLayoutIsHoverContent: unique symbol;
7
+ export declare const keyLayoutIsHoverController: unique symbol;
7
8
  export declare const keyLayoutIsSelected: unique symbol;
9
+ export declare const keyLayoutIsBusyMoving: unique symbol;
8
10
  export declare const controllerSize = 10;
9
11
  export declare const defaultStyle: MiddlewareLayoutSelectorStyle;
@@ -2,8 +2,10 @@ export const key = 'LAYOUT_SELECT';
2
2
  export const keyLayoutActionType = Symbol(`${key}_layoutActionType`);
3
3
  export const keyLayoutControlType = Symbol(`${key}_layoutControlType`);
4
4
  export const keyLayoutController = Symbol(`${key}_layoutController`);
5
- export const keyLayoutIsHover = Symbol(`${key}_layoutIsHover`);
5
+ export const keyLayoutIsHoverContent = Symbol(`${key}_layoutIsHoverContent`);
6
+ export const keyLayoutIsHoverController = Symbol(`${key}_layoutIsHoverController`);
6
7
  export const keyLayoutIsSelected = Symbol(`${key}_layoutIsSelected`);
8
+ export const keyLayoutIsBusyMoving = Symbol(`${key}_layoutIsSelected`);
7
9
  export const controllerSize = 10;
8
10
  export const defaultStyle = {
9
11
  activeColor: '#b331c9'
@@ -1,5 +1,5 @@
1
1
  import type { BoardMiddleware, MiddlewareLayoutSelectorConfig, CoreEventMap } from '@idraw/types';
2
2
  import type { LayoutSelectorSharedStorage } from './types';
3
- import { keyLayoutIsSelected } from './config';
4
- export { keyLayoutIsSelected };
3
+ import { keyLayoutIsSelected, keyLayoutIsBusyMoving } from './config';
4
+ export { keyLayoutIsSelected, keyLayoutIsBusyMoving };
5
5
  export declare const MiddlewareLayoutSelector: BoardMiddleware<LayoutSelectorSharedStorage, CoreEventMap, MiddlewareLayoutSelectorConfig>;
@@ -1,9 +1,9 @@
1
1
  import { calcLayoutSizeController, isViewPointInVertexes, getViewScaleInfoFromSnapshot, isViewPointInElementSize, calcViewElementSize } from '@idraw/util';
2
- import { keyLayoutActionType, keyLayoutController, keyLayoutControlType, keyLayoutIsHover, keyLayoutIsSelected, controllerSize, defaultStyle } from './config';
3
- import { keyActionType as keyElementActionType, keyHoverElement } from '../selector';
2
+ import { keyLayoutActionType, keyLayoutController, keyLayoutControlType, keyLayoutIsHoverContent, keyLayoutIsHoverController, keyLayoutIsSelected, keyLayoutIsBusyMoving, controllerSize, defaultStyle } from './config';
3
+ import { keyActionType as keyElementActionType } from '../selector';
4
4
  import { drawLayoutController, drawLayoutHover } from './util';
5
5
  import { coreEventKeys } from '../../config';
6
- export { keyLayoutIsSelected };
6
+ export { keyLayoutIsSelected, keyLayoutIsBusyMoving };
7
7
  export const MiddlewareLayoutSelector = (opts, config) => {
8
8
  const { sharer, boardContent, calculator, viewer, eventHub } = opts;
9
9
  const { overlayContext } = boardContent;
@@ -11,27 +11,19 @@ export const MiddlewareLayoutSelector = (opts, config) => {
11
11
  const { activeColor } = innerConfig;
12
12
  const style = { activeColor };
13
13
  let prevPoint = null;
14
- let prevIsHover = null;
14
+ let prevIsHoverContent = null;
15
15
  let prevIsSelected = null;
16
- let isBusy = null;
17
16
  const clear = () => {
18
17
  prevPoint = null;
19
18
  sharer.setSharedStorage(keyLayoutActionType, null);
20
19
  sharer.setSharedStorage(keyLayoutControlType, null);
21
20
  sharer.setSharedStorage(keyLayoutController, null);
22
- sharer.setSharedStorage(keyLayoutIsHover, null);
21
+ sharer.setSharedStorage(keyLayoutIsHoverContent, null);
22
+ sharer.setSharedStorage(keyLayoutIsHoverController, null);
23
23
  sharer.setSharedStorage(keyLayoutIsSelected, null);
24
- prevIsHover = null;
24
+ sharer.setSharedStorage(keyLayoutIsBusyMoving, null);
25
+ prevIsHoverContent = null;
25
26
  prevIsSelected = null;
26
- isBusy = null;
27
- };
28
- const isInElementHover = () => {
29
- const hoverElement = sharer.getSharedStorage(keyHoverElement);
30
- if (hoverElement) {
31
- clear();
32
- return true;
33
- }
34
- return false;
35
27
  };
36
28
  const isInElementAction = () => {
37
29
  const elementActionType = sharer.getSharedStorage(keyElementActionType);
@@ -78,6 +70,7 @@ export const MiddlewareLayoutSelector = (opts, config) => {
78
70
  const resetControlType = (e) => {
79
71
  const data = sharer.getActiveStorage('data');
80
72
  const controller = sharer.getSharedStorage(keyLayoutController);
73
+ let controllerType = null;
81
74
  if (controller && (data === null || data === void 0 ? void 0 : data.layout) && (e === null || e === void 0 ? void 0 : e.point)) {
82
75
  let layoutControlType = null;
83
76
  if (controller) {
@@ -93,14 +86,20 @@ export const MiddlewareLayoutSelector = (opts, config) => {
93
86
  if (layoutControlType) {
94
87
  sharer.setSharedStorage(keyLayoutControlType, layoutControlType);
95
88
  eventHub.trigger(coreEventKeys.CLEAR_SELECT);
96
- return layoutControlType;
89
+ controllerType = layoutControlType;
97
90
  }
98
91
  }
99
92
  }
100
- return null;
93
+ if (controllerType) {
94
+ sharer.setSharedStorage(keyLayoutIsHoverController, true);
95
+ }
96
+ else {
97
+ sharer.setSharedStorage(keyLayoutIsHoverController, false);
98
+ }
99
+ return controllerType;
101
100
  };
102
101
  const updateCursor = (controlType) => {
103
- if (isBusy === true) {
102
+ if (sharer.getSharedStorage(keyLayoutIsBusyMoving) === true) {
104
103
  return;
105
104
  }
106
105
  eventHub.trigger(coreEventKeys.CURSOR, {
@@ -116,23 +115,20 @@ export const MiddlewareLayoutSelector = (opts, config) => {
116
115
  resetController();
117
116
  },
118
117
  hover: (e) => {
119
- if (isBusy === true) {
118
+ if (sharer.getSharedStorage(keyLayoutIsBusyMoving) === true) {
120
119
  return;
121
120
  }
122
121
  if (isInElementAction()) {
123
122
  return;
124
123
  }
125
- if (isInElementHover()) {
126
- return;
127
- }
128
124
  if (isInLayout(e.point)) {
129
- sharer.setSharedStorage(keyLayoutIsHover, true);
125
+ sharer.setSharedStorage(keyLayoutIsHoverContent, true);
130
126
  }
131
127
  else {
132
- sharer.setSharedStorage(keyLayoutIsHover, false);
133
- if (prevIsHover === true) {
128
+ sharer.setSharedStorage(keyLayoutIsHoverContent, false);
129
+ if (prevIsHoverContent === true) {
134
130
  viewer.drawFrame();
135
- prevIsHover = false;
131
+ prevIsHoverContent = false;
136
132
  }
137
133
  }
138
134
  if (sharer.getSharedStorage(keyLayoutIsSelected) === true) {
@@ -155,12 +151,18 @@ export const MiddlewareLayoutSelector = (opts, config) => {
155
151
  updateCursor(layoutControlType);
156
152
  }
157
153
  }
154
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
155
+ return false;
156
+ }
158
157
  return;
159
158
  }
160
- if (sharer.getSharedStorage(keyLayoutIsHover) && !prevIsHover) {
159
+ if (sharer.getSharedStorage(keyLayoutIsHoverContent) && !prevIsHoverContent) {
161
160
  viewer.drawFrame();
162
161
  }
163
- prevIsHover = sharer.getSharedStorage(keyLayoutIsHover);
162
+ prevIsHoverContent = sharer.getSharedStorage(keyLayoutIsHoverContent);
163
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
164
+ return false;
165
+ }
164
166
  },
165
167
  pointStart: (e) => {
166
168
  if (isInElementAction()) {
@@ -186,6 +188,9 @@ export const MiddlewareLayoutSelector = (opts, config) => {
186
188
  viewer.drawFrame();
187
189
  }
188
190
  prevIsSelected = sharer.getSharedStorage(keyLayoutIsSelected);
191
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
192
+ return false;
193
+ }
189
194
  },
190
195
  pointMove: (e) => {
191
196
  if (!sharer.getSharedStorage(keyLayoutIsSelected)) {
@@ -198,7 +203,7 @@ export const MiddlewareLayoutSelector = (opts, config) => {
198
203
  const data = sharer.getActiveStorage('data');
199
204
  if (layoutActionType === 'resize' && layoutControlType && (data === null || data === void 0 ? void 0 : data.layout)) {
200
205
  if (prevPoint) {
201
- isBusy = true;
206
+ sharer.setSharedStorage(keyLayoutIsBusyMoving, true);
202
207
  const scale = sharer.getActiveStorage('scale');
203
208
  const viewMoveX = e.point.x - prevPoint.x;
204
209
  const viewMoveY = e.point.y - prevPoint.y;
@@ -288,7 +293,7 @@ export const MiddlewareLayoutSelector = (opts, config) => {
288
293
  }
289
294
  },
290
295
  pointEnd: () => {
291
- isBusy = false;
296
+ sharer.setSharedStorage(keyLayoutIsBusyMoving, false);
292
297
  const layoutActionType = sharer.getSharedStorage(keyLayoutActionType);
293
298
  const layoutControlType = sharer.getSharedStorage(keyLayoutControlType);
294
299
  const data = sharer.getActiveStorage('data');
@@ -298,6 +303,9 @@ export const MiddlewareLayoutSelector = (opts, config) => {
298
303
  data
299
304
  });
300
305
  }
306
+ if (sharer.getSharedStorage(keyLayoutIsHoverController) === true) {
307
+ return false;
308
+ }
301
309
  },
302
310
  beforeDrawFrame: ({ snapshot }) => {
303
311
  var _a;
@@ -306,7 +314,7 @@ export const MiddlewareLayoutSelector = (opts, config) => {
306
314
  }
307
315
  const { sharedStore, activeStore } = snapshot;
308
316
  const layoutActionType = sharedStore[keyLayoutActionType];
309
- const layoutIsHover = sharedStore[keyLayoutIsHover];
317
+ const layoutIsHover = sharedStore[keyLayoutIsHoverContent];
310
318
  const layoutIsSelected = sharedStore[keyLayoutIsSelected];
311
319
  if ((_a = activeStore.data) === null || _a === void 0 ? void 0 : _a.layout) {
312
320
  const { x, y, w, h } = activeStore.data.layout;
@@ -1,5 +1,5 @@
1
1
  import type { LayoutSizeController, Element } from '@idraw/types';
2
- import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHover, keyLayoutIsSelected } from './config';
2
+ import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHoverContent, keyLayoutIsHoverController, keyLayoutIsSelected, keyLayoutIsBusyMoving } from './config';
3
3
  import { keyActionType as keyElementActionType, keyHoverElement } from '../selector';
4
4
  import type { ActionType as ElementActionType } from '../selector';
5
5
  export type ActionType = 'resize' | null;
@@ -10,6 +10,8 @@ export type LayoutSelectorSharedStorage = {
10
10
  [keyLayoutController]: LayoutSizeController | null;
11
11
  [keyElementActionType]: ElementActionType | null;
12
12
  [keyHoverElement]: Element | null;
13
- [keyLayoutIsHover]: boolean | null;
13
+ [keyLayoutIsHoverContent]: boolean | null;
14
+ [keyLayoutIsHoverController]: boolean | null;
14
15
  [keyLayoutIsSelected]: boolean | null;
16
+ [keyLayoutIsBusyMoving]: boolean | null;
15
17
  };
@@ -1,2 +1,2 @@
1
- import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHover, keyLayoutIsSelected } from './config';
1
+ import { keyLayoutActionType, keyLayoutControlType, keyLayoutController, keyLayoutIsHoverContent, keyLayoutIsHoverController, keyLayoutIsSelected, keyLayoutIsBusyMoving } from './config';
2
2
  import { keyActionType as keyElementActionType, keyHoverElement } from '../selector';
@@ -25,4 +25,6 @@ export declare const selectWrapperBorderWidth = 2;
25
25
  export declare const resizeControllerBorderWidth = 4;
26
26
  export declare const areaBorderWidth = 1;
27
27
  export declare const controllerSize = 10;
28
+ export declare const rotateControllerSize = 20;
29
+ export declare const rotateControllerPosition = 22;
28
30
  export declare const defaultStyle: MiddlewareSelectorStyle;
@@ -24,6 +24,8 @@ export const selectWrapperBorderWidth = 2;
24
24
  export const resizeControllerBorderWidth = 4;
25
25
  export const areaBorderWidth = 1;
26
26
  export const controllerSize = 10;
27
+ export const rotateControllerSize = 20;
28
+ export const rotateControllerPosition = 22;
27
29
  const activeColor = '#1973ba';
28
30
  const activeAreaColor = '#1976d21c';
29
31
  const lockedColor = '#5b5959b5';
@@ -0,0 +1,5 @@
1
+ import type { ElementSizeController, ViewContext2D, ViewSizeInfo, ViewScaleInfo } from '@idraw/types';
2
+ export declare function drawDebugStoreSelectedElementController(ctx: ViewContext2D, controller: ElementSizeController | null, opts: {
3
+ viewSizeInfo: ViewSizeInfo;
4
+ viewScaleInfo: ViewScaleInfo;
5
+ }): void;
@@ -0,0 +1,30 @@
1
+ import { calcViewPointSize } from '@idraw/util';
2
+ function drawDebugControllerVertexes(opts) {
3
+ const { ctx, viewScaleInfo, vertexes } = opts;
4
+ const v0 = calcViewPointSize(vertexes[0], { viewScaleInfo });
5
+ const v1 = calcViewPointSize(vertexes[1], { viewScaleInfo });
6
+ const v2 = calcViewPointSize(vertexes[2], { viewScaleInfo });
7
+ const v3 = calcViewPointSize(vertexes[3], { viewScaleInfo });
8
+ ctx.beginPath();
9
+ ctx.fillStyle = '#FF0000A1';
10
+ ctx.moveTo(v0.x, v0.y);
11
+ ctx.lineTo(v1.x, v1.y);
12
+ ctx.lineTo(v2.x, v2.y);
13
+ ctx.lineTo(v3.x, v3.y);
14
+ ctx.lineTo(v0.x, v0.y);
15
+ ctx.closePath();
16
+ ctx.fill();
17
+ return false;
18
+ }
19
+ export function drawDebugStoreSelectedElementController(ctx, controller, opts) {
20
+ if (!controller) {
21
+ return;
22
+ }
23
+ const { viewSizeInfo, viewScaleInfo } = opts;
24
+ const { left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight, rotate } = controller;
25
+ const ctrls = [left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight, rotate];
26
+ for (let i = 0; i < ctrls.length; i++) {
27
+ const ctrl = ctrls[i];
28
+ drawDebugControllerVertexes({ ctx, vertexes: ctrl.vertexes, viewSizeInfo, viewScaleInfo });
29
+ }
30
+ }
@@ -18,6 +18,7 @@ export declare function drawSelectedElementControllersVertexes(ctx: ViewContext2
18
18
  element: Element | null;
19
19
  calculator: ViewCalculator;
20
20
  style: MiddlewareSelectorStyle;
21
+ rotateControllerPattern: ViewContext2D;
21
22
  }): void;
22
23
  export declare function drawElementListShadows(ctx: ViewContext2D, elements: Element<ElementType>[], opts?: Omit<RendererDrawElementOptions, 'loader'>): void;
23
24
  export declare function drawArea(ctx: ViewContext2D, opts: {
@@ -1,6 +1,6 @@
1
1
  import { rotateElementVertexes, calcViewPointSize, calcViewVertexes, calcViewElementSize } from '@idraw/util';
2
- import { resizeControllerBorderWidth, areaBorderWidth, selectWrapperBorderWidth, controllerSize } from './config';
3
- import { drawVertexes, drawLine, drawCircleController, drawCrossVertexes } from './draw-base';
2
+ import { resizeControllerBorderWidth, areaBorderWidth, selectWrapperBorderWidth } from './config';
3
+ import { drawVertexes, drawCircleController, drawCrossVertexes } from './draw-base';
4
4
  export function drawHoverVertexesWrapper(ctx, vertexes, opts) {
5
5
  if (!vertexes) {
6
6
  return;
@@ -36,19 +36,21 @@ export function drawSelectedElementControllersVertexes(ctx, controller, opts) {
36
36
  if (!controller) {
37
37
  return;
38
38
  }
39
- const { hideControllers, style } = opts;
39
+ const { hideControllers, style, rotateControllerPattern, viewSizeInfo } = opts;
40
+ const { devicePixelRatio = 1 } = viewSizeInfo;
40
41
  const { activeColor } = style;
41
- const { elementWrapper, topLeft, topRight, bottomLeft, bottomRight, top, rotate } = controller;
42
+ const { elementWrapper, topLeft, topRight, bottomLeft, bottomRight, rotate } = controller;
42
43
  const wrapperOpts = { borderColor: activeColor, borderWidth: selectWrapperBorderWidth, background: 'transparent', lineDash: [] };
43
44
  const ctrlOpts = Object.assign(Object.assign({}, wrapperOpts), { borderWidth: resizeControllerBorderWidth, background: '#FFFFFF' });
44
45
  drawVertexes(ctx, calcViewVertexes(elementWrapper, opts), wrapperOpts);
45
46
  if (!hideControllers) {
46
- drawLine(ctx, calcViewPointSize(top.center, opts), calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { borderWidth: 2 }));
47
47
  drawVertexes(ctx, calcViewVertexes(topLeft.vertexes, opts), ctrlOpts);
48
48
  drawVertexes(ctx, calcViewVertexes(topRight.vertexes, opts), ctrlOpts);
49
49
  drawVertexes(ctx, calcViewVertexes(bottomLeft.vertexes, opts), ctrlOpts);
50
50
  drawVertexes(ctx, calcViewVertexes(bottomRight.vertexes, opts), ctrlOpts);
51
- drawCircleController(ctx, calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { size: controllerSize, borderWidth: 2 }));
51
+ drawCircleController(ctx, calcViewPointSize(rotate.center, opts), Object.assign(Object.assign({}, ctrlOpts), { size: rotate.size, borderWidth: 0 }));
52
+ const rotateCenter = calcViewPointSize(rotate.center, opts);
53
+ ctx.drawImage(rotateControllerPattern.canvas, 0, 0, rotateControllerPattern.canvas.width / devicePixelRatio, rotateControllerPattern.canvas.height / devicePixelRatio, rotateCenter.x - rotate.size / 2, rotateCenter.y - rotate.size / 2, rotate.size, rotate.size);
52
54
  }
53
55
  }
54
56
  export function drawElementListShadows(ctx, elements, opts) {
@@ -1,6 +1,11 @@
1
1
  import type { CoreEventMap, MiddlewareSelectorConfig } from '@idraw/types';
2
2
  import type { BoardMiddleware, ActionType, DeepSelectorSharedStorage } from './types';
3
3
  import { keyActionType, keyResizeType, keyGroupQueue, keyHoverElement, keySelectedElementList } from './config';
4
+ import { MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE } from '../info';
4
5
  export { keySelectedElementList, keyHoverElement, keyActionType, keyResizeType, keyGroupQueue };
5
6
  export type { DeepSelectorSharedStorage, ActionType };
6
- export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEventMap, MiddlewareSelectorConfig>;
7
+ export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEventMap & {
8
+ [MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE]: {
9
+ show: boolean;
10
+ };
11
+ }, MiddlewareSelectorConfig>;
@@ -2,10 +2,12 @@ import { is, calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueV
2
2
  import { drawHoverVertexesWrapper, drawLockedVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
3
  import { drawReferenceLines } from './draw-reference';
4
4
  import { getPointTarget, resizeElement, rotateElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup, calcMoveInGroup } from './util';
5
- import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keySelectedElementPosition, keyIsMoving, keyEnableSelectInGroup, keyEnableSnapToGrid, controllerSize, defaultStyle } from './config';
5
+ import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keySelectedElementPosition, keyIsMoving, keyEnableSelectInGroup, keyEnableSnapToGrid, controllerSize, rotateControllerSize, rotateControllerPosition, defaultStyle } from './config';
6
6
  import { calcReferenceInfo } from './reference';
7
7
  import { coreEventKeys } from '../../config';
8
- import { keyLayoutIsSelected } from '../layout-selector';
8
+ import { keyLayoutIsSelected, keyLayoutIsBusyMoving } from '../layout-selector';
9
+ import { createRotateControllerPattern } from './pattern';
10
+ import { MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE } from '../info';
9
11
  export { keySelectedElementList, keyHoverElement, keyActionType, keyResizeType, keyGroupQueue };
10
12
  export const MiddlewareSelector = (opts, config) => {
11
13
  const innerConfig = Object.assign(Object.assign({}, defaultStyle), config);
@@ -18,6 +20,10 @@ export const MiddlewareSelector = (opts, config) => {
18
20
  let moveOriginalStartElementSize = null;
19
21
  let inBusyMode = null;
20
22
  let hasChangedData = null;
23
+ const rotateControllerPattern = createRotateControllerPattern({
24
+ fill: style.activeColor,
25
+ devicePixelRatio: sharer.getActiveViewSizeInfo().devicePixelRatio
26
+ });
21
27
  sharer.setSharedStorage(keyActionType, null);
22
28
  sharer.setSharedStorage(keyEnableSnapToGrid, true);
23
29
  const getActiveElements = () => {
@@ -54,16 +60,24 @@ export const MiddlewareSelector = (opts, config) => {
54
60
  }
55
61
  sharer.setSharedStorage(keyHoverElementVertexes, vertexes);
56
62
  };
57
- const updateSelectedElementList = (list, opts) => {
58
- var _a;
59
- sharer.setSharedStorage(keySelectedElementList, list);
63
+ const updateSelectedElemenetController = () => {
64
+ const list = sharer.getSharedStorage(keySelectedElementList);
60
65
  if (list.length === 1) {
61
66
  const controller = calcElementSizeController(list[0], {
62
67
  groupQueue: sharer.getSharedStorage(keyGroupQueue),
63
68
  controllerSize,
64
- viewScaleInfo: sharer.getActiveViewScaleInfo()
69
+ viewScaleInfo: sharer.getActiveViewScaleInfo(),
70
+ rotateControllerPosition,
71
+ rotateControllerSize
65
72
  });
66
73
  sharer.setSharedStorage(keySelectedElementController, controller);
74
+ }
75
+ };
76
+ const updateSelectedElementList = (list, opts) => {
77
+ var _a;
78
+ sharer.setSharedStorage(keySelectedElementList, list);
79
+ if (list.length === 1) {
80
+ updateSelectedElemenetController();
67
81
  sharer.setSharedStorage(keySelectedElementPosition, getElementPositionFromList(list[0].uuid, ((_a = sharer.getActiveStorage('data')) === null || _a === void 0 ? void 0 : _a.elements) || []));
68
82
  }
69
83
  else {
@@ -160,6 +174,10 @@ export const MiddlewareSelector = (opts, config) => {
160
174
  hover: (e) => {
161
175
  var _a, _b, _c, _d, _e;
162
176
  const layoutIsSelected = sharer.getSharedStorage(keyLayoutIsSelected);
177
+ const layoutIsBusyMoving = sharer.getSharedStorage(keyLayoutIsBusyMoving);
178
+ if (layoutIsBusyMoving === true) {
179
+ return;
180
+ }
163
181
  const resizeType = sharer.getSharedStorage(keyResizeType);
164
182
  const actionType = sharer.getSharedStorage(keyActionType);
165
183
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
@@ -345,6 +363,7 @@ export const MiddlewareSelector = (opts, config) => {
345
363
  if (actionType === 'drag') {
346
364
  hasChangedData = true;
347
365
  inBusyMode = 'drag';
366
+ eventHub.trigger(MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE, { show: false });
348
367
  if (data && (elems === null || elems === void 0 ? void 0 : elems.length) === 1 && moveOriginalStartElementSize && originalStart && end && ((_b = (_a = elems[0]) === null || _a === void 0 ? void 0 : _a.operations) === null || _b === void 0 ? void 0 : _b.locked) !== true) {
349
368
  const { moveX, moveY } = calcMoveInGroup(originalStart, end, groupQueue);
350
369
  let totalMoveX = calculator.toGridNum(moveX / scale);
@@ -508,6 +527,9 @@ export const MiddlewareSelector = (opts, config) => {
508
527
  prevPoint = null;
509
528
  moveOriginalStartPoint = null;
510
529
  moveOriginalStartElementSize = null;
530
+ if (actionType === 'drag') {
531
+ eventHub.trigger(MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE, { show: true });
532
+ }
511
533
  if (actionType === 'resize' && resizeType) {
512
534
  sharer.setSharedStorage(keyResizeType, null);
513
535
  needDrawFrame = true;
@@ -579,11 +601,11 @@ export const MiddlewareSelector = (opts, config) => {
579
601
  finalDrawFrame();
580
602
  },
581
603
  pointLeave() {
582
- prevPoint = null;
583
- moveOriginalStartPoint = null;
584
- moveOriginalStartElementSize = null;
585
- clear();
586
- viewer.drawFrame();
604
+ inBusyMode = null;
605
+ sharer.setSharedStorage(keyResizeType, null);
606
+ eventHub.trigger(coreEventKeys.CURSOR, {
607
+ type: 'default'
608
+ });
587
609
  },
588
610
  doubleClick(e) {
589
611
  var _a, _b, _c, _d, _e, _f, _g, _h;
@@ -614,6 +636,12 @@ export const MiddlewareSelector = (opts, config) => {
614
636
  }
615
637
  sharer.setSharedStorage(keyActionType, null);
616
638
  },
639
+ wheel() {
640
+ updateSelectedElemenetController();
641
+ },
642
+ wheelScale() {
643
+ updateSelectedElemenetController();
644
+ },
617
645
  contextMenu: (e) => {
618
646
  var _a, _b, _c, _d, _e, _f, _g, _h;
619
647
  const groupQueue = sharer.getSharedStorage(keyGroupQueue);
@@ -671,30 +699,21 @@ export const MiddlewareSelector = (opts, config) => {
671
699
  const isMoving = sharedStore[keyIsMoving];
672
700
  const enableSnapToGrid = sharedStore[keyEnableSnapToGrid];
673
701
  const drawBaseOpts = { calculator, viewScaleInfo, viewSizeInfo, style };
674
- const selectedElementController = elem
675
- ? calcElementSizeController(elem, {
676
- groupQueue,
677
- controllerSize: 10,
678
- viewScaleInfo
679
- })
680
- : null;
702
+ const selectedElementController = sharedStore[keySelectedElementController];
681
703
  const isHoverLocked = !!((_a = hoverElement === null || hoverElement === void 0 ? void 0 : hoverElement.operations) === null || _a === void 0 ? void 0 : _a.locked);
682
704
  if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
683
705
  drawGroupQueueVertexesWrappers(overlayContext, groupQueueVertexesList, drawBaseOpts);
684
706
  if (hoverElement && actionType !== 'drag') {
685
707
  if (isHoverLocked) {
686
- drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
687
- groupQueue,
688
- controllerSize: 10,
689
- viewScaleInfo
690
- }), style }));
708
+ drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: selectedElementController, style }));
691
709
  }
692
710
  else {
693
711
  drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
694
712
  }
695
713
  }
696
714
  if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
697
- drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', style }));
715
+ drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', rotateControllerPattern,
716
+ style }));
698
717
  if (actionType === 'drag') {
699
718
  if (enableSnapToGrid === true) {
700
719
  const referenceInfo = calcReferenceInfo(elem.uuid, {
@@ -721,18 +740,15 @@ export const MiddlewareSelector = (opts, config) => {
721
740
  else {
722
741
  if (hoverElement && actionType !== 'drag') {
723
742
  if (isHoverLocked) {
724
- drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: calcElementSizeController(hoverElement, {
725
- groupQueue,
726
- controllerSize: 10,
727
- viewScaleInfo
728
- }), style }));
743
+ drawLockedVertexesWrapper(overlayContext, hoverElementVertexes, Object.assign(Object.assign({}, drawBaseOpts), { controller: selectedElementController, style }));
729
744
  }
730
745
  else {
731
746
  drawHoverVertexesWrapper(overlayContext, hoverElementVertexes, drawBaseOpts);
732
747
  }
733
748
  }
734
749
  if (elem && ['select', 'drag', 'resize'].includes(actionType)) {
735
- drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', style }));
750
+ drawSelectedElementControllersVertexes(overlayContext, selectedElementController, Object.assign(Object.assign({}, drawBaseOpts), { element: elem, calculator, hideControllers: !!isMoving && actionType === 'drag', rotateControllerPattern,
751
+ style }));
736
752
  if (actionType === 'drag') {
737
753
  if (enableSnapToGrid === true) {
738
754
  const referenceInfo = calcReferenceInfo(elem.uuid, {
@@ -0,0 +1,4 @@
1
+ import type { Element } from '@idraw/types';
2
+ export declare const createIconRotate: (opts?: {
3
+ fill?: string;
4
+ }) => Element<"path", Record<string, any>>;