viewerManager.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { Observable } from 'babylonjs/Misc/observable';
  2. import { AbstractViewer } from './viewer';
  3. /**
  4. * The viewer manager is the container for all viewers currently registered on this page.
  5. * It is possible to have more than one viewer on a single page.
  6. */
  7. export class ViewerManager {
  8. private _viewers: { [key: string]: AbstractViewer };
  9. /**
  10. * A callback that will be triggered when a new viewer was added
  11. */
  12. public onViewerAdded: (viewer: AbstractViewer) => void;
  13. /**
  14. * Will notify when a new viewer was added
  15. */
  16. public onViewerAddedObservable: Observable<AbstractViewer>;
  17. /**
  18. * Will notify when a viewer was removed (disposed)
  19. */
  20. public onViewerRemovedObservable: Observable<string>;
  21. constructor() {
  22. this._viewers = {};
  23. this.onViewerAddedObservable = new Observable();
  24. this.onViewerRemovedObservable = new Observable();
  25. }
  26. /**
  27. * Adding a new viewer to the viewer manager and start tracking it.
  28. * @param viewer the viewer to add
  29. */
  30. public addViewer(viewer: AbstractViewer) {
  31. this._viewers[viewer.getBaseId()] = viewer;
  32. this._onViewerAdded(viewer);
  33. }
  34. /**
  35. * remove a viewer from the viewer manager
  36. * @param viewer the viewer to remove
  37. */
  38. public removeViewer(viewer: AbstractViewer) {
  39. let id = viewer.getBaseId();
  40. delete this._viewers[id];
  41. this.onViewerRemovedObservable.notifyObservers(id);
  42. }
  43. /**
  44. * Get a viewer by its baseId (if the container element has an ID, it is the this is. if not, a random id was assigned)
  45. * @param id the id of the HTMl element (or the viewer's, if none provided)
  46. */
  47. public getViewerById(id: string): AbstractViewer {
  48. return this._viewers[id];
  49. }
  50. /**
  51. * Get a viewer using a container element
  52. * @param element the HTML element to search viewers associated with
  53. */
  54. public getViewerByHTMLElement(element: HTMLElement) {
  55. for (let id in this._viewers) {
  56. if (this._viewers[id].containerElement === element) {
  57. return this.getViewerById(id);
  58. }
  59. }
  60. }
  61. /**
  62. * Get a promise that will fullfil when this viewer was initialized.
  63. * Since viewer initialization and template injection is asynchronous, using the promise will guaranty that
  64. * you will get the viewer after everything was already configured.
  65. * @param id the viewer id to find
  66. */
  67. public getViewerPromiseById(id: string): Promise<AbstractViewer> {
  68. return new Promise((resolve, reject) => {
  69. let localViewer = this.getViewerById(id);
  70. if (localViewer) {
  71. return resolve(localViewer);
  72. }
  73. let viewerFunction = (viewer: AbstractViewer) => {
  74. if (viewer.getBaseId() === id) {
  75. resolve(viewer);
  76. this.onViewerAddedObservable.removeCallback(viewerFunction);
  77. }
  78. };
  79. this.onViewerAddedObservable.add(viewerFunction);
  80. });
  81. }
  82. private _onViewerAdded(viewer: AbstractViewer) {
  83. this.onViewerAdded && this.onViewerAdded(viewer);
  84. this.onViewerAddedObservable.notifyObservers(viewer);
  85. }
  86. /**
  87. * dispose the manager and all of its associated viewers
  88. */
  89. public dispose() {
  90. for (let id in this._viewers) {
  91. this._viewers[id].dispose();
  92. }
  93. this.onViewerAddedObservable.clear();
  94. this.onViewerRemovedObservable.clear();
  95. }
  96. }
  97. export let viewerManager = new ViewerManager();