/** * Copyright (c) 2018-2023 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose * @author David Sehnal * @author Adam Midlik */ import * as React from 'react'; import { throttleTime } from 'rxjs'; import { PluginCommands } from '../mol-plugin/commands'; import { PluginConfig } from '../mol-plugin/config'; import { ParamDefinition as PD } from '../mol-util/param-definition'; import { PluginUIComponent } from './base'; import { Button, ControlGroup, IconButton } from './controls/common'; import { AutorenewSvg, BuildOutlinedSvg, CameraOutlinedSvg, CloseSvg, FullscreenSvg, TuneSvg } from './controls/icons'; import { ToggleSelectionModeButton } from './structure/selection'; import { ViewportCanvas } from './viewport/canvas'; import { DownloadScreenshotControls } from './viewport/screenshot'; import { SimpleSettingsControl } from './viewport/simple-settings'; interface ViewportControlsState { isSettingsExpanded: boolean, isScreenshotExpanded: boolean, isCameraResetEnabled: boolean } interface ViewportControlsProps { } export class ViewportControls extends PluginUIComponent { private allCollapsedState = { isSettingsExpanded: false, isScreenshotExpanded: false, }; state: ViewportControlsState = { ...this.allCollapsedState, isCameraResetEnabled: true, }; resetCamera = () => { PluginCommands.Camera.Reset(this.plugin, {}); }; private toggle(panel: keyof ViewportControlsState) { return (e?: React.MouseEvent) => { this.setState(old => ({ ...old, ...this.allCollapsedState, [panel]: !this.state[panel] })); e?.currentTarget.blur(); }; } toggleSettingsExpanded = this.toggle('isSettingsExpanded'); toggleScreenshotExpanded = this.toggle('isScreenshotExpanded'); toggleControls = () => { PluginCommands.Layout.Update(this.plugin, { state: { showControls: !this.plugin.layout.state.showControls } }); }; toggleExpanded = () => { PluginCommands.Layout.Update(this.plugin, { state: { isExpanded: !this.plugin.layout.state.isExpanded } }); }; setSettings = (p: { param: PD.Base, name: string, value: any }) => { PluginCommands.Canvas3D.SetSettings(this.plugin, { settings: { [p.name]: p.value } }); }; setLayout = (p: { param: PD.Base, name: string, value: any }) => { PluginCommands.Layout.Update(this.plugin, { state: { [p.name]: p.value } }); }; screenshot = () => { this.plugin.helpers.viewportScreenshot?.download(); }; enableCameraReset = (enable: boolean) => { this.setState(old => ({ ...old, isCameraResetEnabled: enable })); }; componentDidMount() { this.subscribe(this.plugin.events.canvas3d.settingsUpdated, () => this.forceUpdate()); this.subscribe(this.plugin.layout.events.updated, () => this.forceUpdate()); if (this.plugin.canvas3d) { this.subscribe( this.plugin.canvas3d.camera.stateChanged.pipe(throttleTime(500, undefined, { leading: true, trailing: true })), snapshot => this.enableCameraReset(snapshot.radius !== 0 && snapshot.radiusMax !== 0) ); } } icon(icon: React.FC, onClick: (e: React.MouseEvent) => void, title: string, isOn = true) { return ; } render() { return
{this.icon(AutorenewSvg, this.resetCamera, 'Reset Zoom')}
{this.icon(CameraOutlinedSvg, this.toggleScreenshotExpanded, 'Screenshot / State Snapshot', this.state.isScreenshotExpanded)}
{this.plugin.config.get(PluginConfig.Viewport.ShowControls) && this.icon(BuildOutlinedSvg, this.toggleControls, 'Toggle Controls Panel', this.plugin.layout.state.showControls)} {this.plugin.config.get(PluginConfig.Viewport.ShowExpand) && this.icon(FullscreenSvg, this.toggleExpanded, 'Toggle Expanded Viewport', this.plugin.layout.state.isExpanded)} {this.plugin.config.get(PluginConfig.Viewport.ShowSettings) && this.icon(TuneSvg, this.toggleSettingsExpanded, 'Settings / Controls Info', this.state.isSettingsExpanded)}
{this.plugin.config.get(PluginConfig.Viewport.ShowSelectionMode) &&
}
{this.state.isScreenshotExpanded &&
} {this.state.isSettingsExpanded &&
}
; } } export const Logo = () => ; export const Viewport = () => ;