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