Skip to content
Snippets Groups Projects
state.ts 1.56 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';
David Sehnal's avatar
David Sehnal committed
import { CombinedCamera } from 'mol-canvas3d/camera/combined';

export { PluginState }

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

    readonly canvas = {
        camera: CombinedCamera.create()
    };

    getSnapshot(): PluginState.Snapshot {
David Sehnal's avatar
David Sehnal committed
        return {
            data: this.data.getSnapshot(),
            behaviour: this.behaviour.getSnapshot(),
            canvas: {
                camera: { ...this.canvas.camera }
            }
        };
    }

    setSnapshot(snapshot: PluginState.Snapshot) {
David Sehnal's avatar
David Sehnal committed
        // TODO events
        this.behaviour.setSnapshot(snapshot.behaviour);
        this.data.setSnapshot(snapshot.data);
        this.canvas.camera = { ...snapshot.canvas.camera };
David Sehnal's avatar
David Sehnal committed
    async updateData(tree: StateTree) {
        // TODO: "task observer"
        await this.data.update(tree).run(p => console.log(p), 250);
    }

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

    constructor(globalContext: unknown) {
        this.data = State.create(new SO.Root({ label: 'Root' }, { }), { globalContext });
David Sehnal's avatar
David Sehnal committed
        this.behaviour = State.create(new SO.Root({ label: 'Root' }, { }), { globalContext });
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,
        canvas: PluginState['canvas']
    }