summaryrefslogtreecommitdiff
path: root/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/RectangleTool.cs
diff options
context:
space:
mode:
authorAndrew Lee <alee14498@protonmail.com>2020-04-19 17:19:32 -0400
committerAndrew Lee <alee14498@protonmail.com>2020-04-19 17:19:32 -0400
commitc55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78 (patch)
treeee4d51c7c1d633e11f46453ef1edd3c77c4ef9f7 /Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/RectangleTool.cs
downloadProject-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.gz
Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.bz2
Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.zip
Inital commit
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/RectangleTool.cs')
-rw-r--r--Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/RectangleTool.cs169
1 files changed, 169 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/RectangleTool.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/RectangleTool.cs
new file mode 100644
index 0000000..5de1eb6
--- /dev/null
+++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/RectangleTool.cs
@@ -0,0 +1,169 @@
+using System;
+using UnityEngine;
+
+namespace UnityEditor.Timeline
+{
+ abstract class RectangleTool
+ {
+ struct TimelinePoint
+ {
+ readonly double m_Time;
+ readonly float m_YPos;
+ readonly float m_YScrollPos;
+
+ readonly WindowState m_State;
+ readonly TimelineTreeViewGUI m_TreeViewGUI;
+
+ public TimelinePoint(WindowState state, Vector2 mousePosition)
+ {
+ m_State = state;
+ m_TreeViewGUI = state.GetWindow().treeView;
+
+ m_Time = m_State.PixelToTime(mousePosition.x);
+ m_YPos = mousePosition.y;
+ m_YScrollPos = m_TreeViewGUI.scrollPosition.y;
+ }
+
+ public Vector2 ToPixel()
+ {
+ return new Vector2(m_State.TimeToPixel(m_Time), m_YPos - (m_TreeViewGUI.scrollPosition.y - m_YScrollPos));
+ }
+ }
+
+ TimeAreaAutoPanner m_TimeAreaAutoPanner;
+
+ TimelinePoint m_StartPoint;
+ Vector2 m_EndPixel = Vector2.zero;
+
+ Rect m_ActiveRect;
+
+ protected abstract bool enableAutoPan { get; }
+ protected abstract bool CanStartRectangle(Event evt, Vector2 mousePosition, WindowState state);
+ protected abstract bool OnFinish(Event evt, WindowState state, Rect rect);
+
+ int m_Id;
+
+ public void OnGUI(WindowState state, EventType rawType, Vector2 mousePosition)
+ {
+ if (m_Id == 0)
+ m_Id = GUIUtility.GetPermanentControlID();
+
+ if (state == null || state.GetWindow().treeView == null)
+ return;
+
+ var evt = Event.current;
+
+ if (rawType == EventType.MouseDown || evt.type == EventType.MouseDown)
+ {
+ if (state.IsCurrentEditingASequencerTextField())
+ return;
+
+ m_ActiveRect = TimelineWindow.instance.sequenceContentRect;
+
+ if (!m_ActiveRect.Contains(mousePosition))
+ return;
+
+ if (!CanStartRectangle(evt, mousePosition, state))
+ return;
+
+ if (enableAutoPan)
+ m_TimeAreaAutoPanner = new TimeAreaAutoPanner(state);
+
+ m_StartPoint = new TimelinePoint(state, mousePosition);
+ m_EndPixel = mousePosition;
+
+ GUIUtility.hotControl = m_Id; //HACK: Because the treeView eats all the events, steal the hotControl if necessary...
+ evt.Use();
+
+ return;
+ }
+
+ switch (evt.GetTypeForControl(m_Id))
+ {
+ case EventType.KeyDown:
+ {
+ if (GUIUtility.hotControl == m_Id)
+ {
+ if (evt.keyCode == KeyCode.Escape)
+ {
+ m_TimeAreaAutoPanner = null;
+
+ GUIUtility.hotControl = 0;
+ evt.Use();
+ }
+ }
+
+ return;
+ }
+
+ case EventType.MouseDrag:
+ {
+ if (GUIUtility.hotControl != m_Id)
+ return;
+
+ m_EndPixel = mousePosition;
+ evt.Use();
+
+ return;
+ }
+
+ case EventType.MouseUp:
+ {
+ if (GUIUtility.hotControl != m_Id)
+ return;
+
+ m_TimeAreaAutoPanner = null;
+
+ var rect = CurrentRectangle();
+
+ if (IsValidRect(rect))
+ OnFinish(evt, state, rect);
+
+ GUIUtility.hotControl = 0;
+ evt.Use();
+
+ return;
+ }
+ }
+
+ if (GUIUtility.hotControl == m_Id)
+ {
+ if (evt.type == EventType.Repaint)
+ {
+ var r = CurrentRectangle();
+
+ if (IsValidRect(r))
+ {
+ using (new GUIViewportScope(m_ActiveRect))
+ {
+ DrawRectangle(r);
+ }
+ }
+ }
+
+ if (m_TimeAreaAutoPanner != null)
+ m_TimeAreaAutoPanner.OnGUI(evt);
+ }
+ }
+
+ protected virtual void DrawRectangle(Rect rect)
+ {
+ EditorStyles.selectionRect.Draw(rect, GUIContent.none, false, false, false, false);
+ }
+
+ static bool IsValidRect(Rect rect)
+ {
+ return rect.width >= 1.0f && rect.height >= 1.0f;
+ }
+
+ Rect CurrentRectangle()
+ {
+ var startPixel = m_StartPoint.ToPixel();
+ return Rect.MinMaxRect(
+ Math.Min(startPixel.x, m_EndPixel.x),
+ Math.Min(startPixel.y, m_EndPixel.y),
+ Math.Max(startPixel.x, m_EndPixel.x),
+ Math.Max(startPixel.y, m_EndPixel.y));
+ }
+ }
+}