Newer
Older
/**
* Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
import { PluginStateObject as SO } from './state/objects';
import { Camera } from 'mol-canvas3d/camera';
import { CameraSnapshotManager } from './state/camera';
import { PluginStateSnapshotManager } from './state/snapshots';
import { RxEventHelper } from 'mol-util/rx-event-helper';
export { PluginState }
class PluginState {
private ev = RxEventHelper.create();
readonly dataState: State;
readonly behaviorState: State;
readonly cameraSnapshots = new CameraSnapshotManager();
readonly snapshots = new PluginStateSnapshotManager();
readonly behavior = {
kind: this.ev.behavior<PluginState.Kind>('data'),
currentObject: this.ev.behavior<State.ObjectEvent>({} as any)
}
setKind(kind: PluginState.Kind) {
const current = this.behavior.kind.value;
if (kind !== current) {
this.behavior.kind.next(kind);
this.behavior.currentObject.next(kind === 'data'
? this.dataState.behaviors.currentObject.value
: this.behaviorState.behaviors.currentObject.value)
}
}
getSnapshot(): PluginState.Snapshot {
data: this.dataState.getSnapshot(),
behaviour: this.behaviorState.getSnapshot(),
cameraSnapshots: this.cameraSnapshots.getStateSnapshot(),
camera: this.plugin.canvas3d.camera.getSnapshot()
async setSnapshot(snapshot: PluginState.Snapshot) {
// await this.plugin.runTask(this.behaviorState.setSnapshot(snapshot.behaviour));
await this.plugin.runTask(this.dataState.setSnapshot(snapshot.data));
this.cameraSnapshots.setStateSnapshot(snapshot.cameraSnapshots);
this.plugin.canvas3d.camera.setState(snapshot.canvas3d.camera);
this.plugin.canvas3d.requestDraw(true);
this.ev.dispose();
this.dataState.dispose();
this.behaviorState.dispose();
constructor(private plugin: import('./context').PluginContext) {
this.dataState = State.create(new SO.Root({ }), { globalContext: plugin });
this.behaviorState = State.create(new PluginBehavior.Root({ }), { globalContext: plugin });
this.dataState.behaviors.currentObject.subscribe(o => {
if (this.behavior.kind.value === 'data') this.behavior.currentObject.next(o);
});
this.behaviorState.behaviors.currentObject.subscribe(o => {
if (this.behavior.kind.value === 'behavior') this.behavior.currentObject.next(o);
});
this.behavior.currentObject.next(this.dataState.behaviors.currentObject.value);
export type Kind = 'data' | 'behavior'
cameraSnapshots: CameraSnapshotManager.StateSnapshot,