A game about forced loneliness, made by TACStudios
at master 117 lines 4.5 kB view raw
1using System; 2using UnityEditor.U2D.Common; 3using UnityEngine.UIElements; 4 5namespace UnityEditor.U2D.Animation 6{ 7#if ENABLE_UXML_SERIALIZED_DATA 8 [UxmlElement] 9#endif 10 internal partial class BoneToolbar : Toolbar 11 { 12 private const string k_UxmlPath = "SkinningModule/BoneToolbar.uxml"; 13 private const string k_ToolbarId = "BoneToolbar"; 14 private const string k_EditJointsId = "EditJoints"; 15 private const string k_CreateBoneId = "CreateBone"; 16 private const string k_SplitBoneId = "SplitBone"; 17 18#if ENABLE_UXML_TRAITS 19 public class BoneToolbarFactory : UxmlFactory<BoneToolbar, BoneToolbarUxmlTraits> { } 20 public class BoneToolbarUxmlTraits : UxmlTraits { } 21#endif 22 23 public event Action<Tools> SetSkeletonTool = (mode) => { }; 24 public SkinningCache skinningCache { get; private set; } 25 26 public static BoneToolbar GenerateFromUXML() 27 { 28 var clone = GetClone(k_UxmlPath, k_ToolbarId) as BoneToolbar; 29 clone.BindElements(); 30 clone.SetupShortcutUtility(); 31 clone.LocalizeTextInChildren(); 32 clone.AddShortcutsToToolTips(); 33 return clone; 34 } 35 36 public BoneToolbar() 37 { 38 styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/BoneToolbarStyle.uss")); 39 } 40 41 private void BindElements() 42 { 43 var editJoints = this.Q<Button>(k_EditJointsId); 44 editJoints.clickable.clicked += () => { SetSkeletonTool(Tools.EditJoints); }; 45 46 var createBone = this.Q<Button>(k_CreateBoneId); 47 createBone.clickable.clicked += () => { SetSkeletonTool(Tools.CreateBone); }; 48 49 var splitBone = this.Q<Button>(k_SplitBoneId); 50 splitBone.clickable.clicked += () => { SetSkeletonTool(Tools.SplitBone); }; 51 } 52 53 private void SetupShortcutUtility() 54 { 55 m_ShortcutUtility = new ShortcutUtility(ShortcutIds.editBone, 56 ShortcutIds.createBone, 57 ShortcutIds.splitBone); 58 m_ShortcutUtility.OnShortcutChanged = () => 59 { 60 RestoreButtonTooltips(k_UxmlPath, k_ToolbarId); 61 AddShortcutsToToolTips(); 62 }; 63 } 64 65 public void Setup(SkinningCache s) 66 { 67 skinningCache = s; 68 skinningCache.events.skinningModeChanged.AddListener(OnSkinningModeChange); 69 } 70 71 private void OnSkinningModeChange(SkinningMode mode) 72 { 73 if (skinningCache.hasCharacter) 74 { 75 if (mode == SkinningMode.SpriteSheet || skinningCache.bonesReadOnly) 76 { 77 this.Q<Button>(k_EditJointsId).SetEnabled(false); 78 this.Q<Button>(k_CreateBoneId).SetEnabled(false); 79 this.Q<Button>(k_SplitBoneId).SetEnabled(false); 80 81 if (skinningCache.GetTool(Tools.EditJoints).isActive 82 || skinningCache.GetTool(Tools.CreateBone).isActive 83 || skinningCache.GetTool(Tools.SplitBone).isActive) 84 SetSkeletonTool(Tools.EditPose); 85 } 86 else if (mode == SkinningMode.Character) 87 { 88 this.Q<Button>(k_EditJointsId).SetEnabled(true); 89 this.Q<Button>(k_CreateBoneId).SetEnabled(true); 90 this.Q<Button>(k_SplitBoneId).SetEnabled(true); 91 } 92 } 93 } 94 95 public void UpdateToggleState() 96 { 97 //TODO: Make UI not be aware of BaseTool, Cache, etc. Use Tool enum 98 var toolButton = this.Q<Button>(k_EditJointsId); 99 SetButtonChecked(toolButton, skinningCache.GetTool(Tools.EditJoints).isActive); 100 101 toolButton = this.Q<Button>(k_CreateBoneId); 102 SetButtonChecked(toolButton, skinningCache.GetTool(Tools.CreateBone).isActive); 103 104 toolButton = this.Q<Button>(k_SplitBoneId); 105 SetButtonChecked(toolButton, skinningCache.GetTool(Tools.SplitBone).isActive); 106 107 OnSkinningModeChange(skinningCache.mode); 108 } 109 110 private void AddShortcutsToToolTips() 111 { 112 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_EditJointsId, ShortcutIds.editBone); 113 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_CreateBoneId, ShortcutIds.createBone); 114 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_SplitBoneId, ShortcutIds.splitBone); 115 } 116 } 117}