You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.1 KiB
72 lines
2.1 KiB
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; |
|
} |
|
} |
|
}
|
|
|