parameters.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import * as React from 'react'
  7. import { ParamDefinition as PD } from '../../mol-util/param-definition';
  8. import { BooleanParamComponent } from './parameter/boolean';
  9. import { NumberParamComponent } from './parameter/number';
  10. import { SelectParamComponent } from './parameter/select';
  11. import { MultiSelectParamComponent } from './parameter/multi-select';
  12. import { TextParamComponent } from './parameter/text';
  13. import { ColorParamComponent } from './parameter/color';
  14. import { camelCaseToWords } from '../../mol-util/string';
  15. interface ParametersProps<P extends PD.Params> {
  16. params: P
  17. values: { [k in keyof P]: P[k]['defaultValue'] }
  18. onChange<K extends keyof P>(k: K, v: P[K]['defaultValue']): void
  19. }
  20. type ParametersState = {}
  21. function getParamComponent<P extends PD.Any>(label: string, param: PD.Any, value: P['defaultValue'], onChange: (v: P['defaultValue']) => void) {
  22. switch (param.type) {
  23. case 'boolean':
  24. return <BooleanParamComponent label={label} param={param} value={value} onChange={onChange} />
  25. case 'number':
  26. return <NumberParamComponent label={label} param={param} value={value} onChange={onChange} />
  27. case 'select':
  28. return <SelectParamComponent label={label} param={param} value={value} onChange={onChange} />
  29. case 'multi-select':
  30. return <MultiSelectParamComponent label={label} param={param} value={value} onChange={onChange} />
  31. case 'text':
  32. return <TextParamComponent label={label} param={param} value={value} onChange={onChange} />
  33. case 'color':
  34. return <ColorParamComponent label={label} param={param} value={value} onChange={onChange} />
  35. }
  36. return ''
  37. }
  38. function getLabel(name: string, param: PD.Base<any>) {
  39. return param.label === undefined ? camelCaseToWords(name) : param.label
  40. }
  41. export class ParametersComponent<P extends PD.Params> extends React.Component<ParametersProps<P>, ParametersState> {
  42. onChange(k: string, value: any) {
  43. this.props.onChange(k, value)
  44. }
  45. render() {
  46. return <div style={{ width: '100%' }}>
  47. { Object.keys(this.props.params).map(k => {
  48. const param = this.props.params[k]
  49. const value = this.props.values[k]
  50. const label = getLabel(k, param)
  51. return <div key={k}>
  52. {getParamComponent(label, param, value, v => this.onChange(k, v))}
  53. </div>
  54. })}
  55. </div>;
  56. }
  57. }