A game about forced loneliness, made by TACStudios
at master 224 lines 8.2 kB view raw
1using System; 2using UnityEngine; 3using UnityEngine.UIElements; 4 5namespace UnityEditor.U2D.Sprites.SpriteEditorTool 6{ 7 [UxmlElement] 8 internal partial class SpriteOutlineToolOverlayPanel : VisualElement 9 { 10 static readonly string kGenerateSingle = L10n.Tr("Generate"); 11 static readonly string kGenerateAll = L10n.Tr("Generate All"); 12 static readonly string kForceGenerate = L10n.Tr("Force Generate All"); 13 14 FloatField m_OutlineDetailField; 15 IntegerField m_AlphaToleranceField; 16 Slider m_OutlineDetailSlider; 17 SliderInt m_AlphaToleranceSlider; 18 Toggle m_SnapToggle; 19 Toggle m_OptimizeOutline; 20 Toggle m_ForceGenerate; 21 Button m_GenerateButton; 22 Button m_CopyButton; 23 Button m_PasteButton; 24 25 public event Action<bool> onGenerateOutline = _ => { }; 26 public event Action<int> onAlphaToleranceChanged = _ => { }; 27 public event Action<float> onOutlineDetailChanged = _ => { }; 28 public event Action onCopy = () => { }; 29 public event Action onPaste = () => { }; 30 public event Action onPasteAll = () => { }; 31 public event Action onPasteAlternate = () => { }; 32 public event Action onPasteAlternateAll = () => { }; 33 34 public bool snapOn 35 { 36 get { return m_SnapToggle.value; } 37 set { m_SnapToggle.SetValueWithoutNotify(value); } 38 } 39 40 public float outlineDetail 41 { 42 get { return m_OutlineDetailField.value; } 43 set 44 { 45 m_OutlineDetailField.SetValueWithoutNotify(value); 46 m_OutlineDetailSlider.SetValueWithoutNotify(value); 47 } 48 } 49 50 public int alphaTolerance 51 { 52 get { return m_AlphaToleranceField.value; } 53 set 54 { 55 m_AlphaToleranceField.SetValueWithoutNotify(value); 56 m_AlphaToleranceSlider.SetValueWithoutNotify(value); 57 } 58 } 59 60 public bool optimizeOutline 61 { 62 get => m_OptimizeOutline.value; 63 set => m_OptimizeOutline.SetValueWithoutNotify(value); 64 } 65 66 public SpriteOutlineToolOverlayPanel() 67 { 68 styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>("Packages/com.unity.2d.sprite/Editor/UI/SpriteEditor/SpriteOutlineToolOverlayPanelStyle.uss")); 69 RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); }); 70 RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); }); 71 } 72 73 74 public void SetPanelMode(bool hasSelection) 75 { 76 if (hasSelection) 77 { 78 m_GenerateButton.text = kGenerateSingle; 79 m_CopyButton.SetEnabled(true); 80 m_PasteButton.SetEnabled(true); 81 m_ForceGenerate.SetEnabled(false); 82 } 83 else 84 { 85 UpdateGenerateAllButtonText(); 86 m_CopyButton.SetEnabled(false); 87 m_PasteButton.SetEnabled(false); 88 m_ForceGenerate.SetEnabled(true); 89 } 90 } 91 92 void UpdateGenerateAllButtonText() 93 { 94 m_GenerateButton.text = m_ForceGenerate.value ? kForceGenerate : kGenerateAll; 95 } 96 97 void GenerateOutline() 98 { 99 onGenerateOutline(m_ForceGenerate.value); 100 } 101 102 void OnCopy() 103 { 104 onCopy(); 105 } 106 107 void OnPaste() 108 { 109 onPaste(); 110 } 111 112 void OnPasteAll() 113 { 114 onPasteAll(); 115 } 116 117 void OnPasteAlternate() 118 { 119 onPasteAlternate(); 120 } 121 122 void OnPasteAlternateAll() 123 { 124 onPasteAlternateAll(); 125 } 126 127 void OnForceGenerateChanged(ChangeEvent<bool> _) 128 { 129 UpdateGenerateAllButtonText(); 130 } 131 132 private void BindElements(string alternateLabelText) 133 { 134 m_GenerateButton = this.Q<Button>("GenerateButton"); 135 m_GenerateButton.clickable.clicked += GenerateOutline; 136 m_GenerateButton.AddManipulator(m_GenerateButton.clickable); 137 138 m_CopyButton = this.Q<Button>("CopyButton"); 139 m_CopyButton.clickable.clicked += OnCopy; 140 m_CopyButton.AddManipulator(m_CopyButton.clickable); 141 142 m_PasteButton = this.Q<Button>("PasteButton"); 143 m_PasteButton.clickable.clicked += OnPaste; 144 m_PasteButton.AddManipulator(m_PasteButton.clickable); 145 146 m_ForceGenerate = this.Q<Toggle>("ForceGenerateToggle"); 147 m_ForceGenerate.RegisterValueChangedCallback(OnForceGenerateChanged); 148 149 var button = this.Q<Button>("PasteAllButton"); 150 button.clickable.clicked += OnPasteAll; 151 button.AddManipulator(button.clickable); 152 153 button = this.Q<Button>("PasteAlternateButton"); 154 button.clickable.clicked += OnPasteAlternate; 155 button.AddManipulator(button.clickable); 156 157 button = this.Q<Button>("PasteAlternateAllButton"); 158 button.clickable.clicked += OnPasteAlternateAll; 159 button.AddManipulator(button.clickable); 160 161 var alternateLabel = this.Q<Label>("PasteAlternateLabel"); 162 alternateLabel.text = alternateLabelText; 163 164 m_OutlineDetailField = this.Q<FloatField>("OutlineDetailField"); 165 m_AlphaToleranceField = this.Q<IntegerField>("AlphaToleranceField"); 166 m_SnapToggle = this.Q<Toggle>("SnapToggle"); 167 m_OptimizeOutline = this.Q<Toggle>("OptimizeOutlineToggle"); 168 169 m_OutlineDetailSlider = this.Q<Slider>("OutlineDetailSlider"); 170 m_OutlineDetailSlider.RegisterValueChangedCallback((evt) => 171 { 172 if (!evt.newValue.Equals(m_OutlineDetailField.value)) 173 { 174 m_OutlineDetailField.SetValueWithoutNotify(evt.newValue); 175 onOutlineDetailChanged(evt.newValue); 176 } 177 178 }); 179 m_OutlineDetailField.RegisterValueChangedCallback((evt) => 180 { 181 var newValue = evt.newValue; 182 if (!newValue.Equals(m_OutlineDetailSlider.value)) 183 { 184 newValue = Math.Min(newValue, m_OutlineDetailSlider.highValue); 185 newValue = Math.Max(newValue, m_OutlineDetailSlider.lowValue); 186 m_OutlineDetailSlider.value = newValue; 187 m_OutlineDetailField.SetValueWithoutNotify(newValue); 188 onOutlineDetailChanged(evt.newValue); 189 } 190 }); 191 192 m_AlphaToleranceSlider = this.Q<SliderInt>("AlphaToleranceSlider"); 193 m_AlphaToleranceSlider.RegisterValueChangedCallback((evt) => 194 { 195 if (!evt.newValue.Equals(m_OutlineDetailField.value)) 196 { 197 m_AlphaToleranceField.SetValueWithoutNotify(evt.newValue); 198 onAlphaToleranceChanged(evt.newValue); 199 } 200 201 }); 202 m_AlphaToleranceField.RegisterValueChangedCallback((evt) => 203 { 204 var newValue = evt.newValue; 205 if (!newValue.Equals(m_AlphaToleranceSlider.value)) 206 { 207 newValue = Math.Min(newValue, m_AlphaToleranceSlider.highValue); 208 newValue = Math.Max(newValue, m_AlphaToleranceSlider.lowValue); 209 m_AlphaToleranceSlider.value = newValue; 210 m_AlphaToleranceField.SetValueWithoutNotify(newValue); 211 onAlphaToleranceChanged(evt.newValue); 212 } 213 }); 214 } 215 216 public static SpriteOutlineToolOverlayPanel GenerateFromUXML(string alternateLabelText) 217 { 218 var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Packages/com.unity.2d.sprite/Editor/UI/SpriteEditor/SpriteOutlineToolOverlayPanel.uxml"); 219 var clone = visualTree.CloneTree().Q<SpriteOutlineToolOverlayPanel>("SpriteOutlineToolOverlayPanel"); 220 clone.BindElements(alternateLabelText); 221 return clone; 222 } 223 } 224}