color.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 { Color } from '../mol-util/color';
  7. import { Location } from '../mol-model/location';
  8. import { ColorType } from '../mol-geo/geometry/color-data';
  9. import { CarbohydrateSymbolColorThemeProvider } from './color/carbohydrate-symbol';
  10. import { UniformColorThemeProvider } from './color/uniform';
  11. import { deepEqual } from '../mol-util';
  12. import { ParamDefinition as PD } from '../mol-util/param-definition';
  13. import { ThemeDataContext, ThemeRegistry, ThemeProvider } from './theme';
  14. import { ChainIdColorThemeProvider } from './color/chain-id';
  15. import { CrossLinkColorThemeProvider } from './color/cross-link';
  16. import { ElementIndexColorThemeProvider } from './color/element-index';
  17. import { ElementSymbolColorThemeProvider } from './color/element-symbol';
  18. import { MoleculeTypeColorThemeProvider } from './color/molecule-type';
  19. import { PolymerIdColorThemeProvider } from './color/polymer-id';
  20. import { PolymerIndexColorThemeProvider } from './color/polymer-index';
  21. import { ResidueNameColorThemeProvider } from './color/residue-name';
  22. import { SecondaryStructureColorThemeProvider } from './color/secondary-structure';
  23. import { SequenceIdColorThemeProvider } from './color/sequence-id';
  24. import { ShapeGroupColorThemeProvider } from './color/shape-group';
  25. import { UnitIndexColorThemeProvider } from './color/unit-index';
  26. import { ScaleLegend, TableLegend } from '../mol-util/legend';
  27. import { UncertaintyColorThemeProvider } from './color/uncertainty';
  28. import { EntitySourceColorThemeProvider } from './color/entity-source';
  29. import { IllustrativeColorThemeProvider } from './color/illustrative';
  30. import { HydrophobicityColorThemeProvider } from './color/hydrophobicity';
  31. import { ModelIndexColorThemeProvider } from './color/model-index';
  32. import { OccupancyColorThemeProvider } from './color/occupancy';
  33. import { OperatorNameColorThemeProvider } from './color/operator-name';
  34. import { OperatorHklColorThemeProvider } from './color/operator-hkl';
  35. import { InteractionTypeColorThemeProvider } from './color/interaction-type';
  36. import { AccessibleSurfaceAreaColorThemeProvider } from './color/accessible-surface-area';
  37. export type LocationColor = (location: Location, isSecondary: boolean) => Color
  38. export { ColorTheme }
  39. interface ColorTheme<P extends PD.Params> {
  40. readonly factory: ColorTheme.Factory<P>
  41. readonly granularity: ColorType
  42. readonly color: LocationColor
  43. readonly props: Readonly<PD.Values<P>>
  44. readonly contextHash?: number
  45. readonly description?: string
  46. readonly legend?: Readonly<ScaleLegend | TableLegend>
  47. }
  48. namespace ColorTheme {
  49. export type Props = { [k: string]: any }
  50. export type Factory<P extends PD.Params> = (ctx: ThemeDataContext, props: PD.Values<P>) => ColorTheme<P>
  51. export const EmptyFactory = () => Empty
  52. const EmptyColor = Color(0xCCCCCC)
  53. export const Empty: ColorTheme<{}> = {
  54. factory: EmptyFactory,
  55. granularity: 'uniform',
  56. color: () => EmptyColor,
  57. props: {}
  58. }
  59. export function areEqual(themeA: ColorTheme<any>, themeB: ColorTheme<any>) {
  60. return themeA.contextHash === themeB.contextHash && themeA.factory === themeB.factory && deepEqual(themeA.props, themeB.props)
  61. }
  62. export interface Provider<P extends PD.Params> extends ThemeProvider<ColorTheme<P>, P> { }
  63. export const EmptyProvider: Provider<{}> = { label: '', factory: EmptyFactory, getParams: () => ({}), defaultValues: {}, isApplicable: () => true }
  64. export type Registry = ThemeRegistry<ColorTheme<any>>
  65. export function createRegistry() {
  66. return new ThemeRegistry(BuiltInColorThemes as { [k: string]: Provider<any> }, EmptyProvider)
  67. }
  68. export type ParamValues<C extends ColorTheme.Provider<any>> = C extends ColorTheme.Provider<infer P> ? PD.Values<P> : never
  69. }
  70. export const BuiltInColorThemes = {
  71. 'accessible-surface-area': AccessibleSurfaceAreaColorThemeProvider,
  72. 'carbohydrate-symbol': CarbohydrateSymbolColorThemeProvider,
  73. 'chain-id': ChainIdColorThemeProvider,
  74. 'cross-link': CrossLinkColorThemeProvider,
  75. 'element-index': ElementIndexColorThemeProvider,
  76. 'element-symbol': ElementSymbolColorThemeProvider,
  77. 'entity-source': EntitySourceColorThemeProvider,
  78. 'hydrophobicity': HydrophobicityColorThemeProvider,
  79. 'illustrative': IllustrativeColorThemeProvider,
  80. 'interaction-type': InteractionTypeColorThemeProvider,
  81. 'model-index': ModelIndexColorThemeProvider,
  82. 'molecule-type': MoleculeTypeColorThemeProvider,
  83. 'occupancy': OccupancyColorThemeProvider,
  84. 'operator-hkl': OperatorHklColorThemeProvider,
  85. 'operator-name': OperatorNameColorThemeProvider,
  86. 'polymer-id': PolymerIdColorThemeProvider,
  87. 'polymer-index': PolymerIndexColorThemeProvider,
  88. 'residue-name': ResidueNameColorThemeProvider,
  89. 'secondary-structure': SecondaryStructureColorThemeProvider,
  90. 'sequence-id': SequenceIdColorThemeProvider,
  91. 'shape-group': ShapeGroupColorThemeProvider,
  92. 'uncertainty': UncertaintyColorThemeProvider,
  93. 'unit-index': UnitIndexColorThemeProvider,
  94. 'uniform': UniformColorThemeProvider,
  95. }
  96. export type BuiltInColorThemeName = keyof typeof BuiltInColorThemes