A game about forced loneliness, made by TACStudios
1using System.Collections.Generic;
2using UnityEngine;
3using UnityEditor.UIElements;
4using UnityEngine.UIElements;
5using UIElementButton = UnityEngine.UIElements.Button;
6
7namespace UnityEditor.U2D.Sprites
8{
9 internal partial class SpritePolygonModeModule : SpriteFrameModuleBase
10 {
11 private static class SpritePolygonModeStyles
12 {
13 public static readonly GUIContent changeShapeLabel = EditorGUIUtility.TrTextContent("Change Shape");
14 }
15
16 private VisualElement m_PolygonShapeView;
17 private UIElementButton m_ChangeButton;
18 private VisualElement m_WarningMessage;
19
20 // overrides for SpriteFrameModuleViewBase
21 private void AddMainUI(VisualElement element)
22 {
23 var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Packages/com.unity.2d.sprite/Editor/UI/SpriteEditor/PolygonChangeShapeWindow.uxml") as VisualTreeAsset;
24 m_PolygonShapeView = visualTree.CloneTree().Q<VisualElement>("polygonShapeWindow");
25 m_PolygonShapeView.RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
26 m_PolygonShapeView.RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
27 SetupPolygonChangeShapeWindowElements(m_PolygonShapeView);
28 element.Add(m_PolygonShapeView);
29 }
30
31 public override void DoMainGUI()
32 {
33 base.DoMainGUI();
34 DrawGizmos();
35
36 HandleGizmoMode();
37
38 HandleBorderCornerScalingHandles();
39 HandleBorderSidePointScalingSliders();
40
41 HandleBorderSideScalingHandles();
42 HandlePivotHandle();
43
44 if (!MouseOnTopOfInspector())
45 spriteEditor.HandleSpriteSelection();
46 }
47
48 public override void DoToolbarGUI(Rect toolbarRect)
49 {
50 using (new EditorGUI.DisabledScope(spriteEditor.editingDisabled))
51 {
52 GUIStyle skin = EditorStyles.toolbarPopup;
53 Rect drawArea = toolbarRect;
54 drawArea.width = skin.CalcSize(SpritePolygonModeStyles.changeShapeLabel).x;
55 SpriteUtilityWindow.DrawToolBarWidget(ref drawArea, ref toolbarRect, (adjustedDrawArea) =>
56 {
57 showChangeShapeWindow = GUI.Toggle(adjustedDrawArea, showChangeShapeWindow, SpritePolygonModeStyles.changeShapeLabel, EditorStyles.toolbarButton);
58 });
59 }
60 }
61
62 private void DrawGizmos()
63 {
64 if (eventSystem.current.type != EventType.Repaint)
65 return;
66 for (int i = 0; i < spriteCount; i++)
67 {
68 List<Vector2[]> outline = GetSpriteOutlineAt(i);
69 Vector2 offset = GetSpriteRectAt(i).size * 0.5f;
70 if (outline.Count > 0)
71 {
72 SpriteEditorUtility.BeginLines(new Color(0.75f, 0.75f, 0.75f, 0.75f));
73 for (int j = 0; j < outline.Count; ++j)
74 {
75 for (int k = 0, last = outline[j].Length - 1; k < outline[j].Length; last = k, ++k)
76 SpriteEditorUtility.DrawLine(outline[j][last] + offset, outline[j][k] + offset);
77 }
78 SpriteEditorUtility.EndLines();
79 }
80 }
81 DrawSpriteRectGizmos();
82 }
83
84 private void ViewUpdateSideCountField()
85 {
86 var sidesField = m_PolygonShapeView.Q<IntegerField>("labelIntegerField");
87 sidesField.value = polygonSides;
88 }
89
90 private void SetupPolygonChangeShapeWindowElements(VisualElement moduleView)
91 {
92 var sidesField = moduleView.Q<IntegerField>("labelIntegerField");
93 sidesField.SetValueWithoutNotify(polygonSides);
94 sidesField.RegisterValueChangedCallback((evt) =>
95 {
96 polygonSides = (int)evt.newValue;
97 ShowHideWarningMessage();
98 });
99 m_ChangeButton = moduleView.Q<UIElementButton>("changeButton");
100 m_ChangeButton.RegisterCallback<MouseUpEvent>((e) =>
101 {
102 if (isSidesValid)
103 {
104 GeneratePolygonOutline();
105 showChangeShapeWindow = false;
106 }
107 });
108 m_WarningMessage = moduleView.Q("warning");
109 ShowHideWarningMessage();
110 }
111
112 void ShowHideWarningMessage()
113 {
114 m_WarningMessage.style.display = !isSidesValid ? DisplayStyle.Flex : DisplayStyle.None;
115 m_WarningMessage.style.position = m_WarningMessage.style.display == DisplayStyle.Flex ? Position.Relative : Position.Absolute;
116
117 m_ChangeButton.style.display = isSidesValid ? DisplayStyle.Flex : DisplayStyle.None;;
118 m_ChangeButton.style.position = m_ChangeButton.style.display == DisplayStyle.Flex ? Position.Relative : Position.Absolute;
119 }
120
121 private bool isSidesValid
122 {
123 get
124 {
125 return polygonSides == 0 || (polygonSides >= 3 && polygonSides <= 128);
126 }
127 }
128
129 public bool showChangeShapeWindow
130 {
131 get { return m_PolygonShapeView.style.display == DisplayStyle.Flex; }
132 set
133 {
134 var displayValue = value ? DisplayStyle.Flex : DisplayStyle.None;
135 if (m_PolygonShapeView.style.display == displayValue)
136 return;
137 m_PolygonShapeView.style.display = displayValue;
138 }
139 }
140 }
141}