@netless/window-manager 1.0.0-canary.8 → 1.0.0
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/LICENSE.txt +21 -0
- package/README.md +90 -64
- package/README.zh-cn.md +224 -0
- package/dist/index.d.ts +1133 -39
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/{index.es.js → index.mjs} +8393 -5913
- package/dist/index.mjs.map +1 -0
- package/dist/style.css +1 -1
- package/docs/advanced.md +55 -55
- package/docs/api.md +124 -113
- package/docs/app-context.md +248 -209
- package/docs/basic.md +25 -26
- package/docs/camera.md +19 -20
- package/docs/cn/advanced.md +137 -0
- package/docs/cn/api.md +309 -0
- package/docs/cn/app-context.md +369 -0
- package/docs/cn/basic.md +64 -0
- package/docs/cn/camera.md +53 -0
- package/docs/cn/concept.md +9 -0
- package/docs/cn/custom-max-bar.md +31 -0
- package/docs/cn/develop-app.md +94 -0
- package/docs/cn/export-pdf.md +48 -0
- package/docs/cn/migrate.md +60 -0
- package/docs/cn/replay.md +40 -0
- package/docs/concept.md +6 -5
- package/docs/custom-max-bar.md +31 -0
- package/docs/develop-app.md +22 -19
- package/docs/export-pdf.md +48 -0
- package/docs/migrate.md +25 -27
- package/docs/quickstart.md +50 -0
- package/docs/replay.md +20 -20
- package/package.json +32 -22
- package/src/App/AppContext.ts +104 -71
- package/src/App/AppPageStateImpl.ts +6 -25
- package/src/App/AppProxy.ts +42 -147
- package/src/App/MagixEvent/index.ts +38 -38
- package/src/App/Storage/StorageEvent.ts +13 -13
- package/src/App/Storage/index.ts +269 -245
- package/src/App/Storage/typings.ts +4 -2
- package/src/App/Storage/utils.ts +3 -3
- package/src/App/index.ts +0 -1
- package/src/AppListener.ts +8 -8
- package/src/AppManager.ts +84 -75
- package/src/AttributesDelegate.ts +42 -22
- package/src/BoxEmitter.ts +12 -6
- package/src/BoxManager.ts +122 -106
- package/src/ContainerResizeObserver.ts +75 -0
- package/src/Cursor/Cursor.svelte +16 -5
- package/src/Cursor/Cursor.svelte.d.ts +21 -0
- package/src/Cursor/Cursor.ts +77 -13
- package/src/Cursor/icons.ts +6 -0
- package/src/Cursor/icons2.ts +66 -0
- package/src/Cursor/index.ts +127 -26
- package/src/Helper.ts +94 -14
- package/src/InternalEmitter.ts +2 -7
- package/src/Page/PageController.ts +1 -0
- package/src/Page/index.ts +1 -1
- package/src/PageState.ts +6 -5
- package/src/ReconnectRefresher.ts +9 -4
- package/src/RedoUndo.ts +3 -3
- package/src/Register/index.ts +22 -17
- package/src/Register/loader.ts +26 -22
- package/src/Register/storage.ts +13 -13
- package/src/Utils/Common.ts +18 -14
- package/src/Utils/Reactive.ts +26 -25
- package/src/Utils/RoomHacker.ts +4 -4
- package/src/Utils/error.ts +0 -1
- package/src/View/IframeBridge.ts +680 -0
- package/src/View/MainView.ts +114 -53
- package/src/callback.ts +21 -1
- package/src/constants.ts +0 -2
- package/src/image/pencil-eraser-1.svg +3 -0
- package/src/image/pencil-eraser-2.svg +3 -0
- package/src/image/pencil-eraser-3.svg +3 -0
- package/src/index.ts +224 -74
- package/src/style.css +27 -10
- package/src/typings.ts +20 -10
- package/.prettierignore +0 -7
- package/.prettierrc.json +0 -9
- package/CHANGELOG.md +0 -196
- package/__mocks__/white-web-sdk.ts +0 -50
- package/dist/App/AppContext.d.ts +0 -76
- package/dist/App/AppPageStateImpl.d.ts +0 -21
- package/dist/App/AppProxy.d.ts +0 -81
- package/dist/App/AppViewSync.d.ts +0 -11
- package/dist/App/MagixEvent/index.d.ts +0 -29
- package/dist/App/Storage/StorageEvent.d.ts +0 -8
- package/dist/App/Storage/index.d.ts +0 -39
- package/dist/App/Storage/typings.d.ts +0 -22
- package/dist/App/Storage/utils.d.ts +0 -5
- package/dist/App/WhiteboardView.d.ts +0 -22
- package/dist/App/index.d.ts +0 -3
- package/dist/AppListener.d.ts +0 -21
- package/dist/AppManager.d.ts +0 -107
- package/dist/AttributesDelegate.d.ts +0 -80
- package/dist/BoxEmitter.d.ts +0 -34
- package/dist/BoxManager.d.ts +0 -100
- package/dist/BuiltinApps.d.ts +0 -5
- package/dist/Cursor/Cursor.d.ts +0 -39
- package/dist/Cursor/icons.d.ts +0 -3
- package/dist/Cursor/index.d.ts +0 -46
- package/dist/Helper.d.ts +0 -17
- package/dist/InternalEmitter.d.ts +0 -39
- package/dist/Page/PageController.d.ts +0 -20
- package/dist/Page/index.d.ts +0 -3
- package/dist/PageState.d.ts +0 -9
- package/dist/ReconnectRefresher.d.ts +0 -24
- package/dist/RedoUndo.d.ts +0 -18
- package/dist/Register/index.d.ts +0 -28
- package/dist/Register/loader.d.ts +0 -4
- package/dist/Register/storage.d.ts +0 -8
- package/dist/Utils/AppCreateQueue.d.ts +0 -15
- package/dist/Utils/Common.d.ts +0 -23
- package/dist/Utils/Reactive.d.ts +0 -6
- package/dist/Utils/RoomHacker.d.ts +0 -3
- package/dist/Utils/error.d.ts +0 -27
- package/dist/Utils/log.d.ts +0 -1
- package/dist/View/CameraSynchronizer.d.ts +0 -17
- package/dist/View/MainView.d.ts +0 -48
- package/dist/View/ViewManager.d.ts +0 -13
- package/dist/View/ViewSync.d.ts +0 -7
- package/dist/callback.d.ts +0 -24
- package/dist/constants.d.ts +0 -49
- package/dist/index.cjs.js +0 -46
- package/dist/index.umd.js +0 -46
- package/dist/typings.d.ts +0 -82
- package/jest.config.js +0 -27
- package/pnpm-lock.yaml +0 -6302
- package/src/App/AppViewSync.ts +0 -68
- package/src/App/WhiteboardView.ts +0 -83
- package/src/View/CameraSynchronizer.ts +0 -73
- package/src/View/ViewSync.ts +0 -10
- package/vite.config.js +0 -51
- /package/docs/{qickstart.md → cn/quickstart.md} +0 -0
package/docs/camera.md
CHANGED
|
@@ -1,53 +1,52 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
1
|
+
# view angle
|
|
2
|
+
In multi-window mode, multiple whiteboards can exist at the same time, but in most cases users only need to operate on the main whiteboard, which is `mainView`
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Get `camera` of `mainView`
|
|
6
6
|
```typescript
|
|
7
7
|
manager.mainView.camera
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Get `size` of `mainView`
|
|
11
11
|
```typescript
|
|
12
12
|
manager.mainView.size
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Monitor `camera` changes in `mainView`
|
|
16
16
|
```typescript
|
|
17
17
|
manager.mainView.callbacks.on("onCameraUpdated", camera => {
|
|
18
|
-
|
|
18
|
+
// updated camera
|
|
19
19
|
})
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Monitor the change of `size` of `mainView`
|
|
23
23
|
```typescript
|
|
24
24
|
manager.mainView.callbacks.on("onSizeUpdated", camera => {
|
|
25
|
-
|
|
25
|
+
// updated size
|
|
26
26
|
})
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
##
|
|
29
|
+
## Move `camera` via `api`
|
|
30
30
|
```typescript
|
|
31
31
|
manager.moveCamera(camera)
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
##
|
|
35
|
-
|
|
34
|
+
## Set view bounds
|
|
35
|
+
Limit everyone's viewing angle to a rectangle centered at world coordinates (0, 0) with a width of 1024 and a height of 768.
|
|
36
36
|
```typescript
|
|
37
37
|
manager.setCameraBound({
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
centerX: 0,
|
|
39
|
+
centerY: 0,
|
|
40
|
+
width: 1024,
|
|
41
|
+
height: 768,
|
|
42
42
|
})
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
##
|
|
45
|
+
## Prohibit/allow movement and scaling of `mainView` `camera`
|
|
46
46
|
```typescript
|
|
47
|
-
//
|
|
47
|
+
// Prohibit `camera` from moving and zooming
|
|
48
48
|
manager.mainView.disableCameraTransform = false
|
|
49
49
|
|
|
50
|
-
//
|
|
50
|
+
// restore `camera` movement, scaling
|
|
51
51
|
manager.mainView.disableCameraTransform = true
|
|
52
|
-
```
|
|
53
|
-
|
|
52
|
+
```
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
## 进阶使用
|
|
2
|
+
|
|
3
|
+
- 目录
|
|
4
|
+
- [撤销重做](#redo-undo)
|
|
5
|
+
- [清屏](#clean-current-scene)
|
|
6
|
+
- [判断是否打开某种 APP](#has-kind)
|
|
7
|
+
- [页面控制器](#page-control)
|
|
8
|
+
- [视角](#view-mode)
|
|
9
|
+
- [插入图片到当前app](#insert-image-to-app)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
<h3 id="redo-undo">撤销重做</h3>
|
|
13
|
+
|
|
14
|
+
> 以下事件和属性都会根据 `focus` 的窗口来进行自动切换应用对象
|
|
15
|
+
|
|
16
|
+
#### 获取可以撤销/重做的步数
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
manager.canUndoSteps
|
|
20
|
+
manager.canRedoSteps
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
#### 监听可以撤销/重做的步数的变化
|
|
24
|
+
|
|
25
|
+
`canRedoStepsChange` 和 `canUndoStepsChange` 会在切换窗口时重新触发
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
manager.emitter.on("canUndoStepsChange", (steps: number) => {
|
|
29
|
+
// 可以撤销的步数更新
|
|
30
|
+
})
|
|
31
|
+
manager.emitter.on("canRedoStepsChange", (steps: number) => {
|
|
32
|
+
// 可以重做的步数更新
|
|
33
|
+
})
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
#### 撤销/重做
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
manager.undo() //撤销
|
|
40
|
+
manager.redo() // 重做
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
<br>
|
|
44
|
+
|
|
45
|
+
<h3 id="clean-current-scene">清屏</h3>
|
|
46
|
+
|
|
47
|
+
因为在多窗口模式下有多个白板, 如果想要清除当前 `focus` 的白板只需要调用
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
manager.cleanCurrentScene()
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
只想清理主白板的笔迹则需要
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
manager.mainView.cleanCurrentScene()
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
<br>
|
|
61
|
+
|
|
62
|
+
<h3 id="has-kind">判断是否打开某种 APP</h3>
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
manager.emitter.on("ready", () => { // ready 事件在所有 app 创建完成后触发
|
|
66
|
+
const apps = manager.queryAll(); // 获取所有已经打开的 App
|
|
67
|
+
const hasSlide = apps.some(app => app.kind === "Slide"); // 判断已经打开的 APP 中是否有 Slide
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
<br>
|
|
72
|
+
|
|
73
|
+
<h3 id="page-control">页面控制器</h3>
|
|
74
|
+
|
|
75
|
+
`manager` 提供了一个 `pageState` 来获取当前的 index 和总页数
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
manager.pageState.index // 当前的 index
|
|
79
|
+
manager.pageState.length // 总页数
|
|
80
|
+
|
|
81
|
+
manager.emitter.on("pageStateChange", state => {
|
|
82
|
+
// 当前 index 变化和总页数变化会触发此事件
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
上一页/下一页/添加一页
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
manager.nextPage()
|
|
90
|
+
manager.prevPage()
|
|
91
|
+
manager.addPage()
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
<br>
|
|
95
|
+
|
|
96
|
+
<h3 id="view-mode">视角跟随</h3>
|
|
97
|
+
|
|
98
|
+
多窗口中 `ViewMode` 有 `broadcaster` `freedom` 两种模式
|
|
99
|
+
|
|
100
|
+
- `freedom`
|
|
101
|
+
|
|
102
|
+
自由模式,用户可以自由放缩、移动视角
|
|
103
|
+
|
|
104
|
+
即便房间里有主播,主播也无法影响用户的视角
|
|
105
|
+
|
|
106
|
+
- `broadcaster`
|
|
107
|
+
|
|
108
|
+
主播模式, 操作时其他人的视角都会跟随我
|
|
109
|
+
|
|
110
|
+
同时其他为 `broadcaster` 模式的人也会影响我的视角
|
|
111
|
+
|
|
112
|
+
在 `isWritable` 为 `false` 时只会跟随其他 `broadcaster` 的视角
|
|
113
|
+
|
|
114
|
+
<br>
|
|
115
|
+
|
|
116
|
+
<h3 id="insert-image-to-app">插入图片到当前 app</h3>
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
// 判断当前是否为最大化
|
|
120
|
+
if (manager.boxState === "maximized") {
|
|
121
|
+
// `focused` 的值的会根据当前 focus 的 app 不同而变化
|
|
122
|
+
const app = manager.queryOne(manager.focused)
|
|
123
|
+
// 有 view 的 app 才可以插入图片, 像是 视频,音频之类的 app 是没有 view 的
|
|
124
|
+
if (app.view) {
|
|
125
|
+
var imageInformation = {
|
|
126
|
+
uuid: uuid,
|
|
127
|
+
centerX: centerX,
|
|
128
|
+
centerY: centerY,
|
|
129
|
+
width: width,
|
|
130
|
+
height: height,
|
|
131
|
+
locked: false,
|
|
132
|
+
};
|
|
133
|
+
app.view.insertImage(imageInformation);
|
|
134
|
+
app.view.completeImageUpload(uuid, src);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
package/docs/cn/api.md
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# API
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
- [静态方法](#static-methods)
|
|
5
|
+
- [`mount`](#mount)
|
|
6
|
+
- [`register`](#register)
|
|
7
|
+
- [`registered`](#registered)
|
|
8
|
+
- [`setContainer`](#set-container)
|
|
9
|
+
- [`setCollectorContainer`](#set-collector-container)
|
|
10
|
+
- [实例方法](#instance-methods)
|
|
11
|
+
- [`addApp`](#addApp)
|
|
12
|
+
- [`closeApp`](#closeApp)
|
|
13
|
+
- [`focusApp`](#focusApp)
|
|
14
|
+
- [`setMainViewSceneIndex`](#setMainViewSceneIndex)
|
|
15
|
+
- [`setBoxState`](#setBoxState)
|
|
16
|
+
- [`cleanCurrentScene`](#cleanCurrentScene)
|
|
17
|
+
- [`redo`](#redo)
|
|
18
|
+
- [`undo`](#undo)
|
|
19
|
+
- [`copy`](#copy)
|
|
20
|
+
- [`paste`](#paste)
|
|
21
|
+
- [`delete`](#delete)
|
|
22
|
+
- [`duplicate`](#duplicate)
|
|
23
|
+
- [`insertText`](#insertText)
|
|
24
|
+
- [`insertImage`](#insertImage)
|
|
25
|
+
- [`completeImageUpload`](#completeImageUpload)
|
|
26
|
+
- [`lockImage`](#lockImage)
|
|
27
|
+
- [`lockImages`](#lockImages)
|
|
28
|
+
- [`nextPage`](#nextPage)
|
|
29
|
+
- [`prevPage`](#prevPage)
|
|
30
|
+
- [`addPage`](#addPage)
|
|
31
|
+
- [`removePage`](#removePage)
|
|
32
|
+
- [`refresh`](#refresh)
|
|
33
|
+
- [`setContainerSizeRatio`](#setContainerSizeRatio)
|
|
34
|
+
- [实例属性](#prototypes)
|
|
35
|
+
- [事件回调](#events)
|
|
36
|
+
|
|
37
|
+
<br>
|
|
38
|
+
|
|
39
|
+
<h2 id="static-methods">静态方法</h2>
|
|
40
|
+
|
|
41
|
+
<h3 id="mount">WindowManager.mount</h3>
|
|
42
|
+
|
|
43
|
+
> 挂载 WindowManager
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
const manager = await WindowManager.mount(
|
|
47
|
+
room: room,
|
|
48
|
+
container: document.getElementById("container")
|
|
49
|
+
// 完整配置见下方
|
|
50
|
+
);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
参数
|
|
54
|
+
|
|
55
|
+
| name | type | default | desc |
|
|
56
|
+
| ---------------------- | --------------------------------------- | ------- | ---------------------------- |
|
|
57
|
+
| room | [require] Room | | 房间实例 |
|
|
58
|
+
| container | [require] HTMLElement | | 房间挂载容器 |
|
|
59
|
+
| containerSizeRatio | [optional] number | 9 / 16 | 多窗口区域的高宽比,默认为 9 : 16 |
|
|
60
|
+
| chessboard | [optional] boolean | true | 多窗口区域以外的空间显示 PS 棋盘背景,默认 true |
|
|
61
|
+
| collectorContainer | [optional] HTMLElement | | 用于多窗口最小化图标挂载的 dom |
|
|
62
|
+
| collectorStyles | [optional] Partial{CSSStyleDeclaration} | | 配置 collector 的样式 |
|
|
63
|
+
| overwriteStyles | [optional] string | | 用于覆盖窗口的样式 |
|
|
64
|
+
| cursor | [optional] boolean | false | 开启光标同步 |
|
|
65
|
+
| disableCameraTransform | [optional] boolean | | 禁用主白板的相机移动 |
|
|
66
|
+
| prefersColorScheme | [optional] string | light | auto, light, dark |
|
|
67
|
+
| debug | [optional] boolean | false | 打印日志信息
|
|
68
|
+
| applianceIcons | [optional] {ApplianceNames, string} | | 配置光标使用的教具图片 |
|
|
69
|
+
|
|
70
|
+
<h3 id="register">WindowManager.register</h3>
|
|
71
|
+
|
|
72
|
+
> 注册 `APP` 到 `WindowManager`
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
WindowManager.register({
|
|
76
|
+
kind: "helloWorld",
|
|
77
|
+
src: NetlessApp,
|
|
78
|
+
appOptions: () => "appOptions",
|
|
79
|
+
addHooks: (emitter) => {
|
|
80
|
+
emitter.on("created", result => {
|
|
81
|
+
console.log("HelloWordResult", result);
|
|
82
|
+
});
|
|
83
|
+
emitter.on("focus", result => {
|
|
84
|
+
console.log("HelloWorld focus", result);
|
|
85
|
+
})
|
|
86
|
+
emitter.on("destroy", result => {
|
|
87
|
+
console.log("HelloWorld destroy", result);
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
<br>
|
|
94
|
+
|
|
95
|
+
<h3 id="registered">WindowManager.registered</h3>
|
|
96
|
+
|
|
97
|
+
> 获取已经注册过的 `App`
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
WindowManager.registered
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
<br>
|
|
104
|
+
|
|
105
|
+
<h3 id="set-container">setContainer</h3>
|
|
106
|
+
|
|
107
|
+
> 设置白板挂载容器
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
WindowManager.setContainer(document.getElementById("container"));
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
<h3 id="set-container">setCollectorContainer</h3>
|
|
114
|
+
|
|
115
|
+
> 设置 `Collector` 挂载的容器
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
WindowManager.setCollectorContainer(document.getElementById("collector-container"));
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
<br>
|
|
122
|
+
|
|
123
|
+
<h2 id="instance-methods">实例方法</h2>
|
|
124
|
+
|
|
125
|
+
<h3 id="addApp">addApp</h3>
|
|
126
|
+
|
|
127
|
+
> 添加 `app` 至白板
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
const appId = await manager.addApp({
|
|
131
|
+
kind: "helloWorld"
|
|
132
|
+
options: { // 可选配置
|
|
133
|
+
scenePath: "/hello-world"
|
|
134
|
+
}
|
|
135
|
+
})
|
|
136
|
+
```
|
|
137
|
+
具体参数请参考 `APP` 本身的要求
|
|
138
|
+
|
|
139
|
+
<h3 id="closeApp">closeApp</h3>
|
|
140
|
+
|
|
141
|
+
> 关闭已经打开的 `APP`
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
manager.closeApp(appId)
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
<h3 id="focusApp">focusApp</h3>
|
|
148
|
+
|
|
149
|
+
> 切换当前 `focus` 的 `app`, 并把此 `app` 置为最前
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
manager.focusApp(appId)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
<h3 id="setMainViewSceneIndex">setMainViewSceneIndex</h3>
|
|
156
|
+
|
|
157
|
+
> 设置主白板的 `SceneIndex`
|
|
158
|
+
|
|
159
|
+
```ts
|
|
160
|
+
manager.setMainViewSceneIndex(1)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
<h3 id="setBoxState">setBoxState</h3>
|
|
164
|
+
|
|
165
|
+
> 设置当前的 `boxState`
|
|
166
|
+
|
|
167
|
+
```ts
|
|
168
|
+
manager.setBoxState("normal") // boxState: normal | maximized | minimized
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
<h3 id="cleanCurrentScene">cleanCurrentScene</h3>
|
|
172
|
+
|
|
173
|
+
> 清除当前 focus 的 view 的笔迹
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
manager.cleanCurrentScene()
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
<h3 id="redo">redo</h3>
|
|
180
|
+
|
|
181
|
+
> 在当前 focus 的 view 上重做上一步操作
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
manager.redo()
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
<h3 id="undo">undo</h3>
|
|
188
|
+
|
|
189
|
+
> 在当前 focus 的 view 上撤消上一步操作
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
manager.undo()
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
<h3 id="nextPage">nextPage</h3>
|
|
196
|
+
|
|
197
|
+
> 切换主白板至下一页
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
const success = await manager.nextPage()
|
|
201
|
+
if (!success) {
|
|
202
|
+
// 已经到了最后一页
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
<h3 id="prevPage">prevPage</h3>
|
|
207
|
+
|
|
208
|
+
> 切换主白板至上一页
|
|
209
|
+
|
|
210
|
+
```ts
|
|
211
|
+
const success = await manager.prevPage()
|
|
212
|
+
if (!success) {
|
|
213
|
+
// 已经到了第一页
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
<h3 id="addPage">addPage</h3>
|
|
218
|
+
|
|
219
|
+
> 在主白板添加一页
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
manager.addPage() // 默认在最后添加一页
|
|
223
|
+
manager.addPage({ after: true }) // 在当前页后添加一页
|
|
224
|
+
manager.addPage({ scene: { name: "page2" } }) // 传入 page 信息
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
<h3 id="removePage">removePage</h3>
|
|
228
|
+
|
|
229
|
+
> 移除一页
|
|
230
|
+
> 当只剩一页时, 最后一页不允许被删除
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
const success = await manager.removePage() // 默认删除当前页
|
|
234
|
+
const success = await manager.removePage(1) // 可以删除指定 index
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
<h3 id="refresh">refresh</h3>
|
|
238
|
+
|
|
239
|
+
> 刷新 `manager` 的内部状态, 用于从其他房间 `copy` `attributes`
|
|
240
|
+
|
|
241
|
+
```ts
|
|
242
|
+
manager.refresh()
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
<h3 id="setContainerSizeRatio">setContainerSizeRatio</h3>
|
|
246
|
+
|
|
247
|
+
> 设置白板同步区域的宽高比
|
|
248
|
+
|
|
249
|
+
```ts
|
|
250
|
+
manager.setContainerSizeRatio(10 / 16)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
<br>
|
|
254
|
+
|
|
255
|
+
<h2 id="prototypes">实例属性</h2>
|
|
256
|
+
|
|
257
|
+
| name | type | default | desc |
|
|
258
|
+
| ------------------ | ------- | ------- | ----------------- |
|
|
259
|
+
| mainView | View | | 主白板 |
|
|
260
|
+
| mainViewSceneIndex | number | | 当前主白板的 SceneIndex |
|
|
261
|
+
| mainViewScenesLength | number | | mainView 的 scenes 长度 |
|
|
262
|
+
| boxState | string | | 当前窗口状态 |
|
|
263
|
+
| darkMode | boolean | | 黑夜模式 |
|
|
264
|
+
| prefersColorScheme | string | | 颜色主题 |
|
|
265
|
+
| focused | string | | focus 的 app |
|
|
266
|
+
| canRedoSteps | number | | 当前 focus 的 view 可以重做的步数 |
|
|
267
|
+
| canRedoSteps | number | | 当前 focus 的 view 可以撤销的步数 |
|
|
268
|
+
| sceneState | SceneState | | 兼容原本 SDK 的 sceneState 属性, 只对 mainView 生效 |
|
|
269
|
+
| pageState | PageState | | 组合 mainView 的 index 和 scenes 的修改 |
|
|
270
|
+
|
|
271
|
+
<br>
|
|
272
|
+
|
|
273
|
+
<h2 id="events">事件回调</h2>
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
manager.emitter.on(events, listener)
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
| name | type | default | desc |
|
|
280
|
+
| ------------------------ | -------------- | ------- | -------------------------- |
|
|
281
|
+
| mainViewModeChange | ViewVisionMode | | |
|
|
282
|
+
| mainViewSceneIndexChange | index: number | | |
|
|
283
|
+
| boxStateChange | string | | normal,minimized,maximized |
|
|
284
|
+
| darkModeChange | boolean | | |
|
|
285
|
+
| prefersColorSchemeChange | string | | auto,light,dark |
|
|
286
|
+
| cameraStateChange | CameraState | | |
|
|
287
|
+
| focusedChange | string, undefined | | 当前 focus 的 appId,主白板时为 undefined |
|
|
288
|
+
| mainViewScenesLengthChange | number | | mainView scenes 添加或删除时触发 |
|
|
289
|
+
| canRedoStepsChange | number | | 当前 focus 的 view 可重做步数改变 |
|
|
290
|
+
| canUndoStepsChange | number | | 当前 focus 的 view 可撤销步数改变 |
|
|
291
|
+
| loadApp | LoadAppEvent | | 加载远程APP 事件 |
|
|
292
|
+
| ready | undefined | | 当所有 APP 创建完毕时触发 |
|
|
293
|
+
| sceneStateChange | SceneState | | 当 sceneState 修改时触发 |
|
|
294
|
+
| pageStateChange | PageState | | |
|
|
295
|
+
|
|
296
|
+
```ts
|
|
297
|
+
type LoadAppEvent = {
|
|
298
|
+
kind: string;
|
|
299
|
+
status: "start" | "success" | "failed";
|
|
300
|
+
reason?: string;
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
```ts
|
|
305
|
+
type PageState = {
|
|
306
|
+
index: number;
|
|
307
|
+
length: number;
|
|
308
|
+
}
|
|
309
|
+
```
|