200 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace UnityEditor.Timeline
 | |
| {
 | |
|     class EditModeInputHandler
 | |
|     {
 | |
|         readonly MoveInputHandler m_MoveHandler;
 | |
|         readonly TrimInputHandler m_TrimHandler;
 | |
| 
 | |
|         public EditModeInputHandler()
 | |
|         {
 | |
|             m_MoveHandler = new MoveInputHandler();
 | |
|             m_TrimHandler = new TrimInputHandler();
 | |
|         }
 | |
| 
 | |
|         public void ProcessMove(InputEvent action, double value)
 | |
|         {
 | |
|             if (TimelineWindow.instance != null && TimelineWindow.instance.state != null)
 | |
|                 ProcessInputAction(m_MoveHandler, action, value, TimelineWindow.instance.state);
 | |
|         }
 | |
| 
 | |
|         public void ProcessTrim(InputEvent action, double value, bool stretch)
 | |
|         {
 | |
|             if (TimelineWindow.instance != null && TimelineWindow.instance.state != null)
 | |
|             {
 | |
|                 m_TrimHandler.stretch = stretch;
 | |
|                 ProcessInputAction(m_TrimHandler, action, value, TimelineWindow.instance.state);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void SetValueForEdge(IEnumerable<ITimelineItem> items, AttractedEdge edge, double value)
 | |
|         {
 | |
|             if (TimelineWindow.instance != null && TimelineWindow.instance.state != null)
 | |
|                 MoveInputHandler.SetValueForEdge(items, edge, value, TimelineWindow.instance.state);
 | |
|         }
 | |
| 
 | |
|         public void OnGUI(WindowState state, Event evt)
 | |
|         {
 | |
|             if (TimelineWindow.instance != null && TimelineWindow.instance.state != null)
 | |
|             {
 | |
|                 m_MoveHandler.OnGUI(evt);
 | |
|                 m_TrimHandler.OnGUI(state);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         static void ProcessInputAction(IInputHandler handler, InputEvent action, double value, WindowState state)
 | |
|         {
 | |
|             var items = SelectionManager.SelectedItems();
 | |
|             switch (action)
 | |
|             {
 | |
|                 case InputEvent.None:
 | |
|                     return;
 | |
|                 case InputEvent.DragEnter:
 | |
|                     handler.OnEnterDrag(items, state);
 | |
|                     break;
 | |
|                 case InputEvent.Drag:
 | |
|                     handler.OnDrag(value, state);
 | |
|                     break;
 | |
|                 case InputEvent.DragExit:
 | |
|                     handler.OnExitDrag();
 | |
|                     break;
 | |
|                 case InputEvent.KeyboardInput:
 | |
|                     handler.OnSetValue(items, value, state);
 | |
|                     break;
 | |
|                 default:
 | |
|                     return;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         interface IInputHandler
 | |
|         {
 | |
|             void OnEnterDrag(IEnumerable<ITimelineItem> items, WindowState state);
 | |
|             void OnDrag(double value, WindowState state);
 | |
|             void OnExitDrag();
 | |
|             void OnSetValue(IEnumerable<ITimelineItem> items, double value, WindowState state);
 | |
|         }
 | |
| 
 | |
|         class TrimInputHandler : IInputHandler
 | |
|         {
 | |
|             bool isDragging { get; set; }
 | |
|             public bool stretch { get; set; }
 | |
| 
 | |
|             IEnumerable<ITimelineItem> grabbedItems { get; set; }
 | |
| 
 | |
|             public void OnEnterDrag(IEnumerable<ITimelineItem> items, WindowState state)
 | |
|             {
 | |
|                 grabbedItems = items.OfType<ITrimmable>().ToArray();
 | |
|                 foreach (var item in grabbedItems)
 | |
|                 {
 | |
|                     EditMode.BeginTrim(item, TrimEdge.End);
 | |
|                 }
 | |
| 
 | |
|                 isDragging = true;
 | |
|             }
 | |
| 
 | |
|             public void OnDrag(double endValue, WindowState state)
 | |
|             {
 | |
|                 var trimValue = endValue;
 | |
|                 trimValue = TimeReferenceUtility.SnapToFrameIfRequired(trimValue);
 | |
| 
 | |
|                 foreach (var item in grabbedItems)
 | |
|                 {
 | |
|                     EditMode.TrimEnd(item, trimValue, stretch);
 | |
|                 }
 | |
|                 state.UpdateRootPlayableDuration(state.editSequence.duration);
 | |
|             }
 | |
| 
 | |
|             public void OnExitDrag()
 | |
|             {
 | |
|                 isDragging = false;
 | |
|                 EditMode.FinishTrim();
 | |
|                 TimelineWindow.instance.Repaint();
 | |
|             }
 | |
| 
 | |
|             public void OnSetValue(IEnumerable<ITimelineItem> items, double endValue, WindowState state)
 | |
|             {
 | |
|                 foreach (var item in items.OfType<ITrimmable>())
 | |
|                 {
 | |
|                     EditMode.BeginTrim(item, TrimEdge.End);
 | |
|                     EditMode.TrimEnd(item, endValue, stretch);
 | |
|                     EditMode.FinishTrim();
 | |
|                 }
 | |
|                 state.UpdateRootPlayableDuration(state.editSequence.duration);
 | |
|             }
 | |
| 
 | |
|             public void OnGUI(WindowState state)
 | |
|             {
 | |
|                 if (!isDragging) return;
 | |
| 
 | |
|                 foreach (var item in grabbedItems)
 | |
|                 {
 | |
|                     EditMode.DrawTrimGUI(state, item.gui, TrimEdge.End);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         class MoveInputHandler : IInputHandler
 | |
|         {
 | |
|             MoveItemHandler m_MoveItemHandler;
 | |
| 
 | |
|             public void OnEnterDrag(IEnumerable<ITimelineItem> items, WindowState state)
 | |
|             {
 | |
|                 if (items.Any())
 | |
|                 {
 | |
|                     m_MoveItemHandler = new MoveItemHandler(state);
 | |
|                     m_MoveItemHandler.Grab(items, items.First().parentTrack);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             public void OnDrag(double value, WindowState state)
 | |
|             {
 | |
|                 if (m_MoveItemHandler == null) return;
 | |
| 
 | |
|                 var startValue = value;
 | |
|                 startValue = TimeReferenceUtility.SnapToFrameIfRequired(startValue);
 | |
|                 m_MoveItemHandler.OnAttractedEdge(null, ManipulateEdges.Both, AttractedEdge.None, startValue);
 | |
|             }
 | |
| 
 | |
|             public void OnExitDrag()
 | |
|             {
 | |
|                 if (m_MoveItemHandler == null) return;
 | |
| 
 | |
|                 m_MoveItemHandler.Drop();
 | |
|                 m_MoveItemHandler = null;
 | |
|                 GUIUtility.ExitGUI();
 | |
|             }
 | |
| 
 | |
|             public void OnSetValue(IEnumerable<ITimelineItem> items, double value, WindowState state)
 | |
|             {
 | |
|                 if (!items.Any()) return;
 | |
| 
 | |
|                 m_MoveItemHandler = new MoveItemHandler(state);
 | |
|                 m_MoveItemHandler.Grab(items, items.First().parentTrack);
 | |
|                 m_MoveItemHandler.OnAttractedEdge(null, ManipulateEdges.Both, AttractedEdge.None, value);
 | |
|                 m_MoveItemHandler.Drop();
 | |
|                 m_MoveItemHandler = null;
 | |
|             }
 | |
| 
 | |
|             public void OnGUI(Event evt)
 | |
|             {
 | |
|                 if (m_MoveItemHandler != null)
 | |
|                     m_MoveItemHandler.OnGUI(evt);
 | |
|             }
 | |
| 
 | |
|             public static void SetValueForEdge(IEnumerable<ITimelineItem> items, AttractedEdge edge, double value, WindowState state)
 | |
|             {
 | |
|                 var handler = new MoveItemHandler(state);
 | |
|                 foreach (var item in items)
 | |
|                 {
 | |
|                     handler.Grab(new[] { item }, item.parentTrack);
 | |
|                     handler.OnAttractedEdge(null, ManipulateEdges.Both, edge, value);
 | |
|                     handler.Drop();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |