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 WeightToolbar : Toolbar
11 {
12 private const string k_UxmlPath = "SkinningModule/WeightToolbar.uxml";
13 private const string k_ToolbarId = "WeightToolbar";
14
15 private const string k_AutoGenerateWeightId = "AutoGenerateWeight";
16 private const string k_WeightPainterSliderId = "WeightPainterSlider";
17 private const string k_WeightPainterBrushId = "WeightPainterBrush";
18 private const string k_BoneInfluenceWidgetId = "BoneInfluenceWidget";
19 private const string k_SpriteInfluenceWidgetId = "SpriteInfluenceWidget";
20
21#if ENABLE_UXML_TRAITS
22 public class CustomUXMLFactor : UxmlFactory<WeightToolbar, UxmlTraits> { }
23#endif
24
25 public event Action<Tools> SetWeightTool = (mode) => { };
26 public SkinningCache skinningCache { get; set; }
27
28 public static WeightToolbar GenerateFromUXML()
29 {
30 var clone = GetClone(k_UxmlPath, k_ToolbarId) as WeightToolbar;
31 clone.BindElements();
32 clone.SetupShortcutUtility();
33 clone.LocalizeTextInChildren();
34 clone.AddShortcutsToToolTips();
35 return clone;
36 }
37
38 public WeightToolbar()
39 {
40 styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/WeightToolbarStyle.uss"));
41 }
42
43 public void EnableBoneInfluenceWidget()
44 {
45 this.Q<Button>(k_BoneInfluenceWidgetId).SetEnabled(true);
46 }
47
48 public void DisableBoneInfluenceWidget()
49 {
50 this.Q<Button>(k_BoneInfluenceWidgetId).SetEnabled(false);
51 }
52
53 private void BindElements()
54 {
55 var button = this.Q<Button>(k_AutoGenerateWeightId);
56 button.clickable.clicked += () => SetWeightTool(Tools.GenerateWeights);
57
58 button = this.Q<Button>(k_WeightPainterSliderId);
59 button.clickable.clicked += () => SetWeightTool(Tools.WeightSlider);
60
61 button = this.Q<Button>(k_WeightPainterBrushId);
62 button.clickable.clicked += () => SetWeightTool(Tools.WeightBrush);
63
64 button = this.Q<Button>(k_BoneInfluenceWidgetId);
65 button.clickable.clicked += () => SetWeightTool(Tools.BoneInfluence);
66
67 button = this.Q<Button>(k_SpriteInfluenceWidgetId);
68 button.clickable.clicked += () => SetWeightTool(Tools.SpriteInfluence);
69 }
70
71 private void SetupShortcutUtility()
72 {
73 m_ShortcutUtility = new ShortcutUtility(ShortcutIds.autoWeights,
74 ShortcutIds.weightSlider,
75 ShortcutIds.weightBrush,
76 ShortcutIds.boneInfluence,
77 ShortcutIds.spriteInfluence);
78 m_ShortcutUtility.OnShortcutChanged = () =>
79 {
80 RestoreButtonTooltips(k_UxmlPath, k_ToolbarId);
81 AddShortcutsToToolTips();
82 };
83 }
84
85 public void UpdateToggleState()
86 {
87 //TODO: Make UI not be aware of BaseTool, Cache, etc. Use Tool enum
88 var button = this.Q<Button>(k_AutoGenerateWeightId);
89 SetButtonChecked(button, skinningCache.GetTool(Tools.GenerateWeights).isActive);
90
91 button = this.Q<Button>(k_WeightPainterSliderId);
92 SetButtonChecked(button, skinningCache.GetTool(Tools.WeightSlider).isActive);
93
94 button = this.Q<Button>(k_WeightPainterBrushId);
95 SetButtonChecked(button, skinningCache.GetTool(Tools.WeightBrush).isActive);
96
97 button = this.Q<Button>(k_BoneInfluenceWidgetId);
98 SetButtonChecked(button, skinningCache.GetTool(Tools.BoneInfluence).isActive);
99
100 button = this.Q<Button>(k_SpriteInfluenceWidgetId);
101 SetButtonChecked(button, skinningCache.GetTool(Tools.SpriteInfluence).isActive);
102 }
103
104 private void AddShortcutsToToolTips()
105 {
106 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_AutoGenerateWeightId, ShortcutIds.autoWeights);
107 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_WeightPainterSliderId, ShortcutIds.weightSlider);
108 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_WeightPainterBrushId, ShortcutIds.weightBrush);
109 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_BoneInfluenceWidgetId, ShortcutIds.boneInfluence);
110 m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_SpriteInfluenceWidgetId, ShortcutIds.spriteInfluence);
111 }
112 }
113}