// The first layer of the tree must have been manually filled out // for this to work. private void FillOutTree(List <List <TreeNode <MapTreeItem> > > treeLayers) { foreach (List <TreeNode <MapTreeItem> > layer in treeLayers) { foreach (TreeNode <MapTreeItem> parentNode in layer) { for (int i = 0; i < parentNode.GetNumChildren(); i++) { MapTreeItem childItem = parentNode.GetChild(i).mItem; // Create the map node's branch list childItem.mTreeBranches = new List <GameObject>(); // Put object into its parent's twig. childItem.mTreeTwig = parentNode.mItem.mChildLayerTreeNode.mObject; childItem.mTreeUIItem.transform.SetParent(childItem.mTreeTwig.transform, false); // Start moving back up the layer tree, assigning the helper objects of the map node. LayerTreeNode layerTreeNodeParent = parentNode.mItem.mChildLayerTreeNode.mParent; while (layerTreeNodeParent.mParent == null) { childItem.mTreeBranches.Add(layerTreeNodeParent.mObject); layerTreeNodeParent = layerTreeNodeParent.mParent; } // The last object in the layer tree (which has no parent) // is the layer object itself. childItem.mTreeLayer = layerTreeNodeParent.mObject; } } } }
private TreeNode <MapTreeItem> BuildTree(TreeNode <MapItem> mapItemTreeNode, TreeNode <MapTreeItem> currentParent, Dictionary <TreeNode <MapItem>, TreeNode <MapTreeItem> > nodesAlreadyUsed) { TreeNode <MapTreeItem> rootNode = null; if (nodesAlreadyUsed == null || (nodesAlreadyUsed != null && !nodesAlreadyUsed.ContainsKey(mapItemTreeNode))) { MapTreeItem newMapTreeItem = new MapTreeItem(); newMapTreeItem.mMapItem = mapItemTreeNode.mItem; TreeNode <MapTreeItem> newMapTreeItemNode = null; if (currentParent != null) { newMapTreeItemNode = currentParent.AddChild(newMapTreeItem); } else { newMapTreeItemNode = new TreeNode <MapTreeItem>(newMapTreeItem); } rootNode = newMapTreeItemNode; newMapTreeItem.mTreeUIItem = CreateMapUIItem(this, MapTreeItemPrefab, newMapTreeItemNode, mapItemTreeNode.mItem.mName); if (nodesAlreadyUsed == null) { nodesAlreadyUsed = new Dictionary <TreeNode <MapItem>, TreeNode <MapTreeItem> >(); } nodesAlreadyUsed.Add(mapItemTreeNode, newMapTreeItemNode); for (int i = 0; i < mapItemTreeNode.GetNumChildren(); i++) { BuildTree(mapItemTreeNode.GetChild(i), newMapTreeItemNode, nodesAlreadyUsed); } } else if (nodesAlreadyUsed != null && nodesAlreadyUsed.ContainsKey(mapItemTreeNode)) { Debug.Assert(currentParent != null); currentParent.LinkChild(nodesAlreadyUsed[mapItemTreeNode]); } return(rootNode); }