eventManager.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { EventCallback, TemplateManager } from "./templateManager";
  2. /**
  3. * The EventManager is in charge of registering user interctions with the viewer.
  4. * It is used in the TemplateManager
  5. */
  6. export class EventManager {
  7. private _callbacksContainer: { [key: string]: Array<{ eventType?: string, selector?: string, callback: (eventData: EventCallback) => void }> };
  8. constructor(private _templateManager: TemplateManager) {
  9. this._callbacksContainer = {};
  10. this._templateManager.onEventTriggered.add((eventData) => {
  11. this._eventTriggered(eventData);
  12. });
  13. }
  14. /**
  15. * Register a new callback to a specific template.
  16. * The best example for the usage can be found in the DefaultViewer
  17. *
  18. * @param templateName the templateName to register the event to
  19. * @param callback The callback to be executed
  20. * @param eventType the type of event to register
  21. * @param selector an optional selector. if not defined the parent object in the template will be selected
  22. */
  23. public registerCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string) {
  24. if (!this._callbacksContainer[templateName]) {
  25. this._callbacksContainer[templateName] = [];
  26. }
  27. this._callbacksContainer[templateName].push({
  28. eventType,
  29. callback,
  30. selector
  31. });
  32. }
  33. /**
  34. * This will remove a registered event from the defined template.
  35. * Each one of the variables apart from the template name are optional, but one must be provided.
  36. *
  37. * @param templateName the templateName
  38. * @param callback the callback to remove (optional)
  39. * @param eventType the event type to remove (optional)
  40. * @param selector the selector from which to remove the event (optional)
  41. */
  42. public unregisterCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string) {
  43. let callbackDefs = this._callbacksContainer[templateName] || [];
  44. this._callbacksContainer[templateName] = callbackDefs.filter((callbackDef) => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector));
  45. }
  46. private _eventTriggered(data: EventCallback) {
  47. let templateName = data.template.name;
  48. let eventType = data.event.type;
  49. let selector = data.selector;
  50. let callbackDefs = this._callbacksContainer[templateName] || [];
  51. callbackDefs.filter((callbackDef) => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector)).forEach((callbackDef) => {
  52. callbackDef.callback(data);
  53. });
  54. }
  55. /**
  56. * Dispose the event manager
  57. */
  58. public dispose() {
  59. this._callbacksContainer = {};
  60. }
  61. }