public System.Collections.IEnumerable GetChildren(Aga.Controls.Tree.TreePath treePath) { _NodeModel node = null; if (treePath.IsEmpty()) { if (m_rootNode != null) { node = m_rootNode; } } else { node = (_NodeModel)treePath.LastNode; } if (node != null) { if (node.IsStructure) { // scan members var type = (BlendStructureType)node.m_value.Type; foreach (var decl in type.MemberDecls) { var value = node.m_value.GetMember(decl.Name); var childNode = new _NodeModel(decl.Name, value); yield return(childNode); } } else if (node.IsPointer) { // dereference var address = node.m_value.GetRawValue <BlendAddress>(); var pointerType = (BlendPointerType)node.m_value.Type; var baseType = pointerType.BaseType; if (address.CanDereference(baseType)) { List <BlendValueCapsule> result = null; try { if (baseType.Equals(BlendPrimitiveType.Void())) { // void pointer result = address.DereferenceAll(); } else { result = address.DereferenceAll(baseType); } } catch (BlenderException e) { Dialog.ShowError(e); yield break; } if (result.Count == 1) { var childNode = new _NodeModel("*" + node.Name, result[0]); yield return(childNode); } else { // If the number of dereferenced objects is over 1, we show it as an array. for (int i = 0; i < result.Count; ++i) { var value = result[i]; var childNode = new _NodeModel(node.Name + "[" + i + "]", value); yield return(childNode); } } } } else if (node.IsArray) { var arrayType = (BlendArrayType)node.m_value.Type; int arrayCount = arrayType.ArrayDimension; switch (arrayCount) { case 1: for (int i = 0; i < arrayType.GetLength(0); ++i) { var value = node.m_value.GetAt(i); var childNode = new _NodeModel(node.Name + "[" + i + "]", value); yield return(childNode); } break; case 2: for (int i = 0; i < arrayType.GetLength(0); ++i) { for (int j = 0; j < arrayType.GetLength(1); ++j) { var value = node.m_value.GetAt(i, j); var childNode = new _NodeModel(node.Name + "[" + i + "]" + "[" + j + "]", value); yield return(childNode); } } break; } } } yield break; }
public bool IsLeaf(Aga.Controls.Tree.TreePath treePath) { var node = (_NodeModel)treePath.LastNode; return(!(node.IsStructure || node.IsPointer || node.IsArray)); }