説明なし
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

SpriteOutlineOverlay.cs 8.0KB

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