Singularity/Library/PackageCache/com.unity.2d.sprite@1.0.0/Editor/SpriteEditorModule/SpriteFrameModule/SpriteFrameModuleView.cs

224 lines
8.2 KiB
C#
Raw Permalink Normal View History

2024-05-06 14:45:45 -04:00
using UnityEngine;
namespace UnityEditor.U2D.Sprites
{
internal partial class SpriteFrameModule : SpriteFrameModuleBase
{
private static class SpriteFrameModuleStyles
{
public static readonly GUIContent sliceButtonLabel = EditorGUIUtility.TrTextContent("Slice");
public static readonly GUIContent trimButtonLabel = EditorGUIUtility.TrTextContent("Trim", "Trims selected rectangle (T)");
}
// overrides for SpriteFrameModuleBase
public override void DoMainGUI()
{
base.DoMainGUI();
DrawSpriteRectGizmos();
DrawPotentialSpriteRectGizmos();
if (!spriteEditor.editingDisabled)
{
HandleGizmoMode();
if (containsMultipleSprites)
HandleRectCornerScalingHandles();
HandleBorderCornerScalingHandles();
HandleBorderSidePointScalingSliders();
if (containsMultipleSprites)
HandleRectSideScalingHandles();
HandleBorderSideScalingHandles();
HandlePivotHandle();
if (containsMultipleSprites)
HandleDragging();
spriteEditor.HandleSpriteSelection();
if (containsMultipleSprites)
{
HandleCreate();
HandleDelete();
HandleDuplicate();
}
spriteEditor.spriteRects = m_RectsCache.GetSpriteRects();
}
}
private void DrawPotentialSpriteRectGizmos()
{
if (m_PotentialRects != null && m_PotentialRects.Count > 0)
DrawRectGizmos(m_PotentialRects, Color.red);
}
public override void DoToolbarGUI(Rect toolbarRect)
{
using (new EditorGUI.DisabledScope(!containsMultipleSprites || spriteEditor.editingDisabled || m_TextureDataProvider.GetReadableTexture2D() == null))
{
GUIStyle skin = EditorStyles.toolbarPopup;
Rect drawArea = toolbarRect;
drawArea.width = skin.CalcSize(SpriteFrameModuleStyles.sliceButtonLabel).x;
SpriteUtilityWindow.DrawToolBarWidget(ref drawArea, ref toolbarRect, (adjustedDrawArea) =>
{
if (GUI.Button(adjustedDrawArea, SpriteFrameModuleStyles.sliceButtonLabel, skin))
{
if (SpriteEditorMenu.ShowAtPosition(adjustedDrawArea, this, m_TextureDataProvider))
GUIUtility.ExitGUI();
}
});
using (new EditorGUI.DisabledScope(!hasSelected))
{
drawArea.x += drawArea.width;
drawArea.width = skin.CalcSize(SpriteFrameModuleStyles.trimButtonLabel).x;
SpriteUtilityWindow.DrawToolBarWidget(ref drawArea, ref toolbarRect, (adjustedDrawArea) =>
{
if (GUI.Button(adjustedDrawArea, SpriteFrameModuleStyles.trimButtonLabel, EditorStyles.toolbarButton))
{
TrimAlpha();
Repaint();
}
});
}
}
}
private void HandleRectCornerScalingHandles()
{
if (!hasSelected)
return;
GUIStyle dragDot = styles.dragdot;
GUIStyle dragDotActive = styles.dragdotactive;
var color = Color.white;
Rect rect = new Rect(selectedSpriteRect);
float left = rect.xMin;
float right = rect.xMax;
float top = rect.yMax;
float bottom = rect.yMin;
EditorGUI.BeginChangeCheck();
HandleBorderPointSlider(ref left, ref top, MouseCursor.ResizeUpLeft, false, dragDot, dragDotActive, color);
HandleBorderPointSlider(ref right, ref top, MouseCursor.ResizeUpRight, false, dragDot, dragDotActive, color);
HandleBorderPointSlider(ref left, ref bottom, MouseCursor.ResizeUpRight, false, dragDot, dragDotActive, color);
HandleBorderPointSlider(ref right, ref bottom, MouseCursor.ResizeUpLeft, false, dragDot, dragDotActive, color);
if (EditorGUI.EndChangeCheck())
{
rect.xMin = left;
rect.xMax = right;
rect.yMax = top;
rect.yMin = bottom;
ScaleSpriteRect(rect);
PopulateSpriteFrameInspectorField();
}
}
private void HandleRectSideScalingHandles()
{
if (!hasSelected)
return;
Rect rect = new Rect(selectedSpriteRect);
float left = rect.xMin;
float right = rect.xMax;
float top = rect.yMax;
float bottom = rect.yMin;
Vector2 screenRectTopLeft = Handles.matrix.MultiplyPoint(new Vector3(rect.xMin, rect.yMin));
Vector2 screenRectBottomRight = Handles.matrix.MultiplyPoint(new Vector3(rect.xMax, rect.yMax));
float screenRectWidth = Mathf.Abs(screenRectBottomRight.x - screenRectTopLeft.x);
float screenRectHeight = Mathf.Abs(screenRectBottomRight.y - screenRectTopLeft.y);
EditorGUI.BeginChangeCheck();
left = HandleBorderScaleSlider(left, rect.yMax, screenRectWidth, screenRectHeight, true);
right = HandleBorderScaleSlider(right, rect.yMax, screenRectWidth, screenRectHeight, true);
top = HandleBorderScaleSlider(rect.xMin, top, screenRectWidth, screenRectHeight, false);
bottom = HandleBorderScaleSlider(rect.xMin, bottom, screenRectWidth, screenRectHeight, false);
if (EditorGUI.EndChangeCheck())
{
rect.xMin = left;
rect.xMax = right;
rect.yMax = top;
rect.yMin = bottom;
ScaleSpriteRect(rect);
PopulateSpriteFrameInspectorField();
}
}
private void HandleDragging()
{
if (hasSelected && !MouseOnTopOfInspector())
{
Rect textureBounds = new Rect(0, 0, textureActualWidth, textureActualHeight);
EditorGUI.BeginChangeCheck();
Rect oldRect = selectedSpriteRect;
Rect newRect = SpriteEditorUtility.ClampedRect(SpriteEditorUtility.RoundedRect(SpriteEditorHandles.SliderRect(oldRect)), textureBounds, true);
if (EditorGUI.EndChangeCheck())
{
selectedSpriteRect = newRect;
UpdatePositionField(null);
}
}
}
private void HandleCreate()
{
if (!MouseOnTopOfInspector() && !eventSystem.current.alt)
{
// Create new rects via dragging in empty space
EditorGUI.BeginChangeCheck();
Rect newRect = SpriteEditorHandles.RectCreator(textureActualWidth, textureActualHeight, styles.createRect);
if (EditorGUI.EndChangeCheck() && newRect.width > 0f && newRect.height > 0f)
{
CreateSprite(newRect);
GUIUtility.keyboardControl = 0;
}
}
}
private void HandleDuplicate()
{
IEvent evt = eventSystem.current;
if ((evt.type == EventType.ValidateCommand || evt.type == EventType.ExecuteCommand)
&& evt.commandName == EventCommandNames.Duplicate)
{
if (evt.type == EventType.ExecuteCommand)
DuplicateSprite();
evt.Use();
}
}
private void HandleDelete()
{
IEvent evt = eventSystem.current;
if ((evt.type == EventType.ValidateCommand || evt.type == EventType.ExecuteCommand)
&& (evt.commandName == EventCommandNames.SoftDelete || evt.commandName == EventCommandNames.Delete))
{
if (evt.type == EventType.ExecuteCommand && hasSelected)
DeleteSprite();
evt.Use();
}
}
}
}