protected override TreeViewItem BuildRoot() { managersByGroup.Clear(); managersByID.Clear(); floatingManagers.Clear(); recordersByManager.Clear(); systemVersion = -1; if (window.WorldSelection != null) { systemVersion = window.WorldSelection.Version; Dictionary <Type, ScriptBehaviourUpdateOrder.ScriptBehaviourGroup> allGroups; Dictionary <Type, ScriptBehaviourUpdateOrder.DependantBehavior> dependencies; ScriptBehaviourUpdateOrder.CollectGroups(window.WorldSelection.BehaviourManagers, out allGroups, out dependencies); foreach (var manager in window.WorldSelection.BehaviourManagers) { var hasGroup = false; foreach (var attributeData in manager.GetType().GetCustomAttributesData()) { if (attributeData.AttributeType == typeof(UpdateInGroupAttribute)) { var groupType = (Type)attributeData.ConstructorArguments[0].Value; if (!managersByGroup.ContainsKey(groupType)) { managersByGroup[groupType] = new List <ScriptBehaviourManager> { manager } } ; else { managersByGroup[groupType].Add(manager); } hasGroup = true; break; } } if (!hasGroup) { floatingManagers.Add(manager); } } foreach (var managerSet in managersByGroup.Values) { managerSet.Sort(CompareSystem); } } floatingManagers.Sort(CompareSystem); var currentID = 0; var root = new TreeViewItem { id = currentID++, depth = -1, displayName = "Root" }; if (managersByGroup.Count == 0 && floatingManagers.Count == 0) { root.AddChild(new TreeViewItem { id = currentID++, displayName = "No ComponentSystems Loaded" }); } else { foreach (var manager in floatingManagers) { root.AddChild(CreateManagerItem(currentID++, manager)); } foreach (var group in (from g in managersByGroup.Keys orderby g.Name select g)) { var groupItem = new TreeViewItem { id = currentID++, displayName = group.Name }; root.AddChild(groupItem); foreach (var manager in managersByGroup[group]) { groupItem.AddChild(CreateManagerItem(currentID++, manager)); } } SetupDepthsFromParentsAndChildren(root); } return(root); }