camera.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { PluginCommands } from 'mol-plugin/command';
  7. import * as React from 'react';
  8. import { PluginComponent } from './base';
  9. import { ParamDefinition as PD } from 'mol-util/param-definition';
  10. import { ParameterControls } from './controls/parameters';
  11. export class CameraSnapshots extends PluginComponent<{ }, { }> {
  12. render() {
  13. return <div>
  14. <div className='msp-section-header'>Camera Snapshots</div>
  15. <CameraSnapshotControls />
  16. <CameraSnapshotList />
  17. </div>;
  18. }
  19. }
  20. class CameraSnapshotControls extends PluginComponent<{ }, { name: string, description: string }> {
  21. static Params = {
  22. name: PD.Text(),
  23. description: PD.Text()
  24. }
  25. state = PD.getDefaultValues(CameraSnapshotControls.Params);
  26. add = () => {
  27. PluginCommands.Camera.Snapshots.Add.dispatch(this.plugin, this.state);
  28. this.setState({ name: '', description: '' })
  29. }
  30. clear = () => {
  31. PluginCommands.Camera.Snapshots.Clear.dispatch(this.plugin, {});
  32. }
  33. render() {
  34. return <div>
  35. <ParameterControls params={CameraSnapshotControls.Params} values={this.state} onEnter={this.add} onChange={p => this.setState({ [p.name]: p.value } as any)} />
  36. <div className='msp-btn-row-group'>
  37. <button className='msp-btn msp-btn-block msp-form-control' onClick={this.add}>Add</button>
  38. <button className='msp-btn msp-btn-block msp-form-control' onClick={this.clear}>Clear</button>
  39. </div>
  40. </div>;
  41. }
  42. }
  43. class CameraSnapshotList extends PluginComponent<{ }, { }> {
  44. componentDidMount() {
  45. this.subscribe(this.plugin.events.state.cameraSnapshots.changed, () => this.forceUpdate());
  46. }
  47. apply(id: string) {
  48. return () => PluginCommands.Camera.Snapshots.Apply.dispatch(this.plugin, { id });
  49. }
  50. remove(id: string) {
  51. return () => {
  52. PluginCommands.Camera.Snapshots.Remove.dispatch(this.plugin, { id });
  53. }
  54. }
  55. render() {
  56. return <ul style={{ listStyle: 'none' }} className='msp-state-list'>
  57. {this.plugin.state.cameraSnapshots.entries.valueSeq().map(e =><li key={e!.id}>
  58. <button className='msp-btn msp-btn-block msp-form-control' onClick={this.apply(e!.id)}>{e!.name || e!.timestamp} <small>{e!.description}</small></button>
  59. <button onClick={this.remove(e!.id)} className='msp-btn msp-btn-link msp-state-list-remove-button'>
  60. <span className='msp-icon msp-icon-remove' />
  61. </button>
  62. </li>)}
  63. </ul>;
  64. }
  65. }