@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.
- package/dist/esm/index.js +1 -0
- package/dist/esm/middleware/info/config.d.ts +1 -0
- package/dist/esm/middleware/info/config.js +1 -0
- package/dist/esm/middleware/info/draw-info.d.ts +1 -1
- package/dist/esm/middleware/info/index.d.ts +7 -1
- package/dist/esm/middleware/info/index.js +27 -14
- package/dist/esm/middleware/layout-selector/config.d.ts +3 -1
- package/dist/esm/middleware/layout-selector/config.js +3 -1
- package/dist/esm/middleware/layout-selector/index.d.ts +2 -2
- package/dist/esm/middleware/layout-selector/index.js +40 -32
- package/dist/esm/middleware/layout-selector/types.d.ts +4 -2
- package/dist/esm/middleware/layout-selector/types.js +1 -1
- package/dist/esm/middleware/selector/config.d.ts +2 -0
- package/dist/esm/middleware/selector/config.js +2 -0
- package/dist/esm/middleware/selector/draw-debug.d.ts +5 -0
- package/dist/esm/middleware/selector/draw-debug.js +30 -0
- package/dist/esm/middleware/selector/draw-wrapper.d.ts +1 -0
- package/dist/esm/middleware/selector/draw-wrapper.js +8 -6
- package/dist/esm/middleware/selector/index.d.ts +6 -1
- package/dist/esm/middleware/selector/index.js +46 -30
- package/dist/esm/middleware/selector/pattern/icon-rotate.d.ts +4 -0
- package/dist/esm/middleware/selector/pattern/icon-rotate.js +88 -0
- package/dist/esm/middleware/selector/pattern/index.d.ts +5 -0
- package/dist/esm/middleware/selector/pattern/index.js +38 -0
- package/dist/esm/middleware/selector/types.d.ts +2 -1
- package/dist/esm/middleware/selector/types.js +1 -1
- package/dist/esm/middleware/selector/util.js +1 -1
- package/dist/index.global.js +760 -551
- package/dist/index.global.min.js +1 -1
- 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 '
|
|
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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
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
|
|
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,
|
|
3
|
-
import { keyActionType as keyElementActionType
|
|
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
|
|
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(
|
|
21
|
+
sharer.setSharedStorage(keyLayoutIsHoverContent, null);
|
|
22
|
+
sharer.setSharedStorage(keyLayoutIsHoverController, null);
|
|
23
23
|
sharer.setSharedStorage(keyLayoutIsSelected, null);
|
|
24
|
-
|
|
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
|
-
|
|
89
|
+
controllerType = layoutControlType;
|
|
97
90
|
}
|
|
98
91
|
}
|
|
99
92
|
}
|
|
100
|
-
|
|
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 (
|
|
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 (
|
|
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(
|
|
125
|
+
sharer.setSharedStorage(keyLayoutIsHoverContent, true);
|
|
130
126
|
}
|
|
131
127
|
else {
|
|
132
|
-
sharer.setSharedStorage(
|
|
133
|
-
if (
|
|
128
|
+
sharer.setSharedStorage(keyLayoutIsHoverContent, false);
|
|
129
|
+
if (prevIsHoverContent === true) {
|
|
134
130
|
viewer.drawFrame();
|
|
135
|
-
|
|
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(
|
|
159
|
+
if (sharer.getSharedStorage(keyLayoutIsHoverContent) && !prevIsHoverContent) {
|
|
161
160
|
viewer.drawFrame();
|
|
162
161
|
}
|
|
163
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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[
|
|
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,
|
|
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
|
-
[
|
|
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,
|
|
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
|
|
3
|
-
import { drawVertexes,
|
|
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,
|
|
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:
|
|
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
|
|
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
|
|
58
|
-
|
|
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
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
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 =
|
|
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:
|
|
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',
|
|
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:
|
|
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',
|
|
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, {
|