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.

PoseToolbar.cs 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System;
  2. using UnityEditor.U2D.Common;
  3. using UnityEngine.UIElements;
  4. namespace UnityEditor.U2D.Animation
  5. {
  6. internal class PoseToolbar : Toolbar
  7. {
  8. private const string k_UxmlPath = "SkinningModule/PoseToolbar.uxml";
  9. private const string k_UssPath = "SkinningModule/PoseToolbarStyle.uss";
  10. private const string k_ToolbarId = "PoseToolbar";
  11. private const string k_PreviewPoseId = "PreviewPose";
  12. private const string k_RestorePoseId = "RestorePose";
  13. private const string k_CharacterPivotId = "PivotPose";
  14. public class CustomUXMLFactor : UxmlFactory<PoseToolbar, UxmlTraits> {}
  15. public event Action<Tools> SetMeshTool = (mode) => {};
  16. public event Action<Tools> SetSkeletonTool = (mode) => {};
  17. public event Action ActivateEditPoseTool = () => {};
  18. SkinningCache skinningCache { get; set; }
  19. private Button m_PreviewBtn;
  20. private Button m_RestoreBtn;
  21. private Button m_PivotBtn;
  22. public static PoseToolbar GenerateFromUXML()
  23. {
  24. var clone = GetClone(k_UxmlPath, k_ToolbarId) as PoseToolbar;
  25. clone.BindElements();
  26. clone.SetupShortcutUtility();
  27. clone.LocalizeTextInChildren();
  28. clone.AddShortcutsToToolTips();
  29. return clone;
  30. }
  31. public PoseToolbar()
  32. {
  33. styleSheets.Add(ResourceLoader.Load<StyleSheet>(k_UssPath));
  34. }
  35. public void Setup(SkinningCache s)
  36. {
  37. skinningCache = s;
  38. skinningCache.events.skinningModeChanged.AddListener(OnSkinningModeChange);
  39. OnSkinningModeChange(s.mode);
  40. }
  41. private void BindElements()
  42. {
  43. m_PreviewBtn = this.Q<Button>(k_PreviewPoseId);
  44. m_PreviewBtn.clickable.clicked += () => { ActivateEditPoseTool(); };
  45. m_RestoreBtn = this.Q<Button>(k_RestorePoseId);
  46. m_RestoreBtn.clickable.clicked += RestorePose;
  47. m_PivotBtn = this.Q<Button>(k_CharacterPivotId);
  48. m_PivotBtn.clickable.clicked += PivotPose;
  49. }
  50. private void PivotPose()
  51. {
  52. SetMeshTool(Tools.CharacterPivotTool);
  53. }
  54. private void OnSkinningModeChange(SkinningMode mode)
  55. {
  56. if (skinningCache.hasCharacter)
  57. {
  58. m_PivotBtn.SetHiddenFromLayout(false);
  59. if (mode == SkinningMode.SpriteSheet)
  60. {
  61. m_PivotBtn.SetEnabled(false);
  62. if (skinningCache.GetTool(Tools.CharacterPivotTool).isActive)
  63. SetSkeletonTool(Tools.EditPose);
  64. }
  65. else if (mode == SkinningMode.Character)
  66. {
  67. m_PivotBtn.SetEnabled(true);
  68. }
  69. }
  70. else
  71. {
  72. m_PivotBtn.SetHiddenFromLayout(true);
  73. var tool = skinningCache.GetTool(Tools.CharacterPivotTool);
  74. if (tool != null && tool.isActive)
  75. SetSkeletonTool(Tools.EditPose);
  76. }
  77. }
  78. private void RestorePose()
  79. {
  80. using (skinningCache.UndoScope(TextContent.restorePose))
  81. {
  82. skinningCache.RestoreBindPose();
  83. skinningCache.events.restoreBindPose.Invoke();
  84. }
  85. }
  86. private void SetupShortcutUtility()
  87. {
  88. m_ShortcutUtility = new ShortcutUtility(ShortcutIds.previewPose,
  89. ShortcutIds.restoreBindPose);
  90. m_ShortcutUtility.OnShortcutChanged = () =>
  91. {
  92. RestoreButtonTooltips(k_UxmlPath, k_ToolbarId);
  93. AddShortcutsToToolTips();
  94. };
  95. }
  96. public void UpdateToggleState()
  97. {
  98. SetButtonChecked(m_PreviewBtn, skinningCache.GetTool(Tools.EditPose).isActive);
  99. SetButtonChecked(m_PivotBtn, skinningCache.GetTool(Tools.CharacterPivotTool).isActive);
  100. }
  101. public void UpdateResetButtonState()
  102. {
  103. var skeleton = skinningCache.GetEffectiveSkeleton(skinningCache.selectedSprite);
  104. var isResetEnabled = skeleton != null && skeleton.isPosePreview;
  105. m_RestoreBtn.SetEnabled(isResetEnabled);
  106. }
  107. private void AddShortcutsToToolTips()
  108. {
  109. m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_PreviewPoseId, ShortcutIds.previewPose);
  110. m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_RestorePoseId, ShortcutIds.restoreBindPose);
  111. m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_CharacterPivotId, ShortcutIds.characterPivot);
  112. }
  113. }
  114. }