@netless/forge-whiteboard 0.1.7 → 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 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 appendViewMatrix;
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
@@ -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;IAElC,OAAO,KAAK,cAAc,GAIzB;IAED,OAAO,KAAK,cAAc,GAGzB;gBAGG,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;IA8C5B,mBAAmB,CAAC,KAAK,EAAE,MAAM;IAIxC,OAAO,CAAC,eAAe;IAahB,WAAW;IAIX,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,gBAAgB;IAyBxB,OAAO,CAAC,WAAW,CAuCjB;IAEK,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAKpD"}
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"}
@@ -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`, 否则调用无效
@@ -1 +1 @@
1
- {"version":3,"file":"Whiteboard.d.ts","sourceRoot":"","sources":["../src/Whiteboard.ts"],"names":[],"mappings":"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"}
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,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;;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;;IAsND,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe,CAErB;IAEW,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuOhE,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"}
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"}
@@ -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.appendViewMatrix(matrix);
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.appendViewMatrix(matrix);
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
- appendViewMatrix(matrix) {
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
- if (cameraMode === "free" || cameraMode === "main") {
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
- const next = current.appended(matrix);
28982
- if (next.scaling.x <= 3 && next.scaling.x >= 0.3) {
28983
- userMap.set(WhiteboardKeys.viewMatrix, [next.a, next.b, next.c, next.d, next.tx, next.ty]);
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
- const currentMatrixValue = this.whiteboardAttrsMap.get(WhiteboardKeys.viewMatrix);
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.appendViewMatrix(matrix);
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.appendViewMatrix(matrix);
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.appendViewMatrix(matrix);
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,15 @@ 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
+ };
30142
30284
  this.emitter.on("error", (errorCode, errorMessage) => {
30143
30285
  log3("WhiteboardApplicationError", {
30144
30286
  errorCode,
@@ -30202,6 +30344,38 @@ var WhiteboardApplication = class extends AbstractApplication {
30202
30344
  that.toolbarModel.dashArray = v;
30203
30345
  }
30204
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
+ });
30205
30379
  }
30206
30380
  userMap(userId) {
30207
30381
  return this.getMap(`user/${userId}`);
@@ -30229,7 +30403,12 @@ var WhiteboardApplication = class extends AbstractApplication {
30229
30403
  );
30230
30404
  this.pageModel.on("pagesChange", this.handleLayersChange);
30231
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
+ }
30232
30409
  this.camera = new Camera(
30410
+ new this.paperScope.Size(option.width, option.height),
30411
+ option.maxScaleRatio ?? -1,
30233
30412
  this.rootElement,
30234
30413
  this.userManager,
30235
30414
  this.paperScope,