No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BoneTreeViewController.cs 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEditor.IMGUI.Controls;
  6. namespace UnityEditor.U2D.Animation
  7. {
  8. internal class BoneTreeWidgetController
  9. {
  10. protected IBoneTreeViewModel m_Model;
  11. protected SkinningEvents m_SkinningEvents;
  12. public BoneTreeWidgetController(IBoneTreeViewModel model, SkinningEvents eventSystem)
  13. {
  14. m_Model = model;
  15. m_SkinningEvents = eventSystem;
  16. }
  17. public void Activate()
  18. {
  19. SetupSkeleton();
  20. m_SkinningEvents.selectedSpriteChanged.AddListener(OnSelectionChange);
  21. m_SkinningEvents.skinningModeChanged.AddListener(OnSkinningModuleModeChanged);
  22. m_SkinningEvents.boneSelectionChanged.AddListener(OnBoneSelectionChanged);
  23. m_SkinningEvents.boneNameChanged.AddListener(OnBoneNameChanged);
  24. m_SkinningEvents.skeletonTopologyChanged.AddListener(SkeletonTopologyChanged);
  25. }
  26. public void Deactivate()
  27. {
  28. m_SkinningEvents.selectedSpriteChanged.RemoveListener(OnSelectionChange);
  29. m_SkinningEvents.skinningModeChanged.RemoveListener(OnSkinningModuleModeChanged);
  30. m_SkinningEvents.boneSelectionChanged.RemoveListener(OnBoneSelectionChanged);
  31. m_SkinningEvents.boneNameChanged.RemoveListener(OnBoneNameChanged);
  32. m_SkinningEvents.skeletonTopologyChanged.RemoveListener(SkeletonTopologyChanged);
  33. if (m_Model.view != null)
  34. m_Model.view.Deactivate();
  35. }
  36. private void OnSelectionChange(SpriteCache sprite)
  37. {
  38. SetupSkeleton();
  39. m_Model.SetAllVisibility(null, true);
  40. }
  41. private void OnBoneSelectionChanged()
  42. {
  43. m_Model.view.OnBoneSelectionChange(m_Model.GetBoneSelection());
  44. }
  45. private void OnBoneNameChanged(BoneCache bone)
  46. {
  47. m_Model.view.OnBoneNameChanged(bone);
  48. }
  49. private void OnSkinningModuleModeChanged(SkinningMode mode)
  50. {
  51. SetupSkeleton();
  52. m_Model.SetAllVisibility(null, true);
  53. }
  54. private void SetupSkeleton()
  55. {
  56. m_Model.view.OnSelectionChange(m_Model.GetSelectedSkeleton());
  57. m_Model.view.OnBoneExpandedChange(m_Model.GetExpandedBones());
  58. m_Model.view.OnBoneSelectionChange(m_Model.GetBoneSelection());
  59. }
  60. public void SetAllVisibility(bool visibility)
  61. {
  62. var skeleton = m_Model.GetSelectedSkeleton();
  63. if (skeleton != null)
  64. {
  65. using (m_Model.UndoScope(TextContent.boneVisibility))
  66. {
  67. m_Model.SetAllVisibility(skeleton, visibility);
  68. }
  69. }
  70. }
  71. private void SkeletonTopologyChanged(SkeletonCache skeleton)
  72. {
  73. m_Model.view.OnSelectionChange(skeleton);
  74. }
  75. public List<TreeViewItem> BuildTreeView()
  76. {
  77. var rows = new List<TreeViewItem>();
  78. var skeleton = m_Model.GetSelectedSkeleton();
  79. if (skeleton != null)
  80. {
  81. var bones = skeleton.bones;
  82. var children = bones.Where(x => x.parentBone == null).ToArray();
  83. Array.Sort(children, (a, b) => a.siblingIndex.CompareTo(b.siblingIndex));
  84. foreach (var bone in children)
  85. AddTreeViewItem(rows, bone, bones, 0);
  86. }
  87. return rows;
  88. }
  89. private static void AddTreeViewItem(IList<TreeViewItem> rows, BoneCache bone, BoneCache[] bones, int depth)
  90. {
  91. var item = new TreeViewItemBase<BoneCache>(bone.GetInstanceID(), depth, bone.name, bone);
  92. rows.Add(item);
  93. var children = bones.Where(x => x.parentBone == bone).ToArray();
  94. Array.Sort(children, (a, b) => a.siblingIndex.CompareTo(b.siblingIndex));
  95. foreach (var childBone in children)
  96. AddTreeViewItem(rows, childBone, bones, depth + 1);
  97. }
  98. public List<int> GetIDsToExpand(BoneCache[] bones)
  99. {
  100. var result = new List<int>();
  101. if (bones != null)
  102. {
  103. foreach (var bone in bones)
  104. {
  105. if (bone != null)
  106. {
  107. var parent = bone.parentBone;
  108. while (parent != null)
  109. {
  110. int parentId = parent.GetInstanceID();
  111. result.Add(parentId);
  112. parent = parent.parentBone;
  113. }
  114. }
  115. }
  116. }
  117. return result;
  118. }
  119. public int[] GetIDsToSelect(BoneCache[] bones)
  120. {
  121. return bones == null ? new int[0] : Array.ConvertAll(bones, x => x != null ? x.GetInstanceID() : 0);
  122. }
  123. public void SelectBones(IList<int> selectedIds, IList<TreeViewItem> items)
  124. {
  125. var selectedBones = items.Where(x => selectedIds.Contains(x.id)).Select(y => ((TreeViewItemBase<BoneCache>)y).customData).ToArray();
  126. using (m_Model.UndoScope(TextContent.boneSelection))
  127. {
  128. m_Model.SelectBones(selectedBones);
  129. m_SkinningEvents.boneSelectionChanged.Invoke();
  130. }
  131. }
  132. public void ExpandBones(IList<int> expandedIds, IList<TreeViewItem> items)
  133. {
  134. var expandedBones = items.Where(x => expandedIds.Contains(x.id)).Select(y => ((TreeViewItemBase<BoneCache>)y).customData).ToArray();
  135. using (m_Model.UndoScope(TextContent.expandBones))
  136. {
  137. m_Model.SetExpandedBones(expandedBones);
  138. }
  139. }
  140. public bool GetTreeItemVisibility(TreeViewItemBase<BoneCache> item)
  141. {
  142. return m_Model.GetVisibility(item.customData);
  143. }
  144. public void SetTreeItemVisibility(TreeViewItemBase<BoneCache> item, bool visible, bool includeChildren)
  145. {
  146. var bone = item.customData;
  147. if (bone != null && bone.isVisible != visible)
  148. {
  149. using (m_Model.UndoScope(TextContent.visibilityChange))
  150. {
  151. m_Model.SetVisibility(item.customData, visible);
  152. if (includeChildren)
  153. {
  154. // toggle all children as well
  155. SetChildrenVisibility(item, visible);
  156. }
  157. }
  158. }
  159. }
  160. void SetChildrenVisibility(TreeViewItemBase<BoneCache> bone, bool visible)
  161. {
  162. if (bone.children == null)
  163. return;
  164. foreach (var childBone in bone.children)
  165. {
  166. var cb = childBone as TreeViewItemBase<BoneCache>;
  167. SetChildrenVisibility(cb, visible);
  168. m_Model.SetVisibility(cb.customData, visible);
  169. }
  170. }
  171. public int GetTreeItemDepthValue(TreeViewItemBase<BoneCache> bone)
  172. {
  173. return m_Model.GetDepth(bone.customData);
  174. }
  175. public void SetTreeItemDepthValue(TreeViewItemBase<BoneCache> bone, int value)
  176. {
  177. if (bone != null && bone.customData != null)
  178. {
  179. using (m_Model.UndoScope(TextContent.boneDepth))
  180. {
  181. m_Model.SetDepth(bone.customData, value);
  182. m_SkinningEvents.boneDepthChanged.Invoke(bone.customData);
  183. }
  184. }
  185. }
  186. public Color GetTreeItemColorValue(TreeViewItemBase<BoneCache> bone)
  187. {
  188. return m_Model.GetBoneColor(bone.customData);
  189. }
  190. public void SetTreeItemColorValue(TreeViewItemBase<BoneCache> bone, Color color)
  191. {
  192. if (bone != null && bone.customData != null)
  193. {
  194. using (m_Model.UndoScope(TextContent.boneColor))
  195. {
  196. m_Model.SetBoneColor(bone.customData, color);
  197. m_SkinningEvents.boneColorChanged.Invoke(bone.customData);
  198. }
  199. }
  200. }
  201. public void SetTreeViewBoneName(IList<TreeViewItem> items, BoneCache bone)
  202. {
  203. var treeBone = items.FirstOrDefault(x => ((TreeViewItemBase<BoneCache>)x).customData == bone);
  204. if (treeBone != null)
  205. treeBone.displayName = bone.name;
  206. }
  207. public void TreeViewItemRename(IList<TreeViewItem> rows, int itemID, string newName)
  208. {
  209. var item = rows.FirstOrDefault(x => x.id == itemID) as TreeViewItemBase<BoneCache>;
  210. if (item == null)
  211. return;
  212. if (item.customData != null && item.customData.name != newName && !string.IsNullOrEmpty(newName)
  213. && !string.IsNullOrWhiteSpace(newName))
  214. {
  215. item.displayName = newName;
  216. using (m_Model.UndoScope(TextContent.boneName))
  217. {
  218. m_Model.SetName(item.customData, newName);
  219. m_SkinningEvents.boneNameChanged.Invoke(item.customData);
  220. }
  221. }
  222. }
  223. public bool CanReparent(TreeViewItemBase<BoneCache> parent, List<TreeViewItem> draggedItems)
  224. {
  225. TreeViewItemBase<BoneCache> currentParent = parent;
  226. while (currentParent != null)
  227. {
  228. if (draggedItems.Contains(currentParent))
  229. return false;
  230. currentParent = currentParent.parent as TreeViewItemBase<BoneCache>;
  231. }
  232. return true;
  233. }
  234. public void ReparentItems(TreeViewItemBase<BoneCache> newParent, List<TreeViewItem> draggedItems, int insertAtIndex)
  235. {
  236. if ((m_Model.hasCharacter && m_Model.mode != SkinningMode.Character) ||
  237. (!m_Model.hasCharacter && m_Model.mode == SkinningMode.Character))
  238. return;
  239. var parent = newParent != null ? newParent.customData : null;
  240. using (m_Model.UndoScope(TextContent.setParentBone))
  241. {
  242. for (var i = draggedItems.Count - 1; i >= 0; --i)
  243. {
  244. var bone = ((TreeViewItemBase<BoneCache>)draggedItems[i]).customData;
  245. m_Model.SetBoneParent(parent, bone, insertAtIndex);
  246. m_SkinningEvents.skeletonTopologyChanged.Invoke(bone.skeleton);
  247. }
  248. }
  249. }
  250. public virtual bool CanDrag()
  251. {
  252. m_SkinningEvents.boneVisibility.Invoke("drag");
  253. return false;
  254. }
  255. public virtual bool CanRename()
  256. {
  257. m_SkinningEvents.boneVisibility.Invoke("rename");
  258. return false;
  259. }
  260. }
  261. }