tree.tsx 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * Adapted from LiteMol
  5. * Copyright (c) 2016 - now David Sehnal, licensed under Apache 2.0, See LICENSE file for more info.
  6. *
  7. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  8. */
  9. import * as React from 'react'
  10. import { View } from '../view';
  11. import { EntityTreeController } from '../../controller/entity/tree';
  12. import { Controller } from '../../controller/controller';
  13. import { AnyEntity, RootEntity } from 'mol-view/state/entity';
  14. import { AnyTransform, SpacefillUpdate, UrlToData, DataToCif, FileToData, CifToMmcif, MmcifToModel, ModelToStructure, StructureToSpacefill, MmcifFileToSpacefill, StructureCenter } from 'mol-view/state/transform';
  15. function getTransforms(entity: AnyEntity): AnyTransform[] {
  16. const transforms: AnyTransform[] = []
  17. switch (entity.kind) {
  18. case 'root':
  19. transforms.push(MmcifFileToSpacefill)
  20. break;
  21. case 'url':
  22. transforms.push(UrlToData)
  23. break;
  24. case 'file':
  25. transforms.push(FileToData)
  26. break;
  27. case 'data':
  28. transforms.push(DataToCif)
  29. break;
  30. case 'cif':
  31. transforms.push(CifToMmcif)
  32. break;
  33. case 'mmcif':
  34. transforms.push(MmcifToModel)
  35. break;
  36. case 'model':
  37. transforms.push(ModelToStructure)
  38. break;
  39. case 'structure':
  40. transforms.push(StructureToSpacefill, StructureCenter)
  41. break;
  42. case 'spacefill':
  43. transforms.push(SpacefillUpdate)
  44. break;
  45. }
  46. return transforms
  47. }
  48. export class Entity extends View<Controller<any>, {}, { entity: AnyEntity}> {
  49. render() {
  50. const entity = this.props.entity
  51. return <div className='molstar-entity-tree-entry'>
  52. <div className='molstar-entity-tree-entry-body'>
  53. <div className='molstar-entity-tree-entry-label-wrap'>
  54. <button
  55. className='molstar-entity-tree-entry-label'
  56. onClick={() => {
  57. console.log(entity)
  58. this.controller.context.currentEntity.next(entity)
  59. this.controller.context.currentTransforms.next(getTransforms(entity))
  60. }}
  61. >
  62. <span>{entity.id} - {entity.kind}</span>
  63. </button>
  64. </div>
  65. </div>
  66. </div>;
  67. }
  68. }
  69. export class EntityTree extends View<EntityTreeController, {}, {}> {
  70. render() {
  71. const entities: JSX.Element[] = []
  72. const state = this.controller.state.getValue()
  73. if (state) {
  74. state.entities.forEach(e => {
  75. entities.push(
  76. <div key={e.id}>
  77. <Entity controller={this.controller} entity={e}></Entity>
  78. </div>
  79. )
  80. })
  81. }
  82. return <div className='molstar-entity-tree'>
  83. <div className='molstar-entity-tree-root'>
  84. <Entity controller={this.controller} entity={RootEntity}></Entity>
  85. </div>
  86. <div className='molstar-entity-tree-children'>
  87. <div>{entities}</div>
  88. </div>
  89. </div>;
  90. }
  91. }