Browse Source

Added type safety to the sendEvent calls.

Shaddock Heath 9 years ago
parent
commit
9339f6d0c5
26 changed files with 96 additions and 87 deletions
  1. 8 8
      Script/AtomicEditor/editor/Editor.ts
  2. 4 2
      Script/AtomicEditor/editor/EditorEvents.ts
  3. 3 3
      Script/AtomicEditor/hostExtensions/languageExtensions/TypescriptLanguageExtension.ts
  4. 19 19
      Script/AtomicEditor/resources/ResourceOps.ts
  5. 1 1
      Script/AtomicEditor/ui/MainToolbar.ts
  6. 6 5
      Script/AtomicEditor/ui/Shortcuts.ts
  7. 2 2
      Script/AtomicEditor/ui/frames/ProjectFrame.ts
  8. 6 6
      Script/AtomicEditor/ui/frames/ResourceFrame.ts
  9. 2 2
      Script/AtomicEditor/ui/frames/WelcomeFrame.ts
  10. 4 4
      Script/AtomicEditor/ui/frames/inspector/AttributeInfoEdit.ts
  11. 5 5
      Script/AtomicEditor/ui/frames/inspector/ColorChooser.ts
  12. 5 5
      Script/AtomicEditor/ui/frames/inspector/ComponentAttributeUI.ts
  13. 1 1
      Script/AtomicEditor/ui/frames/inspector/CreateComponentButton.ts
  14. 3 2
      Script/AtomicEditor/ui/frames/inspector/MaterialInspector.ts
  15. 1 1
      Script/AtomicEditor/ui/frames/inspector/ModelInspector.ts
  16. 2 2
      Script/AtomicEditor/ui/frames/inspector/SelectionInspector.ts
  17. 4 4
      Script/AtomicEditor/ui/frames/inspector/SelectionPrefabWidget.ts
  18. 5 5
      Script/AtomicEditor/ui/frames/menus/HierarchyFrameMenu.ts
  19. 1 1
      Script/AtomicEditor/ui/frames/menus/MainFrameMenu.ts
  20. 1 1
      Script/AtomicEditor/ui/modal/CreateProject.ts
  21. 6 6
      Script/AtomicEditor/ui/modal/UIResourceOps.ts
  22. 1 1
      Script/AtomicEditor/ui/playmode/PlayMode.ts
  23. 1 1
      Script/AtomicEditor/ui/resourceEditors/Scene3dResourceEditorBuilder.ts
  24. 1 0
      Script/Packages/Atomic/Core.json
  25. 3 0
      Script/TypeScript/AtomicWork.d.ts
  26. 1 0
      Script/TypeScript/EditorWork.d.ts

+ 8 - 8
Script/AtomicEditor/editor/Editor.ts

@@ -165,7 +165,7 @@ class AtomicEditor extends Atomic.ScriptObject {
             applicationPreferences: JSON.stringify(Preferences.getInstance().cachedApplicationPreferences)
         };
 
-        this.sendEvent(Editor.UserPreferencesChangedNotificationEventType, eventData);
+        this.sendEvent<Editor.UserPreferencesChangedNotificationEvent>(Editor.UserPreferencesChangedNotificationEventType, eventData);
     }
 
     /**
@@ -183,7 +183,7 @@ class AtomicEditor extends Atomic.ScriptObject {
             applicationPreferences: JSON.stringify(Preferences.getInstance().cachedApplicationPreferences)
         };
 
-        this.sendEvent(Editor.UserPreferencesChangedNotificationEventType, eventData);
+        this.sendEvent<Editor.UserPreferencesChangedNotificationEvent>(Editor.UserPreferencesChangedNotificationEventType, eventData);
     }
 
     handleEditorLoadProject(event: Editor.LoadProjectNotificationEvent): boolean {
@@ -191,7 +191,7 @@ class AtomicEditor extends Atomic.ScriptObject {
         var system = ToolCore.getToolSystem();
         if (system.project) {
 
-            this.sendEvent(Editor.EditorModalEventType,
+            this.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType,
                 { type: Editor.EDITOR_MODALERROR, title: "Project already loaded", message: "Project already loaded" });
 
             return false;
@@ -202,7 +202,7 @@ class AtomicEditor extends Atomic.ScriptObject {
             Preferences.getInstance().loadUserPrefs();
             WebView.WebBrowserHost.setGlobalStringProperty("HOST_Preferences", "ProjectPreferences", JSON.stringify(Preferences.getInstance().cachedProjectPreferences, null, 2 ));
             WebView.WebBrowserHost.setGlobalStringProperty("HOST_Preferences", "ApplicationPreferences", JSON.stringify(Preferences.getInstance().cachedApplicationPreferences, null, 2 ));
-            this.sendEvent(Editor.LoadProjectNotificationEventType, event);
+            this.sendEvent<Editor.LoadProjectNotificationEvent>(Editor.LoadProjectNotificationEventType, event);
         }
         return loaded;
     }
@@ -224,9 +224,9 @@ class AtomicEditor extends Atomic.ScriptObject {
         editor.requestClose();
     }
 
-    handleEditorCloseProject(event) {
+    handleEditorCloseProject(event: Editor.ProjectUnloadedNotificationEvent) {
         this.projectCloseRequested = true;
-        this.sendEvent(Editor.ProjectUnloadedNotificationEventType, event);
+        this.sendEvent<Editor.ProjectUnloadedNotificationEvent>(Editor.ProjectUnloadedNotificationEventType, event);
         this.closeAllResourceEditors();
     }
 
@@ -246,7 +246,7 @@ class AtomicEditor extends Atomic.ScriptObject {
 
     handleProjectUnloaded(event) {
 
-        this.sendEvent(Editor.EditorActiveSceneEditorChangeEventType, { sceneEditor: null });
+        this.sendEvent<Editor.EditorActiveSceneEditorChangeEvent>(Editor.EditorActiveSceneEditorChangeEventType, { sceneEditor: null });
 
     }
 
@@ -260,7 +260,7 @@ class AtomicEditor extends Atomic.ScriptObject {
 
             if (args[idx] == "--project") {
 
-                this.sendEvent(Editor.EditorLoadProjectEventType, { path: args[idx + 1] });
+                this.sendEvent<Editor.EditorLoadProjectEvent>(Editor.EditorLoadProjectEventType, { path: args[idx + 1] });
 
             }
 

+ 4 - 2
Script/AtomicEditor/editor/EditorEvents.ts

@@ -22,5 +22,7 @@
 
 // These are exposed in AtomicApp, but that module is not available to call until the player is playing
 // but we need the event names
-export const IPCPlayerExitRequestEventType = "IPCPlayerExitRequest";
-export const IPCPlayerWindowChangedEventType = "IPCPlayerWindowChanged";
+export const IPCPlayerExitRequestEventType: Atomic.EventType = "IPCPlayerExitRequest";
+export const IPCPlayerWindowChangedEventType: Atomic.EventType = "IPCPlayerWindowChanged";
+export const IPCPlayerPauseResumeRequestEventType: Atomic.EventType = "IPCPlayerPauseResumeRequest";
+export const IPCPlayerPauseStepRequestEventType: Atomic.EventType = "IPCPlayerPauseStepRequest";

+ 3 - 3
Script/AtomicEditor/hostExtensions/languageExtensions/TypescriptLanguageExtension.ts

@@ -226,12 +226,12 @@ export default class TypescriptLanguageExtension implements Editor.HostExtension
                 console.log(`${this.name}: deleting corresponding .js file`);
                 ToolCore.assetDatabase.deleteAsset(jsFileAsset);
 
-                let eventData: Editor.EditorDeleteResourceEvent = {
+                let eventData : Editor.EditorDeleteResourceNotificationEvent = {
                     path: jsFile
                 };
 
                 this.setTsConfigOnWebView(this.buildTsConfig());
-                this.serviceRegistry.sendEvent(Editor.EditorDeleteResourceNotificationEventType, eventData);
+                this.serviceRegistry.sendEvent<Editor.EditorDeleteResourceNotificationEvent>(Editor.EditorDeleteResourceNotificationEventType, eventData);
             }
         }
     }
@@ -260,7 +260,7 @@ export default class TypescriptLanguageExtension implements Editor.HostExtension
                 };
 
                 this.setTsConfigOnWebView(this.buildTsConfig());
-                this.serviceRegistry.sendEvent(Editor.EditorRenameResourceNotificationEventType, eventData);
+                this.serviceRegistry.sendEvent<Editor.EditorRenameResourceNotificationEvent>(Editor.EditorRenameResourceNotificationEventType, eventData);
             }
         }
     }

+ 19 - 19
Script/AtomicEditor/resources/ResourceOps.ts

@@ -31,7 +31,7 @@ class ResourceOps extends Atomic.ScriptObject {
 
         this.subscribeToEvent(ToolCore.AssetImportErrorEvent((ev: ToolCore.AssetImportErrorEvent) => {
 
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: "Asset Import Error", message: ev.error });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: "Asset Import Error", message: ev.error });
 
         }));
 
@@ -44,7 +44,7 @@ class ResourceOps extends Atomic.ScriptObject {
         var fs = Atomic.fileSystem;
         var projectPath = Atomic.addTrailingSlash(Atomic.getPath(ev.path));
 
-        var openProject = () => this.sendEvent(Editor.EditorLoadProjectEventType, { path: ev.path });
+        var openProject = () => this.sendEvent<Editor.EditorLoadProjectEvent>(Editor.EditorLoadProjectEventType, { path: ev.path });
 
         // Check whether there is a cache folder, if so, this project has been loaded before
         if (Atomic.fileSystem.dirExists(projectPath + "Cache")) {
@@ -115,7 +115,7 @@ export function CreateNewFolder(resourcePath: string, reportError: boolean = tru
 
     if (fs.dirExists(resourcePath) || fs.fileExists(resourcePath)) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Already exists: " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Already exists: " + resourcePath });
         return false;
 
     }
@@ -123,7 +123,7 @@ export function CreateNewFolder(resourcePath: string, reportError: boolean = tru
     if (!fs.createDir(resourcePath)) {
 
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Could not create " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Could not create " + resourcePath });
 
         return false;
     }
@@ -143,7 +143,7 @@ export function CreateNewComponent(resourcePath: string, componentName: string,
 
     if (fs.dirExists(resourcePath) || fs.fileExists(resourcePath)) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Already exists: " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Already exists: " + resourcePath });
         return false;
 
     }
@@ -154,7 +154,7 @@ export function CreateNewComponent(resourcePath: string, componentName: string,
     if (!file) {
 
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed to open template: " + templateFilename });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed to open template: " + templateFilename });
         return false;
 
     }
@@ -165,7 +165,7 @@ export function CreateNewComponent(resourcePath: string, componentName: string,
 
     if (!success) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
         return false;
     }
 
@@ -183,7 +183,7 @@ export function CreateNewScript(resourcePath: string, scriptName: string, templa
 
     if (fs.dirExists(resourcePath) || fs.fileExists(resourcePath)) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Already exists: " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Already exists: " + resourcePath });
         return false;
 
     }
@@ -194,7 +194,7 @@ export function CreateNewScript(resourcePath: string, scriptName: string, templa
     if (!file) {
 
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed to open template: " + templateFilename });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed to open template: " + templateFilename });
         return false;
 
     }
@@ -205,7 +205,7 @@ export function CreateNewScript(resourcePath: string, scriptName: string, templa
 
     if (!success) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
         return false;
     }
 
@@ -223,7 +223,7 @@ export function CreateNewScene(resourcePath: string, sceneName: string, reportEr
 
     if (fs.dirExists(resourcePath) || fs.fileExists(resourcePath)) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Already exists: " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Already exists: " + resourcePath });
         return false;
 
     }
@@ -234,7 +234,7 @@ export function CreateNewScene(resourcePath: string, sceneName: string, reportEr
     if (!file) {
 
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed to open template: " + templateFilename });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed to open template: " + templateFilename });
         return false;
 
     }
@@ -245,7 +245,7 @@ export function CreateNewScene(resourcePath: string, sceneName: string, reportEr
 
     if (!success) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
         return false;
     }
 
@@ -263,7 +263,7 @@ export function CreateNewMaterial(resourcePath: string, materialName: string, re
 
     if (fs.dirExists(resourcePath) || fs.fileExists(resourcePath)) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Already exists: " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Already exists: " + resourcePath });
         return false;
 
     }
@@ -274,7 +274,7 @@ export function CreateNewMaterial(resourcePath: string, materialName: string, re
     if (!file) {
 
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed to open template: " + templateFilename });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed to open template: " + templateFilename });
         return false;
 
     }
@@ -285,7 +285,7 @@ export function CreateNewMaterial(resourcePath: string, materialName: string, re
 
     if (!success) {
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed template copy: " + templateFilename + " -> " + resourcePath });
         return false;
     }
 
@@ -307,7 +307,7 @@ export function CreateNewAnimationPreviewScene(reportError: boolean = true): boo
     if (!templateFile) {
 
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed to open template scene: " + templateFile });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed to open template scene: " + templateFile });
         return false;
 
     }
@@ -318,7 +318,7 @@ export function CreateNewAnimationPreviewScene(reportError: boolean = true): boo
     if (!animFile) {
 
         if (reportError)
-            resourceOps.sendEvent(Editor.EditorModalEventType, { title: title, message: "Failed to open animation viewer: " + animFilename });
+            resourceOps.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: title, message: "Failed to open animation viewer: " + animFilename });
         return false;
 
     }
@@ -326,7 +326,7 @@ export function CreateNewAnimationPreviewScene(reportError: boolean = true): boo
     //Reset the animation viewer scene to a blank scene
     animFile = templateFile;
 
-    resourceOps.sendEvent(Editor.EditorEditResourceEventType, { path: animFilename });
+    resourceOps.sendEvent<Editor.EditorEditResourceEvent>(Editor.EditorEditResourceEventType, { path: animFilename });
 
     return true;
 

+ 1 - 1
Script/AtomicEditor/ui/MainToolbar.ts

@@ -134,7 +134,7 @@ class MainToolbar extends Atomic.UIWidget {
                 else if (ev.target.id == "3d_scale")
                     mode = 3;
 
-                this.sendEvent(Editor.GizmoEditModeChangedEventType, { mode: mode });
+                this.sendEvent<Editor.GizmoEditModeChangedEvent>(Editor.GizmoEditModeChangedEventType, { mode: mode });
 
                 return true;
 

+ 6 - 5
Script/AtomicEditor/ui/Shortcuts.ts

@@ -22,6 +22,7 @@
 
 import EditorUI = require("./EditorUI");
 import Preferences = require("editor/Preferences");
+import * as EditorEvents from "../editor/EditorEvents";
 
 class Shortcuts extends Atomic.ScriptObject {
 
@@ -42,7 +43,7 @@ class Shortcuts extends Atomic.ScriptObject {
         this.sendEvent(Editor.EditorSaveAllResourcesEventType);
 
         if (Atomic.editorMode.isPlayerEnabled()) {
-            this.sendEvent("IPCPlayerExitRequest" /*AtomicApp.IPCPlayerExitRequestEventName*/);
+            this.sendEvent(EditorEvents.IPCPlayerExitRequestEventType);
         } else {
 
             var playerWindow = Preferences.getInstance().playerWindow;
@@ -91,13 +92,13 @@ class Shortcuts extends Atomic.ScriptObject {
 
     invokePauseOrResumePlayer() {
         if (Atomic.editorMode.isPlayerEnabled()) {
-            this.sendEvent("IPCPlayerPauseResumeRequest" /*AtomicApp.IPCPlayerPauseResumeRequestEventName*/);
+            this.sendEvent(EditorEvents.IPCPlayerPauseResumeRequestEventType);
         }
     }
 
     invokeStepPausedPlayer() {
         if (Atomic.editorMode.isPlayerEnabled()) {
-            this.sendEvent("IPCPlayerPauseStepRequest" /*AtomicApp.IPCPlayerPauseStepRequestEventName*/);
+            this.sendEvent(EditorEvents.IPCPlayerPauseStepRequestEventType);
         }
     }
 
@@ -152,7 +153,7 @@ class Shortcuts extends Atomic.ScriptObject {
 
     invokeGizmoEditModeChanged(mode: Editor.EditMode) {
 
-        this.sendEvent(Editor.GizmoEditModeChangedEventType, { mode: mode });
+        this.sendEvent<Editor.GizmoEditModeChangedEvent>(Editor.GizmoEditModeChangedEventType, { mode: mode });
 
     }
 
@@ -161,7 +162,7 @@ class Shortcuts extends Atomic.ScriptObject {
 
         if (editor && editor instanceof Editor.SceneEditor3D) {
             var mode = editor.getGizmo().axisMode ? Editor.AxisMode.AXIS_WORLD : Editor.AxisMode.AXIS_LOCAL;
-            this.sendEvent(Editor.GizmoAxisModeChangedEventType, { mode: mode });
+            this.sendEvent<Editor.GizmoAxisModeChangedEvent>(Editor.GizmoAxisModeChangedEventType, { mode: mode });
         }
     }
 

+ 2 - 2
Script/AtomicEditor/ui/frames/ProjectFrame.ts

@@ -259,7 +259,7 @@ class ProjectFrame extends ScriptWidget {
 
                     } else {
 
-                        this.sendEvent(Editor.EditorEditResourceEventType, { "path": asset.path });
+                        this.sendEvent<Editor.EditorEditResourceEvent>(Editor.EditorEditResourceEventType, { "path": asset.path });
                     }
 
                 }
@@ -469,7 +469,7 @@ class ProjectFrame extends ScriptWidget {
 
         if (this.currentFolder != folder) {
 
-            this.sendEvent(Editor.ContentFolderChangedEventType, { path: folder.path });
+            this.sendEvent<Editor.ContentFolderChangedEvent>(Editor.ContentFolderChangedEventType, { path: folder.path });
 
         }
 

+ 6 - 6
Script/AtomicEditor/ui/frames/ResourceFrame.ts

@@ -56,7 +56,7 @@ class ResourceFrame extends ScriptWidget {
         if (this.currentResourceEditor) {
             this.currentResourceEditor.save();
             // Grab the path to this file and pass it to the save resource
-            this.sendEvent(Editor.EditorSaveResourceNotificationEventType, {
+            this.sendEvent<Editor.EditorSaveResourceNotificationEvent>(Editor.EditorSaveResourceNotificationEventType, {
                 path: ev.path || this.currentResourceEditor.fullPath
             });
         }
@@ -75,7 +75,7 @@ class ResourceFrame extends ScriptWidget {
 
         for (var i in this.editors) {
             this.editors[i].save();
-            this.sendEvent(Editor.EditorSaveResourceNotificationEventType, {
+            this.sendEvent<Editor.EditorSaveResourceNotificationEvent>(Editor.EditorSaveResourceNotificationEventType, {
                 path: this.editors[i].fullPath
             });
         }
@@ -218,11 +218,11 @@ class ResourceFrame extends ScriptWidget {
 
                     if (w.editor.typeName == "SceneEditor3D") {
 
-                        this.sendEvent(Editor.EditorActiveSceneEditorChangeEventType, { sceneEditor: (<Editor.SceneEditor3D> w.editor) });
+                        this.sendEvent<Editor.EditorActiveSceneEditorChangeEvent>(Editor.EditorActiveSceneEditorChangeEventType, { sceneEditor: (<Editor.SceneEditor3D> w.editor) });
 
                     }
 
-                    this.sendEvent(Editor.EditorResourceEditorChangedEventType, { resourceEditor: w.editor });
+                    this.sendEvent<Editor.EditorResourceEditorChangedEvent>(Editor.EditorResourceEditorChangedEventType, { resourceEditor: w.editor });
 
                 }
 
@@ -244,7 +244,7 @@ class ResourceFrame extends ScriptWidget {
         // on exit close all open editors
         for (var path in this.editors) {
 
-            this.sendEvent(Editor.EditorResourceCloseEventType, { editor: this.editors[path], navigateToAvailableResource: false });
+            this.sendEvent<Editor.EditorResourceCloseEvent>(Editor.EditorResourceCloseEventType, { editor: this.editors[path], navigateToAvailableResource: false });
 
         }
 
@@ -254,7 +254,7 @@ class ResourceFrame extends ScriptWidget {
 
       for (var i in this.editors) {
           var editor = this.editors[i];
-           this.sendEvent(Editor.EditorResourceCloseEventType, { editor: editor, navigateToAvailableResource: false });
+           this.sendEvent<Editor.EditorResourceCloseEvent>(Editor.EditorResourceCloseEventType, { editor: editor, navigateToAvailableResource: false });
            editor.close();
       }
 

+ 2 - 2
Script/AtomicEditor/ui/frames/WelcomeFrame.ts

@@ -232,7 +232,7 @@ class WelcomeFrame extends ScriptWidget {
                 var path = utils.openProjectFileDialog();
                 if (path) {
 
-                    this.sendEvent(Editor.RequestProjectLoadEventType, { path: path });
+                    this.sendEvent<Editor.RequestProjectLoadEvent>(Editor.RequestProjectLoadEventType, { path: path });
 
                 }
 
@@ -252,7 +252,7 @@ class WelcomeFrame extends ScriptWidget {
                     return;
                 }
                 var path: string = this.recent[this.recentList.getSelectedItemID()];
-                this.sendEvent(Editor.RequestProjectLoadEventType, { path: path });
+                this.sendEvent<Editor.RequestProjectLoadEvent>(Editor.RequestProjectLoadEventType, { path: path });
             }
 
             if (id == "recentProjectsContextMenu") {

+ 4 - 4
Script/AtomicEditor/ui/frames/inspector/AttributeInfoEdit.ts

@@ -795,7 +795,7 @@ class ResourceRefAttributeEdit extends AttributeInfoEdit {
 
         if (parent) {
 
-            parent.sendEvent(Editor.AttributeEditResourceChangedEventType, { attrInfoEdit: this, resource: resource });
+            parent.sendEvent<Editor.AttributeEditResourceChangedEvent>(Editor.AttributeEditResourceChangedEventType, { attrInfoEdit: this, resource: resource });
 
         }
 
@@ -861,18 +861,18 @@ class ResourceRefAttributeEdit extends AttributeInfoEdit {
                         if (resource instanceof Atomic.JSComponentFile) {
 
                             var pathName = resource.name;
-                            this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": pathName });
+                            this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": pathName });
 
                         } else if (resource instanceof Atomic.Model) {
 
                             var asset = ToolCore.assetDatabase.getAssetByCachePath(resource.name);
-                            this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": asset.getRelativePath() });
+                            this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": asset.getRelativePath() });
 
                         } else if (resource instanceof Atomic.Animation) {
 
                              var animCacheReferenceName = resource.name.replace( "_" + (<Atomic.Animation>resource).animationName, "");
                              var asset = ToolCore.assetDatabase.getAssetByCachePath(animCacheReferenceName);
-                             this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": asset.getRelativePath() });
+                             this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": asset.getRelativePath() });
 
                         } else {
 

+ 5 - 5
Script/AtomicEditor/ui/frames/inspector/ColorChooser.ts

@@ -69,7 +69,7 @@ class ColorChooser extends Atomic.UIWindow {
 
         (<Atomic.UIButton>this.getWidget("ccancelbutton")).onClick = () => {
 
-            this.sendEvent(Atomic.UIWidgetEditCanceledEventType, { widget : this });
+            this.sendEvent<Atomic.UIWidgetEditCanceledEvent>(Atomic.UIWidgetEditCanceledEventType, { widget : this });
             this.unsubscribeFromEvent(Atomic.UIWidgetDeletedEventType);
             this.close();
 
@@ -79,14 +79,14 @@ class ColorChooser extends Atomic.UIWindow {
 
             Preferences.getInstance().addColorHistory(this.infohex.text);
 
-            this.sendEvent(Atomic.UIWidgetEditCompleteEventType, { widget : this });
+            this.sendEvent<Atomic.UIWidgetEditCompleteEvent>(Atomic.UIWidgetEditCompleteEventType, { widget : this });
             this.unsubscribeFromEvent(Atomic.UIWidgetDeletedEventType);
             this.close();
         };
 
         this.subscribeToEvent(this, Atomic.UIWidgetDeletedEvent((event: Atomic.UIWidgetDeletedEvent) => {
 
-            this.sendEvent(Atomic.UIWidgetEditCanceledEventType, { widget : this });
+            this.sendEvent<Atomic.UIWidgetEditCanceledEvent>(Atomic.UIWidgetEditCanceledEventType, { widget : this });
 
         }));
 
@@ -192,7 +192,7 @@ class ColorChooser extends Atomic.UIWindow {
 
         if (changed) {
 
-            this.sendEvent(Editor.ColorChooserChangedEventType, { widget : this });
+            this.sendEvent<Editor.ColorChooserChangedEvent>(Editor.ColorChooserChangedEventType, { widget : this });
 
         }
 
@@ -226,7 +226,7 @@ class ColorChooser extends Atomic.UIWindow {
             this.fixcolor();
             this.update_hslwidgets();
             this.update_rgbwidgets();
-            this.sendEvent(Editor.ColorChooserChangedEventType, { widget : this });
+            this.sendEvent<Editor.ColorChooserChangedEvent>(Editor.ColorChooserChangedEventType, { widget : this });
 
         }
 

+ 5 - 5
Script/AtomicEditor/ui/frames/inspector/ComponentAttributeUI.ts

@@ -152,7 +152,7 @@ class SubmeshAttributeEdit extends AttributeInfoEdit {
 
         this.matIndex = materialIndex;
 
-        EditorUI.getModelOps().showResourceSelection("Select " + resourceTypeName + " Resource", importerName, resourceTypeName, function (retObject: any) {
+        EditorUI.getModelOps().showResourceSelection("Select " + resourceTypeName + " Resource", importerName, resourceTypeName, (retObject: any) => {
 
             if (retObject == null) {
                 this.editType.onAttributeInfoEdited(this.attrInfo, null, this.matIndex);
@@ -172,11 +172,11 @@ class SubmeshAttributeEdit extends AttributeInfoEdit {
 
             }
 
-            this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": resource.name });
+            this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": resource.name });
             this.editType.onAttributeInfoEdited(this.attrInfo, resource, materialIndex);
             this.refresh();
 
-        }.bind(this));
+        });
 
     }
 
@@ -228,7 +228,7 @@ class SubmeshAttributeEdit extends AttributeInfoEdit {
                 if (importer) {
 
                     var resource = asset.getResource(resourceTypeName);
-                    this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": resource.name });
+                    this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": resource.name });
                     this.editType.onAttributeInfoEdited(this.attrInfo, resource, materialIndex);
                     this.refresh();
                 }
@@ -241,7 +241,7 @@ class SubmeshAttributeEdit extends AttributeInfoEdit {
             if (ev.type == Atomic.UI_EVENT_TYPE.UI_EVENT_TYPE_POINTER_DOWN && o.editField.text != "") {
 
                 var pathName = materialEdit.pathReference;
-                this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": pathName });
+                this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": pathName });
 
             } else if (o.editField.text == "") {
 

+ 1 - 1
Script/AtomicEditor/ui/frames/inspector/CreateComponentButton.ts

@@ -152,7 +152,7 @@ class CreateComponentButton extends Atomic.UIButton {
 
         if (ev.target && ev.target.id == "create component popup") {
 
-            this.sendEvent(Editor.SelectionCreateComponentEventType, { componentTypeName : ev.refid});
+            this.sendEvent<Editor.SelectionCreateComponentEvent>(Editor.SelectionCreateComponentEventType, { componentTypeName : ev.refid});
 
             return true;
 

+ 3 - 2
Script/AtomicEditor/ui/frames/inspector/MaterialInspector.ts

@@ -293,7 +293,7 @@ class MaterialInspector extends ScriptWidget {
             var texture = this.material.getTexture(textureUnit);
 
             if (textureWidget.getTexture() != null) {
-                this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": texture.getName() });
+                this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": texture.getName() });
             } else {
                 this.openTextureSelectionBox(textureUnit, textureWidget);
             }
@@ -408,7 +408,8 @@ class MaterialInspector extends ScriptWidget {
                         this.material.setTexture(ev.target["tunit"], texture);
                         (<Atomic.UITextureWidget>ev.target["textureWidget"]).texture = this.getTextureThumbnail(texture);
 
-                        this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": texture.getName(), "ButtonID": texture.getName() });
+                        // note, ButtonID has been commented out because it doesn't appear to be used anywhere
+                        this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": texture.getName() /* "ButtonID": texture.getName() */ });
                     }
                 }
             }));

+ 1 - 1
Script/AtomicEditor/ui/frames/inspector/ModelInspector.ts

@@ -95,7 +95,7 @@ class ModelInspector extends InspectorWidget {
         editField.subscribeToEvent(editField, Atomic.UIWidgetFocusChangedEvent((ev: Atomic.UIWidgetFocusChangedEvent) => {
 
             if (ev.widget == editField && editField.focus) {
-                this.sendEvent(Editor.InspectorProjectReferenceEventType, { "path": asset.getRelativePath() });
+                this.sendEvent<Editor.InspectorProjectReferenceEvent>(Editor.InspectorProjectReferenceEventType, { "path": asset.getRelativePath() });
             }
 
         }));

+ 2 - 2
Script/AtomicEditor/ui/frames/inspector/SelectionInspector.ts

@@ -699,7 +699,7 @@ class SelectionInspector extends ScriptWidget {
 
             this.component = c;
 
-            this.sceneEditor.scene.sendEvent(Editor.SceneEditComponentCopyEventType, { component: this.component });
+            this.sceneEditor.scene.sendEvent<Editor.SceneEditComponentCopyEvent>(Editor.SceneEditComponentCopyEventType, { component: this.component });
             this.refresh();
 
         }
@@ -721,7 +721,7 @@ class SelectionInspector extends ScriptWidget {
 
             this.component = c;
 
-            this.sceneEditor.scene.sendEvent(Editor.SceneEditComponentPasteEventType, { component: this.component });
+            this.sceneEditor.scene.sendEvent<Editor.SceneEditComponentPasteEvent>(Editor.SceneEditComponentPasteEventType, { component: this.component , end: false});
             this.refresh();
         }
 

+ 4 - 4
Script/AtomicEditor/ui/frames/inspector/SelectionPrefabWidget.ts

@@ -57,7 +57,7 @@ class SelectionPrefabWidget extends Atomic.UILayout {
 
         saveButton.onClick = () => {
 
-            this.node.scene.sendEvent(Editor.SceneEditPrefabSaveEventType, {node : this.node});
+            this.node.scene.sendEvent<Editor.SceneEditPrefabSaveEvent>(Editor.SceneEditPrefabSaveEventType, {node : this.node});
             return true;
         };
 
@@ -67,7 +67,7 @@ class SelectionPrefabWidget extends Atomic.UILayout {
 
         undoButton.onClick = () => {
 
-            this.node.scene.sendEvent(Editor.SceneEditPrefabRevertEventType, {node : this.node});
+            this.node.scene.sendEvent<Editor.SceneEditPrefabRevertEvent>(Editor.SceneEditPrefabRevertEventType, {node : this.node});
             return true;
 
         };
@@ -206,7 +206,7 @@ class ConfirmPrefabBreak extends Atomic.UIWindow {
 
                 this.hide();
 
-                this.node.scene.sendEvent(Editor.SceneEditPrefabBreakEventType, {node : this.node});
+                this.node.scene.sendEvent<Editor.SceneEditPrefabBreakEvent>(Editor.SceneEditPrefabBreakEventType, {node : this.node});
 
                 return true;
             }
@@ -215,7 +215,7 @@ class ConfirmPrefabBreak extends Atomic.UIWindow {
 
                 this.hide();
 
-                this.node.scene.sendEvent(Editor.SceneEditPrefabRevertEventType, {node : this.node});
+                this.node.scene.sendEvent<Editor.SceneEditPrefabRevertEvent>(Editor.SceneEditPrefabRevertEventType, {node : this.node});
 
                 return true;
             }

+ 5 - 5
Script/AtomicEditor/ui/frames/menus/HierarchyFrameMenu.ts

@@ -73,7 +73,7 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
             }
 
             if (child) {
-                child.scene.sendEvent(Editor.SceneEditNodeCreatedEventType, { node: child });
+                child.scene.sendEvent<Editor.SceneEditNodeCreatedEvent>(Editor.SceneEditNodeCreatedEventType, { node: child });
             }
 
             return true;
@@ -100,10 +100,10 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
                     return;
 
                 var scene = node.scene;
-                scene.sendEvent(Editor.SceneEditAddRemoveNodesEventType, { end: false });
-                scene.sendEvent(Editor.SceneEditNodeRemovedEventType, { node: node, parent: node.parent, scene: scene });
+                scene.sendEvent<Editor.SceneEditAddRemoveNodesEvent>(Editor.SceneEditAddRemoveNodesEventType, { end: false });
+                scene.sendEvent<Editor.SceneEditNodeRemovedEvent>(Editor.SceneEditNodeRemovedEventType, { node: node, parent: node.parent, scene: scene });
                 node.remove();
-                scene.sendEvent(Editor.SceneEditAddRemoveNodesEventType, { end: true });
+                scene.sendEvent<Editor.SceneEditAddRemoveNodesEvent>(Editor.SceneEditAddRemoveNodesEventType, { end: true });
 
                 editor.selection.delete();
 
@@ -115,7 +115,7 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
                     return;
 
                 var newnode = node.clone();
-                node.scene.sendEvent(Editor.SceneEditNodeCreatedEventType, { node: newnode });
+                node.scene.sendEvent<Editor.SceneEditNodeCreatedEvent>(Editor.SceneEditNodeCreatedEventType, { node: newnode });
 
                 return true;
             }

+ 1 - 1
Script/AtomicEditor/ui/frames/menus/MainFrameMenu.ts

@@ -170,7 +170,7 @@ class MainFrameMenu extends Atomic.ScriptObject {
 
                 }
 
-                var requestProjectLoad = () => this.sendEvent(Editor.RequestProjectLoadEventType, { path: path });
+                var requestProjectLoad = () => this.sendEvent<Editor.RequestProjectLoadEvent>(Editor.RequestProjectLoadEventType, { path: path });
 
                 if (ToolCore.toolSystem.project) {
 

+ 1 - 1
Script/AtomicEditor/ui/modal/CreateProject.ts

@@ -259,7 +259,7 @@ class CreateProject extends ModalWindow {
 
             this.hide();
 
-            this.sendEvent(Editor.EditorLoadProjectEventType, { path: folder });
+            this.sendEvent<Editor.EditorLoadProjectEvent>(Editor.EditorLoadProjectEventType, { path: folder });
             return true;
         } else {
             let message = [

+ 6 - 6
Script/AtomicEditor/ui/modal/UIResourceOps.ts

@@ -63,7 +63,7 @@ export class ResourceDelete extends ModalWindow {
                 var db = ToolCore.getAssetDatabase();
                 db.deleteAsset(this.asset);
 
-                this.sendEvent(Editor.EditorDeleteResourceNotificationEventType, eventData);
+                this.sendEvent<Editor.EditorDeleteResourceNotificationEvent>(Editor.EditorDeleteResourceNotificationEventType, eventData);
 
                 return true;
             }
@@ -186,7 +186,7 @@ export class CreateComponent extends ModalWindow {
 
                         this.hide();
 
-                        this.sendEvent(Editor.EditorEditResourceEventType, { path: outputFile });
+                        this.sendEvent<Editor.EditorEditResourceEvent>(Editor.EditorEditResourceEventType, { path: outputFile });
 
                     }
 
@@ -272,7 +272,7 @@ export class CreateScript extends ModalWindow {
 
                         this.hide();
 
-                        this.sendEvent(Editor.EditorEditResourceEventType, { path: outputFile });
+                        this.sendEvent<Editor.EditorEditResourceEvent>(Editor.EditorEditResourceEventType, { path: outputFile });
 
                     }
 
@@ -330,7 +330,7 @@ export class CreateScene extends ModalWindow {
 
                     this.hide();
 
-                    this.sendEvent(Editor.EditorEditResourceEventType, { path: outputFile });
+                    this.sendEvent<Editor.EditorEditResourceEvent>(Editor.EditorEditResourceEventType, { path: outputFile });
 
                 }
 
@@ -382,7 +382,7 @@ export class CreateMaterial extends ModalWindow {
 
                     this.hide();
 
-                    this.sendEvent(Editor.EditorEditResourceEventType, { path: outputFile });
+                    this.sendEvent<Editor.EditorEditResourceEvent>(Editor.EditorEditResourceEventType, { path: outputFile });
 
                 }
 
@@ -448,7 +448,7 @@ export class RenameAsset extends ModalWindow {
                         asset: this.asset
                     };
 
-                    this.sendEvent(Editor.EditorRenameResourceNotificationEventType, eventData);
+                    this.sendEvent<Editor.EditorRenameResourceNotificationEvent>(Editor.EditorRenameResourceNotificationEventType, eventData);
                 }
 
                 return true;

+ 1 - 1
Script/AtomicEditor/ui/playmode/PlayMode.ts

@@ -66,7 +66,7 @@ class PlayMode extends Atomic.ScriptObject {
         this.inErrorState = true;
 
         var errorMessage = ev.errorFileName + " - " + ev.errorLineNumber + " : " + ev.errorMessage;
-        this.sendEvent(Editor.EditorModalEventType, { title: "Player JavaScript Error", message: errorMessage });
+        this.sendEvent<Editor.EditorModalEvent>(Editor.EditorModalEventType, { type: Editor.EDITOR_MODALERROR, title: "Player JavaScript Error", message: errorMessage });
 
         Atomic.graphics.raiseWindow();
 

+ 1 - 1
Script/AtomicEditor/ui/resourceEditors/Scene3dResourceEditorBuilder.ts

@@ -30,7 +30,7 @@ export default class Scene3dResourceEditorBuilder implements Editor.Extensions.R
     getEditor(resourceFram: Atomic.UIWidget, resourcePath: string, tabContainer: Atomic.UITabContainer) : Editor.ResourceEditor {
 
         const editor = new Editor.SceneEditor3D(resourcePath, tabContainer);
-        editor.sendEvent(Editor.EditorActiveSceneEditorChangeEventType, { sceneEditor: editor });
+        editor.sendEvent<Editor.EditorActiveSceneEditorChangeEvent>(Editor.EditorActiveSceneEditorChangeEventType, { sceneEditor: editor });
 
         return editor;
     }

+ 1 - 0
Script/Packages/Atomic/Core.json

@@ -27,6 +27,7 @@
 
 		"Object" : [
 			"sendEvent(eventType:string, data?:Object);",
+			"sendEvent<T extends Atomic.EventMetaData>(eventType:Atomic.EventType, data?:T);",
 			"subscribeToEvent(eventType:string, callback:(data:any) => void);",
 			"subscribeToEvent(sender:AObject, eventType:string, callback:(data: any) => void);",
 			"subscribeToEvent(eventMetaData:Atomic.EventMetaData);",

+ 3 - 0
Script/TypeScript/AtomicWork.d.ts

@@ -26,6 +26,9 @@ declare module Atomic {
 
     // end subsystems
 
+    /** Base for all event types */
+    type EventType = string;
+
     // Base interface for events, contains eventType string and callback
     interface EventMetaData {
         /**@internal*/

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

@@ -63,6 +63,7 @@ declare module Editor.Extensions {
          * @param  {any} data
          */
         sendEvent(eventType: string, data: any);
+        sendEvent<T extends Atomic.EventMetaData>(eventType:string, data?:T);
 
         /**
          * Subscribe to an event and provide a callback.  This can be used by services to subscribe to custom events