73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			73 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; | ||
|  |         } | ||
|  |     } | ||
|  | } |