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