Browse Source

Adding hierarchy frame

Josh Engebretson 10 years ago
parent
commit
41410c430a

+ 1 - 0
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/tsconfig.json

@@ -16,6 +16,7 @@
         "./editor/Editor.ts",
         "./editor/Editor.ts",
         "./main.ts",
         "./main.ts",
         "./ui/EditorStrings.ts",
         "./ui/EditorStrings.ts",
+        "./ui/HierarchyFrame.ts",
         "./ui/MainFrame.ts",
         "./ui/MainFrame.ts",
         "./ui/MainFrameMenu.ts",
         "./ui/MainFrameMenu.ts",
         "./ui/ProjectFrame.ts",
         "./ui/ProjectFrame.ts",

+ 124 - 0
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/HierarchyFrame.ts

@@ -0,0 +1,124 @@
+
+class HierarchyFrame extends Atomic.UIWidget {
+
+    hierList: Atomic.UIListView;
+
+    /*
+
+    super();
+
+    this.load("AtomicEditor/editor/ui/projectframe.tb.txt");
+
+    this.gravity = UI.GRAVITY_TOP_BOTTOM;
+
+    var projectviewcontainer = parent.getWidget("projectviewcontainer");
+
+    projectviewcontainer.addChild(this);
+
+    var foldercontainer = this.getWidget("foldercontainer");
+
+    var folderList = this.folderList = new Atomic.UIListView();
+
+    folderList.rootList.id = "folderList_";
+
+    foldercontainer.addChild(folderList);
+
+    // events
+    this.subscribeToEvent("ProjectLoaded", (data) => this.handleProjectLoaded(data));
+    this.subscribeToEvent("DragEnded", (data) => this.handleDragEnded(data));
+
+    */
+
+    constructor(parent: Atomic.UIWidget) {
+
+        super();
+
+        this.load("AtomicEditor/editor/ui/hierarchyframe.tb.txt");
+
+        this.gravity = Atomic.UI_GRAVITY_TOP_BOTTOM;
+
+        var hierarchycontainer = parent.getWidget("hierarchycontainer");
+        hierarchycontainer.addChild(this);
+
+        hierarchycontainer = this.getWidget("hierarchycontainer");
+
+        var hierList = this.hierList = new Atomic.UIListView();
+
+        hierList.rootList.id = "hierList_";
+
+        hierarchycontainer.addChild(hierList);
+
+        this.subscribeToEvent(this, "WidgetEvent", (data) => this.handleWidgetEvent(data));
+        this.subscribeToEvent("EditorActiveSceneChanged", (data) => this.handleActiveSceneChanged(data));
+
+    }
+
+    recursiveAddNode(parentID: number, node: Atomic.Node) {
+
+        var name = node.name;
+        if (!name.length)
+            name = "(Anonymous)"
+
+        var childItemID = this.hierList.addChildItem(parentID, name, "Folder.icon", node.id.toString());
+
+        for (var i = 0; i < node.getNumChildren(false); i++) {
+
+            this.recursiveAddNode(childItemID, node.getChildAtIndex(i));
+
+        }
+
+    }
+
+    refresh() {
+
+        this.hierList.deleteAllItems();
+
+        if (!this.scene)
+            return;
+
+        var parentID = this.hierList.addRootItem("Scene", "Folder.icon", this.scene.id.toString());
+
+        for (var i = 0; i < this.scene.getNumChildren(false); i++) {
+
+            this.recursiveAddNode(parentID, this.scene.getChildAtIndex(i));
+
+        }
+
+        this.hierList.rootList.value = 0;
+        this.hierList.setExpanded(parentID, true);
+
+    }
+
+    handleActiveSceneChanged(data) {
+
+        this.scene = <Atomic.Scene> data.scene;
+        this.refresh();
+
+    }
+
+    handleWidgetEvent(data: Atomic.UIWidgetEvent): boolean {
+
+        if (data.type == Atomic.UI_EVENT_TYPE_CLICK && data.target) {
+
+            var id = data.target.id;
+
+            if (id == "hierList_") {
+
+                var list = <Atomic.UISelectList> data.target;
+
+                var selectedId = Number(list.selectedItemID);
+                var node = this.scene.getNode(selectedId);
+                this.sendEvent("EditorActiveNodeChange", { node: node });
+                return false;
+
+            }
+        }
+
+        return false;
+    }
+
+    scene: Atomic.Scene = null;
+
+}
+
+export = HierarchyFrame;

+ 4 - 0
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/MainFrame.ts

@@ -2,6 +2,7 @@ import menubar = require("./MainFrameMenu");
 import ProjectFrame = require("./ProjectFrame");
 import ProjectFrame = require("./ProjectFrame");
 import ResourceFrame = require("./ResourceFrame");
 import ResourceFrame = require("./ResourceFrame");
 import InspectorFrame = require("./inspector/InspectorFrame");
 import InspectorFrame = require("./inspector/InspectorFrame");
+import HierarchyFrame = require("./HierarchyFrame");
 
 
 import MessageModal = require("./modal/MessageModal");
 import MessageModal = require("./modal/MessageModal");
 import UIEvents = require("./UIEvents");
 import UIEvents = require("./UIEvents");
@@ -15,6 +16,7 @@ class MainFrame extends ScriptWidget {
     projectframe: ProjectFrame;
     projectframe: ProjectFrame;
     resourceframe: ResourceFrame;
     resourceframe: ResourceFrame;
     inspectorframe: InspectorFrame;
     inspectorframe: InspectorFrame;
+    hierarchyFrame: HierarchyFrame;
 
 
     inspectorlayout: Atomic.UILayout;
     inspectorlayout: Atomic.UILayout;
 
 
@@ -32,6 +34,8 @@ class MainFrame extends ScriptWidget {
         this.inspectorlayout.addChild(this.inspectorframe);
         this.inspectorlayout.addChild(this.inspectorframe);
 
 
         this.projectframe = new ProjectFrame(this);
         this.projectframe = new ProjectFrame(this);
+        this.hierarchyFrame = new HierarchyFrame(this);
+
         this.resourceframe = new ResourceFrame(this);
         this.resourceframe = new ResourceFrame(this);
 
 
         this.showInspectorFrame(true);
         this.showInspectorFrame(true);

+ 4 - 1
Data/AtomicEditor/Resources/EditorData/AtomicEditor/typescript/ui/ResourceFrame.ts

@@ -49,7 +49,10 @@ class ResourceFrame extends ScriptWidget {
 
 
         } else if (ext == ".scene") {
         } else if (ext == ".scene") {
 
 
-            editor = new Editor.SceneEditor3D(path, this.tabcontainer);
+            var sceneEditor3D = new Editor.SceneEditor3D(path, this.tabcontainer);
+            editor = sceneEditor3D;
+
+            this.sendEvent("EditorActiveSceneChanged", { scene : sceneEditor3D.scene });
 
 
         }
         }
 
 

+ 21 - 0
Source/AtomicJS/Javascript/JSScene.cpp

@@ -111,6 +111,24 @@ static int Node_GetComponents(duk_context* ctx)
     return 1;
     return 1;
 }
 }
 
 
+static int Node_GetChildAtIndex(duk_context* ctx)
+{
+    duk_push_this(ctx);
+    Node* node = js_to_class_instance<Node>(ctx, -1, 0);
+
+    unsigned idx = (unsigned) duk_to_number(ctx, 0);
+
+    if (node->GetNumChildren() <= idx)
+    {
+        duk_push_null(ctx);
+        return 1;
+    }
+
+    Node* child = node->GetChild(idx);
+    js_push_class_object_instance(ctx, child, "Node");
+
+    return 1;
+}
 
 
 static int Scene_LoadXML(duk_context* ctx)
 static int Scene_LoadXML(duk_context* ctx)
 {
 {
@@ -159,6 +177,9 @@ void jsapi_init_scene(JSVM* vm)
     duk_put_prop_string(ctx, -2, "getComponents");
     duk_put_prop_string(ctx, -2, "getComponents");
     duk_push_c_function(ctx, Node_CreateJSComponent, 1);
     duk_push_c_function(ctx, Node_CreateJSComponent, 1);
     duk_put_prop_string(ctx, -2, "createJSComponent");
     duk_put_prop_string(ctx, -2, "createJSComponent");
+    duk_push_c_function(ctx, Node_GetChildAtIndex, 1);
+    duk_put_prop_string(ctx, -2, "getChildAtIndex");
+
     duk_pop(ctx);
     duk_pop(ctx);
 
 
     js_class_get_prototype(ctx, "Atomic", "Scene");
     js_class_get_prototype(ctx, "Atomic", "Scene");

+ 3 - 0
Source/AtomicJS/Javascript/JSSceneSerializable.cpp

@@ -67,6 +67,9 @@ static int Serializable_GetAttributes(duk_context* ctx)
     duk_dup(ctx, -1);
     duk_dup(ctx, -1);
     duk_put_prop_index(ctx, -4, type);
     duk_put_prop_index(ctx, -4, type);
 
 
+    if (!attrs)
+        return 1;
+
     for (unsigned i = 0; i < attrs->Size(); i++)
     for (unsigned i = 0; i < attrs->Size(); i++)
     {
     {
         const AttributeInfo* attr = &attrs->At(i);
         const AttributeInfo* attr = &attrs->At(i);

+ 2 - 1
Source/AtomicJS/Packages/Atomic/Scene.json

@@ -23,7 +23,8 @@
 		"Node" : [
 		"Node" : [
 			"getChildrenWithName(name:string, recursive?:boolean):Node[];",
 			"getChildrenWithName(name:string, recursive?:boolean):Node[];",
 			"getChildrenWithComponent(componentType:string, recursive?:boolean):Node[];",
 			"getChildrenWithComponent(componentType:string, recursive?:boolean):Node[];",
-			"getComponents(componentType?:string, recursive?:boolean):Component[];"
+			"getComponents(componentType?:string, recursive?:boolean):Component[];",
+			"getChildAtIndex(index:number):Node;"
 		]
 		]
 	}
 	}