| using UnityEngine; |
|
|
| namespace UnityEditor.Timeline |
| { |
| class TimeAreaAutoPanner |
| { |
| readonly WindowState m_State; |
| readonly TimelineWindow m_Window; |
| readonly Rect m_ViewRect; |
|
|
| const float k_PixelDistanceToMaxSpeed = 100.0f; |
| const float k_MaxPanSpeed = 30.0f; |
|
|
| public TimeAreaAutoPanner(WindowState state) |
| { |
| m_State = state; |
| m_Window = m_State.GetWindow(); |
|
|
| var shownRange = m_State.timeAreaShownRange; |
| var trackViewBounds = m_Window.sequenceRect; |
| m_ViewRect = Rect.MinMaxRect(m_State.TimeToPixel(shownRange.x), trackViewBounds.yMin, |
| m_State.TimeToPixel(shownRange.y), trackViewBounds.yMax); |
| } |
|
|
| public void OnGUI(Event evt) |
| { |
| if (evt.type != EventType.Layout) |
| return; |
|
|
| var hFactor = 0.0f; |
| var vFactor = 0.0f; |
|
|
| bool horizontalPan = GetPanFactor(evt.mousePosition.x, m_ViewRect.xMin, m_ViewRect.xMax, out hFactor); |
| bool verticalPan = GetPanFactor(evt.mousePosition.y, m_ViewRect.yMin, m_ViewRect.yMax, out vFactor); |
|
|
| if (horizontalPan) |
| { |
| var translation = m_State.timeAreaTranslation; |
| translation.x += hFactor * k_MaxPanSpeed; |
|
|
| m_State.SetTimeAreaTransform(translation, m_State.timeAreaScale); |
| } |
|
|
| if (verticalPan) |
| { |
| var translation = m_Window.treeView.scrollPosition; |
| translation.y -= vFactor * k_MaxPanSpeed; |
|
|
| m_Window.treeView.scrollPosition = translation; |
| } |
| } |
|
|
| static bool GetPanFactor(float v, float min, float max, out float factor) |
| { |
| factor = 0.0f; |
|
|
| if (v < min) |
| { |
| factor = Mathf.Clamp01((min - v) / k_PixelDistanceToMaxSpeed); |
| return true; |
| } |
|
|
| if (v > max) |
| { |
| factor = -Mathf.Clamp01((v - max) / k_PixelDistanceToMaxSpeed); |
| return true; |
| } |
|
|
| return false; |
| } |
| } |
| } |
|
|