Skip to content

Commit 166133c

Browse files
committed
feat: add setViewLocalScenePathChange
1 parent c0d9375 commit 166133c

7 files changed

Lines changed: 493 additions & 33 deletions

File tree

package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"devDependencies": {
55
"@commitlint/cli": "^16.2.3",
66
"@commitlint/config-conventional": "^16.2.1",
7-
"@netless/window-manager": "^0.4.75",
7+
"@netless/window-manager": "^1.0.9",
88
"@sveltejs/vite-plugin-svelte": "1.0.0-next.48",
99
"@tsconfig/svelte": "^3.0.0",
1010
"@types/node": "^17.0.41",
@@ -29,7 +29,8 @@
2929
"typescript": "^4.7.3",
3030
"typings": "workspace:*",
3131
"vite": "^2.9.10",
32-
"white-web-sdk": "2.16.52"
32+
"white-web-sdk": "2.16.53",
33+
"@netless/appliance-plugin": "1.1.27-beta.1"
3334
},
3435
"scripts": {
3536
"create-app": "node ./packages/create-app",
@@ -42,8 +43,9 @@
4243
"dev": "pnpm -F playground dev"
4344
},
4445
"overrides": {
45-
"@netless/window-manager": "^0.4.75",
46-
"white-web-sdk": "2.16.52",
46+
"@netless/appliance-plugin": "1.1.27-beta.1",
47+
"@netless/window-manager": "^1.0.9",
48+
"white-web-sdk": "2.16.53",
4749
"sass": "1.79.3"
4850
}
4951
}

packages/app-slide/src/SlideController/helpers.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import type { ScenePathType } from "white-web-sdk";
33
import type { Slide } from "@netless/slide";
44
import type { DocsViewerPage } from "../DocsViewer";
55
import type { Attributes } from "../typings";
6+
import type { AppliancePluginInstance } from "@netless/appliance-plugin";
7+
import { log, warn } from "../utils/logger";
68

79
export function createDocsViewerPages(slide: Slide, previewUrls: string[] = []): DocsViewerPage[] {
810
const { width, height, slideCount, slideState } = slide;
@@ -54,3 +56,51 @@ export function syncSceneWithSlide(
5456
context.setScenePath(scenePath);
5557
}
5658
}
59+
60+
export function renderSceneWithSlide(
61+
room: Room,
62+
context: AppContext<Attributes>,
63+
slide: Slide,
64+
baseScenePath: string,
65+
appliancePlugin: AppliancePluginInstance,
66+
needCount: boolean,
67+
count: number = 1000
68+
) {
69+
if (needCount && count <= 0) {
70+
warn('[Slide] renderSceneWithSlide count <= 0', count);
71+
return;
72+
}
73+
const page = slide.slideState.currentSlideIndex;
74+
if (!(page > 0)) return;
75+
const scenePath = [baseScenePath, page].join("/");
76+
// 只有打开ppt用户,并且场景路径不是页面(未被其它用户创建出页面),则需要同步场景
77+
let isFirstRender = false;
78+
if ((needCount && count === 100 || !needCount) && context.isAddApp && context.getIsWritable() && room.scenePathType(scenePath) !== ("page" as ScenePathType.Page)) {
79+
room.removeScenes(baseScenePath);
80+
const count = slide.slideCount;
81+
const scenes: { name: string }[] = [];
82+
for (let i = 1; i <= count; ++i) scenes.push({ name: `${i}` });
83+
room.putScenes(baseScenePath, scenes);
84+
isFirstRender = true;
85+
}
86+
87+
let currentScenePath: string;
88+
if (context.getBox().focus) {
89+
currentScenePath = room.state.sceneState.scenePath;
90+
} else {
91+
currentScenePath = context.getView()?.focusScenePath || "";
92+
}
93+
if (currentScenePath !== scenePath && room.scenePathType(scenePath) === ("page" as ScenePathType.Page)) {
94+
context.setScenePath(scenePath);
95+
}
96+
97+
const view = appliancePlugin.currentManager?.viewContainerManager.getView(context.appId);
98+
if (view) {
99+
needCount && log('[Slide] setViewLocalScenePathChange count', count);
100+
appliancePlugin.setViewLocalScenePathChange(scenePath, context.appId);
101+
} else if(needCount) {
102+
requestAnimationFrame(() => {
103+
renderSceneWithSlide(room, context, slide, baseScenePath, appliancePlugin, needCount, count - 1);
104+
});
105+
}
106+
}

packages/app-slide/src/index.ts

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { SlideDocsViewer } from "./SlideDocsViewer";
1818
import { apps, FreezerLength, addHooks, useFreezer } from "./utils/freezer";
1919
import { log, logger } from "./utils/logger";
2020
import styles from "./style.scss?inline";
21+
import { renderSceneWithSlide } from "./SlideController/helpers";
2122

2223
export type { PreviewParams } from "./SlidePreviewer";
2324
export { SlidePreviewer, default as previewSlide } from "./SlidePreviewer";
@@ -133,14 +134,19 @@ const SlideApp: NetlessApp<Attributes, MagixEvents, AppOptions, AppResult> = {
133134
const baseScenePath = context.getInitScenePath() as string;
134135

135136
let docsViewer: SlideDocsViewer | null = null;
136-
137137
const onPageChanged = (page: number) => {
138138
const room = context.getRoom();
139139
if (docsViewer && docsViewer.slideController) {
140140
let synced = false;
141-
if (room && context.getIsWritable()) {
142-
syncSceneWithSlide(room, context, docsViewer.slideController.slide, baseScenePath);
143-
synced = true;
141+
if (room) {
142+
const windowManager = context.getWindowManager();
143+
if (windowManager._appliancePlugin) {
144+
renderSceneWithSlide(room, context, docsViewer.slideController.slide, baseScenePath, windowManager._appliancePlugin, false);
145+
synced = true;
146+
} else if (context.getIsWritable()) {
147+
syncSceneWithSlide(room, context, docsViewer.slideController.slide, baseScenePath);
148+
synced = true;
149+
}
144150
}
145151
log("[Slide] page to", page, synced ? "(synced)" : "");
146152
docsViewer.viewer.setPageIndex(page - 1);
@@ -171,12 +177,18 @@ const SlideApp: NetlessApp<Attributes, MagixEvents, AppOptions, AppResult> = {
171177
// eslint-disable-next-line @typescript-eslint/no-explicit-any
172178
(window as any).slideController = slideController;
173179
}
174-
slideController.readyPromise.then(options.onReady).then(() => {
180+
slideController.readyPromise.then(options.onReady).then(async () => {
175181
const room = context.getRoom();
176182
let synced = false;
177-
if (room && context.getIsWritable()) {
178-
syncSceneWithSlide(room, context, slideController.slide, baseScenePath);
179-
synced = true;
183+
if (room) {
184+
const windowManager = context.getWindowManager();
185+
if (windowManager._appliancePlugin) {
186+
renderSceneWithSlide(room, context, slideController.slide, baseScenePath, windowManager._appliancePlugin, true);
187+
synced = true;
188+
} else if (context.getIsWritable()) {
189+
syncSceneWithSlide(room, context, slideController.slide, baseScenePath);
190+
synced = true;
191+
}
180192
}
181193
const page = slideController.slide.slideState.currentSlideIndex;
182194
log("[Slide] page to", page, synced ? "(synced)" : "", "(on ready)");

packages/app-slide/src/utils/logger.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class Logger {
100100

101101
export const logger = /** @__PURE__ */ new Logger(import.meta.env.DEV);
102102
export const log = /** @__PURE__ */ logger.log.bind(logger);
103+
export const warn = /** @__PURE__ */ logger.warn.bind(logger);
103104
export const verbose = /** @__PURE__ */ logger.verbose.bind(logger);
104105
export const setRoomLogger = (displayer: Displayer) => {
105106
logger.roomLogger = (displayer as any).logger;

packages/playground/src/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import "@netless/window-manager/dist/style.css";
2+
import "@netless/appliance-plugin/dist/style.css";
23
import type { WindowManager } from "@netless/window-manager";
34
import type { Room } from "white-web-sdk";
45

packages/playground/src/room.ts

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ import { ApplianceNames, DeviceType, WhiteWebSdk } from "white-web-sdk";
66

77
import { QueryVersion, store, type RoomInfo } from "./common";
88
import { clearQueryString, createRoom, persistStore } from "./common";
9+
import {
10+
ApplianceMultiPlugin,
11+
AppliancePluginOptions,
12+
UseWorkerType,
13+
} from "@netless/appliance-plugin";
14+
import fullWorkerString from "@netless/appliance-plugin/dist/fullWorker.js?raw";
15+
import subWorkerString from "@netless/appliance-plugin/dist/subWorker.js?raw";
916

1017
export const sdk = new WhiteWebSdk({
1118
appIdentifier: import.meta.env.VITE_APPID,
@@ -68,7 +75,7 @@ export async function joinRoom(info: RoomInfo): Promise<Room> {
6875
const room = await sdk.joinRoom({
6976
...info,
7077
uid,
71-
invisiblePlugins: [WindowManager],
78+
invisiblePlugins: [WindowManager as any, ApplianceMultiPlugin],
7279
useMultiViews: true,
7380
disableNewPencil: false,
7481
disableMagixEventDispatchLimit: true,
@@ -114,22 +121,78 @@ export async function reset({
114121
}
115122
}
116123

117-
export function init(container: HTMLElement) {
118-
WindowManager.mount({
124+
export async function init(container: HTMLElement) {
125+
const manager = await WindowManager.mount({
119126
room,
120127
container,
121128
chessboard: false,
122129
cursor: true,
123130
debug: true,
124131
prefersColorScheme: "auto",
125-
}).then(async manager => {
126-
window.manager = manager;
127-
await manager.switchMainViewToWriter();
128-
const tool = store.getItem("currentApplianceName") as ApplianceNames;
129-
if (tool) {
130-
manager.mainView.setMemberState({ currentApplianceName: tool });
131-
}
132+
supportAppliancePlugin: true,
133+
})
134+
const fullWorkerBlob = new Blob([fullWorkerString], {
135+
type: "text/javascript",
136+
});
137+
const fullWorkerUrl = URL.createObjectURL(fullWorkerBlob);
138+
const subWorkerBlob = new Blob([subWorkerString], {
139+
type: "text/javascript",
140+
});
141+
const subWorkerUrl = URL.createObjectURL(subWorkerBlob);
142+
const pluginOptions: AppliancePluginOptions = {
143+
cdn: {
144+
fullWorkerUrl,
145+
subWorkerUrl,
146+
},
147+
extras: {
148+
useSimple: true,
149+
// useWorker,
150+
// canvasOpt: {
151+
// contextType: "2d",
152+
// },
153+
cursor: {
154+
enable: false,
155+
expirationTime: 500,
156+
moveDelayTime: 300,
157+
},
158+
syncOpt: {
159+
interval: 100,
160+
smoothSync: false,
161+
},
162+
bezier: {
163+
enable: false,
164+
maxDrawCount: 180,
165+
},
166+
textEditor: {
167+
showFloatBar: false,
168+
canSelectorSwitch: false,
169+
rightBoundBreak: true,
170+
// extendFontFaces: [{fontFamily: "Pacifico", src: "https://fonts.gstatic.com/s/pacifico/v17/FwZY7-Qmy14u9lezJ-6H6MmBp0u-.woff2"}]
171+
extendFontFaces: [
172+
{
173+
fontFamily: "Noto Sans SC",
174+
src: "https://fonts.gstatic.com/s/opensans/v44/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-mu0SC55I.woff2",
175+
},
176+
],
177+
loadFontFacesTimeout: 20000,
178+
},
179+
longDottedStroke: {
180+
lineCap: "round",
181+
segment: 2,
182+
gap: 3,
183+
},
184+
},
185+
};
186+
const plugin = await ApplianceMultiPlugin.getInstance(manager as any, {
187+
options: pluginOptions,
132188
});
189+
(window as any).appliancePlugin = plugin;
190+
window.manager = manager;
191+
await manager.switchMainViewToWriter();
192+
const tool = store.getItem("currentApplianceName") as ApplianceNames;
193+
if (tool) {
194+
manager.mainView.setMemberState({ currentApplianceName: tool });
195+
}
133196
}
134197

135198
export const tools = Object.values(ApplianceNames);

0 commit comments

Comments
 (0)