Browse Source

Context menu for nodes in hierarchy frame

Josh Engebretson 10 years ago
parent
commit
0ab32fb394

+ 26 - 7
Script/AtomicEditor/ui/frames/HierarchyFrame.ts

@@ -188,6 +188,7 @@ class HierarchyFrame extends Atomic.UIWidget {
 
         if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
 
+            // node deletion
             if (data.key == Atomic.KEY_DELETE || data.key == Atomic.KEY_BACKSPACE) {
 
                 var selectedId = Number(this.hierList.rootList.selectedItemID);
@@ -202,9 +203,7 @@ class HierarchyFrame extends Atomic.UIWidget {
 
             }
 
-        }
-
-        if (data.type == Atomic.UI_EVENT_TYPE_POINTER_DOWN) {
+        } else if (data.type == Atomic.UI_EVENT_TYPE_POINTER_DOWN) {
 
             if (data.target == this.hierList.rootList) {
 
@@ -254,9 +253,11 @@ class HierarchyFrame extends Atomic.UIWidget {
 
             }
 
-        }
+        } else if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
 
-        if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
+            if (this.menu.handleNodeContextMenu(data.target, data.refid)) {
+                return true;
+            }
 
             var id = data.target.id;
 
@@ -264,7 +265,6 @@ class HierarchyFrame extends Atomic.UIWidget {
 
                 var selectedId = Number(this.hierList.rootList.selectedItemID);
                 var node = this.scene.getNode(selectedId);
-
                 if (this.menu.handlePopupMenu(data.target, data.refid, node))
                     return true;
 
@@ -290,7 +290,6 @@ class HierarchyFrame extends Atomic.UIWidget {
 
                 if (node) {
 
-
                     this.sendEvent("EditorActiveNodeChange", { node: node });
 
                 }
@@ -298,6 +297,26 @@ class HierarchyFrame extends Atomic.UIWidget {
                 return false;
 
             }
+        } else if (data.type == Atomic.UI_EVENT_TYPE_RIGHT_POINTER_UP) {
+
+            var id = data.target.id;
+            var db = ToolCore.getAssetDatabase();
+            var node: Atomic.Node;
+
+            if (id == "hierList_")
+                node = this.scene.getNode(Number(this.hierList.hoverItemID));
+            else
+                node = this.scene.getNode(Number(id));
+
+            if (node) {
+
+                this.menu.createNodeContextMenu(this, node, data.x, data.y);
+
+            }
+
+
+
+
         }
 
         return false;

+ 14 - 0
Script/AtomicEditor/ui/frames/inspector/InspectorFrame.ts

@@ -26,6 +26,7 @@ class InspectorFrame extends ScriptWidget {
         this.subscribeToEvent(EditorEvents.EditResource, (data) => this.handleEditResource(data));
         this.subscribeToEvent(EditorEvents.ActiveNodeChange, (data) => this.handleActiveNodeChange(data));
         this.subscribeToEvent("ProjectUnloaded", (data) => this.handleProjectUnloaded(data));
+        this.subscribeToEvent("NodeRemoved", (ev: Atomic.NodeRemovedEvent) => this.handleNodeRemoved(ev));
 
 
     }
@@ -111,6 +112,19 @@ class InspectorFrame extends ScriptWidget {
 
     }
 
+    handleNodeRemoved(ev: Atomic.NodeRemovedEvent) {
+
+        if (this.inspectingNode != ev.node)
+            return;
+
+        this.inspectNode = null;
+
+        var container = this.getWidget("inspectorcontainer");
+        container.deleteAllChildren();
+
+    }
+
+
     inspectNode(node: Atomic.Node) {
 
         if (!node) return;

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

@@ -12,7 +12,7 @@ class NodeInspector extends ScriptWidget {
 
         this.subscribeToEvent(this, "WidgetEvent", (ev) => this.handleWidgetEvent(ev));
         this.subscribeToEvent("GizmoMoved", (ev) => this.handleGizmoModed(ev));
-        this.subscribeToEvent("Update", (ev) => this.handleUpdate(ev));
+        this.subscribeToEvent("Update", (ev) => this.handleUpdate(ev));        
 
     }
 

+ 55 - 3
Script/AtomicEditor/ui/frames/menus/HierarchyFrameMenu.ts

@@ -11,6 +11,7 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
         super();
 
         MenuItemSources.createMenuItemSource("hierarchy create items", createItems);
+        MenuItemSources.createMenuItemSource("node context general", nodeGeneralContextItems);
 
         this.subscribeToEvent(EditorEvents.ContentFolderChanged, (ev: EditorEvents.ContentFolderChangedEvent) => {
             this.contentFolder = ev.path;
@@ -20,11 +21,11 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
 
     handlePopupMenu(target: Atomic.UIWidget, refid: string, node: Atomic.Node): boolean {
 
-        if (!target || !refid) return;
+        if (!target || !refid) return false;
 
         if (target.id == "create popup") {
 
-            var child:Atomic.Node;
+            var child: Atomic.Node;
 
             if (refid == "create_node") {
 
@@ -49,7 +50,7 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
 
             if (child) {
 
-              this.sendEvent(EditorEvents.ActiveNodeChange, { node: child });
+                this.sendEvent(EditorEvents.ActiveNodeChange, { node: child });
 
             }
 
@@ -61,6 +62,51 @@ class HierarchyFrameMenus extends Atomic.ScriptObject {
 
     }
 
+    handleNodeContextMenu(target: Atomic.UIWidget, refid: string): boolean {
+
+        if (target.id == "node context menu") {
+
+            var node = <Atomic.Node> target['node'];
+
+            if (!node) {
+                return false;
+            }
+
+            if (refid == "delete_node") {
+
+              node.removeAllComponents();
+              node.remove();
+
+            } else if (refid == "duplicate_node") {
+
+                var newnode = node.clone();
+                this.sendEvent(EditorEvents.ActiveNodeChange, { node: newnode });
+
+            }
+
+            return true;
+        }
+
+        return false;
+
+    }
+
+
+    createNodeContextMenu(parent: Atomic.UIWidget, node: Atomic.Node, x: number, y: number) {
+
+
+        var menu = new Atomic.UIMenuWindow(parent, "node context menu");
+
+        menu['node'] = node;
+
+        var srcName: string = "node context general";
+
+        var src = MenuItemSources.getMenuItemSource(srcName);
+        menu.show(src, x, y);
+
+
+    }
+
     contentFolder: string;
 
 }
@@ -77,3 +123,9 @@ var createItems = {
         Light: ["create_light", undefined, "JavascriptBitmap"]
     }
 };
+
+var nodeGeneralContextItems = {
+    "Duplicate": ["duplicate_node", undefined, ""],
+    "-1": null,
+    "Delete": ["delete_node", undefined, ""]
+};

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

@@ -20,7 +20,7 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
 
     }
 
-    handleAssetContextMenu(target: Atomic.UIWidget, refid: string) {
+    handleAssetContextMenu(target: Atomic.UIWidget, refid: string):boolean {
 
         if (target.id == "asset context menu" || target.id == "create popup") {
 
@@ -70,6 +70,8 @@ class ProjectFrameMenus extends Atomic.ScriptObject {
             }
         }
 
+        return false;
+
     }
 
     createFolderContextMenu(parent: Atomic.UIWidget, id: string, folder: ToolCore.Asset, x: number, y: number) {

+ 1 - 1
Script/Packages/Atomic/Audio.json

@@ -1,7 +1,7 @@
 {
 	"name" : "Audio",
 	"sources" : ["Source/Atomic/Audio"],
-	"classes" : ["Sound", "SoundSource"],
+	"classes" : ["Sound", "SoundSource", "SoundSource3D", "SoundListener"],
 	"overloads" : {
 		"SoundSource" : {
 			"Play" : ["Sound"]