Skip to content
Snippets Groups Projects
Commit 3dd1af3b authored by Alexander Rose's avatar Alexander Rose
Browse files

wip, param label tweaks

parent 1ea3672c
No related branches found
No related tags found
No related merge requests found
...@@ -158,6 +158,7 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> { ...@@ -158,6 +158,7 @@ export class Viewport extends React.Component<ViewportProps, ViewportState> {
</select> </select>
</div> </div>
<ColorParamComponent <ColorParamComponent
label={BackgroundColorParam.label || ''}
param={BackgroundColorParam} param={BackgroundColorParam}
value={this.state.backgroundColor} value={this.state.backgroundColor}
onChange={value => { onChange={value => {
......
...@@ -8,6 +8,7 @@ import * as React from 'react' ...@@ -8,6 +8,7 @@ import * as React from 'react'
import { ParamDefinition as PD } from 'mol-util/param-definition'; import { ParamDefinition as PD } from 'mol-util/param-definition';
export interface BooleanParamComponentProps { export interface BooleanParamComponentProps {
label: string
param: PD.Boolean param: PD.Boolean
value: boolean value: boolean
onChange(v: boolean): void onChange(v: boolean): void
...@@ -29,7 +30,7 @@ export class BooleanParamComponent extends React.Component<BooleanParamComponent ...@@ -29,7 +30,7 @@ export class BooleanParamComponent extends React.Component<BooleanParamComponent
render() { render() {
return <div> return <div>
<span>{this.props.param.label} </span> <span>{this.props.label} </span>
<button onClick={e => this.onChange(!this.state.value) }> <button onClick={e => this.onChange(!this.state.value) }>
{this.state.value ? 'Off' : 'On'} {this.state.value ? 'Off' : 'On'}
</button> </button>
......
...@@ -10,6 +10,7 @@ import { ColorNames } from 'mol-util/color/tables'; ...@@ -10,6 +10,7 @@ import { ColorNames } from 'mol-util/color/tables';
import { Color } from 'mol-util/color'; import { Color } from 'mol-util/color';
export interface ColorParamComponentProps { export interface ColorParamComponentProps {
label: string
param: PD.Color param: PD.Color
value: Color value: Color
onChange(v: Color): void onChange(v: Color): void
...@@ -31,7 +32,7 @@ export class ColorParamComponent extends React.Component<ColorParamComponentProp ...@@ -31,7 +32,7 @@ export class ColorParamComponent extends React.Component<ColorParamComponentProp
render() { render() {
return <div> return <div>
<span>{this.props.param.label} </span> <span>{this.props.label} </span>
<select value={this.state.value} onChange={e => this.onChange(Color(parseInt(e.target.value))) }> <select value={this.state.value} onChange={e => this.onChange(Color(parseInt(e.target.value))) }>
{Object.keys(ColorNames).map(name => { {Object.keys(ColorNames).map(name => {
return <option key={name} value={(ColorNames as { [k: string]: Color})[name]}>{name}</option> return <option key={name} value={(ColorNames as { [k: string]: Color})[name]}>{name}</option>
......
...@@ -8,6 +8,7 @@ import * as React from 'react' ...@@ -8,6 +8,7 @@ import * as React from 'react'
import { ParamDefinition as PD } from 'mol-util/param-definition'; import { ParamDefinition as PD } from 'mol-util/param-definition';
export interface MultiSelectParamComponentProps<T extends string> { export interface MultiSelectParamComponentProps<T extends string> {
label: string
param: PD.MultiSelect<T> param: PD.MultiSelect<T>
value: T[] value: T[]
onChange(v: T[]): void onChange(v: T[]): void
...@@ -29,10 +30,10 @@ export class MultiSelectParamComponent<T extends string> extends React.Component ...@@ -29,10 +30,10 @@ export class MultiSelectParamComponent<T extends string> extends React.Component
render() { render() {
return <div> return <div>
<span>{this.props.param.label} </span> <span>{this.props.label} </span>
<select multiple value={this.state.value} onChange={e => { <select multiple value={this.state.value} onChange={e => {
const value = Array.from(e.target.options).filter(option => option.selected).map(option => option.value) const value = Array.from(e.target.options).filter(option => option.selected).map(option => option.value)
this.onChange(value as T[]) this.onChange(value as T[])
}}> }}>
{this.props.param.options.map(v => { {this.props.param.options.map(v => {
const [value, label] = v const [value, label] = v
......
...@@ -8,6 +8,7 @@ import * as React from 'react' ...@@ -8,6 +8,7 @@ import * as React from 'react'
import { ParamDefinition as PD } from 'mol-util/param-definition'; import { ParamDefinition as PD } from 'mol-util/param-definition';
export interface NumberParamComponentProps { export interface NumberParamComponentProps {
label: string
param: PD.Numeric param: PD.Numeric
value: number value: number
onChange(v: number): void onChange(v: number): void
...@@ -30,7 +31,7 @@ export class NumberParamComponent extends React.Component<NumberParamComponentPr ...@@ -30,7 +31,7 @@ export class NumberParamComponent extends React.Component<NumberParamComponentPr
render() { render() {
return <div> return <div>
<span>{this.props.param.label} </span> <span>{this.props.label} </span>
<input type='range' <input type='range'
value={this.state.value} value={this.state.value}
min={this.props.param.min} min={this.props.param.min}
......
...@@ -8,6 +8,7 @@ import * as React from 'react' ...@@ -8,6 +8,7 @@ import * as React from 'react'
import { ParamDefinition as PD } from 'mol-util/param-definition'; import { ParamDefinition as PD } from 'mol-util/param-definition';
export interface SelectParamComponentProps<T extends string> { export interface SelectParamComponentProps<T extends string> {
label: string
param: PD.Select<T> param: PD.Select<T>
value: T value: T
onChange(v: T): void onChange(v: T): void
...@@ -29,7 +30,7 @@ export class SelectParamComponent<T extends string> extends React.Component<Sele ...@@ -29,7 +30,7 @@ export class SelectParamComponent<T extends string> extends React.Component<Sele
render() { render() {
return <div> return <div>
<span>{this.props.param.label} </span> <span>{this.props.label} </span>
<select value={this.state.value} onChange={e => this.onChange(e.target.value as T) }> <select value={this.state.value} onChange={e => this.onChange(e.target.value as T) }>
{this.props.param.options.map(v => { {this.props.param.options.map(v => {
const [value, label] = v const [value, label] = v
......
...@@ -8,6 +8,7 @@ import * as React from 'react' ...@@ -8,6 +8,7 @@ import * as React from 'react'
import { ParamDefinition as PD } from 'mol-util/param-definition'; import { ParamDefinition as PD } from 'mol-util/param-definition';
export interface TextParamComponentProps { export interface TextParamComponentProps {
label: string
param: PD.Text param: PD.Text
value: string value: string
onChange(v: string): void onChange(v: string): void
...@@ -29,7 +30,7 @@ export class TextParamComponent extends React.Component<TextParamComponentProps, ...@@ -29,7 +30,7 @@ export class TextParamComponent extends React.Component<TextParamComponentProps,
render() { render() {
return <div> return <div>
<span>{this.props.param.label} </span> <span>{this.props.label} </span>
<input type='text' <input type='text'
value={this.state.value} value={this.state.value}
onChange={e => this.onChange(e.currentTarget.value)} onChange={e => this.onChange(e.currentTarget.value)}
......
...@@ -12,6 +12,7 @@ import { SelectParamComponent } from './parameter/select'; ...@@ -12,6 +12,7 @@ import { SelectParamComponent } from './parameter/select';
import { MultiSelectParamComponent } from './parameter/multi-select'; import { MultiSelectParamComponent } from './parameter/multi-select';
import { TextParamComponent } from './parameter/text'; import { TextParamComponent } from './parameter/text';
import { ColorParamComponent } from './parameter/color'; import { ColorParamComponent } from './parameter/color';
import { camelCaseToWords } from 'mol-util/string';
interface ParametersProps<P extends PD.Params> { interface ParametersProps<P extends PD.Params> {
params: P params: P
...@@ -21,24 +22,28 @@ interface ParametersProps<P extends PD.Params> { ...@@ -21,24 +22,28 @@ interface ParametersProps<P extends PD.Params> {
type ParametersState = {} type ParametersState = {}
function getParamComponent<P extends PD.Any>(p: PD.Any, value: P['defaultValue'], onChange: (v: P['defaultValue']) => void) { function getParamComponent<P extends PD.Any>(label: string, param: PD.Any, value: P['defaultValue'], onChange: (v: P['defaultValue']) => void) {
switch (p.type) { switch (param.type) {
case 'boolean': case 'boolean':
return <BooleanParamComponent param={p} value={value} onChange={onChange} /> return <BooleanParamComponent label={label} param={param} value={value} onChange={onChange} />
case 'number': case 'number':
return <NumberParamComponent param={p} value={value} onChange={onChange} /> return <NumberParamComponent label={label} param={param} value={value} onChange={onChange} />
case 'select': case 'select':
return <SelectParamComponent param={p} value={value} onChange={onChange} /> return <SelectParamComponent label={label} param={param} value={value} onChange={onChange} />
case 'multi-select': case 'multi-select':
return <MultiSelectParamComponent param={p} value={value} onChange={onChange} /> return <MultiSelectParamComponent label={label} param={param} value={value} onChange={onChange} />
case 'text': case 'text':
return <TextParamComponent param={p} value={value} onChange={onChange} /> return <TextParamComponent label={label} param={param} value={value} onChange={onChange} />
case 'color': case 'color':
return <ColorParamComponent param={p} value={value} onChange={onChange} /> return <ColorParamComponent label={label} param={param} value={value} onChange={onChange} />
} }
return '' return ''
} }
function getLabel(name: string, param: PD.Base<any>) {
return param.label === undefined ? camelCaseToWords(name) : param.label
}
export class ParametersComponent<P extends PD.Params> extends React.Component<ParametersProps<P>, ParametersState> { export class ParametersComponent<P extends PD.Params> extends React.Component<ParametersProps<P>, ParametersState> {
onChange(k: string, value: any) { onChange(k: string, value: any) {
this.props.onChange(k, value) this.props.onChange(k, value)
...@@ -49,8 +54,9 @@ export class ParametersComponent<P extends PD.Params> extends React.Component<Pa ...@@ -49,8 +54,9 @@ export class ParametersComponent<P extends PD.Params> extends React.Component<Pa
{ Object.keys(this.props.params).map(k => { { Object.keys(this.props.params).map(k => {
const param = this.props.params[k] const param = this.props.params[k]
const value = this.props.values[k] const value = this.props.values[k]
const label = getLabel(k, param)
return <div key={k}> return <div key={k}>
{getParamComponent(param, value, v => this.onChange(k, v))} {getParamComponent(label, param, value, v => this.onChange(k, v))}
</div> </div>
})} })}
</div>; </div>;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import * as React from 'react' import * as React from 'react'
import { ParamDefinition as PD } from 'mol-util/param-definition'; import { ParamDefinition as PD } from 'mol-util/param-definition';
import { camelCaseToWords } from 'mol-util/string';
export interface ParameterControlsProps<P extends PD.Params = PD.Params> { export interface ParameterControlsProps<P extends PD.Params = PD.Params> {
params: P, params: P,
...@@ -57,6 +58,10 @@ export type ParamOnChange = (params: { param: PD.Base<any>, name: string, value: ...@@ -57,6 +58,10 @@ export type ParamOnChange = (params: { param: PD.Base<any>, name: string, value:
type ValueControlProps<P extends PD.Base<any> = PD.Base<any>> = { value: any, param: P, isEnabled?: boolean, onChange: (v: any) => void, onEnter?: () => void } type ValueControlProps<P extends PD.Base<any> = PD.Base<any>> = { value: any, param: P, isEnabled?: boolean, onChange: (v: any) => void, onEnter?: () => void }
type ValueControl = React.ComponentClass<ValueControlProps<any>> type ValueControl = React.ComponentClass<ValueControlProps<any>>
function getLabel(name: string, param: PD.Base<any>) {
return param.label === undefined ? camelCaseToWords(name) : param.label
}
export class ParamWrapper extends React.PureComponent<ParamWrapperProps> { export class ParamWrapper extends React.PureComponent<ParamWrapperProps> {
onChange = (value: any) => { onChange = (value: any) => {
this.props.onChange({ param: this.props.param, name: this.props.name, value }); this.props.onChange({ param: this.props.param, name: this.props.name, value });
...@@ -64,7 +69,7 @@ export class ParamWrapper extends React.PureComponent<ParamWrapperProps> { ...@@ -64,7 +69,7 @@ export class ParamWrapper extends React.PureComponent<ParamWrapperProps> {
render() { render() {
return <div style={{ padding: '0 3px', borderBottom: '1px solid #ccc' }}> return <div style={{ padding: '0 3px', borderBottom: '1px solid #ccc' }}>
<div style={{ lineHeight: '20px', float: 'left' }} title={this.props.param.description}>{this.props.param.label}</div> <div style={{ lineHeight: '20px', float: 'left' }} title={this.props.param.description}>{getLabel(this.props.name, this.props.param)}</div>
<div style={{ float: 'left', marginLeft: '5px' }}> <div style={{ float: 'left', marginLeft: '5px' }}>
<this.props.control value={this.props.value} param={this.props.param} onChange={this.onChange} onEnter={this.props.onEnter} isEnabled={this.props.isEnabled} /> <this.props.control value={this.props.value} param={this.props.param} onChange={this.onChange} onEnter={this.props.onEnter} isEnabled={this.props.isEnabled} />
</div> </div>
...@@ -140,16 +145,17 @@ export class SelectControl extends React.PureComponent<ValueControlProps<PD.Sele ...@@ -140,16 +145,17 @@ export class SelectControl extends React.PureComponent<ValueControlProps<PD.Sele
export class MultiSelectControl extends React.PureComponent<ValueControlProps<PD.MultiSelect<any>>> { export class MultiSelectControl extends React.PureComponent<ValueControlProps<PD.MultiSelect<any>>> {
// onChange = (e: React.ChangeEvent<HTMLSelectElement>) => { onChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
// this.setState({ value: e.target.value }); const value = Array.from(e.target.options).filter(option => option.selected).map(option => option.value);
// this.props.onChange(e.target.value); this.setState({ value });
// } this.props.onChange(value);
}
render() { render() {
return <span>multiselect TODO</span>; // return <span>multiselect TODO</span>;
// return <select value={this.props.value || ''} onChange={this.onChange}> return <select multiple value={this.props.value || ''} onChange={this.onChange}>
// {this.props.param.options.map(([value, label]) => <option key={label} value={value}>{label}</option>)} {this.props.param.options.map(([value, label]) => <option key={label} value={value}>{label}</option>)}
// </select>; </select>;
} }
} }
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
import { Color as ColorData } from './color'; import { Color as ColorData } from './color';
import { shallowClone } from 'mol-util'; import { shallowClone } from 'mol-util';
import { Vec2 } from 'mol-math/linear-algebra'; import { Vec2 } from 'mol-math/linear-algebra';
import { camelCaseToWords } from './string';
export namespace ParamDefinition { export namespace ParamDefinition {
export interface Info { export interface Info {
...@@ -101,7 +100,7 @@ export namespace ParamDefinition { ...@@ -101,7 +100,7 @@ export namespace ParamDefinition {
params: Params params: Params
} }
export function Group<P extends Params>(params: P, info: Info = {}): Group<Values<P>> { export function Group<P extends Params>(params: P, info: Info = {}): Group<Values<P>> {
return { type: 'group', defaultValue: getDefaultValues(params) as any, params }; return { type: 'group', defaultValue: getDefaultValues(params) as any, params, ...info };
} }
export interface Mapped<T> extends Base<{ name: string, params: T }> { export interface Mapped<T> extends Base<{ name: string, params: T }> {
...@@ -136,15 +135,6 @@ export namespace ParamDefinition { ...@@ -136,15 +135,6 @@ export namespace ParamDefinition {
return d as Values<T> return d as Values<T>
} }
export function getLabels<T extends Params>(params: T) {
const d: { [k: string]: string } = {}
Object.keys(params).forEach(k => {
const label = params[k].label
d[k] = label === undefined ? camelCaseToWords(k) : label
})
return d as { [k in keyof T]: string }
}
export function clone<P extends Params>(params: P): P { export function clone<P extends Params>(params: P): P {
return shallowClone(params) return shallowClone(params)
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment