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 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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. internal class BoneReparentToolWindow : VisualElement, IBoneVisibilityToolView
  72. {
  73. public class CustomUxmlFactory : UxmlFactory<BoneReparentToolWindow, UxmlTraits> {}
  74. BoneReparentToolView m_ToolView;
  75. public Func<IBoneTreeViewModel> GetModel = () => null;
  76. public Func<BoneTreeWidgetController> GetController = () => null;
  77. static internal BoneReparentToolWindow CreateFromUXML()
  78. {
  79. var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/BoneReparentWindow.uxml");
  80. var ve = visualTree.CloneTree().Q("BoneReparentToolWindow") as BoneReparentToolWindow;
  81. ve.BindElements();
  82. return ve;
  83. }
  84. internal void BindElements()
  85. {
  86. m_ToolView = this.Q<BoneReparentToolView>();
  87. m_ToolView.GetModel = InternalGetModel;
  88. m_ToolView.GetController = InternalGetController;
  89. this.styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/BoneReparentStyle.uss"));
  90. }
  91. IBoneTreeViewModel InternalGetModel()
  92. {
  93. return GetModel();
  94. }
  95. BoneTreeWidgetController InternalGetController()
  96. {
  97. return GetController();
  98. }
  99. public void OnBoneSelectionChange(SkeletonSelection skeleton)
  100. {
  101. ((IBoneVisibilityToolView)toolView).OnBoneSelectionChange(skeleton);
  102. }
  103. public void OnBoneExpandedChange(BoneCache[] bones)
  104. {
  105. ((IBoneVisibilityToolView)toolView).OnBoneExpandedChange(bones);
  106. }
  107. public void OnBoneNameChanged(BoneCache bone)
  108. {
  109. ((IBoneVisibilityToolView)toolView).OnBoneNameChanged(bone);
  110. }
  111. public void OnSelectionChange(SkeletonCache skeleton)
  112. {
  113. ((IBoneVisibilityToolView)toolView).OnSelectionChange(skeleton);
  114. }
  115. BoneReparentToolView toolView { get {return m_ToolView; } }
  116. public void Deactivate()
  117. {
  118. toolView.Deactivate();
  119. }
  120. }
  121. internal class BoneReparentToolView : BoneVisibilityToolView
  122. {
  123. public class CustomUxmlFactory : UxmlFactory<BoneReparentToolView, CustomUxmlTraits> {}
  124. public class CustomUxmlTraits : UxmlTraits {}
  125. protected override VisibilityToolColumnHeader SetupToolColumnHeader()
  126. {
  127. var columns = new MultiColumnHeaderState.Column[4];
  128. columns[0] = new MultiColumnHeaderState.Column
  129. {
  130. headerContent = VisibilityTreeViewBase.VisibilityIconStyle.visibilityOnIcon,
  131. headerTextAlignment = TextAlignment.Center,
  132. width = 32,
  133. minWidth = 32,
  134. maxWidth = 32,
  135. autoResize = false,
  136. allowToggleVisibility = true
  137. };
  138. columns[1] = new MultiColumnHeaderState.Column
  139. {
  140. headerContent = new GUIContent(TextContent.bone),
  141. headerTextAlignment = TextAlignment.Center,
  142. width = 130,
  143. minWidth = 130,
  144. autoResize = true,
  145. allowToggleVisibility = false
  146. };
  147. columns[2] = new MultiColumnHeaderState.Column
  148. {
  149. headerContent = new GUIContent(TextContent.depth),
  150. headerTextAlignment = TextAlignment.Center,
  151. width = 50,
  152. minWidth = 50,
  153. maxWidth = 50,
  154. autoResize = true,
  155. allowToggleVisibility = true
  156. };
  157. columns[3] = new MultiColumnHeaderState.Column
  158. {
  159. headerContent = new GUIContent(TextContent.color),
  160. headerTextAlignment = TextAlignment.Center,
  161. width = 50,
  162. minWidth = 50,
  163. maxWidth = 50,
  164. autoResize = true,
  165. allowToggleVisibility = true
  166. };
  167. var multiColumnHeaderState = new MultiColumnHeaderState(columns);
  168. return new VisibilityToolColumnHeader(multiColumnHeaderState)
  169. {
  170. GetAllVisibility = GetAllVisibility,
  171. SetAllVisibility = SetAllVisibility,
  172. canSort = false,
  173. height = 20,
  174. visibilityColumn = 0
  175. };
  176. }
  177. }
  178. }