225 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using UnityEngine;
 | |
| using UnityEngine.UIElements;
 | |
| 
 | |
| namespace UnityEditor.U2D.Sprites.SpriteEditorTool
 | |
| {
 | |
|     [UxmlElement]
 | |
|     internal partial class SpriteOutlineToolOverlayPanel : VisualElement
 | |
|     {
 | |
|         static readonly string kGenerateSingle = L10n.Tr("Generate");
 | |
|         static readonly string kGenerateAll = L10n.Tr("Generate All");
 | |
|         static readonly string kForceGenerate = L10n.Tr("Force Generate All");
 | |
| 
 | |
|         FloatField m_OutlineDetailField;
 | |
|         IntegerField m_AlphaToleranceField;
 | |
|         Slider m_OutlineDetailSlider;
 | |
|         SliderInt m_AlphaToleranceSlider;
 | |
|         Toggle m_SnapToggle;
 | |
|         Toggle m_OptimizeOutline;
 | |
|         Toggle m_ForceGenerate;
 | |
|         Button m_GenerateButton;
 | |
|         Button m_CopyButton;
 | |
|         Button m_PasteButton;
 | |
| 
 | |
|         public event Action<bool> onGenerateOutline = _ => { };
 | |
|         public event Action<int> onAlphaToleranceChanged = _ => { };
 | |
|         public event Action<float> onOutlineDetailChanged  = _ => { };
 | |
|         public event Action onCopy = () => { };
 | |
|         public event Action onPaste = () => { };
 | |
|         public event Action onPasteAll = () => { };
 | |
|         public event Action onPasteAlternate = () => { };
 | |
|         public event Action onPasteAlternateAll = () => { };
 | |
| 
 | |
|         public bool snapOn
 | |
|         {
 | |
|             get { return m_SnapToggle.value; }
 | |
|             set { m_SnapToggle.SetValueWithoutNotify(value); }
 | |
|         }
 | |
| 
 | |
|         public float outlineDetail
 | |
|         {
 | |
|             get { return m_OutlineDetailField.value; }
 | |
|             set
 | |
|             {
 | |
|                 m_OutlineDetailField.SetValueWithoutNotify(value);
 | |
|                 m_OutlineDetailSlider.SetValueWithoutNotify(value);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public int alphaTolerance
 | |
|         {
 | |
|             get { return m_AlphaToleranceField.value; }
 | |
|             set
 | |
|             {
 | |
|                 m_AlphaToleranceField.SetValueWithoutNotify(value);
 | |
|                 m_AlphaToleranceSlider.SetValueWithoutNotify(value);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool optimizeOutline
 | |
|         {
 | |
|             get => m_OptimizeOutline.value;
 | |
|             set => m_OptimizeOutline.SetValueWithoutNotify(value);
 | |
|         }
 | |
| 
 | |
|         public SpriteOutlineToolOverlayPanel()
 | |
|         {
 | |
|             styleSheets.Add(AssetDatabase.LoadAssetAtPath<StyleSheet>("Packages/com.unity.2d.sprite/Editor/UI/SpriteEditor/SpriteOutlineToolOverlayPanelStyle.uss"));
 | |
|             RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
 | |
|             RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
 | |
|         }
 | |
| 
 | |
| 
 | |
|         public void SetPanelMode(bool hasSelection)
 | |
|         {
 | |
|             if (hasSelection)
 | |
|             {
 | |
|                 m_GenerateButton.text = kGenerateSingle;
 | |
|                 m_CopyButton.SetEnabled(true);
 | |
|                 m_PasteButton.SetEnabled(true);
 | |
|                 m_ForceGenerate.SetEnabled(false);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 UpdateGenerateAllButtonText();
 | |
|                 m_CopyButton.SetEnabled(false);
 | |
|                 m_PasteButton.SetEnabled(false);
 | |
|                 m_ForceGenerate.SetEnabled(true);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void UpdateGenerateAllButtonText()
 | |
|         {
 | |
|             m_GenerateButton.text = m_ForceGenerate.value ? kForceGenerate : kGenerateAll;
 | |
|         }
 | |
| 
 | |
|         void GenerateOutline()
 | |
|         {
 | |
|             onGenerateOutline(m_ForceGenerate.value);
 | |
|         }
 | |
| 
 | |
|         void OnCopy()
 | |
|         {
 | |
|             onCopy();
 | |
|         }
 | |
| 
 | |
|         void OnPaste()
 | |
|         {
 | |
|             onPaste();
 | |
|         }
 | |
| 
 | |
|         void OnPasteAll()
 | |
|         {
 | |
|             onPasteAll();
 | |
|         }
 | |
| 
 | |
|         void OnPasteAlternate()
 | |
|         {
 | |
|             onPasteAlternate();
 | |
|         }
 | |
| 
 | |
|         void OnPasteAlternateAll()
 | |
|         {
 | |
|             onPasteAlternateAll();
 | |
|         }
 | |
| 
 | |
|         void OnForceGenerateChanged(ChangeEvent<bool> _)
 | |
|         {
 | |
|             UpdateGenerateAllButtonText();
 | |
|         }
 | |
| 
 | |
|         private void BindElements(string alternateLabelText)
 | |
|         {
 | |
|             m_GenerateButton = this.Q<Button>("GenerateButton");
 | |
|             m_GenerateButton.clickable.clicked += GenerateOutline;
 | |
|             m_GenerateButton.AddManipulator(m_GenerateButton.clickable);
 | |
| 
 | |
|             m_CopyButton = this.Q<Button>("CopyButton");
 | |
|             m_CopyButton.clickable.clicked += OnCopy;
 | |
|             m_CopyButton.AddManipulator(m_CopyButton.clickable);
 | |
| 
 | |
|             m_PasteButton = this.Q<Button>("PasteButton");
 | |
|             m_PasteButton.clickable.clicked += OnPaste;
 | |
|             m_PasteButton.AddManipulator(m_PasteButton.clickable);
 | |
| 
 | |
|             m_ForceGenerate = this.Q<Toggle>("ForceGenerateToggle");
 | |
|             m_ForceGenerate.RegisterValueChangedCallback(OnForceGenerateChanged);
 | |
| 
 | |
|             var button = this.Q<Button>("PasteAllButton");
 | |
|             button.clickable.clicked += OnPasteAll;
 | |
|             button.AddManipulator(button.clickable);
 | |
| 
 | |
|             button = this.Q<Button>("PasteAlternateButton");
 | |
|             button.clickable.clicked += OnPasteAlternate;
 | |
|             button.AddManipulator(button.clickable);
 | |
| 
 | |
|             button = this.Q<Button>("PasteAlternateAllButton");
 | |
|             button.clickable.clicked += OnPasteAlternateAll;
 | |
|             button.AddManipulator(button.clickable);
 | |
| 
 | |
|             var alternateLabel = this.Q<Label>("PasteAlternateLabel");
 | |
|             alternateLabel.text = alternateLabelText;
 | |
| 
 | |
|             m_OutlineDetailField = this.Q<FloatField>("OutlineDetailField");
 | |
|             m_AlphaToleranceField = this.Q<IntegerField>("AlphaToleranceField");
 | |
|             m_SnapToggle = this.Q<Toggle>("SnapToggle");
 | |
|             m_OptimizeOutline = this.Q<Toggle>("OptimizeOutlineToggle");
 | |
| 
 | |
|             m_OutlineDetailSlider = this.Q<Slider>("OutlineDetailSlider");
 | |
|             m_OutlineDetailSlider.RegisterValueChangedCallback((evt) =>
 | |
|             {
 | |
|                 if (!evt.newValue.Equals(m_OutlineDetailField.value))
 | |
|                 {
 | |
|                     m_OutlineDetailField.SetValueWithoutNotify(evt.newValue);
 | |
|                     onOutlineDetailChanged(evt.newValue);
 | |
|                 }
 | |
| 
 | |
|             });
 | |
|             m_OutlineDetailField.RegisterValueChangedCallback((evt) =>
 | |
|             {
 | |
|                 var newValue = evt.newValue;
 | |
|                 if (!newValue.Equals(m_OutlineDetailSlider.value))
 | |
|                 {
 | |
|                     newValue = Math.Min(newValue, m_OutlineDetailSlider.highValue);
 | |
|                     newValue = Math.Max(newValue, m_OutlineDetailSlider.lowValue);
 | |
|                     m_OutlineDetailSlider.value = newValue;
 | |
|                     m_OutlineDetailField.SetValueWithoutNotify(newValue);
 | |
|                     onOutlineDetailChanged(evt.newValue);
 | |
|                 }
 | |
|             });
 | |
| 
 | |
|             m_AlphaToleranceSlider = this.Q<SliderInt>("AlphaToleranceSlider");
 | |
|             m_AlphaToleranceSlider.RegisterValueChangedCallback((evt) =>
 | |
|             {
 | |
|                 if (!evt.newValue.Equals(m_OutlineDetailField.value))
 | |
|                 {
 | |
|                     m_AlphaToleranceField.SetValueWithoutNotify(evt.newValue);
 | |
|                     onAlphaToleranceChanged(evt.newValue);
 | |
|                 }
 | |
| 
 | |
|             });
 | |
|             m_AlphaToleranceField.RegisterValueChangedCallback((evt) =>
 | |
|             {
 | |
|                 var newValue = evt.newValue;
 | |
|                 if (!newValue.Equals(m_AlphaToleranceSlider.value))
 | |
|                 {
 | |
|                     newValue = Math.Min(newValue, m_AlphaToleranceSlider.highValue);
 | |
|                     newValue = Math.Max(newValue, m_AlphaToleranceSlider.lowValue);
 | |
|                     m_AlphaToleranceSlider.value = newValue;
 | |
|                     m_AlphaToleranceField.SetValueWithoutNotify(newValue);
 | |
|                     onAlphaToleranceChanged(evt.newValue);
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         public static SpriteOutlineToolOverlayPanel GenerateFromUXML(string alternateLabelText)
 | |
|         {
 | |
|             var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Packages/com.unity.2d.sprite/Editor/UI/SpriteEditor/SpriteOutlineToolOverlayPanel.uxml");
 | |
|             var clone = visualTree.CloneTree().Q<SpriteOutlineToolOverlayPanel>("SpriteOutlineToolOverlayPanel");
 | |
|             clone.BindElements(alternateLabelText);
 | |
|             return clone;
 | |
|         }
 | |
|     }
 | |
| }
 |