@netless/forge-whiteboard 0.1.6 → 0.1.9
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/README.md +63 -3
- package/changelog.md +28 -0
- package/dist/Camera.d.ts +14 -2
- package/dist/Camera.d.ts.map +1 -1
- package/dist/Whiteboard.d.ts +31 -0
- package/dist/Whiteboard.d.ts.map +1 -1
- package/dist/WhiteboardApplication.d.ts +6 -0
- package/dist/WhiteboardApplication.d.ts.map +1 -1
- package/dist/whiteboard.esm.js +216 -22
- package/dist/whiteboard.esm.js.map +3 -3
- package/dist/whiteboard.js +215 -21
- package/dist/whiteboard.js.map +2 -2
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -134,7 +134,7 @@ whiteboard.setElementAttribute(pageId, elementId, "strokeColor", "#fff");
|
|
|
134
134
|
whiteboard.setElementAttribute(pageId, elementId, "fontFamily", "kai");
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
## 页面操作
|
|
138
138
|
|
|
139
139
|
**基础页面操作**
|
|
140
140
|
|
|
@@ -195,9 +195,9 @@ whiteboard.clonePage("1", "2");
|
|
|
195
195
|
whiteboard.clearPage();
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
-
|
|
198
|
+
## 白板权限
|
|
199
199
|
|
|
200
|
-
`forge-whiteboard` 设计了细致的白板权限控制机制, 通过不同权限配置可以实现很多有趣的场景.
|
|
200
|
+
`forge-whiteboard` 设计了细致的白板权限控制机制, 通过不同权限配置可以实现很多有趣的场景. 默认没有给任何权限.
|
|
201
201
|
|
|
202
202
|
| 权限类型 | 描述 |
|
|
203
203
|
|---|---|
|
|
@@ -211,6 +211,66 @@ whiteboard.clearPage();
|
|
|
211
211
|
|WhiteboardPermissionFlag.setOthersView|可以修改他人的视角模式, 指定他人的页码|
|
|
212
212
|
|WhiteboardPermissionFlag.all|拥有所有权限|
|
|
213
213
|
|
|
214
|
+
### 权限相关 api
|
|
215
|
+
|
|
214
216
|
```javascript
|
|
217
|
+
// 给当前客户端用户设置权限
|
|
218
|
+
whiteboard.permissions.addPermission(WhiteboardPermissionFlag.all);
|
|
219
|
+
|
|
220
|
+
// 给指定用户设置权限
|
|
221
|
+
whiteboard.permissions.addPermission(WhiteboardPermissionFlag.all, "userId");
|
|
222
|
+
|
|
223
|
+
// 获取当前权限列表
|
|
224
|
+
whiteboard.permissions.getPermissionFlags();
|
|
225
|
+
|
|
226
|
+
// 获取当前权限值, 可以用来判断是否有某个权限
|
|
227
|
+
const permissionValue = whiteboard.permissions.getPermissionValue();
|
|
228
|
+
// 是否有绘制权限
|
|
229
|
+
permissionValue & WhiteboardPermissionFlag.draw;
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 相机
|
|
233
|
+
|
|
234
|
+
`forge-whiteboard` 通过相机的概念来控制试图的拖动和缩放, 以及配置白板画布的范围.
|
|
235
|
+
|
|
236
|
+
### 相机相关配置
|
|
237
|
+
|
|
238
|
+
**WhiteboardOption.maxScaleRatio** 设置画布最大区域在默认高宽上的放大比例. 默认值为 -1, 表示无边界. 只能设置 -1 或者 >= 1 的值.
|
|
239
|
+
例如: `WhiteboardOption.width` 设置为 1920, `WhiteboardOption.height` 设置为 1080, `WhiteboardOption.maxScaleRatio` 设置为 2, 则画布最大区域为 3840 x 2160. 拖动和缩放操作都会受最大区域限制.
|
|
240
|
+
|
|
241
|
+
**Whiteboard.enableCameraBoundaryHighlight** 控制相机超出边界时是否显示向内的高亮阴影以做警示. 默认值为 true.
|
|
242
|
+
|
|
243
|
+
**Whiteboard.cameraBoundaryColor** 设置警示颜色. 默认值为 "#F44336".
|
|
244
|
+
|
|
245
|
+
**Whiteboard.enableCameraByMouse** 控制是否允许通过鼠标/触摸板控制相机的缩放和拖动. 默认值为 true.
|
|
215
246
|
|
|
247
|
+
**Whiteboard.enableCameraByTouch** 控制是否允许通过触摸屏上的触摸手势控制相机的缩放和拖动. 默认值为 true.
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// 设置最高 2 倍放大
|
|
251
|
+
const whiteboard = await room.applicationManager.launchApplication(WhiteboardApplication, {
|
|
252
|
+
width: 1920,
|
|
253
|
+
height: 1080,
|
|
254
|
+
maxScaleRatio: 2,
|
|
255
|
+
defaultToolbarStyle: {
|
|
256
|
+
tool: "curve"
|
|
257
|
+
}
|
|
258
|
+
}, "MainWhiteboard");
|
|
259
|
+
|
|
260
|
+
// 取消相机超出边界时的高亮显示
|
|
261
|
+
whiteboard.enableCameraBoundaryHighlight = false;
|
|
262
|
+
// 禁止通过触摸手势控制相机
|
|
263
|
+
whiteboard.enableCameraByMouse = false;
|
|
216
264
|
```
|
|
265
|
+
|
|
266
|
+
### 通过代码控制相机
|
|
267
|
+
|
|
268
|
+
**Whiteboard.translateCamera** 拖动相机
|
|
269
|
+
**Whiteboard.scaleCamera** 以画布中心为不动点缩放相机
|
|
270
|
+
**Whiteboard.resetCamera** 重置相机位置和缩放
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
whiteboard.scaleCamera(1.2);
|
|
274
|
+
whiteboard.translateCamera(10, 10);
|
|
275
|
+
whiteboard.resetCamera();
|
|
276
|
+
```
|
package/changelog.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
## changelog
|
|
2
|
+
|
|
3
|
+
### 0.1.2
|
|
4
|
+
- 修复因为复用 element uuid 导致的不同步现象
|
|
5
|
+
|
|
6
|
+
### 0.1.2
|
|
7
|
+
- 修复 `@netless/forge-room` 依赖版本号
|
|
8
|
+
|
|
9
|
+
### 0.1.4
|
|
10
|
+
- 修复 root view 宽度或高度为 0 时的报错
|
|
11
|
+
|
|
12
|
+
### 0.1.6
|
|
13
|
+
- 修复调用 `rasterize` 后 dom 树上会多出一个 canvas 元素的问题
|
|
14
|
+
|
|
15
|
+
### 0.1.7
|
|
16
|
+
|
|
17
|
+
- 修复对应工具不支持时不能加载白板的问题
|
|
18
|
+
|
|
19
|
+
### 0.1.8
|
|
20
|
+
|
|
21
|
+
- `Whiteboard.translateView`相机拖动 api
|
|
22
|
+
- `Whiteboard.scaleView`相机缩放 api
|
|
23
|
+
- `Whiteboard.resetView`相机缩放 api
|
|
24
|
+
- `Whiteboard.enableCameraByTouch` 控制是否允许通过触摸手势控制相机
|
|
25
|
+
- `Whiteboard.enableCameraByMouse` 控制是否允许通过鼠标/触摸板控制相机
|
|
26
|
+
- `Whiteboard.enableCameraBoundaryHighlight` 控制是否允许相机超出边界时高亮显示
|
|
27
|
+
- `Whiteboard.cameraBoundaryColor` 设置边界高亮颜色
|
|
28
|
+
- `WhiteboardOption.maxScaleRatio` 控制相机最大放大比例
|
package/dist/Camera.d.ts
CHANGED
|
@@ -21,9 +21,18 @@ export declare class Camera extends EventEmitter<CameraEvents> {
|
|
|
21
21
|
private hasPermission;
|
|
22
22
|
private gesture;
|
|
23
23
|
private inherentScale;
|
|
24
|
+
private maxScale;
|
|
25
|
+
private initSize;
|
|
26
|
+
private bound;
|
|
27
|
+
private boundTiemoutId;
|
|
28
|
+
enableByMouse: boolean;
|
|
29
|
+
enableByTouch: boolean;
|
|
30
|
+
boundaryColor: string;
|
|
31
|
+
enableBoundaryHighlight: boolean;
|
|
24
32
|
private get inherentMatrix();
|
|
25
33
|
private get translateScale();
|
|
26
|
-
constructor(dom: HTMLDivElement, userManager: UserManager, scope: paper.PaperScope, whiteboardAttrsMap: Y.Map<any>, hasPermission: (flag: WhiteboardPermissionFlag) => boolean, requestUserMap: (userId: string) => Y.Map<any>, paperSize: () => [number, number], domSize: () => [number, number]);
|
|
34
|
+
constructor(initSize: paper.Size, maxScale: number, dom: HTMLDivElement, userManager: UserManager, scope: paper.PaperScope, whiteboardAttrsMap: Y.Map<any>, hasPermission: (flag: WhiteboardPermissionFlag) => boolean, requestUserMap: (userId: string) => Y.Map<any>, paperSize: () => [number, number], domSize: () => [number, number]);
|
|
35
|
+
private highlightBound;
|
|
27
36
|
updateInherentScale(scale: number): void;
|
|
28
37
|
private getActiveMatrix;
|
|
29
38
|
triggerZoom(): void;
|
|
@@ -34,9 +43,12 @@ export declare class Camera extends EventEmitter<CameraEvents> {
|
|
|
34
43
|
private handleUserJoin;
|
|
35
44
|
private createModel;
|
|
36
45
|
private handleViewMatrixUpdate;
|
|
37
|
-
private
|
|
46
|
+
private validNextMatrix;
|
|
47
|
+
private updateViewMatrix;
|
|
38
48
|
private handleWheel;
|
|
49
|
+
scale(value: number): void;
|
|
39
50
|
translate(offsetX: number, offsetY: number): void;
|
|
51
|
+
reset(): void;
|
|
40
52
|
}
|
|
41
53
|
export {};
|
|
42
54
|
//# sourceMappingURL=Camera.d.ts.map
|
package/dist/Camera.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../src/Camera.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAgB,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAC,wBAAwB,EAAC,MAAM,oBAAoB,CAAC;AAI5D,UAAU,YAAY;IAClB,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,qBAAa,MAAO,SAAQ,YAAY,CAAC,YAAY,CAAC;IAElD,SAAgB,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;IAExC,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,aAAa,CAAa;
|
|
1
|
+
{"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../src/Camera.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAgB,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAC,wBAAwB,EAAC,MAAM,oBAAoB,CAAC;AAI5D,UAAU,YAAY;IAClB,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,qBAAa,MAAO,SAAQ,YAAY,CAAC,YAAY,CAAC;IAElD,SAAgB,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC;IAExC,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,kBAAkB,CAAa;IACvC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,cAAc,CAAM;IAErB,aAAa,EAAE,OAAO,CAAQ;IAC9B,aAAa,EAAE,OAAO,CAAQ;IAC9B,aAAa,EAAE,MAAM,CAAa;IAClC,uBAAuB,EAAE,OAAO,CAAQ;IAE/C,OAAO,KAAK,cAAc,GAIzB;IAED,OAAO,KAAK,cAAc,GAGzB;gBAGG,QAAQ,EAAE,KAAK,CAAC,IAAI,EACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,CAAC,UAAU,EACvB,kBAAkB,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAO,EAC1D,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAE9C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAEjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAyDnC,OAAO,CAAC,cAAc;IAUf,mBAAmB,CAAC,KAAK,EAAE,MAAM;IAIxC,OAAO,CAAC,eAAe;IAahB,WAAW;IAOX,qBAAqB,CAAC,MAAM,EAAE,MAAM;IAMpC,qBAAqB;IAM5B,OAAO,CAAC,sBAAsB,CAgB5B;IAEF,OAAO,CAAC,eAAe,CAKrB;IAEF,OAAO,CAAC,cAAc,CAMpB;IAEF,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,sBAAsB,CA2B5B;IAEF,OAAO,CAAC,eAAe;IAwDvB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,WAAW,CA4CjB;IAEK,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM1B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjD,KAAK,IAAI,IAAI;CAIvB"}
|
package/dist/Whiteboard.d.ts
CHANGED
|
@@ -108,6 +108,22 @@ export declare class Whiteboard extends EventEmitter<WhiteboardEvents> implement
|
|
|
108
108
|
* 描边宽度
|
|
109
109
|
*/
|
|
110
110
|
strokeWidth: number;
|
|
111
|
+
/**
|
|
112
|
+
* 是否允许用鼠标/触控板进行缩放和拖动画布
|
|
113
|
+
*/
|
|
114
|
+
enableCameraByMouse: boolean;
|
|
115
|
+
/**
|
|
116
|
+
* 是否允许触摸屏上触摸事件进行缩放和拖动画布
|
|
117
|
+
*/
|
|
118
|
+
enableCameraByTouch: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* 相机超出边界时, 警示阴影的颜色, 默认 "#F44336"
|
|
121
|
+
*/
|
|
122
|
+
cameraBoundaryColor: string;
|
|
123
|
+
/**
|
|
124
|
+
* 是否允许相机超出边界时, 警示高亮阴影, 默认 true
|
|
125
|
+
*/
|
|
126
|
+
enableCameraBoundaryHighlight: boolean;
|
|
111
127
|
getElementAttribute: <K extends ElementAttributeKey>(sceneId: string, elementId: string, attribute: K) => ElementAttributes[K];
|
|
112
128
|
setElementAttribute: <K extends keyof ElementAttributes>(sceneId: string, elementId: string, attribute: K, value: ElementAttributes[K]) => any;
|
|
113
129
|
getCurrentTool: () => WhiteboardToolType;
|
|
@@ -149,6 +165,21 @@ export declare class Whiteboard extends EventEmitter<WhiteboardEvents> implement
|
|
|
149
165
|
* 清空当前页面
|
|
150
166
|
*/
|
|
151
167
|
clearPage: () => void;
|
|
168
|
+
/**
|
|
169
|
+
* 平移画布
|
|
170
|
+
* @param {number} offsetX - x 轴偏移量
|
|
171
|
+
* @param {number} offsetY - y 轴偏移量
|
|
172
|
+
*/
|
|
173
|
+
translateCamera: (offsetX: number, offsetY: number) => void;
|
|
174
|
+
/**
|
|
175
|
+
* 以画布中心为固定点缩放画布
|
|
176
|
+
* @param {number} scale - 缩放比例
|
|
177
|
+
*/
|
|
178
|
+
scaleCamera: (scale: number) => void;
|
|
179
|
+
/**
|
|
180
|
+
* 重置画布, 将画布缩放比例重置为 1, 平移量重置为 [0, 0]
|
|
181
|
+
*/
|
|
182
|
+
resetCamera: () => void;
|
|
152
183
|
/**
|
|
153
184
|
* 为 userId 指定的用户设置页面, 调用需要有 `WhiteboardPermissionFlag.setOthersView` 权限,
|
|
154
185
|
* userId 指定的用户的视角模式应为 `free`, 否则调用无效
|
package/dist/Whiteboard.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Whiteboard.d.ts","sourceRoot":"","sources":["../src/Whiteboard.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,EAAC,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAC,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC7B;;;;;;;OAOG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,EAAE,EAAE,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAChK;;;OAGG;IACH,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C;;;OAGG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD;;;OAGG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC1C;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IACjF;;;OAGG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;OAGG;IACH,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;OAEG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;CAChC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,iBAAiB,CAAC;AAE1D,qBAAa,UAAW,SAAQ,YAAY,CAAC,gBAAgB,CAAE,YAAW,uBAAuB;IAE7F,SAAgB,IAAI,EAAE,cAAc,CAAC;IACrC,SAAgB,UAAU,EAAG,MAAM,CAAC;IAEpC,SAAgB,WAAW,EAAG,qBAAqB,CAAC;IAEpD;;OAEG;IACI,IAAI,EAAG,kBAAkB,CAAC;IACjC;;OAEG;IACI,QAAQ,EAAG,MAAM,CAAC;IACzB;;OAEG;IACI,SAAS,EAAG,MAAM,EAAE,CAAC;IAC5B;;OAEG;IACI,UAAU,EAAG,MAAM,CAAC;IAC3B;;OAEG;IACI,WAAW,EAAG,MAAM,CAAC;IAC5B;;OAEG;IACI,SAAS,EAAG,MAAM,CAAC;IAC1B;;OAEG;IACI,WAAW,EAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Whiteboard.d.ts","sourceRoot":"","sources":["../src/Whiteboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,12 @@ export interface WhiteboardOption {
|
|
|
13
13
|
* 白板可视区域高度, 如果各客户端配置不一致则会导致可视区域不同步
|
|
14
14
|
*/
|
|
15
15
|
height: number;
|
|
16
|
+
/**
|
|
17
|
+
* 白板区域最大缩放比例, 如果各客户端配置不一致则会导致可视区域不同步
|
|
18
|
+
* 参数必须大于等于 1, 或者 -1, -1 表示无边界.
|
|
19
|
+
* @default -1
|
|
20
|
+
*/
|
|
21
|
+
maxScaleRatio?: number;
|
|
16
22
|
/**
|
|
17
23
|
* 默认工具栏样式, 如果各客户端配置不一致则随机应用其中一个值
|
|
18
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WhiteboardApplication.d.ts","sourceRoot":"","sources":["../src/WhiteboardApplication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"WhiteboardApplication.d.ts","sourceRoot":"","sources":["../src/WhiteboardApplication.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAM,MAAM,qBAAqB,CAAC;AAS7D,OAAO,EAAC,YAAY,EAAE,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAUhE,OAAO,EAAyC,UAAU,EAAC,MAAM,cAAc,CAAC;AAchF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/C;AAED,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAC1B,OAAO,GACL,WAAW,GACX,UAAU,GACV,MAAM,GACN,OAAO,GACP,MAAM,GACN,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,MAAM,CAAC;AAEb,qBAAa,qBAAsB,SAAQ,mBAAmB,CAAC,gBAAgB,EAAE,UAAU,CAAC;IAExF,MAAM,CAAC,eAAe,SAAuB;IAE7C,SAAgB,IAAI,EAAE,MAAM,CAAuB;IAC5C,OAAO,EAAE,UAAU,CAAC;IAEpB,YAAY,EAAG,YAAY,CAAC;IACnC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,oBAAoB,CAAwB;IACpD,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,YAAY,CAAyC;IAE7D,OAAO,CAAC,WAAW,CAAiD;IACpE,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,aAAa,CAAuD;IAC5E,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,qBAAqB,CAAuD;IACpF,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,mBAAmB,CAAuD;IAClF,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAyB;IAE5C,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAwB;IAE3C,OAAO,KAAK,WAAW,GAMtB;;IAgQD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe,CAErB;IAEW,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6OhE,OAAO,CAAC,gBAAgB,CA6CtB;IAEF,OAAO,CAAC,aAAa,CAEnB;IAEF,OAAO,CAAC,oBAAoB,CAI1B;IAEF,OAAO,CAAC,qBAAqB,CAG3B;IAEF,OAAO,CAAC,kBAAkB,CAmCxB;IAEF,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,yBAAyB,CAQhC;IAED,OAAO,CAAC,kBAAkB,CAExB;IAEF,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,mBAAmB,CAazB;IAEF,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,mBAAmB,CAUzB;IAEF,OAAO,CAAC,iCAAiC,CAGvC;IAEF,OAAO,CAAC,mBAAmB,CAczB;IAEF,OAAO,CAAC,oBAAoB,CAqD1B;IAEK,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA4C9D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAexC"}
|
package/dist/whiteboard.esm.js
CHANGED
|
@@ -25362,7 +25362,7 @@ var require_lodash = __commonJS({
|
|
|
25362
25362
|
|
|
25363
25363
|
// src/WhiteboardApplication.ts
|
|
25364
25364
|
var import_paper = __toESM(require_paper_full(), 1);
|
|
25365
|
-
import { AbstractApplication } from "@netless/forge-room";
|
|
25365
|
+
import { AbstractApplication, log as log3 } from "@netless/forge-room";
|
|
25366
25366
|
import * as Y15 from "yjs";
|
|
25367
25367
|
|
|
25368
25368
|
// src/model/RenderableModel.ts
|
|
@@ -27751,7 +27751,7 @@ var ToolbarModel = class extends EventEmitter3 {
|
|
|
27751
27751
|
this.root = root;
|
|
27752
27752
|
this.root.observe(this.handleRootUpdate);
|
|
27753
27753
|
Object.keys(defaultStyle).forEach((key) => {
|
|
27754
|
-
if (!this.root.has(key)) {
|
|
27754
|
+
if (!this.root.has(key) || this.root.get(key) === void 0) {
|
|
27755
27755
|
this.root.set(key, defaultStyle[key]);
|
|
27756
27756
|
}
|
|
27757
27757
|
});
|
|
@@ -28828,6 +28828,14 @@ var Camera = class extends EventEmitter8 {
|
|
|
28828
28828
|
hasPermission;
|
|
28829
28829
|
gesture;
|
|
28830
28830
|
inherentScale = 1;
|
|
28831
|
+
maxScale;
|
|
28832
|
+
initSize;
|
|
28833
|
+
bound;
|
|
28834
|
+
boundTiemoutId;
|
|
28835
|
+
enableByMouse = true;
|
|
28836
|
+
enableByTouch = true;
|
|
28837
|
+
boundaryColor = "#F44336";
|
|
28838
|
+
enableBoundaryHighlight = true;
|
|
28831
28839
|
get inherentMatrix() {
|
|
28832
28840
|
const inherentMatrix = new this.scope.Matrix();
|
|
28833
28841
|
inherentMatrix.scale(this.inherentScale, [0, 0]);
|
|
@@ -28837,8 +28845,12 @@ var Camera = class extends EventEmitter8 {
|
|
|
28837
28845
|
const view = this.scope.project.view;
|
|
28838
28846
|
return 1 / view.matrix.scaling.x;
|
|
28839
28847
|
}
|
|
28840
|
-
constructor(dom, userManager, scope, whiteboardAttrsMap, hasPermission, requestUserMap, paperSize, domSize) {
|
|
28848
|
+
constructor(initSize, maxScale, dom, userManager, scope, whiteboardAttrsMap, hasPermission, requestUserMap, paperSize, domSize) {
|
|
28841
28849
|
super();
|
|
28850
|
+
this.maxScale = maxScale;
|
|
28851
|
+
this.bound = window.document.createElement("div");
|
|
28852
|
+
this.bound.style.cssText = `transition: box-shadow 100ms;pointer-events:none;z-index:99;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);`;
|
|
28853
|
+
this.initSize = initSize;
|
|
28842
28854
|
this.hasPermission = hasPermission;
|
|
28843
28855
|
this.paperSize = paperSize;
|
|
28844
28856
|
this.domSize = domSize;
|
|
@@ -28847,6 +28859,7 @@ var Camera = class extends EventEmitter8 {
|
|
|
28847
28859
|
this.requestUserMap = requestUserMap;
|
|
28848
28860
|
this.userManager = userManager;
|
|
28849
28861
|
this.dom = dom;
|
|
28862
|
+
this.dom.appendChild(this.bound);
|
|
28850
28863
|
this.dom.addEventListener("wheel", this.handleWheel, { passive: false, capture: true });
|
|
28851
28864
|
this.dom.addEventListener("touchstart", (e) => {
|
|
28852
28865
|
e.preventDefault();
|
|
@@ -28867,17 +28880,32 @@ var Camera = class extends EventEmitter8 {
|
|
|
28867
28880
|
this.whiteboardAttrsMap.observe(this.handleMainCameraChange);
|
|
28868
28881
|
this.gesture = new Gesture(this.dom, this.scope);
|
|
28869
28882
|
this.gesture.on("offset", (x, y) => {
|
|
28883
|
+
if (!this.enableByTouch) {
|
|
28884
|
+
return;
|
|
28885
|
+
}
|
|
28870
28886
|
const matrix = new this.scope.Matrix();
|
|
28871
28887
|
matrix.translate({ x: x * this.translateScale, y: y * this.translateScale });
|
|
28872
|
-
this.
|
|
28888
|
+
this.updateViewMatrix(matrix);
|
|
28873
28889
|
});
|
|
28874
28890
|
this.gesture.on("scale", (scale, center) => {
|
|
28891
|
+
if (!this.enableByTouch) {
|
|
28892
|
+
return;
|
|
28893
|
+
}
|
|
28875
28894
|
const matrix = new this.scope.Matrix();
|
|
28876
28895
|
const paperPoint = this.scope.project.view.viewToProject(center);
|
|
28877
28896
|
matrix.scale(scale, paperPoint);
|
|
28878
|
-
this.
|
|
28897
|
+
this.updateViewMatrix(matrix);
|
|
28879
28898
|
});
|
|
28880
28899
|
}
|
|
28900
|
+
highlightBound() {
|
|
28901
|
+
if (this.enableBoundaryHighlight) {
|
|
28902
|
+
this.bound.style.boxShadow = `inset 0px 0px 6px 2px ${this.boundaryColor}`;
|
|
28903
|
+
window.clearTimeout(this.boundTiemoutId);
|
|
28904
|
+
this.boundTiemoutId = window.setTimeout(() => {
|
|
28905
|
+
this.bound.style.boxShadow = `none`;
|
|
28906
|
+
}, 100);
|
|
28907
|
+
}
|
|
28908
|
+
}
|
|
28881
28909
|
updateInherentScale(scale) {
|
|
28882
28910
|
this.inherentScale = scale;
|
|
28883
28911
|
}
|
|
@@ -28894,6 +28922,9 @@ var Camera = class extends EventEmitter8 {
|
|
|
28894
28922
|
return new this.scope.Matrix(matrixValue);
|
|
28895
28923
|
}
|
|
28896
28924
|
triggerZoom() {
|
|
28925
|
+
const [width, height] = this.domSize();
|
|
28926
|
+
this.bound.style.width = `${width}px`;
|
|
28927
|
+
this.bound.style.height = `${height}px`;
|
|
28897
28928
|
this.emit("zoom", this.inherentMatrix.appended(this.getActiveMatrix()));
|
|
28898
28929
|
}
|
|
28899
28930
|
resetViewMatrixToFlow(userId) {
|
|
@@ -28972,29 +29003,89 @@ var Camera = class extends EventEmitter8 {
|
|
|
28972
29003
|
}
|
|
28973
29004
|
}
|
|
28974
29005
|
};
|
|
28975
|
-
|
|
29006
|
+
validNextMatrix(next) {
|
|
29007
|
+
let shouldHighlightBound = false;
|
|
29008
|
+
const maxTranslate = (this.maxScale - 1) / 2;
|
|
29009
|
+
const maxScale = maxTranslate * 2 + 1;
|
|
29010
|
+
const minScale = 1 / maxScale;
|
|
29011
|
+
if (next.a > maxScale) {
|
|
29012
|
+
const tx = next.tx / next.a;
|
|
29013
|
+
next.a = maxScale;
|
|
29014
|
+
next.tx = tx * maxScale;
|
|
29015
|
+
shouldHighlightBound = true;
|
|
29016
|
+
}
|
|
29017
|
+
if (next.a < minScale) {
|
|
29018
|
+
const tx = next.tx / next.a;
|
|
29019
|
+
next.a = minScale;
|
|
29020
|
+
next.tx = tx * minScale;
|
|
29021
|
+
shouldHighlightBound = true;
|
|
29022
|
+
}
|
|
29023
|
+
if (next.d > maxScale) {
|
|
29024
|
+
const ty = next.ty / next.d;
|
|
29025
|
+
next.d = maxScale;
|
|
29026
|
+
next.ty = ty * maxScale;
|
|
29027
|
+
shouldHighlightBound = true;
|
|
29028
|
+
}
|
|
29029
|
+
if (next.d < minScale) {
|
|
29030
|
+
const ty = next.ty / next.d;
|
|
29031
|
+
next.d = minScale;
|
|
29032
|
+
next.ty = ty * minScale;
|
|
29033
|
+
shouldHighlightBound = true;
|
|
29034
|
+
}
|
|
29035
|
+
const maxTranslateX = this.initSize.width * maxTranslate;
|
|
29036
|
+
if (next.tx / next.a > maxTranslateX) {
|
|
29037
|
+
next.tx = maxTranslateX * next.a;
|
|
29038
|
+
shouldHighlightBound = true;
|
|
29039
|
+
}
|
|
29040
|
+
const minTx = (this.initSize.width * (maxTranslate + 1) - this.scope.project.view.bounds.width) * -next.a;
|
|
29041
|
+
if (next.tx < minTx) {
|
|
29042
|
+
next.tx = minTx;
|
|
29043
|
+
shouldHighlightBound = true;
|
|
29044
|
+
}
|
|
29045
|
+
const maxTranslateY = this.initSize.height * maxTranslate;
|
|
29046
|
+
if (next.ty / next.d > maxTranslateY) {
|
|
29047
|
+
next.ty = maxTranslateY * next.d;
|
|
29048
|
+
shouldHighlightBound = true;
|
|
29049
|
+
}
|
|
29050
|
+
const minTy = (this.initSize.height * (maxTranslate + 1) - this.scope.project.view.bounds.height) * -next.d;
|
|
29051
|
+
if (next.ty < minTy) {
|
|
29052
|
+
next.ty = minTy;
|
|
29053
|
+
shouldHighlightBound = true;
|
|
29054
|
+
}
|
|
29055
|
+
if (shouldHighlightBound) {
|
|
29056
|
+
this.highlightBound();
|
|
29057
|
+
}
|
|
29058
|
+
return next;
|
|
29059
|
+
}
|
|
29060
|
+
updateViewMatrix(matrix, append = true) {
|
|
28976
29061
|
const userMap = this.requestUserMap(this.userManager.selfId);
|
|
28977
29062
|
const cameraMode = userMap.get(WhiteboardKeys.cameraMode);
|
|
28978
|
-
|
|
29063
|
+
let next = matrix;
|
|
29064
|
+
if (append) {
|
|
28979
29065
|
const currentMatrixValue = userMap.get(WhiteboardKeys.viewMatrix);
|
|
28980
29066
|
const current = new this.scope.Matrix(currentMatrixValue);
|
|
28981
|
-
|
|
28982
|
-
|
|
28983
|
-
|
|
29067
|
+
next = current.appended(matrix);
|
|
29068
|
+
}
|
|
29069
|
+
if (this.maxScale >= 1) {
|
|
29070
|
+
next = this.validNextMatrix(next);
|
|
29071
|
+
} else {
|
|
29072
|
+
if (!(next.scaling.x <= 3 && next.scaling.x >= 0.2) && append) {
|
|
29073
|
+
return;
|
|
28984
29074
|
}
|
|
28985
29075
|
}
|
|
29076
|
+
if (cameraMode === "free" || cameraMode === "main") {
|
|
29077
|
+
userMap.set(WhiteboardKeys.viewMatrix, [next.a, next.b, next.c, next.d, next.tx, next.ty]);
|
|
29078
|
+
}
|
|
28986
29079
|
if (cameraMode === "main") {
|
|
28987
29080
|
if (this.hasPermission(32 /* mainView */)) {
|
|
28988
|
-
|
|
28989
|
-
const current = new this.scope.Matrix(currentMatrixValue);
|
|
28990
|
-
const next = current.appended(matrix);
|
|
28991
|
-
if (next.scaling.x <= 3 && next.scaling.x >= 0.3) {
|
|
28992
|
-
this.whiteboardAttrsMap.set(WhiteboardKeys.viewMatrix, [next.a, next.b, next.c, next.d, next.tx, next.ty]);
|
|
28993
|
-
}
|
|
29081
|
+
this.whiteboardAttrsMap.set(WhiteboardKeys.viewMatrix, [next.a, next.b, next.c, next.d, next.tx, next.ty]);
|
|
28994
29082
|
}
|
|
28995
29083
|
}
|
|
28996
29084
|
}
|
|
28997
29085
|
handleWheel = (evt) => {
|
|
29086
|
+
if (!this.enableByMouse) {
|
|
29087
|
+
return;
|
|
29088
|
+
}
|
|
28998
29089
|
evt.preventDefault();
|
|
28999
29090
|
evt.stopImmediatePropagation();
|
|
29000
29091
|
evt.stopPropagation();
|
|
@@ -29018,22 +29109,33 @@ var Camera = class extends EventEmitter8 {
|
|
|
29018
29109
|
} else {
|
|
29019
29110
|
scale = 1 + Math.abs(deltaY / wheelDelta);
|
|
29020
29111
|
}
|
|
29112
|
+
scale = Math.max(0.9, scale);
|
|
29113
|
+
scale = Math.min(1.1, scale);
|
|
29021
29114
|
matrix.scale(scale, paperPoint);
|
|
29022
|
-
this.
|
|
29115
|
+
this.updateViewMatrix(matrix);
|
|
29023
29116
|
} else {
|
|
29024
29117
|
const deltaX = this.lastDelta.x + evt.deltaX;
|
|
29025
29118
|
const deltaY = this.lastDelta.y + evt.deltaY;
|
|
29026
29119
|
const matrix = new this.scope.Matrix();
|
|
29027
29120
|
matrix.translate({ x: -deltaX * window.devicePixelRatio, y: -deltaY * window.devicePixelRatio });
|
|
29028
|
-
this.
|
|
29121
|
+
this.updateViewMatrix(matrix);
|
|
29029
29122
|
}
|
|
29030
29123
|
this.lastTriggerTime = Date.now();
|
|
29031
29124
|
this.lastDelta = { x: 0, y: 0 };
|
|
29032
29125
|
};
|
|
29126
|
+
scale(value) {
|
|
29127
|
+
const matrix = new this.scope.Matrix();
|
|
29128
|
+
matrix.scale(value, this.scope.project.view.bounds.center);
|
|
29129
|
+
this.updateViewMatrix(matrix);
|
|
29130
|
+
}
|
|
29033
29131
|
translate(offsetX, offsetY) {
|
|
29034
29132
|
const matrix = new this.scope.Matrix();
|
|
29035
29133
|
matrix.translate({ x: offsetX, y: offsetY });
|
|
29036
|
-
this.
|
|
29134
|
+
this.updateViewMatrix(matrix);
|
|
29135
|
+
}
|
|
29136
|
+
reset() {
|
|
29137
|
+
this.updateViewMatrix(new this.scope.Matrix(), false);
|
|
29138
|
+
this.lastDelta = { x: 0, y: 0 };
|
|
29037
29139
|
}
|
|
29038
29140
|
};
|
|
29039
29141
|
|
|
@@ -29142,6 +29244,22 @@ var Whiteboard = class extends EventEmitter9 {
|
|
|
29142
29244
|
* 描边宽度
|
|
29143
29245
|
*/
|
|
29144
29246
|
strokeWidth;
|
|
29247
|
+
/**
|
|
29248
|
+
* 是否允许用鼠标/触控板进行缩放和拖动画布
|
|
29249
|
+
*/
|
|
29250
|
+
enableCameraByMouse;
|
|
29251
|
+
/**
|
|
29252
|
+
* 是否允许触摸屏上触摸事件进行缩放和拖动画布
|
|
29253
|
+
*/
|
|
29254
|
+
enableCameraByTouch;
|
|
29255
|
+
/**
|
|
29256
|
+
* 相机超出边界时, 警示阴影的颜色, 默认 "#F44336"
|
|
29257
|
+
*/
|
|
29258
|
+
cameraBoundaryColor;
|
|
29259
|
+
/**
|
|
29260
|
+
* 是否允许相机超出边界时, 警示高亮阴影, 默认 true
|
|
29261
|
+
*/
|
|
29262
|
+
enableCameraBoundaryHighlight;
|
|
29145
29263
|
getElementAttribute;
|
|
29146
29264
|
setElementAttribute;
|
|
29147
29265
|
getCurrentTool;
|
|
@@ -29183,6 +29301,21 @@ var Whiteboard = class extends EventEmitter9 {
|
|
|
29183
29301
|
* 清空当前页面
|
|
29184
29302
|
*/
|
|
29185
29303
|
clearPage;
|
|
29304
|
+
/**
|
|
29305
|
+
* 平移画布
|
|
29306
|
+
* @param {number} offsetX - x 轴偏移量
|
|
29307
|
+
* @param {number} offsetY - y 轴偏移量
|
|
29308
|
+
*/
|
|
29309
|
+
translateCamera;
|
|
29310
|
+
/**
|
|
29311
|
+
* 以画布中心为固定点缩放画布
|
|
29312
|
+
* @param {number} scale - 缩放比例
|
|
29313
|
+
*/
|
|
29314
|
+
scaleCamera;
|
|
29315
|
+
/**
|
|
29316
|
+
* 重置画布, 将画布缩放比例重置为 1, 平移量重置为 [0, 0]
|
|
29317
|
+
*/
|
|
29318
|
+
resetCamera;
|
|
29186
29319
|
/**
|
|
29187
29320
|
* 为 userId 指定的用户设置页面, 调用需要有 `WhiteboardPermissionFlag.setOthersView` 权限,
|
|
29188
29321
|
* userId 指定的用户的视角模式应为 `free`, 否则调用无效
|
|
@@ -30139,6 +30272,21 @@ var WhiteboardApplication = class extends AbstractApplication {
|
|
|
30139
30272
|
this.inputType = type;
|
|
30140
30273
|
this.emitter.emit("inputTypeChange", this.inputType);
|
|
30141
30274
|
};
|
|
30275
|
+
this.emitter.translateCamera = (offsetX, offsetY) => {
|
|
30276
|
+
this.camera.translate(offsetX, offsetY);
|
|
30277
|
+
};
|
|
30278
|
+
this.emitter.scaleCamera = (scale) => {
|
|
30279
|
+
this.camera.scale(scale);
|
|
30280
|
+
};
|
|
30281
|
+
this.emitter.resetCamera = () => {
|
|
30282
|
+
this.camera.reset();
|
|
30283
|
+
};
|
|
30284
|
+
this.emitter.on("error", (errorCode, errorMessage) => {
|
|
30285
|
+
log3("WhiteboardApplicationError", {
|
|
30286
|
+
errorCode,
|
|
30287
|
+
errorMessage
|
|
30288
|
+
});
|
|
30289
|
+
});
|
|
30142
30290
|
const that = this;
|
|
30143
30291
|
Object.defineProperty(this.emitter, "tool", {
|
|
30144
30292
|
get() {
|
|
@@ -30196,6 +30344,38 @@ var WhiteboardApplication = class extends AbstractApplication {
|
|
|
30196
30344
|
that.toolbarModel.dashArray = v;
|
|
30197
30345
|
}
|
|
30198
30346
|
});
|
|
30347
|
+
Object.defineProperty(this.emitter, "enableCameraByMouse", {
|
|
30348
|
+
get() {
|
|
30349
|
+
return that.camera.enableByMouse;
|
|
30350
|
+
},
|
|
30351
|
+
set(value) {
|
|
30352
|
+
that.camera.enableByMouse = value;
|
|
30353
|
+
}
|
|
30354
|
+
});
|
|
30355
|
+
Object.defineProperty(this.emitter, "enableCameraByTouch", {
|
|
30356
|
+
get() {
|
|
30357
|
+
return that.camera.enableByTouch;
|
|
30358
|
+
},
|
|
30359
|
+
set(value) {
|
|
30360
|
+
that.camera.enableByTouch = value;
|
|
30361
|
+
}
|
|
30362
|
+
});
|
|
30363
|
+
Object.defineProperty(this.emitter, "cameraBoundaryColor", {
|
|
30364
|
+
get() {
|
|
30365
|
+
return that.camera.boundaryColor;
|
|
30366
|
+
},
|
|
30367
|
+
set(value) {
|
|
30368
|
+
that.camera.boundaryColor = value;
|
|
30369
|
+
}
|
|
30370
|
+
});
|
|
30371
|
+
Object.defineProperty(this.emitter, "enableCameraBoundaryHighlight", {
|
|
30372
|
+
get() {
|
|
30373
|
+
return that.camera.enableBoundaryHighlight;
|
|
30374
|
+
},
|
|
30375
|
+
set(value) {
|
|
30376
|
+
that.camera.enableBoundaryHighlight = value;
|
|
30377
|
+
}
|
|
30378
|
+
});
|
|
30199
30379
|
}
|
|
30200
30380
|
userMap(userId) {
|
|
30201
30381
|
return this.getMap(`user/${userId}`);
|
|
@@ -30223,7 +30403,12 @@ var WhiteboardApplication = class extends AbstractApplication {
|
|
|
30223
30403
|
);
|
|
30224
30404
|
this.pageModel.on("pagesChange", this.handleLayersChange);
|
|
30225
30405
|
this.pageModel.on("switchPage", this.handlePageSwitch);
|
|
30406
|
+
if (option.maxScaleRatio && option.maxScaleRatio < 1 && option.maxScaleRatio !== -1) {
|
|
30407
|
+
throw new Error(`[@netless/forge-whiteboard] invalid maxScaleRatio ${option.maxScaleRatio}`);
|
|
30408
|
+
}
|
|
30226
30409
|
this.camera = new Camera(
|
|
30410
|
+
new this.paperScope.Size(option.width, option.height),
|
|
30411
|
+
option.maxScaleRatio ?? -1,
|
|
30227
30412
|
this.rootElement,
|
|
30228
30413
|
this.userManager,
|
|
30229
30414
|
this.paperScope,
|
|
@@ -30284,10 +30469,19 @@ var WhiteboardApplication = class extends AbstractApplication {
|
|
|
30284
30469
|
grab: new GrabTool(this.enableToolEvent, this.getCurrentRenderableModel, this.shadowEmitter, this.paperScope, this.camera)
|
|
30285
30470
|
};
|
|
30286
30471
|
this.toolbarModel.on("update", (style) => {
|
|
30287
|
-
|
|
30472
|
+
if (this.tools[style.tool]) {
|
|
30473
|
+
this.paperScope.tool = this.tools[style.tool].tool;
|
|
30474
|
+
} else {
|
|
30475
|
+
this.emitter.emit("error", 300001, `${style.tool} not supported`);
|
|
30476
|
+
}
|
|
30288
30477
|
this.emitter.emit("toolbarStyleChange", style);
|
|
30289
30478
|
});
|
|
30290
|
-
|
|
30479
|
+
if (this.tools[this.toolbarModel.currentTool]) {
|
|
30480
|
+
this.paperScope.tool = this.tools[this.toolbarModel.currentTool].tool;
|
|
30481
|
+
} else {
|
|
30482
|
+
this.paperScope.tool = this.tools["curve"].tool;
|
|
30483
|
+
log3(`${this.toolbarModel.currentTool} not supported, backup to curve`);
|
|
30484
|
+
}
|
|
30291
30485
|
this.selectElementsModel.on("elementsChange", this.handleElementsSelect);
|
|
30292
30486
|
this.trashedElementsModel.on("elementsChange", this.handleElementsTrash);
|
|
30293
30487
|
this.trashedElementsModel.on("removeElementForSelf", this.handleRemoveTrashedElementForSelf);
|
|
@@ -30506,7 +30700,7 @@ var WhiteboardApplication = class extends AbstractApplication {
|
|
|
30506
30700
|
getCurrentRenderableModel = () => {
|
|
30507
30701
|
let layerId = this.userMap(this.userId).get(WhiteboardKeys.currentPage);
|
|
30508
30702
|
if (!this.layers.has(layerId)) {
|
|
30509
|
-
this.emitter.emit("error",
|
|
30703
|
+
this.emitter.emit("error", 300002, `target page: ${layerId} not found`);
|
|
30510
30704
|
}
|
|
30511
30705
|
return this.layers.get(layerId);
|
|
30512
30706
|
};
|