size.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /**
  2. * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { SizeType, LocationSize } from '../mol-geo/geometry/size-data';
  7. import { UniformSizeThemeProvider } from './size/uniform';
  8. import { ParamDefinition as PD } from '../mol-util/param-definition';
  9. import { ThemeDataContext, ThemeRegistry, ThemeProvider } from '../mol-theme/theme';
  10. import { PhysicalSizeThemeProvider } from './size/physical';
  11. import { deepEqual } from '../mol-util';
  12. import { ShapeGroupSizeThemeProvider } from './size/shape-group';
  13. import { UncertaintySizeThemeProvider } from './size/uncertainty';
  14. export { SizeTheme }
  15. interface SizeTheme<P extends PD.Params> {
  16. readonly factory: SizeTheme.Factory<P>
  17. readonly granularity: SizeType
  18. readonly size: LocationSize
  19. readonly props: Readonly<PD.Values<P>>
  20. readonly description?: string
  21. }
  22. namespace SizeTheme {
  23. export type Props = { [k: string]: any }
  24. export type Factory<P extends PD.Params> = (ctx: ThemeDataContext, props: PD.Values<P>) => SizeTheme<P>
  25. export const EmptyFactory = () => Empty
  26. export const Empty: SizeTheme<{}> = { factory: EmptyFactory, granularity: 'uniform', size: () => 1, props: {} }
  27. export function areEqual(themeA: SizeTheme<any>, themeB: SizeTheme<any>) {
  28. return themeA.factory === themeB.factory && deepEqual(themeA.props, themeB.props)
  29. }
  30. export interface Provider<P extends PD.Params> extends ThemeProvider<SizeTheme<P>, P> { }
  31. export const EmptyProvider: Provider<{}> = { label: '', factory: EmptyFactory, getParams: () => ({}), defaultValues: {}, isApplicable: () => true }
  32. export type Registry = ThemeRegistry<SizeTheme<any>>
  33. export function createRegistry() {
  34. return new ThemeRegistry(BuiltInSizeThemes as { [k: string]: Provider<any> }, EmptyProvider)
  35. }
  36. export type ParamValues<C extends SizeTheme.Provider<any>> = C extends SizeTheme.Provider<infer P> ? PD.Values<P> : never
  37. }
  38. export const BuiltInSizeThemes = {
  39. 'physical': PhysicalSizeThemeProvider,
  40. 'shape-group': ShapeGroupSizeThemeProvider,
  41. 'uncertainty': UncertaintySizeThemeProvider,
  42. 'uniform': UniformSizeThemeProvider
  43. }
  44. export type BuiltInSizeThemeName = keyof typeof BuiltInSizeThemes