129 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using UnityEngine;
 | |
| using UnityEngine.Timeline;
 | |
| 
 | |
| namespace UnityEditor.Timeline
 | |
| {
 | |
|     partial class TimelineWindow
 | |
|     {
 | |
|         TimeAreaItem m_TimelineDuration;
 | |
| 
 | |
|         void DurationGUI(TimelineItemArea area, double duration)
 | |
|         {
 | |
|             // don't show the duration if the time area is not visible for some other reason.
 | |
|             if (!currentMode.ShouldShowTimeArea(state))
 | |
|                 return;
 | |
| 
 | |
|             bool headerMode = area == TimelineItemArea.Header;
 | |
| 
 | |
|             if (state.IsEditingASubTimeline())
 | |
|             {
 | |
|                 if (headerMode)
 | |
|                     HighlightTimeAreaRange(state.editSequence.GetEvaluableRange(), DirectorStyles.Instance.customSkin.colorSubSequenceDurationLine);
 | |
| 
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             // don't show the duration if there's none.
 | |
|             if (state.editSequence.asset.durationMode == TimelineAsset.DurationMode.BasedOnClips && duration <= 0.0f)
 | |
|                 return;
 | |
| 
 | |
|             if (m_TimelineDuration == null || m_TimelineDuration.style != styles.endmarker)
 | |
|             {
 | |
|                 m_TimelineDuration = new TimeAreaItem(styles.endmarker, OnTrackDurationDrag)
 | |
|                 {
 | |
|                     tooltip = L10n.Tr("End of sequence marker"),
 | |
|                     boundOffset = new Vector2(0.0f, -DirectorStyles.kDurationGuiThickness)
 | |
|                 };
 | |
|             }
 | |
| 
 | |
|             DrawDuration(headerMode, !headerMode, duration);
 | |
|         }
 | |
| 
 | |
|         void DrawDuration(bool drawhead, bool drawline, double duration)
 | |
|         {
 | |
|             if (state.TimeIsInRange((float)duration))
 | |
|             {
 | |
|                 // Set the colors based on the mode
 | |
|                 Color lineColor = DirectorStyles.Instance.customSkin.colorEndmarker;
 | |
|                 Color headColor = Color.white;
 | |
| 
 | |
|                 bool canMoveHead = !EditorApplication.isPlaying && state.editSequence.asset.durationMode == TimelineAsset.DurationMode.FixedLength;
 | |
| 
 | |
|                 if (canMoveHead)
 | |
|                 {
 | |
|                     if (Event.current.type == EventType.MouseDown)
 | |
|                     {
 | |
|                         if (m_TimelineDuration.bounds.Contains(Event.current.mousePosition))
 | |
|                         {
 | |
|                             if (m_PlayHead != null && m_PlayHead.bounds.Contains(Event.current.mousePosition))
 | |
|                             {
 | |
|                                 // ignore duration markers if the mouse is over the TimeCursor.
 | |
|                                 canMoveHead = false;
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     lineColor.a *= 0.66f;
 | |
|                     headColor = DirectorStyles.Instance.customSkin.colorDuration;
 | |
|                 }
 | |
| 
 | |
|                 if (canMoveHead)
 | |
|                     m_TimelineDuration.HandleManipulatorsEvents(state);
 | |
| 
 | |
|                 m_TimelineDuration.lineColor = lineColor;
 | |
|                 m_TimelineDuration.headColor = headColor;
 | |
|                 m_TimelineDuration.drawHead = drawhead;
 | |
|                 m_TimelineDuration.drawLine = drawline;
 | |
|                 m_TimelineDuration.canMoveHead = canMoveHead;
 | |
| 
 | |
|                 // Draw the TimeAreaItem
 | |
|                 // Rect trackheadRect = treeviewBounds;
 | |
|                 //trackheadRect.height = clientArea.height;
 | |
|                 m_TimelineDuration.Draw(sequenceContentRect, state, duration);
 | |
|             }
 | |
| 
 | |
|             // Draw Blue line in timeline indicating the duration...
 | |
|             if (state.editSequence.asset != null && drawhead)
 | |
|             {
 | |
|                 HighlightTimeAreaRange(state.editSequence.GetEvaluableRange(), DirectorStyles.Instance.customSkin.colorDurationLine);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void HighlightTimeAreaRange(Range range, Color lineColor)
 | |
|         {
 | |
|             if (range.length <= 0.0 || !state.RangeIsVisible(range)) return;
 | |
| 
 | |
|             Rect lineRect = Rect.MinMaxRect(
 | |
|                 Math.Max(state.TimeToPixel(range.start), state.timeAreaRect.xMin),
 | |
|                 state.timeAreaRect.y - DirectorStyles.kDurationGuiThickness + state.timeAreaRect.height,
 | |
|                 Math.Min(state.TimeToPixel(range.end), state.timeAreaRect.xMax),
 | |
|                 state.timeAreaRect.y + state.timeAreaRect.height);
 | |
|             EditorGUI.DrawRect(lineRect, lineColor);
 | |
|         }
 | |
| 
 | |
|         // Drag handler for the gui
 | |
|         void OnTrackDurationDrag(double newTime)
 | |
|         {
 | |
|             if (state.editSequence.asset.durationMode == TimelineAsset.DurationMode.FixedLength && !state.editSequence.isReadOnly)
 | |
|             {
 | |
|                 // this is the first call to the drag
 | |
|                 if (m_TimelineDuration.firstDrag)
 | |
|                 {
 | |
|                     UndoExtensions.RegisterTimeline(state.editSequence.asset, L10n.Tr("Change Duration"));
 | |
|                 }
 | |
| 
 | |
|                 state.editSequence.asset.fixedDuration = newTime;
 | |
| 
 | |
|                 // when setting a new length, modify the duration of the timeline playable directly instead of
 | |
|                 //  rebuilding the whole graph
 | |
|                 state.UpdateRootPlayableDuration(newTime);
 | |
|             }
 | |
| 
 | |
|             m_TimelineDuration.showTooltip = true;
 | |
|         }
 | |
|     }
 | |
| }
 |