Sin descripción
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.

BoneVisibilityTool.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. using UnityEditor.IMGUI.Controls;
  4. using System;
  5. using System.Linq;
  6. using UnityEngine.UIElements;
  7. namespace UnityEditor.U2D.Animation
  8. {
  9. internal class BoneVisibilityTool : BoneTreeWidgetModel, IVisibilityTool
  10. {
  11. private BoneTreeWidgetController m_Controller;
  12. VisualElement IVisibilityTool.view { get { return (VisualElement)m_View; } }
  13. public string name => TextContent.bone;
  14. public bool isAvailable
  15. {
  16. get { return true; }
  17. }
  18. public BoneVisibilityTool(SkinningCache s)
  19. {
  20. m_SkinningCache = s;
  21. }
  22. public void Setup()
  23. {
  24. m_Data = skinningCache.CreateCache<BoneVisibilityToolData>();
  25. m_Controller = new BoneReparentToolController(this, skinningCache.events);//new BoneTreeWidgetController(this, skinningCache.events);
  26. m_View = new BoneReparentToolView()
  27. {
  28. GetModel = () => this,
  29. GetController = () => m_Controller
  30. };
  31. }
  32. public void Dispose()
  33. {}
  34. public void Activate()
  35. {
  36. m_Controller.Activate();
  37. if (m_Data.previousVisiblity != m_Data.allVisibility)
  38. {
  39. m_Data.previousVisiblity = m_Data.allVisibility;
  40. }
  41. }
  42. public void Deactivate()
  43. {
  44. m_Controller.Deactivate();
  45. }
  46. public void SetAvailabilityChangeCallback(Action callback)
  47. {}
  48. }
  49. internal class BoneVisibilityToolView : VisibilityToolViewBase, IBoneVisibilityToolView
  50. {
  51. public Func<BoneTreeWidgetController> GetController = () => null;
  52. public Func<IBoneTreeViewModel> GetModel = () => null;
  53. public BoneVisibilityToolView()
  54. {
  55. m_TreeView = new BoneTreeView(m_TreeViewState, SetupToolColumnHeader())
  56. {
  57. GetController = InternalGetController
  58. };
  59. SetupSearchField();
  60. }
  61. protected virtual VisibilityToolColumnHeader SetupToolColumnHeader()
  62. {
  63. var columns = new MultiColumnHeaderState.Column[2];
  64. columns[0] = new MultiColumnHeaderState.Column
  65. {
  66. headerContent = VisibilityTreeViewBase.VisibilityIconStyle.visibilityOnIcon,
  67. headerTextAlignment = TextAlignment.Center,
  68. width = 32,
  69. minWidth = 32,
  70. maxWidth = 32,
  71. autoResize = false,
  72. allowToggleVisibility = true
  73. };
  74. columns[1] = new MultiColumnHeaderState.Column
  75. {
  76. headerContent = new GUIContent(TextContent.bone),
  77. headerTextAlignment = TextAlignment.Center,
  78. width = 200,
  79. minWidth = 130,
  80. autoResize = true,
  81. allowToggleVisibility = false
  82. };
  83. var multiColumnHeaderState = new MultiColumnHeaderState(columns);
  84. return new VisibilityToolColumnHeader(multiColumnHeaderState)
  85. {
  86. GetAllVisibility = GetAllVisibility,
  87. SetAllVisibility = SetAllVisibility,
  88. canSort = false,
  89. height = 20,
  90. visibilityColumn = 0
  91. };
  92. }
  93. BoneTreeWidgetController InternalGetController()
  94. {
  95. return GetController();
  96. }
  97. protected void SetAllVisibility(bool visibility)
  98. {
  99. GetController().SetAllVisibility(visibility);
  100. }
  101. protected bool GetAllVisibility()
  102. {
  103. return GetModel() != null && GetModel().GetAllVisibility();
  104. }
  105. public void OnSelectionChange(SkeletonCache skeleton)
  106. {
  107. ((BoneTreeView)m_TreeView).SetupHierarchy();
  108. }
  109. public void OnBoneSelectionChange(SkeletonSelection bones)
  110. {
  111. ((BoneTreeView)m_TreeView).OnBoneSelectionChanged(bones);
  112. }
  113. public void OnBoneExpandedChange(BoneCache[] bones)
  114. {
  115. ((BoneTreeView)m_TreeView).OnBoneExpandedChanged(bones);
  116. }
  117. public void OnBoneNameChanged(BoneCache bone)
  118. {
  119. ((BoneTreeView)m_TreeView).OnBoneNameChanged(bone);
  120. }
  121. public void Deactivate()
  122. {
  123. if (m_TreeView.HasSelection())
  124. m_TreeView.EndRename();
  125. }
  126. }
  127. class BoneTreeView : VisibilityTreeViewBase
  128. {
  129. public Func<BoneTreeWidgetController> GetController = () => null;
  130. public BoneTreeView(TreeViewState treeViewState, MultiColumnHeader columnHeader)
  131. : base(treeViewState, columnHeader)
  132. {
  133. columnIndexForTreeFoldouts = 1;
  134. ReloadView();
  135. }
  136. public void SetupHierarchy()
  137. {
  138. ReloadView();
  139. }
  140. private void ReloadView()
  141. {
  142. Reload();
  143. }
  144. public void OnBoneSelectionChanged(SkeletonSelection boneSelection)
  145. {
  146. var bones = boneSelection.elements.ToSpriteSheetIfNeeded();
  147. var ids = GetController().GetIDsToSelect(bones);
  148. SetSelection(ids, TreeViewSelectionOptions.RevealAndFrame);
  149. }
  150. public void OnBoneExpandedChanged(BoneCache[] bones)
  151. {
  152. var expandIds = GetController().GetIDsToSelect(bones);
  153. if (expandIds.Length == 0)
  154. return;
  155. SetExpanded(expandIds.Union(GetExpanded()).ToList());
  156. }
  157. public void OnBoneNameChanged(BoneCache bone)
  158. {
  159. GetController().SetTreeViewBoneName(GetRows(), bone);
  160. }
  161. protected override void SelectionChanged(IList<int> selectedIds)
  162. {
  163. GetController().SelectBones(selectedIds, GetRows());
  164. }
  165. protected override void ExpandedStateChanged()
  166. {
  167. GetController().ExpandBones(GetExpanded(), GetRows());
  168. }
  169. protected override float GetCustomRowHeight(int row, TreeViewItem item)
  170. {
  171. return EditorGUIUtility.singleLineHeight * 1.1f;
  172. }
  173. void CellGUI(Rect cellRect, TreeViewItem item, int column, ref RowGUIArgs args)
  174. {
  175. CenterRectUsingSingleLineHeight(ref cellRect);
  176. switch (column)
  177. {
  178. case 0:
  179. DrawVisibilityCell(cellRect, item);
  180. break;
  181. case 1:
  182. DrawNameCell(cellRect, item, ref args);
  183. break;
  184. case 2:
  185. DrawDepthCell(cellRect, item);
  186. break;
  187. case 3:
  188. DrawColorCell(cellRect, item);
  189. break;
  190. }
  191. }
  192. void DrawDepthCell(Rect cellRect, TreeViewItem item)
  193. {
  194. var boneItemView = DrawCell(cellRect, item);
  195. EditorGUI.BeginChangeCheck();
  196. var depth = GetController().GetTreeItemDepthValue(boneItemView);
  197. depth = EditorGUI.IntField(cellRect, depth);
  198. if (EditorGUI.EndChangeCheck())
  199. GetController().SetTreeItemDepthValue(boneItemView, depth);
  200. }
  201. void DrawColorCell(Rect cellRect, TreeViewItem item)
  202. {
  203. var boneItemView = DrawCell(cellRect, item);
  204. EditorGUI.BeginChangeCheck();
  205. var color = GetController().GetTreeItemColorValue(boneItemView);
  206. color = EditorGUI.ColorField(cellRect, color);
  207. if (EditorGUI.EndChangeCheck())
  208. GetController().SetTreeItemColorValue(boneItemView, color);
  209. }
  210. static TreeViewItemBase<BoneCache> DrawCell(Rect cellRect, TreeViewItem item)
  211. {
  212. const int width = 30;
  213. var boneItemView = item as TreeViewItemBase<BoneCache>;
  214. cellRect.height = EditorGUIUtility.singleLineHeight;
  215. cellRect.x += (cellRect.width - width) * 0.5f;
  216. cellRect.width = width;
  217. return boneItemView;
  218. }
  219. void DrawVisibilityCell(Rect cellRect, TreeViewItem item)
  220. {
  221. GUIStyle style = MultiColumnHeader.DefaultStyles.columnHeaderCenterAligned;
  222. EditorGUI.BeginChangeCheck();
  223. var boneItemView = item as TreeViewItemBase<BoneCache>;
  224. bool visible = GetController().GetTreeItemVisibility(boneItemView);
  225. visible = GUI.Toggle(cellRect, visible, visible ? VisibilityIconStyle.visibilityOnIcon : VisibilityIconStyle.visibilityOffIcon, style);
  226. if (EditorGUI.EndChangeCheck())
  227. {
  228. GetController().SetTreeItemVisibility(boneItemView, visible, Event.current.alt);
  229. }
  230. }
  231. void DrawNameCell(Rect cellRect, TreeViewItem item, ref RowGUIArgs args)
  232. {
  233. args.rowRect = cellRect;
  234. base.RowGUI(args);
  235. }
  236. protected override Rect GetRenameRect(Rect rowRect, int row, TreeViewItem item)
  237. {
  238. Rect cellRect = GetCellRectForTreeFoldouts(rowRect);
  239. CenterRectUsingSingleLineHeight(ref cellRect);
  240. return base.GetRenameRect(cellRect, row, item);
  241. }
  242. protected override void RowGUI(RowGUIArgs args)
  243. {
  244. var item = args.item;
  245. for (int i = 0; i < args.GetNumVisibleColumns(); ++i)
  246. {
  247. CellGUI(args.GetCellRect(i), item, args.GetColumn(i), ref args);
  248. }
  249. }
  250. protected override TreeViewItem BuildRoot()
  251. {
  252. var root = new TreeViewItem {id = 0, depth = -1, displayName = "Root"};
  253. List<TreeViewItem> rows = GetController() != null ? GetController().BuildTreeView() : new List<TreeViewItem>();
  254. SetupParentsAndChildrenFromDepths(root, rows);
  255. return root;
  256. }
  257. protected override bool CanRename(TreeViewItem item)
  258. {
  259. return GetController().CanRename();
  260. }
  261. protected override void RenameEnded(RenameEndedArgs args)
  262. {
  263. var rows = GetRows();
  264. GetController().TreeViewItemRename(rows, args.itemID, args.newName);
  265. base.RenameEnded(args);
  266. }
  267. // dragging
  268. const string k_GenericDragID = "GenericDragColumnDragging";
  269. protected override bool CanStartDrag(CanStartDragArgs args)
  270. {
  271. return true;
  272. }
  273. protected override void SetupDragAndDrop(SetupDragAndDropArgs args)
  274. {
  275. if (GetController().CanDrag() && !hasSearch)
  276. {
  277. DragAndDrop.PrepareStartDrag();
  278. var draggedRows = GetRows().Where(item => args.draggedItemIDs.Contains(item.id)).ToList();
  279. DragAndDrop.SetGenericData(k_GenericDragID, draggedRows);
  280. DragAndDrop.objectReferences = new UnityEngine.Object[] {}; // this IS required for dragging to work
  281. string title = draggedRows.Count == 1 ? draggedRows[0].displayName : "< Multiple >";
  282. DragAndDrop.StartDrag(title);
  283. }
  284. }
  285. protected override DragAndDropVisualMode HandleDragAndDrop(DragAndDropArgs args)
  286. {
  287. // Check if we can handle the current drag data (could be dragged in from other areas/windows in the editor)
  288. var draggedRows = DragAndDrop.GetGenericData(k_GenericDragID) as List<TreeViewItem>;
  289. if (draggedRows == null)
  290. return DragAndDropVisualMode.None;
  291. // Parent item is null when dragging outside any tree view items.
  292. switch (args.dragAndDropPosition)
  293. {
  294. case DragAndDropPosition.UponItem:
  295. case DragAndDropPosition.OutsideItems:
  296. case DragAndDropPosition.BetweenItems:
  297. {
  298. var newParent = args.parentItem as TreeViewItemBase<BoneCache>;
  299. bool validDrag = false;
  300. validDrag = GetController().CanReparent(newParent, draggedRows);
  301. if (args.performDrop && validDrag)
  302. {
  303. GetController().ReparentItems(newParent, draggedRows, args.insertAtIndex);
  304. Reload();
  305. var selectedIDs = draggedRows.ConvertAll(b => b.id);
  306. SetSelection(selectedIDs, TreeViewSelectionOptions.RevealAndFrame);
  307. SelectionChanged(selectedIDs);
  308. }
  309. return validDrag ? DragAndDropVisualMode.Move : DragAndDropVisualMode.None;
  310. }
  311. }
  312. return DragAndDropVisualMode.None;
  313. }
  314. }
  315. }