representation.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { PluginBehavior } from '../behavior';
  7. import { PluginStateObject as SO } from '../../state/base';
  8. import { EmptyLoci, Loci, areLociEqual } from 'mol-model/loci';
  9. import { MarkerAction } from 'mol-geo/geometry/marker-data';
  10. export const AddRepresentationToCanvas = PluginBehavior.create({
  11. name: 'add-representation-to-canvas',
  12. ctor: class extends PluginBehavior.Handler {
  13. register(): void {
  14. this.subscribeObservable(this.ctx.events.state.data.object.created, o => {
  15. if (!SO.isRepresentation3D(o.obj)) return;
  16. this.ctx.canvas3d.add(o.obj.data);
  17. this.ctx.canvas3d.requestDraw(true);
  18. });
  19. this.subscribeObservable(this.ctx.events.state.data.object.updated, o => {
  20. const oo = o.obj;
  21. if (!SO.isRepresentation3D(oo)) return;
  22. this.ctx.canvas3d.add(oo.data);
  23. this.ctx.canvas3d.requestDraw(true);
  24. });
  25. this.subscribeObservable(this.ctx.events.state.data.object.removed, o => {
  26. const oo = o.obj;
  27. if (!SO.isRepresentation3D(oo)) return;
  28. this.ctx.canvas3d.remove(oo.data);
  29. this.ctx.canvas3d.requestDraw(true);
  30. oo.data.destroy();
  31. });
  32. this.subscribeObservable(this.ctx.events.state.data.object.replaced, o => {
  33. if (o.oldObj && SO.isRepresentation3D(o.oldObj)) {
  34. this.ctx.canvas3d.remove(o.oldObj.data);
  35. this.ctx.canvas3d.requestDraw(true);
  36. o.oldObj.data.destroy();
  37. }
  38. if (o.newObj && SO.isRepresentation3D(o.newObj)) {
  39. this.ctx.canvas3d.add(o.newObj.data);
  40. this.ctx.canvas3d.requestDraw(true);
  41. }
  42. });
  43. }
  44. },
  45. display: { name: 'Add Representation To Canvas', group: 'Data' }
  46. });
  47. export const HighlightLoci = PluginBehavior.create({
  48. name: 'representation-highlight-loci',
  49. ctor: class extends PluginBehavior.Handler {
  50. register(): void {
  51. let prevLoci: Loci = EmptyLoci, prevRepr: any = void 0;
  52. this.subscribeObservable(this.ctx.behaviors.canvas.highlightLoci, current => {
  53. if (!this.ctx.canvas3d) return;
  54. if (current.repr !== prevRepr || !areLociEqual(current.loci, prevLoci)) {
  55. this.ctx.canvas3d.mark(prevLoci, MarkerAction.RemoveHighlight);
  56. this.ctx.canvas3d.mark(current.loci, MarkerAction.Highlight);
  57. prevLoci = current.loci;
  58. prevRepr = current.repr;
  59. }
  60. });
  61. }
  62. },
  63. display: { name: 'Highlight Loci on Canvas', group: 'Data' }
  64. });
  65. export const SelectLoci = PluginBehavior.create({
  66. name: 'representation-select-loci',
  67. ctor: class extends PluginBehavior.Handler {
  68. register(): void {
  69. this.subscribeObservable(this.ctx.behaviors.canvas.selectLoci, ({ loci }) => {
  70. if (!this.ctx.canvas3d) return;
  71. this.ctx.canvas3d.mark(loci, MarkerAction.Toggle);
  72. });
  73. }
  74. },
  75. display: { name: 'Select Loci on Canvas', group: 'Data' }
  76. });