tree.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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, StructureToBond, BondUpdate } 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, StructureToBond, StructureCenter)
  41. break;
  42. case 'spacefill':
  43. transforms.push(SpacefillUpdate)
  44. break;
  45. case 'bond':
  46. transforms.push(BondUpdate)
  47. break;
  48. }
  49. return transforms
  50. }
  51. export class Entity extends View<Controller<any>, {}, { entity: AnyEntity}> {
  52. render() {
  53. const entity = this.props.entity
  54. return <div className='molstar-entity-tree-entry'>
  55. <div className='molstar-entity-tree-entry-body'>
  56. <div className='molstar-entity-tree-entry-label-wrap'>
  57. <button
  58. className='molstar-entity-tree-entry-label'
  59. onClick={() => {
  60. console.log(entity)
  61. this.controller.context.currentEntity.next(entity)
  62. this.controller.context.currentTransforms.next(getTransforms(entity))
  63. }}
  64. >
  65. <span>{entity.id} - {entity.kind}</span>
  66. </button>
  67. </div>
  68. </div>
  69. </div>;
  70. }
  71. }
  72. export class EntityTree extends View<EntityTreeController, {}, {}> {
  73. render() {
  74. const entities: JSX.Element[] = []
  75. const state = this.controller.state.getValue()
  76. if (state) {
  77. state.entities.forEach(e => {
  78. entities.push(
  79. <div key={e.id}>
  80. <Entity controller={this.controller} entity={e}></Entity>
  81. </div>
  82. )
  83. })
  84. }
  85. return <div className='molstar-entity-tree'>
  86. <div className='molstar-entity-tree-root'>
  87. <Entity controller={this.controller} entity={RootEntity}></Entity>
  88. </div>
  89. <div className='molstar-entity-tree-children'>
  90. <div>{entities}</div>
  91. </div>
  92. </div>;
  93. }
  94. }