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: eventType,
  29. callback: callback
  30. });
  31. }
  32. /**
  33. * This will remove a registered event from the defined template.
  34. * Each one of the variables apart from the template name are optional, but one must be provided.
  35. *
  36. * @param templateName the templateName
  37. * @param callback the callback to remove (optional)
  38. * @param eventType the event type to remove (optional)
  39. * @param selector the selector from which to remove the event (optional)
  40. */
  41. public unregisterCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string) {
  42. let callbackDefs = this._callbacksContainer[templateName] || [];
  43. this._callbacksContainer[templateName] = callbackDefs.filter(callbackDef => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector));
  44. }
  45. private _eventTriggered(data: EventCallback) {
  46. let templateName = data.template.name;
  47. let eventType = data.event.type;
  48. let selector = data.selector;
  49. let callbackDefs = this._callbacksContainer[templateName] || [];
  50. callbackDefs.filter(callbackDef => (!callbackDef.eventType || callbackDef.eventType === eventType) && (!callbackDef.selector || callbackDef.selector === selector)).forEach(callbackDef => {
  51. callbackDef.callback(data);
  52. });
  53. }
  54. /**
  55. * Dispose the event manager
  56. */
  57. public dispose() {
  58. this._callbacksContainer = {};
  59. }
  60. }