HostExtensionServices.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. //
  2. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  3. // LICENSE: Atomic Game Engine Editor and Tools EULA
  4. // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
  5. // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
  6. //
  7. import * as EditorEvents from "../editor/EditorEvents";
  8. import * as EditorUI from "../ui/EditorUI";
  9. /**
  10. * Generic registry for storing Editor Extension Services
  11. */
  12. class ServiceRegistry<T extends Editor.Extensions.EditorService> implements Editor.Extensions.ServiceRegistry<T> {
  13. registeredServices: T[] = [];
  14. /**
  15. * Adds a service to the registered services list for this type of service
  16. * @param {T} service the service to register
  17. */
  18. register(service: T) {
  19. this.registeredServices.push(service);
  20. }
  21. }
  22. interface ServiceEventSubscriber {
  23. /**
  24. * Allow this service registry to subscribe to events that it is interested in
  25. * @param {Atomic.UIWidget} topLevelWindow The top level window that will be receiving these events
  26. */
  27. subscribeToEvents(topLevelWindow: Atomic.UIWidget);
  28. }
  29. /**
  30. * Registry for service extensions that are concerned about project events
  31. */
  32. export class ProjectServiceRegistry extends ServiceRegistry<Editor.HostExtensions.ProjectService> implements ServiceEventSubscriber {
  33. constructor() {
  34. super();
  35. }
  36. /**
  37. * Allow this service registry to subscribe to events that it is interested in
  38. * @param {Atomic.UIWidget} topLevelWindow The top level window that will be receiving these events
  39. */
  40. subscribeToEvents(eventDispatcher: Editor.Extensions.EventDispatcher) {
  41. eventDispatcher.subscribeToEvent(EditorEvents.LoadProjectNotification, (ev) => this.projectLoaded(ev));
  42. eventDispatcher.subscribeToEvent(EditorEvents.CloseProject, (ev) => this.projectUnloaded(ev));
  43. eventDispatcher.subscribeToEvent(EditorEvents.PlayerStartRequest, () => this.playerStarted());
  44. }
  45. /**
  46. * Called when the project is unloaded
  47. * @param {[type]} data Event info from the project unloaded event
  48. */
  49. projectUnloaded(data) {
  50. this.registeredServices.forEach((service) => {
  51. // Notify services that the project has been unloaded
  52. try {
  53. if (service.projectUnloaded) {
  54. service.projectUnloaded();
  55. }
  56. } catch (e) {
  57. EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n \n ${e.stack}`);
  58. }
  59. });
  60. }
  61. /**
  62. * Called when the project is loaded
  63. * @param {[type]} data Event info from the project unloaded event
  64. */
  65. projectLoaded(ev: Editor.EditorEvents.LoadProjectEvent) {
  66. this.registeredServices.forEach((service) => {
  67. try {
  68. // Notify services that the project has just been loaded
  69. if (service.projectLoaded) {
  70. service.projectLoaded(ev);
  71. }
  72. } catch (e) {
  73. EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n \n ${e.stack}`);
  74. }
  75. });
  76. }
  77. playerStarted() {
  78. this.registeredServices.forEach((service) => {
  79. try {
  80. // Notify services that the project has just been loaded
  81. if (service.playerStarted) {
  82. service.playerStarted();
  83. }
  84. } catch (e) {
  85. EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n \n ${e.stack}`);
  86. }
  87. });
  88. }
  89. }
  90. /**
  91. * Registry for service extensions that are concerned about Resources
  92. */
  93. export class ResourceServiceRegistry extends ServiceRegistry<Editor.HostExtensions.ResourceService> {
  94. constructor() {
  95. super();
  96. }
  97. /**
  98. * Allow this service registry to subscribe to events that it is interested in
  99. * @param {Atomic.UIWidget} topLevelWindow The top level window that will be receiving these events
  100. */
  101. subscribeToEvents(eventDispatcher: Editor.Extensions.EventDispatcher) {
  102. eventDispatcher.subscribeToEvent(EditorEvents.SaveResourceNotification, (ev) => this.saveResource(ev));
  103. eventDispatcher.subscribeToEvent(EditorEvents.DeleteResourceNotification, (ev) => this.deleteResource(ev));
  104. eventDispatcher.subscribeToEvent(EditorEvents.RenameResourceNotification, (ev) => this.renameResource(ev));
  105. }
  106. /**
  107. * Called after a resource has been saved
  108. * @param {Editor.EditorEvents.SaveResourceEvent} ev
  109. */
  110. saveResource(ev: Editor.EditorEvents.SaveResourceEvent) {
  111. // run through and find any services that can handle this.
  112. this.registeredServices.forEach((service) => {
  113. try {
  114. // Verify that the service contains the appropriate methods and that it can save
  115. if (service.save) {
  116. service.save(ev);
  117. }
  118. } catch (e) {
  119. EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n \n ${e.stack}`);
  120. }
  121. });
  122. }
  123. /**
  124. * Called when a resource has been deleted
  125. */
  126. deleteResource(ev: Editor.EditorEvents.DeleteResourceEvent) {
  127. this.registeredServices.forEach((service) => {
  128. try {
  129. // Verify that the service contains the appropriate methods and that it can delete
  130. if (service.delete) {
  131. service.delete(ev);
  132. }
  133. } catch (e) {
  134. EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n ${e}\n ${e.stack}`);
  135. }
  136. });
  137. }
  138. /**
  139. * Called when a resource has been renamed
  140. * @param {Editor.EditorEvents.RenameResourceEvent} ev
  141. */
  142. renameResource(ev: Editor.EditorEvents.RenameResourceEvent) {
  143. this.registeredServices.forEach((service) => {
  144. try {
  145. // Verify that the service contains the appropriate methods and that it can handle the rename
  146. if (service.rename) {
  147. service.rename(ev);
  148. }
  149. } catch (e) {
  150. EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n \n ${e.stack}`);
  151. }
  152. });
  153. }
  154. }