Skip to content
Snippets Groups Projects
representation.tsx 2.37 KiB
Newer Older
Alexander Rose's avatar
Alexander Rose committed
/**
 * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 */

import * as React from 'react'
import Viewer from 'mol-canvas3d/viewer';
Alexander Rose's avatar
Alexander Rose committed
import { App } from '../app';
import { Params } from 'mol-util/parameter';
Alexander Rose's avatar
Alexander Rose committed
import { Representation } from 'mol-geo/representation';
import { ParametersComponent } from 'mol-app/component/parameters';
import { Progress } from 'mol-task';
import { ColorTheme } from 'mol-canvas3d/theme/color';
Alexander Rose's avatar
Alexander Rose committed
import { getColorThemeProps } from 'mol-geo/geometry/color-data';
import { ColorThemeComponent } from 'mol-app/component/color-theme';
Alexander Rose's avatar
Alexander Rose committed

export interface RepresentationComponentProps {
    app: App
    viewer: Viewer
    repr: Representation<Params>
}

export interface RepresentationComponentState {
Alexander Rose's avatar
Alexander Rose committed
    label: string
    reprParams: Params
    reprProps: Readonly<{}>
Alexander Rose's avatar
Alexander Rose committed
}

export class RepresentationComponent extends React.Component<RepresentationComponentProps, RepresentationComponentState> {

Alexander Rose's avatar
Alexander Rose committed
    private stateFromRepr(repr: Representation<Params>) {
        return {
            label: this.props.repr.label,
            reprParams: this.props.repr.params,
            reprProps: this.props.repr.props
        }
    }

    componentWillMount() {
        this.setState(this.stateFromRepr(this.props.repr))
    }

Alexander Rose's avatar
Alexander Rose committed
    async onChange(k: string, v: any) {
        await this.props.app.runTask(this.props.repr.createOrUpdate({ [k]: v }).run(
            progress => console.log(Progress.format(progress))
        ), 'Representation Update')
Alexander Rose's avatar
Alexander Rose committed
        this.props.viewer.add(this.props.repr)
        this.props.viewer.requestDraw(true)
Alexander Rose's avatar
Alexander Rose committed
        this.setState(this.stateFromRepr(this.props.repr))
Alexander Rose's avatar
Alexander Rose committed
    }

    render() {
Alexander Rose's avatar
Alexander Rose committed
        const { label, reprParams, reprProps } = this.state
        let colorTheme: ColorTheme | undefined = undefined
        if ('colorTheme' in reprProps) {
            colorTheme = ColorTheme(getColorThemeProps(reprProps))
        }
Alexander Rose's avatar
Alexander Rose committed

        return <div>
            <div>
Alexander Rose's avatar
Alexander Rose committed
                <h4>{label}</h4>
Alexander Rose's avatar
Alexander Rose committed
            </div>
            <div>
                <ParametersComponent
Alexander Rose's avatar
Alexander Rose committed
                    params={reprParams}
                    values={reprProps}
Alexander Rose's avatar
Alexander Rose committed
                    onChange={(k, v) => this.onChange(k as string, v)}
                />
            </div>
Alexander Rose's avatar
Alexander Rose committed
            { colorTheme !== undefined ? <ColorThemeComponent colorTheme={colorTheme} /> : '' }
Alexander Rose's avatar
Alexander Rose committed
        </div>;
    }
}