A game about forced loneliness, made by TACStudios
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}