rimworld-animation-studio/Library/PackageCache/com.unity.timeline@1.2.18/Editor/Manipulators/TimeAreaAutoPanner.cs
2022-09-13 00:36:34 -05:00

72 lines
2.1 KiB
C#

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;
}
}
}