Skip to content

Commit fd1fa58

Browse files
committed
Allow hot-swap shared model
1 parent d6f5429 commit fd1fa58

File tree

10 files changed

+159
-94
lines changed

10 files changed

+159
-94
lines changed

packages/base/src/3dview/mainview.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
IDict,
55
IDisplayShape,
66
IJupyterCadClientState,
7-
IJupyterCadDoc,
87
IJupyterCadModel,
98
IPostOperatorInput,
109
IPostResult,
@@ -1226,7 +1225,7 @@ export class MainView extends React.Component<IProps, IStates> {
12261225
}
12271226

12281227
private _onSharedMetadataChanged = (
1229-
_: IJupyterCadDoc,
1228+
_: IJupyterCadModel,
12301229
changes: MapChange
12311230
) => {
12321231
const newState = { ...this.state.annotations };
@@ -1369,10 +1368,10 @@ export class MainView extends React.Component<IProps, IStates> {
13691368
};
13701369

13711370
private _onSharedOptionsChanged(
1372-
sender: IJupyterCadDoc,
1371+
sender: IJupyterCadModel,
13731372
change: MapChange
13741373
): void {
1375-
const objects = sender.objects;
1374+
const objects = sender.sharedModel.objects;
13761375

13771376
if (objects) {
13781377
for (const objData of objects) {

packages/base/src/3dview/mainviewmodel.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
IJcadObjectDocChange,
66
IJCadWorker,
77
IJCadWorkerRegistry,
8-
IJupyterCadDoc,
98
IJupyterCadModel,
109
IMainMessage,
1110
IPostOperatorInput,
@@ -275,7 +274,7 @@ export class MainViewModel implements IDisposable {
275274
}
276275

277276
private async _onSharedObjectsChanged(
278-
_: IJupyterCadDoc,
277+
_: IJupyterCadModel,
279278
change: IJcadObjectDocChange
280279
): Promise<void> {
281280
if (change.objectChange) {

packages/base/src/panelview/objectproperties.tsx

+13-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
IJCadModel,
55
IJcadObjectDocChange,
66
IJupyterCadClientState,
7-
IJupyterCadDoc,
87
IJupyterCadModel,
98
IJupyterCadTracker,
109
ISelection
@@ -133,12 +132,20 @@ class ObjectPropertiesReact extends React.Component<IProps, IStates> {
133132
this.props.cpModel.jcadModel?.sharedObjectsChanged.connect(
134133
this._sharedJcadModelChanged
135134
);
135+
this.props.cpModel.jcadModel?.sharedModelSwapped.connect(
136+
this._sharedModelSwappedHandler,
137+
this
138+
);
136139
this.props.cpModel.documentChanged.connect((_, changed) => {
137140
if (changed) {
138141
this.props.cpModel.disconnect(this._sharedJcadModelChanged);
139142
this.props.cpModel.disconnect(this._onClientSharedStateChanged);
140143
const currentModel = changed.context.model;
141144
currentModel.sharedObjectsChanged.connect(this._sharedJcadModelChanged);
145+
currentModel.sharedModelSwapped.connect(
146+
this._sharedModelSwappedHandler,
147+
this
148+
);
142149
const clients = currentModel.sharedModel.awareness.getStates() as Map<
143150
number,
144151
IJupyterCadClientState
@@ -217,7 +224,7 @@ class ObjectPropertiesReact extends React.Component<IProps, IStates> {
217224
};
218225

219226
private _sharedJcadModelChanged = (
220-
_: IJupyterCadDoc,
227+
_: IJupyterCadModel,
221228
changed: IJcadObjectDocChange
222229
): void => {
223230
this.setState(old => {
@@ -245,7 +252,10 @@ class ObjectPropertiesReact extends React.Component<IProps, IStates> {
245252
}
246253
});
247254
};
248-
255+
private _sharedModelSwappedHandler(sender: IJupyterCadModel) {
256+
const clientId = sender.getClientId();
257+
this.setState(old => ({ ...old, clientId }));
258+
}
249259
private _onClientSharedStateChanged = (
250260
sender: IJupyterCadModel,
251261
clients: Map<number, IJupyterCadClientState>
@@ -288,7 +298,6 @@ class ObjectPropertiesReact extends React.Component<IProps, IStates> {
288298
newState = localState;
289299
}
290300
}
291-
292301
if (newState) {
293302
const selection = newState.selected.value;
294303
const selectedObjectNames = Object.keys(selection || {});
@@ -302,7 +311,6 @@ class ObjectPropertiesReact extends React.Component<IProps, IStates> {
302311
}));
303312
return;
304313
}
305-
306314
let selectedObject = selectedObjectNames[0];
307315
if (
308316
selection[selectedObject] &&

packages/base/src/panelview/objecttree.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ class ObjectTreeReact extends React.Component<IProps, IStates> {
267267
};
268268

269269
private _sharedJcadModelChanged = (
270-
sender: IJupyterCadDoc,
270+
sender: IJupyterCadModel,
271271
change: IJcadObjectDocChange
272272
): void => {
273273
if (change.objectChange) {
@@ -365,10 +365,10 @@ class ObjectTreeReact extends React.Component<IProps, IStates> {
365365
}
366366

367367
private _onClientSharedOptionsChanged = (
368-
sender: IJupyterCadDoc,
368+
sender: IJupyterCadModel,
369369
clients: any
370370
): void => {
371-
this.setState(old => ({ ...old, options: sender.options }));
371+
this.setState(old => ({ ...old, options: sender.sharedModel.options }));
372372
};
373373

374374
private _handleRemoveObject = (objectId: string): void => {

packages/base/src/panelview/rightpanel.tsx

+7-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { ControlPanelHeader } from './header';
1111
import { SuggestionPanel } from '../suggestion/suggestionpanel';
1212
import { SuggestionModel } from '../suggestion/model';
1313
import { IForkManager } from '@jupyter/docprovider';
14+
import { ICollaborativeDrive } from '@jupyter/collaborative-drive';
1415
export class RightPanelWidget extends SidePanel {
1516
constructor(options: RightPanelWidget.IOptions) {
1617
super();
@@ -27,10 +28,11 @@ export class RightPanelWidget extends SidePanel {
2728
this.addWidget(annotations);
2829

2930
const suggestionModel = new SuggestionModel({
30-
sharedModel: this._model?.sharedModel,
31+
jupytercadModel: this._model?.jcadModel,
3132
filePath: '',
3233
tracker: options.tracker,
33-
forkManager: options.forkManager
34+
forkManager: options.forkManager,
35+
collaborativeDrive: options.collaborativeDrive
3436
});
3537
const suggestion = new SuggestionPanel({ model: suggestionModel });
3638
this.addWidget(suggestion);
@@ -44,14 +46,14 @@ export class RightPanelWidget extends SidePanel {
4446

4547
suggestionModel.switchContext({
4648
filePath: changed.context.localPath,
47-
sharedModel: changed.context?.model?.sharedModel
49+
jupytercadModel: changed.context?.model
4850
});
4951
} else {
5052
header.title.label = '-';
5153
this._annotationModel.context = undefined;
5254
suggestionModel.switchContext({
5355
filePath: '',
54-
sharedModel: undefined
56+
jupytercadModel: undefined
5557
});
5658
}
5759
});
@@ -70,6 +72,7 @@ export namespace RightPanelWidget {
7072
tracker: IJupyterCadTracker;
7173
annotationModel: IAnnotationModel;
7274
forkManager: IForkManager;
75+
collaborativeDrive?: ICollaborativeDrive;
7376
}
7477
export interface IProps {
7578
filePath?: string;

packages/base/src/suggestion/model.ts

+37-38
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
22
IJupyterCadDoc,
3-
IJupyterCadDocChange,
3+
IJupyterCadModel,
44
IJupyterCadTracker
55
} from '@jupytercad/schema';
66
import { ISignal, Signal } from '@lumino/signaling';
@@ -12,15 +12,23 @@ import {
1212
ISessionModel,
1313
requestDocSession
1414
} from '@jupyter/docprovider';
15+
import { ICollaborativeDrive } from '@jupyter/collaborative-drive';
1516

1617
export class SuggestionModel {
1718
constructor(options: SuggestionModel.IOptions) {
18-
const { tracker, forkManager, filePath, sharedModel } = options;
19+
const {
20+
tracker,
21+
forkManager,
22+
filePath,
23+
jupytercadModel,
24+
collaborativeDrive
25+
} = options;
1926
this._tracker = tracker;
2027
this._forkManager = forkManager;
28+
this._drive = collaborativeDrive;
2129
this.switchContext({
2230
filePath,
23-
sharedModel
31+
jupytercadModel
2432
});
2533
this._tracker;
2634
this._forkManager;
@@ -31,15 +39,6 @@ export class SuggestionModel {
3139
return pathComponents.length > 1 ? pathComponents[1] : pathComponents[0];
3240
}
3341

34-
set sharedModel(newSharedModel: IJupyterCadDoc | undefined) {
35-
this._sharedModel?.changed.disconnect(this._onStateChanged, this);
36-
this._sharedModel = newSharedModel;
37-
this._sharedModel?.changed.connect(this._onStateChanged.bind(this), this);
38-
}
39-
get sharedModel(): IJupyterCadDoc | undefined {
40-
return this._sharedModel;
41-
}
42-
4342
get allForks(): IAllForksResponse {
4443
return this._allForks;
4544
}
@@ -56,18 +55,16 @@ export class SuggestionModel {
5655

5756
async switchContext(context: {
5857
filePath: string;
59-
sharedModel: IJupyterCadDoc | undefined;
58+
jupytercadModel: IJupyterCadModel | undefined;
6059
}): Promise<void> {
6160
this._filePath = context.filePath;
62-
this.sharedModel = context.sharedModel;
61+
this._jupytercadModel = context.jupytercadModel;
6362
if (this._filePath && this._filePath.length > 0) {
6463
const session = (this._currentSession = await requestDocSession(
6564
'text',
6665
'jcad',
6766
this._filePath
6867
));
69-
console.log('file path', this._filePath, session);
70-
7168
this._forkProvider = this._forkManager.getProvider({
7269
documentPath: this._filePath,
7370
format: session.format!,
@@ -103,9 +100,26 @@ export class SuggestionModel {
103100
}
104101

105102
async backToRoot(): Promise<void> {
106-
console.log('restoring', this._forkProvider);
107-
if (this._forkProvider) {
108-
await this._forkProvider?.reconnect();
103+
this._jupytercadModel?.sharedModel.dispose();
104+
if (this._drive && this._currentSession && this._filePath) {
105+
const currentSharedModel = this._drive.sharedModelFactory.createNew({
106+
path: this._filePath,
107+
format: this._currentSession.format,
108+
contentType: this._currentSession.type,
109+
collaborative: true
110+
});
111+
112+
if (currentSharedModel) {
113+
this._jupytercadModel?.swapSharedModel(
114+
currentSharedModel as IJupyterCadDoc
115+
);
116+
}
117+
this._forkProvider = this._forkManager.getProvider({
118+
documentPath: this._filePath,
119+
format: this._currentSession.format!,
120+
type: this._currentSession.type
121+
});
122+
await (this._forkProvider as any).ready;
109123
this._toggleSplitScreen(false);
110124
}
111125
}
@@ -138,24 +152,7 @@ export class SuggestionModel {
138152
}
139153
}
140154

141-
private _onStateChanged(
142-
sender: IJupyterCadDoc,
143-
changes: IJupyterCadDocChange
144-
) {
145-
if (changes.stateChange) {
146-
changes.stateChange.forEach(value => {
147-
if (
148-
value.name === 'document_id' &&
149-
value.newValue &&
150-
value.newValue !== value.oldValue
151-
) {
152-
// const documentId = value.newValue;
153-
// const allForks = this._forkManager.getAllForks(documentId);
154-
}
155-
});
156-
}
157-
}
158-
private _sharedModel: IJupyterCadDoc | undefined;
155+
private _jupytercadModel: IJupyterCadModel | undefined;
159156
private _allForks: IAllForksResponse = {};
160157
private _forksUpdated: Signal<this, void> = new Signal(this);
161158
private _forkSwitched: Signal<this, string> = new Signal(this);
@@ -166,13 +163,15 @@ export class SuggestionModel {
166163
private _forkManager: IForkManager;
167164
private _forkProvider?: IForkProvider;
168165
private _currentSession?: ISessionModel;
166+
private _drive?: ICollaborativeDrive;
169167
}
170168

171169
namespace SuggestionModel {
172170
export interface IOptions {
173-
sharedModel: IJupyterCadDoc | undefined;
171+
jupytercadModel: IJupyterCadModel | undefined;
174172
filePath: string;
175173
tracker: IJupyterCadTracker;
176174
forkManager: IForkManager;
175+
collaborativeDrive?: ICollaborativeDrive;
177176
}
178177
}

packages/schema/src/interfaces.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,12 @@ export interface IJupyterCadModel extends DocumentRegistry.IModel {
146146
IJupyterCadModel,
147147
Map<number, IJupyterCadClientState>
148148
>;
149-
sharedMetadataChanged: ISignal<IJupyterCadDoc, MapChange>;
150-
sharedOptionsChanged: ISignal<IJupyterCadDoc, MapChange>;
151-
sharedObjectsChanged: ISignal<IJupyterCadDoc, IJcadObjectDocChange>;
149+
sharedMetadataChanged: ISignal<IJupyterCadModel, MapChange>;
150+
sharedOptionsChanged: ISignal<IJupyterCadModel, MapChange>;
151+
sharedObjectsChanged: ISignal<IJupyterCadModel, IJcadObjectDocChange>;
152+
sharedModelSwapped: ISignal<IJupyterCadModel, void>;
153+
154+
swapSharedModel(newSharedModel: IJupyterCadDoc): void;
152155

153156
getWorker(): Worker;
154157
getContent(): IJCadContent;

0 commit comments

Comments
 (0)