/** * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose */ import { SizeType, LocationSize } from '../mol-geo/geometry/size-data'; import { UniformSizeThemeProvider } from './size/uniform'; import { ParamDefinition as PD } from '../mol-util/param-definition'; import { ThemeDataContext, ThemeRegistry, ThemeProvider } from '../mol-theme/theme'; import { PhysicalSizeThemeProvider } from './size/physical'; import { deepEqual } from '../mol-util'; import { ShapeGroupSizeThemeProvider } from './size/shape-group'; import { UncertaintySizeThemeProvider } from './size/uncertainty'; export { SizeTheme } interface SizeTheme

{ readonly factory: SizeTheme.Factory

readonly granularity: SizeType readonly size: LocationSize readonly props: Readonly> readonly description?: string } namespace SizeTheme { export type Props = { [k: string]: any } export type Factory

= (ctx: ThemeDataContext, props: PD.Values

) => SizeTheme

export const EmptyFactory = () => Empty export const Empty: SizeTheme<{}> = { factory: EmptyFactory, granularity: 'uniform', size: () => 1, props: {} } export function areEqual(themeA: SizeTheme, themeB: SizeTheme) { return themeA.factory === themeB.factory && deepEqual(themeA.props, themeB.props) } export interface Provider

extends ThemeProvider, P> { } export const EmptyProvider: Provider<{}> = { label: '', factory: EmptyFactory, getParams: () => ({}), defaultValues: {}, isApplicable: () => true } export type Registry = ThemeRegistry> export function createRegistry() { return new ThemeRegistry(BuiltInSizeThemes as { [k: string]: Provider }, EmptyProvider) } export type ParamValues> = C extends SizeTheme.Provider ? PD.Values

: never } export const BuiltInSizeThemes = { 'physical': PhysicalSizeThemeProvider, 'shape-group': ShapeGroupSizeThemeProvider, 'uncertainty': UncertaintySizeThemeProvider, 'uniform': UniformSizeThemeProvider } export type BuiltInSizeThemeName = keyof typeof BuiltInSizeThemes