Skip to content
Snippets Groups Projects
state.ts 1.77 KiB
Newer Older
/**
 * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author David Sehnal <david.sehnal@gmail.com>
 */

David Sehnal's avatar
David Sehnal committed
import { State, StateTree } from 'mol-state';
import { PluginStateObjects as SO } from './state/objects';
import { Camera } from 'mol-canvas3d/camera';
David Sehnal's avatar
David Sehnal committed
import { PluginBehavior } from './behavior';

export { PluginState }

class PluginState {
David Sehnal's avatar
David Sehnal committed
    readonly data: State;
David Sehnal's avatar
David Sehnal committed
    readonly behavior: State;

    getSnapshot(): PluginState.Snapshot {
David Sehnal's avatar
David Sehnal committed
        return {
            data: this.data.getSnapshot(),
David Sehnal's avatar
David Sehnal committed
            behaviour: this.behavior.getSnapshot(),
            canvas3d: {
                camera: this.plugin.canvas3d.camera.getSnapshot()
David Sehnal's avatar
David Sehnal committed
            }
        };
    async setSnapshot(snapshot: PluginState.Snapshot) {
David Sehnal's avatar
David Sehnal committed
        await this.plugin.runTask(this.behavior.setSnapshot(snapshot.behaviour));
        await this.plugin.runTask(this.data.setSnapshot(snapshot.data));
        this.plugin.canvas3d.camera.setState(snapshot.canvas3d.camera);
        this.plugin.canvas3d.requestDraw(true);
David Sehnal's avatar
David Sehnal committed
    }

    updateData(tree: StateTree) {
        return this.plugin.runTask(this.data.update(tree));
David Sehnal's avatar
David Sehnal committed
    updateBehaviour(tree: StateTree) {
        return this.plugin.runTask(this.behavior.update(tree));
    }

    dispose() {
        this.data.dispose();
    }
David Sehnal's avatar
David Sehnal committed

David Sehnal's avatar
David Sehnal committed
    constructor(private plugin: import('./context').PluginContext) {
David Sehnal's avatar
David Sehnal committed
        this.data = State.create(new SO.Root({ label: 'Root' }, { }), { globalContext: plugin });
        this.behavior = State.create(new PluginBehavior.Root({ label: 'Root' }, { }), { globalContext: plugin });
David Sehnal's avatar
David Sehnal committed
    }
}

namespace PluginState {
David Sehnal's avatar
David Sehnal committed
    export interface Snapshot {
        data: State.Snapshot,
        behaviour: State.Snapshot,
David Sehnal's avatar
David Sehnal committed
        canvas3d: {
            camera: Camera.Snapshot
David Sehnal's avatar
David Sehnal committed
        }
David Sehnal's avatar
David Sehnal committed
    }