224 lines
8.2 KiB
C#
224 lines
8.2 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|