Browse Source

Simplified context menu API to pass node and asset directly. Fixed all plugins processing all menu events even if already processed. Fixed HierarchyFrameMenu passing already processed events to plugins.

Matt Benic 9 years ago
parent
commit
ae708bd7be

+ 18 - 18
Script/AtomicEditor/hostExtensions/HostExtensionServices.ts

@@ -296,69 +296,69 @@ export class UIServicesProvider extends ServicesProvider<Editor.HostExtensions.U
      */
      */
     menuItemClicked(refid: string): boolean {
     menuItemClicked(refid: string): boolean {
         // run through and find any services that can handle this.
         // run through and find any services that can handle this.
-        let holdResult = false;
-        this.registeredServices.forEach((service) => {
+        return this.registeredServices.some((service) => {
             try {
             try {
                 // Verify that the service contains the appropriate methods and that it can handle it
                 // Verify that the service contains the appropriate methods and that it can handle it
                 if (service.menuItemClicked) {
                 if (service.menuItemClicked) {
                     if (service.menuItemClicked(refid)) {
                     if (service.menuItemClicked(refid)) {
-                        holdResult = true;
+                        return true;
                     }
                     }
                 }
                 }
             } catch (e) {
             } catch (e) {
                EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}:\n${e}\n\n ${e.stack}`);
                EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}:\n${e}\n\n ${e.stack}`);
             }
             }
         });
         });
-        return holdResult;
     }
     }
 
 
     /**
     /**
      * Called when a context menu item in the hierarchy pane has been clicked
      * Called when a context menu item in the hierarchy pane has been clicked
-     * @param  {Atomic.UIWidget} target
+     * @param  {Atomic.Node} node
      * @param  {string} refId
      * @param  {string} refId
      * @type {boolean} return true if handled
      * @type {boolean} return true if handled
      */
      */
-    hierarchyContextItemClicked(target: Atomic.UIWidget, refid: string): boolean {
+    hierarchyContextItemClicked(node: Atomic.Node, refid: string): boolean {
+        if (!node) 
+            return false;
+
         // run through and find any services that can handle this.
         // run through and find any services that can handle this.
-        let holdResult = false;
-        this.registeredServices.forEach((service) => {
+        return this.registeredServices.some((service) => {
             try {
             try {
                 // Verify that the service contains the appropriate methods and that it can handle it
                 // Verify that the service contains the appropriate methods and that it can handle it
                 if (service.hierarchyContextItemClicked) {
                 if (service.hierarchyContextItemClicked) {
-                    if (service.hierarchyContextItemClicked(target, refid)) {
-                        holdResult = true;
+                    if (service.hierarchyContextItemClicked(node, refid)) {
+                        return true;
                     }
                     }
                 }
                 }
             } catch (e) {
             } catch (e) {
                EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}:\n${e}\n\n ${e.stack}`);
                EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}:\n${e}\n\n ${e.stack}`);
             }
             }
         });
         });
-        return holdResult;
     }
     }
 
 
 
 
     /**
     /**
      * Called when a context menu item in the hierarchy pane has been clicked
      * Called when a context menu item in the hierarchy pane has been clicked
-     * @param  {Atomic.UIWidget} target
+     * @param  {ToolCore.Asset} asset
      * @param  {string} refId
      * @param  {string} refId
      * @type {boolean} return true if handled
      * @type {boolean} return true if handled
      */
      */
-    projectContextItemClicked(target: Atomic.UIWidget, refid: string): boolean {
+    projectContextItemClicked(asset: ToolCore.Asset, refid: string): boolean {
+        if (!asset)
+            return false;
+
         // run through and find any services that can handle this.
         // run through and find any services that can handle this.
-        let holdResult = false;
-        this.registeredServices.forEach((service) => {
+        return this.registeredServices.some((service) => {
             try {
             try {
                 // Verify that the service contains the appropriate methods and that it can handle it
                 // Verify that the service contains the appropriate methods and that it can handle it
                 if (service.projectContextItemClicked) {
                 if (service.projectContextItemClicked) {
-                    if (service.projectContextItemClicked(target, refid)) {
-                        holdResult = true;
+                    if (service.projectContextItemClicked(asset, refid)) {
+                        return true;
                     }
                     }
                 }
                 }
             } catch (e) {
             } catch (e) {
                EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}:\n${e}\n\n ${e.stack}`);
                EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}:\n${e}\n\n ${e.stack}`);
             }
             }
         });
         });
-        return holdResult;
     }
     }
 
 
     /**
     /**

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

@@ -106,6 +106,8 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
                 node.remove();
                 node.remove();
                 scene.sendEvent("SceneEditAddRemoveNodes", { end: true });
                 scene.sendEvent("SceneEditAddRemoveNodes", { end: true });
 
 
+                return true;
+
             } else if (refid == "duplicate_node") {
             } else if (refid == "duplicate_node") {
 
 
                 if (node instanceof Atomic.Scene)
                 if (node instanceof Atomic.Scene)
@@ -113,10 +115,12 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
 
 
                 var newnode = node.clone();
                 var newnode = node.clone();
                 node.scene.sendEvent("SceneEditNodeCreated", { node: newnode });
                 node.scene.sendEvent("SceneEditNodeCreated", { node: newnode });
+
+                return true;
             }
             }
 
 
             // Let plugins handle context
             // Let plugins handle context
-            return ServiceLocator.uiServices.hierarchyContextItemClicked(target, refid);
+            return ServiceLocator.uiServices.hierarchyContextItemClicked(node, refid);
         }
         }
 
 
         return false;
         return false;

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

@@ -112,7 +112,7 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
             }
             }
 
 
             // Let plugins handle context
             // Let plugins handle context
-            return ServiceLocator.uiServices.projectContextItemClicked(target, refid);
+            return ServiceLocator.uiServices.projectContextItemClicked(asset, refid);
         }
         }
 
 
         return false;
         return false;

+ 3 - 2
Script/TypeScript/EditorWork.d.ts

@@ -7,6 +7,7 @@
 
 
 /// <reference path="Atomic.d.ts" />
 /// <reference path="Atomic.d.ts" />
 /// <reference path="Editor.d.ts" />
 /// <reference path="Editor.d.ts" />
+/// <reference path="ToolCore.d.ts" />
 
 
 declare module Editor.EditorEvents {
 declare module Editor.EditorEvents {
 
 
@@ -255,8 +256,8 @@ declare module Editor.HostExtensions {
 
 
     export interface UIServicesEventListener extends Editor.Extensions.ServiceEventListener {
     export interface UIServicesEventListener extends Editor.Extensions.ServiceEventListener {
         menuItemClicked?(refid: string): boolean;
         menuItemClicked?(refid: string): boolean;
-        projectContextItemClicked?(target: Atomic.UIWidget, refid: string): boolean;
-        hierarchyContextItemClicked?(target: Atomic.UIWidget, refid: string): boolean;
+        projectContextItemClicked?(asset: ToolCore.Asset, refid: string): boolean;
+        hierarchyContextItemClicked?(node: Atomic.Node, refid: string): boolean;
     }
     }
     export interface UIServicesProvider extends Editor.Extensions.ServicesProvider<UIServicesEventListener> {
     export interface UIServicesProvider extends Editor.Extensions.ServicesProvider<UIServicesEventListener> {
         createPluginMenuItemSource(id: string, items: any): Atomic.UIMenuItemSource;
         createPluginMenuItemSource(id: string, items: any): Atomic.UIMenuItemSource;