Browse Source

Editor scans Resources/Editor when a project is opened for .Service.js files, and loads them as extensions

Matt Benic 9 years ago
parent
commit
2541b51cb7

+ 28 - 0
Script/AtomicEditor/editor/Editor.ts

@@ -26,6 +26,10 @@ import PlayMode = require("ui/playmode/PlayMode");
 import EditorLicense = require("./EditorLicense");
 import EditorLicense = require("./EditorLicense");
 import EditorEvents = require("./EditorEvents");
 import EditorEvents = require("./EditorEvents");
 import Preferences = require("./Preferences");
 import Preferences = require("./Preferences");
+import ServiceLocator from "../hostExtensions/ServiceLocator";
+
+// Duktape require isn't recognized as a function, but can be used as one
+declare function require(filename : string) : any;
 
 
 class Editor extends Atomic.ScriptObject {
 class Editor extends Atomic.ScriptObject {
 
 
@@ -151,11 +155,35 @@ class Editor extends Atomic.ScriptObject {
         }
         }
         const loaded = system.loadProject(event.path);
         const loaded = system.loadProject(event.path);
         if (loaded) {
         if (loaded) {
+            this.loadProjectExtensions();
             this.sendEvent(EditorEvents.LoadProjectNotification, event);
             this.sendEvent(EditorEvents.LoadProjectNotification, event);
         }
         }
         return loaded;
         return loaded;
     }
     }
 
 
+    loadProjectExtensions() {
+        var system = ToolCore.getToolSystem();
+        if (system.project) {
+            var fileSystem = Atomic.getFileSystem();
+            var editorScriptsPath = system.project.resourcePath + "../Editor/";
+            if (fileSystem.dirExists(editorScriptsPath)) {
+                var filenames = fileSystem.scanDir(editorScriptsPath, "*.js", Atomic.SCAN_FILES, true);
+                for (var index in filenames) {
+                    var filename = filenames[index];
+                    // Filtered search in Atomic doesn't due true wildcarding, only handles extension filters
+                    if (filename.lastIndexOf(".Service.js") >= 0) {
+                        var extensionPath = editorScriptsPath + filename;
+                        extensionPath = extensionPath.substring(0, extensionPath.length - 3);
+                        // Note: duktape does not yet support unloading modules,
+                        // but will return the same object when passed a path the second time.
+                        var resourceService = <Editor.HostExtensions.HostEditorService> require(extensionPath).default;
+                        ServiceLocator.loadService(resourceService);
+                    }
+                }
+            }
+        }
+    }
+
     closeAllResourceEditors() {
     closeAllResourceEditors() {
         var editor = EditorUI.getCurrentResourceEditor();
         var editor = EditorUI.getCurrentResourceEditor();
         if (!editor) {
         if (!editor) {

+ 6 - 0
Script/AtomicEditor/hostExtensions/HostExtensionServices.ts

@@ -38,6 +38,12 @@ class ServiceRegistry<T extends Editor.Extensions.EditorService> implements Edit
         this.registeredServices.push(service);
         this.registeredServices.push(service);
     }
     }
 
 
+    unregister(service: T) {
+        var index = this.registeredServices.indexOf(service, 0);
+        if (index > -1) {
+           this.registeredServices.splice(index, 1);
+        }        
+    }
 }
 }
 
 
 interface ServiceEventSubscriber {
 interface ServiceEventSubscriber {

+ 1 - 1
Script/TypeScript/AtomicWork.d.ts

@@ -2,7 +2,7 @@
 /// <reference path="ToolCore.d.ts" />
 /// <reference path="ToolCore.d.ts" />
 /// <reference path="Editor.d.ts" />
 /// <reference path="Editor.d.ts" />
 /// <reference path="AtomicPlayer.d.ts" />
 /// <reference path="AtomicPlayer.d.ts" />
-
+/// <reference path="AtomicNet.d.ts" />
 
 
 declare module Atomic {
 declare module Atomic {
 
 

+ 5 - 0
Script/TypeScript/EditorWork.d.ts

@@ -195,6 +195,11 @@ declare module Editor.Extensions {
          * @param  {T}      service the service to register
          * @param  {T}      service the service to register
          */
          */
         register(service: T);
         register(service: T);
+        /**
+         * Removes a service from the registered services list for this type of service
+         * @param  {T}      service the service to unregister
+         */
+        unregister(service: T);
     }
     }
 }
 }