private void BonesTreeViews_ModelDropped(object sender, BrightIdeasSoftware.ModelDropEventArgs e) { void UnlinkBone(BoneLinkNode node) { node.ParentID = string.Empty; var parentBone = BoneNodes.FirstOrDefault(x => x.ChildBones.Contains(node)); if (parentBone != null) { parentBone.ChildBones.Remove(node); HierarchyTreeView.RefreshObject(parentBone); } } var draggedBones = e.SourceModels.OfType <BoneLinkNode>().ToList(); if (sender == UnassignedTreeView) { var allBones = draggedBones.SelectMany(x => x.GetHierarchy(true)).Distinct().ToList(); foreach (BoneLinkNode node in allBones) { //node.ParentID = string.Empty; node.UnlinkChildrens(); } foreach (BoneLinkNode node in draggedBones) { UnlinkBone(node); } UnassignedTreeView.AddObjects(allBones); } else if (sender == HierarchyTreeView) { if (RootBone == null) { RootBone = e.SourceModels[0] as BoneLinkNode; HierarchyTreeView.AddObject(RootBone); } else if (e.TargetModel is BoneLinkNode targetBone) { foreach (BoneLinkNode node in draggedBones) { if (string.IsNullOrEmpty(node.ParentID)) { UnassignedTreeView.RemoveObject(node); } UnlinkBone(node); targetBone.ChildBones.Add(node); node.ParentID = targetBone.ID; } HierarchyTreeView.RefreshObject(targetBone); } } }
private void LoadBoneNodes() { BoneNodes = new List <BoneLinkNode>(); foreach (var bone in Bones) { var parentBone = Bones.FirstOrDefault(x => x.BoneID == bone.TargetBoneID); BoneNodes.Add(new BoneLinkNode() { ID = bone.ID, Name = bone.Name, ParentID = parentBone?.ID, BoneID = bone.BoneID }); } var remainingBones = BoneNodes.ToList(); void LinkChildBones(BoneLinkNode parent) { var childs = remainingBones.Where(x => x.ParentID == parent.ID).ToList(); if (!childs.Any()) { return; } parent.ChildBones.AddRange(childs); remainingBones.RemoveAll(x => x.ParentID == parent.ID); foreach (var child in childs) { LinkChildBones(child); } } RootBone = BoneNodes.FirstOrDefault(b => b.BoneID == 0); if (RootBone != null) { remainingBones.Remove(RootBone); LinkChildBones(RootBone); HierarchyTreeView.AddObject(RootBone); } if (remainingBones.Any()) { UnassignedTreeView.SetObjects(remainingBones); } HierarchyTreeView.ExpandAll(); }