123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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 = "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(sequenceRect, 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, "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;
- }
- }
- }
|