|
|
@@ -15,6 +15,7 @@ var IconTemporary = "ComponentBitmap";
|
|
|
class HierarchyFrame extends Atomic.UIWidget {
|
|
|
|
|
|
scene: Atomic.Scene = null;
|
|
|
+ sceneEditor: Editor.SceneEditor3D;
|
|
|
hierList: Atomic.UIListView;
|
|
|
menu: HierarchyFrameMenu;
|
|
|
nodeIDToItemID = {};
|
|
|
@@ -35,21 +36,15 @@ class HierarchyFrame extends Atomic.UIWidget {
|
|
|
hierarchycontainer = this.getWidget("hierarchycontainer");
|
|
|
|
|
|
var hierList = this.hierList = new Atomic.UIListView();
|
|
|
-
|
|
|
hierList.rootList.id = "hierList_";
|
|
|
|
|
|
+ hierList.subscribeToEvent("WidgetEvent", (event: Atomic.UIWidgetEvent) => this.handleHierListWidgetEvent(event));
|
|
|
+
|
|
|
hierarchycontainer.addChild(hierList);
|
|
|
|
|
|
this.subscribeToEvent(this, "WidgetEvent", (data) => this.handleWidgetEvent(data));
|
|
|
|
|
|
- this.subscribeToEvent(EditorEvents.ActiveNodeChange, (data) => {
|
|
|
-
|
|
|
- if (data.node)
|
|
|
- this.hierList.selectItemByID(data.node.id.toString());
|
|
|
-
|
|
|
- });
|
|
|
-
|
|
|
- this.subscribeToEvent(EditorEvents.ActiveSceneChange, (data) => this.handleActiveSceneChanged(data));
|
|
|
+ this.subscribeToEvent(EditorEvents.ActiveSceneEditorChange, (data) => this.handleActiveSceneEditorChanged(data));
|
|
|
|
|
|
// handle dropping on hierarchy, moving node, dropping prefabs, etc
|
|
|
this.subscribeToEvent(this.hierList.rootList, "DragEnded", (data) => this.handleDragEnded(data));
|
|
|
@@ -157,30 +152,27 @@ class HierarchyFrame extends Atomic.UIWidget {
|
|
|
|
|
|
this.hierList.deleteItemByID(node.id.toString());
|
|
|
|
|
|
- var selectedId = Number(this.hierList.rootList.selectedItemID);
|
|
|
- var selectedNode = this.scene.getNode(selectedId);
|
|
|
- if (selectedNode == node) {
|
|
|
-
|
|
|
- this.sendEvent(EditorEvents.ActiveNodeChange, { node: ev.parent ? ev.parent : this.scene });
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- handleActiveSceneChanged(data) {
|
|
|
+ handleActiveSceneEditorChanged(event: EditorEvents.ActiveSceneEditorChangeEvent) {
|
|
|
|
|
|
if (this.scene)
|
|
|
this.unsubscribeFromEvents(this.scene);
|
|
|
|
|
|
- // clear selected node
|
|
|
- this.sendEvent(EditorEvents.ActiveNodeChange, { node: null });
|
|
|
+ this.sceneEditor = null;
|
|
|
+ this.scene = null;
|
|
|
+
|
|
|
+ if (!event.sceneEditor)
|
|
|
+ return;
|
|
|
|
|
|
- this.scene = <Atomic.Scene>data.scene;
|
|
|
+ this.sceneEditor = event.sceneEditor;
|
|
|
+ this.scene = event.sceneEditor.scene;
|
|
|
|
|
|
this.populate();
|
|
|
|
|
|
if (this.scene) {
|
|
|
|
|
|
+ this.subscribeToEvent(this.scene, "SceneNodeSelected", (event: Editor.SceneNodeSelectedEvent) => this.handleSceneNodeSelected(event));
|
|
|
this.subscribeToEvent(this.scene, "NodeAdded", (ev: Atomic.NodeAddedEvent) => this.handleNodeAdded(ev));
|
|
|
this.subscribeToEvent(this.scene, "NodeRemoved", (ev: Atomic.NodeRemovedEvent) => this.handleNodeRemoved(ev));
|
|
|
this.subscribeToEvent(this.scene, "NodeNameChanged", (ev: Atomic.NodeNameChangedEvent) => {
|
|
|
@@ -193,147 +185,6 @@ class HierarchyFrame extends Atomic.UIWidget {
|
|
|
|
|
|
}
|
|
|
|
|
|
- handleWidgetEvent(data: Atomic.UIWidgetEvent): boolean {
|
|
|
-
|
|
|
- if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
|
|
|
-
|
|
|
- if (data.key == Atomic.KEY_DOWN || data.key == Atomic.KEY_UP || data.key == Atomic.KEY_LEFT || data.key == Atomic.KEY_RIGHT) {
|
|
|
- var selectedId = Number(this.hierList.selectedItemID);
|
|
|
- var node = this.scene.getNode(selectedId);
|
|
|
-
|
|
|
- if (node) {
|
|
|
-
|
|
|
- this.sendEvent("EditorActiveNodeChange", { node: node });
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- if (data.key == Atomic.KEY_RIGHT) {
|
|
|
- var selectedId = Number(this.hierList.selectedItemID);
|
|
|
- var itemNodeId = this.nodeIDToItemID[selectedId];
|
|
|
-
|
|
|
- if (!this.hierList.getExpanded(itemNodeId) && this.hierList.getExpandable(itemNodeId)) {
|
|
|
- this.hierList.setExpanded(itemNodeId, true);
|
|
|
- this.hierList.rootList.invalidateList();
|
|
|
- } else {
|
|
|
- this.hierList.rootList.selectNextItem();
|
|
|
- }
|
|
|
-
|
|
|
- } else if (data.key == Atomic.KEY_LEFT) {
|
|
|
- var selectedId = Number(this.hierList.selectedItemID);
|
|
|
- var itemNodeId = this.nodeIDToItemID[selectedId];
|
|
|
-
|
|
|
- if (this.hierList.getExpanded(itemNodeId)) {
|
|
|
- this.hierList.setExpanded(itemNodeId, false);
|
|
|
- this.hierList.rootList.invalidateList();
|
|
|
- } else {
|
|
|
- var node = this.scene.getNode(selectedId);
|
|
|
- var parentNode = node.getParent();
|
|
|
- if (parentNode) {
|
|
|
- this.hierList.selectItemByID(parentNode.id.toString());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // node deletion
|
|
|
- if (data.key == Atomic.KEY_DELETE || data.key == Atomic.KEY_BACKSPACE) {
|
|
|
-
|
|
|
- var selectedId = Number(this.hierList.rootList.selectedItemID);
|
|
|
-
|
|
|
- var node = this.scene.getNode(selectedId);
|
|
|
- if (node) {
|
|
|
- this.scene.sendEvent("SceneEditNodeAddedRemoved", { scene:this.scene, node:node, added:false});
|
|
|
- node.remove();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- } else if (data.type == Atomic.UI_EVENT_TYPE_POINTER_DOWN) {
|
|
|
-
|
|
|
- if (data.target == this.hierList.rootList) {
|
|
|
-
|
|
|
- var node = this.scene.getNode(Number(data.refid));
|
|
|
-
|
|
|
- if (node) {
|
|
|
-
|
|
|
- // set the widget's drag object
|
|
|
- var dragObject = new Atomic.UIDragObject(node, node.name.length ? "Node: " + node.name : "Node: (Anonymous)");
|
|
|
- this.hierList.rootList.dragObject = dragObject;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- } else if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
|
|
|
-
|
|
|
- if (this.menu.handleNodeContextMenu(data.target, data.refid)) {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- var id = data.target.id;
|
|
|
-
|
|
|
- if (id == "create popup") {
|
|
|
-
|
|
|
- var selectedId = Number(this.hierList.rootList.selectedItemID);
|
|
|
- var node = this.scene.getNode(selectedId);
|
|
|
- if (this.menu.handlePopupMenu(data.target, data.refid, node))
|
|
|
- return true;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // create
|
|
|
- if (id == "menu create") {
|
|
|
- if (!ToolCore.toolSystem.project) return;
|
|
|
- var src = MenuItemSources.getMenuItemSource("hierarchy create items");
|
|
|
- var menu = new Atomic.UIMenuWindow(data.target, "create popup");
|
|
|
- menu.show(src);
|
|
|
- return true;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if (id == "hierList_") {
|
|
|
-
|
|
|
- var list = <Atomic.UISelectList>data.target;
|
|
|
-
|
|
|
- var selectedId = Number(list.selectedItemID);
|
|
|
- var node = this.scene.getNode(selectedId);
|
|
|
-
|
|
|
- if (node) {
|
|
|
-
|
|
|
- this.sendEvent("EditorActiveNodeChange", { node: node });
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- 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;
|
|
|
- }
|
|
|
-
|
|
|
filterNode(node: Atomic.Node): boolean {
|
|
|
|
|
|
if (!node) return false;
|
|
|
@@ -397,7 +248,7 @@ class HierarchyFrame extends Atomic.UIWidget {
|
|
|
|
|
|
}
|
|
|
|
|
|
- this.hierList.rootList.value = 0;
|
|
|
+ this.hierList.rootList.value = -1;
|
|
|
this.hierList.setExpanded(parentID, true);
|
|
|
|
|
|
}
|
|
|
@@ -448,6 +299,147 @@ class HierarchyFrame extends Atomic.UIWidget {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ handleSceneNodeSelected(ev: Editor.SceneNodeSelectedEvent) {
|
|
|
+
|
|
|
+ if (ev.selected) {
|
|
|
+ this.hierList.selectItemByID(ev.node.id.toString(), true, true);
|
|
|
+ } else {
|
|
|
+ this.hierList.selectItemByID(ev.node.id.toString(), false, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.hierList.scrollToSelectedItem();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ handleHierListWidgetEvent(event: Atomic.UIWidgetEvent): boolean {
|
|
|
+
|
|
|
+ if (event.type == Atomic.UI_EVENT_TYPE_CUSTOM) {
|
|
|
+
|
|
|
+ var hierList = this.hierList;
|
|
|
+ if (event.refid == "select_list_selection_changed") {
|
|
|
+
|
|
|
+ for (var i = 0; i < hierList.rootList.numItems; i++) {
|
|
|
+
|
|
|
+ var selected = hierList.rootList.getItemSelected(i);
|
|
|
+ var id = hierList.rootList.getItemID(i);
|
|
|
+ var node = this.scene.getNode(Number(id));
|
|
|
+ if (node) {
|
|
|
+
|
|
|
+ if (selected)
|
|
|
+ this.sceneEditor.selection.addNode(node);
|
|
|
+ else
|
|
|
+ this.sceneEditor.selection.removeNode(node);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ handleWidgetEvent(data: Atomic.UIWidgetEvent): boolean {
|
|
|
+
|
|
|
+ if (data.type == Atomic.UI_EVENT_TYPE_KEY_UP) {
|
|
|
+
|
|
|
+ if (data.key == Atomic.KEY_RIGHT) {
|
|
|
+ var selectedId = Number(this.hierList.selectedItemID);
|
|
|
+ var itemNodeId = this.nodeIDToItemID[selectedId];
|
|
|
+
|
|
|
+ if (!this.hierList.getExpanded(itemNodeId) && this.hierList.getExpandable(itemNodeId)) {
|
|
|
+ this.hierList.setExpanded(itemNodeId, true);
|
|
|
+ this.hierList.rootList.invalidateList();
|
|
|
+ } else {
|
|
|
+ this.hierList.rootList.selectNextItem();
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (data.key == Atomic.KEY_LEFT) {
|
|
|
+ var selectedId = Number(this.hierList.selectedItemID);
|
|
|
+ var itemNodeId = this.nodeIDToItemID[selectedId];
|
|
|
+
|
|
|
+ if (this.hierList.getExpanded(itemNodeId)) {
|
|
|
+ this.hierList.setExpanded(itemNodeId, false);
|
|
|
+ this.hierList.rootList.invalidateList();
|
|
|
+ } else {
|
|
|
+ var node = this.scene.getNode(selectedId);
|
|
|
+ var parentNode = node.getParent();
|
|
|
+ if (parentNode) {
|
|
|
+ this.hierList.selectItemByID(parentNode.id.toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // node deletion
|
|
|
+ if (data.key == Atomic.KEY_DELETE || data.key == Atomic.KEY_BACKSPACE) {
|
|
|
+ this.sceneEditor.selection.delete();
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (data.type == Atomic.UI_EVENT_TYPE_POINTER_DOWN) {
|
|
|
+
|
|
|
+ if (data.target == this.hierList.rootList) {
|
|
|
+
|
|
|
+ var node = this.scene.getNode(Number(data.refid));
|
|
|
+
|
|
|
+ if (node) {
|
|
|
+
|
|
|
+ // set the widget's drag object
|
|
|
+ var dragObject = new Atomic.UIDragObject(node, node.name.length ? "Node: " + node.name : "Node: (Anonymous)");
|
|
|
+ this.hierList.rootList.dragObject = dragObject;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if (data.type == Atomic.UI_EVENT_TYPE_CLICK) {
|
|
|
+
|
|
|
+ if (this.menu.handleNodeContextMenu(data.target, data.refid)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ var id = data.target.id;
|
|
|
+
|
|
|
+ if (id == "create popup") {
|
|
|
+
|
|
|
+ var selectedId = Number(this.hierList.rootList.selectedItemID);
|
|
|
+ var node = this.scene.getNode(selectedId);
|
|
|
+ if (this.menu.handlePopupMenu(data.target, data.refid, node))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // create
|
|
|
+ if (id == "menu create") {
|
|
|
+ if (!ToolCore.toolSystem.project) return;
|
|
|
+ var src = MenuItemSources.getMenuItemSource("hierarchy create items");
|
|
|
+ var menu = new Atomic.UIMenuWindow(data.target, "create popup");
|
|
|
+ menu.show(src);
|
|
|
+ return true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ } else if (data.type == Atomic.UI_EVENT_TYPE_RIGHT_POINTER_UP) {
|
|
|
+
|
|
|
+ var id = data.target.id;
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
export = HierarchyFrame;
|