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.

BoneReparentTool.cs 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using System;
  2. using UnityEditor.U2D.Common;
  3. using UnityEditor.U2D.Layout;
  4. using UnityEditor.IMGUI.Controls;
  5. using UnityEngine;
  6. using UnityEngine.UIElements;
  7. namespace UnityEditor.U2D.Animation
  8. {
  9. internal class BoneReparentToolController : BoneTreeWidgetController
  10. {
  11. public BoneReparentToolController(IBoneTreeViewModel model, SkinningEvents eventSystem) : base(model, eventSystem)
  12. {}
  13. public override bool CanDrag()
  14. {
  15. m_SkinningEvents.boneVisibility.Invoke("drag");
  16. return (m_Model.hasCharacter && m_Model.mode == SkinningMode.Character) ||
  17. (!m_Model.hasCharacter && m_Model.mode == SkinningMode.SpriteSheet);
  18. }
  19. public override bool CanRename()
  20. {
  21. m_SkinningEvents.boneVisibility.Invoke("rename");
  22. return true;
  23. }
  24. }
  25. internal class BoneReparentToolModel : BoneTreeWidgetModel
  26. {
  27. public BoneReparentToolModel(SkinningCache cache, IBoneVisibilityToolView view)
  28. {
  29. m_SkinningCache = cache;
  30. m_View = view;
  31. m_Data = skinningCache.CreateCache<BoneVisibilityToolData>();
  32. }
  33. }
  34. internal class BoneReparentTool : SkeletonToolWrapper
  35. {
  36. BoneReparentToolWindow m_View;
  37. BoneReparentToolModel m_Model;
  38. private BoneReparentToolController m_Controller;
  39. public override void Initialize(LayoutOverlay layout)
  40. {
  41. if (m_View == null)
  42. {
  43. m_View = BoneReparentToolWindow.CreateFromUXML();
  44. }
  45. m_Model = new BoneReparentToolModel(skinningCache, m_View);
  46. m_Controller = new BoneReparentToolController(m_Model, skinningCache.events);
  47. m_View.GetController = () => m_Controller;
  48. m_View.GetModel = () => m_Model;
  49. layout.rightOverlay.Add(m_View);
  50. m_View.SetHiddenFromLayout(true);
  51. }
  52. protected override void OnActivate()
  53. {
  54. m_View.SetHiddenFromLayout(false);
  55. m_Controller.Activate();
  56. skeletonTool.Activate();
  57. }
  58. protected override void OnDeactivate()
  59. {
  60. m_View.SetHiddenFromLayout(true);
  61. m_Controller.Deactivate();
  62. skeletonTool.Deactivate();
  63. }
  64. protected override void OnGUI()
  65. {
  66. skeletonTool.mode = mode;
  67. skeletonTool.editBindPose = editBindPose;
  68. skeletonTool.DoGUI();
  69. }
  70. }
  71. #if ENABLE_UXML_SERIALIZED_DATA
  72. [UxmlElement]
  73. #endif
  74. internal partial class BoneReparentToolWindow : VisualElement, IBoneVisibilityToolView
  75. {
  76. #if ENABLE_UXML_TRAITS
  77. public class CustomUxmlFactory : UxmlFactory<BoneReparentToolWindow, UxmlTraits> { }
  78. #endif
  79. BoneReparentToolView m_ToolView;
  80. public Func<IBoneTreeViewModel> GetModel = () => null;
  81. public Func<BoneTreeWidgetController> GetController = () => null;
  82. static internal BoneReparentToolWindow CreateFromUXML()
  83. {
  84. var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/BoneReparentWindow.uxml");
  85. var ve = visualTree.CloneTree().Q("BoneReparentToolWindow") as BoneReparentToolWindow;
  86. ve.BindElements();
  87. return ve;
  88. }
  89. internal void BindElements()
  90. {
  91. m_ToolView = this.Q<BoneReparentToolView>();
  92. m_ToolView.GetModel = InternalGetModel;
  93. m_ToolView.GetController = InternalGetController;
  94. this.styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/BoneReparentStyle.uss"));
  95. }
  96. IBoneTreeViewModel InternalGetModel()
  97. {
  98. return GetModel();
  99. }
  100. BoneTreeWidgetController InternalGetController()
  101. {
  102. return GetController();
  103. }
  104. public void OnBoneSelectionChange(SkeletonSelection skeleton)
  105. {
  106. ((IBoneVisibilityToolView)toolView).OnBoneSelectionChange(skeleton);
  107. }
  108. public void OnBoneExpandedChange(BoneCache[] bones)
  109. {
  110. ((IBoneVisibilityToolView)toolView).OnBoneExpandedChange(bones);
  111. }
  112. public void OnBoneNameChanged(BoneCache bone)
  113. {
  114. ((IBoneVisibilityToolView)toolView).OnBoneNameChanged(bone);
  115. }
  116. public void OnSelectionChange(SkeletonCache skeleton)
  117. {
  118. ((IBoneVisibilityToolView)toolView).OnSelectionChange(skeleton);
  119. }
  120. BoneReparentToolView toolView { get {return m_ToolView; } }
  121. public void Deactivate()
  122. {
  123. toolView.Deactivate();
  124. }
  125. }
  126. #if ENABLE_UXML_SERIALIZED_DATA
  127. [UxmlElement]
  128. #endif
  129. internal partial class BoneReparentToolView : BoneVisibilityToolView
  130. {
  131. #if ENABLE_UXML_TRAITS
  132. public class CustomUxmlFactory : UxmlFactory<BoneReparentToolView, CustomUxmlTraits> {}
  133. public class CustomUxmlTraits : UxmlTraits {}
  134. #endif
  135. protected override VisibilityToolColumnHeader SetupToolColumnHeader()
  136. {
  137. var columns = new MultiColumnHeaderState.Column[4];
  138. columns[0] = new MultiColumnHeaderState.Column
  139. {
  140. headerContent = VisibilityTreeViewBase.VisibilityIconStyle.visibilityOnIcon,
  141. headerTextAlignment = TextAlignment.Center,
  142. width = 32,
  143. minWidth = 32,
  144. maxWidth = 32,
  145. autoResize = false,
  146. allowToggleVisibility = true
  147. };
  148. columns[1] = new MultiColumnHeaderState.Column
  149. {
  150. headerContent = new GUIContent(TextContent.bone),
  151. headerTextAlignment = TextAlignment.Center,
  152. width = 130,
  153. minWidth = 130,
  154. autoResize = true,
  155. allowToggleVisibility = false
  156. };
  157. columns[2] = new MultiColumnHeaderState.Column
  158. {
  159. headerContent = new GUIContent(TextContent.depth),
  160. headerTextAlignment = TextAlignment.Center,
  161. width = 50,
  162. minWidth = 50,
  163. maxWidth = 50,
  164. autoResize = true,
  165. allowToggleVisibility = true
  166. };
  167. columns[3] = new MultiColumnHeaderState.Column
  168. {
  169. headerContent = new GUIContent(TextContent.color),
  170. headerTextAlignment = TextAlignment.Center,
  171. width = 50,
  172. minWidth = 50,
  173. maxWidth = 50,
  174. autoResize = true,
  175. allowToggleVisibility = true
  176. };
  177. var multiColumnHeaderState = new MultiColumnHeaderState(columns);
  178. return new VisibilityToolColumnHeader(multiColumnHeaderState)
  179. {
  180. GetAllVisibility = GetAllVisibility,
  181. SetAllVisibility = SetAllVisibility,
  182. canSort = false,
  183. height = 20,
  184. visibilityColumn = 0
  185. };
  186. }
  187. }
  188. }