using System; using UnityEngine; using UnityEngine.UIElements; namespace UnityEditor.U2D.Animation { internal class WeightToolbar : Toolbar { private const string k_UxmlPath = "SkinningModule/WeightToolbar.uxml"; private const string k_ToolbarId = "WeightToolbar"; private const string k_AutoGenerateWeightId = "AutoGenerateWeight"; private const string k_WeightPainterSliderId = "WeightPainterSlider"; private const string k_WeightPainterBrushId = "WeightPainterBrush"; private const string k_BoneInfluenceWidgetId = "BoneInfluenceWidget"; private const string k_SpriteInfluenceWidgetId = "SpriteInfluenceWidget"; public class CustomUXMLFactor : UxmlFactory<WeightToolbar, UxmlTraits> {} public event Action<Tools> SetWeightTool = (mode) => {}; public SkinningCache skinningCache { get; set; } public static WeightToolbar GenerateFromUXML() { var clone = GetClone(k_UxmlPath, k_ToolbarId) as WeightToolbar; clone.BindElements(); clone.SetupShortcutUtility(); clone.LocalizeTextInChildren(); clone.AddShortcutsToToolTips(); return clone; } public WeightToolbar() { styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/WeightToolbarStyle.uss")); } public void EnableBoneInfluenceWidget() { this.Q<Button>(k_BoneInfluenceWidgetId).SetEnabled(true); } public void DisableBoneInfluenceWidget() { this.Q<Button>(k_BoneInfluenceWidgetId).SetEnabled(false); } private void BindElements() { var button = this.Q<Button>(k_AutoGenerateWeightId); button.clickable.clicked += () => SetWeightTool(Tools.GenerateWeights); button = this.Q<Button>(k_WeightPainterSliderId); button.clickable.clicked += () => SetWeightTool(Tools.WeightSlider); button = this.Q<Button>(k_WeightPainterBrushId); button.clickable.clicked += () => SetWeightTool(Tools.WeightBrush); button = this.Q<Button>(k_BoneInfluenceWidgetId); button.clickable.clicked += () => SetWeightTool(Tools.BoneInfluence); button = this.Q<Button>(k_SpriteInfluenceWidgetId); button.clickable.clicked += () => SetWeightTool(Tools.SpriteInfluence); } private void SetupShortcutUtility() { m_ShortcutUtility = new ShortcutUtility(ShortcutIds.autoWeights, ShortcutIds.weightSlider, ShortcutIds.weightBrush, ShortcutIds.boneInfluence, ShortcutIds.spriteInfluence); m_ShortcutUtility.OnShortcutChanged = () => { RestoreButtonTooltips(k_UxmlPath, k_ToolbarId); AddShortcutsToToolTips(); }; } public void UpdateToggleState() { //TODO: Make UI not be aware of BaseTool, Cache, etc. Use Tool enum var button = this.Q<Button>(k_AutoGenerateWeightId); SetButtonChecked(button, skinningCache.GetTool(Tools.GenerateWeights).isActive); button = this.Q<Button>(k_WeightPainterSliderId); SetButtonChecked(button, skinningCache.GetTool(Tools.WeightSlider).isActive); button = this.Q<Button>(k_WeightPainterBrushId); SetButtonChecked(button, skinningCache.GetTool(Tools.WeightBrush).isActive); button = this.Q<Button>(k_BoneInfluenceWidgetId); SetButtonChecked(button, skinningCache.GetTool(Tools.BoneInfluence).isActive); button = this.Q<Button>(k_SpriteInfluenceWidgetId); SetButtonChecked(button, skinningCache.GetTool(Tools.SpriteInfluence).isActive); } private void AddShortcutsToToolTips() { m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_AutoGenerateWeightId, ShortcutIds.autoWeights); m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_WeightPainterSliderId, ShortcutIds.weightSlider); m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_WeightPainterBrushId, ShortcutIds.weightBrush); m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_BoneInfluenceWidgetId, ShortcutIds.boneInfluence); m_ShortcutUtility.AddShortcutToButtonTooltip(this, k_SpriteInfluenceWidgetId, ShortcutIds.spriteInfluence); } } }