123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEditor.Timeline.Actions;
- using UnityEngine;
- using UnityEngine.Timeline;
- using Object = UnityEngine.Object;
-
- namespace UnityEditor.Timeline
- {
- class TimelineMarkerHeaderGUI : IRowGUI, ILayerable
- {
- static readonly GUIContent k_Muted = L10n.TextContent("Muted");
-
- int m_TrackHash;
- TimelineAsset timeline { get; }
- WindowState state { get; }
- MarkersLayer m_Layer;
- LayerZOrder m_ZOrder = new LayerZOrder(Layer.MarkerHeaderTrack, 0);
-
- struct DrawData
- {
- public Rect headerRect;
- public Rect contentRect;
- public GUIStyle trackHeaderFont;
- public Color colorTrackFont;
- public bool isMuted;
- public bool isSelected;
- }
-
- public TimelineMarkerHeaderGUI(TimelineAsset asset, WindowState state)
- {
- m_TrackHash = -1;
- timeline = asset;
- this.state = state;
- }
-
- public TrackAsset asset => timeline.markerTrack;
- public Rect boundingRect { get; private set; }
-
- public bool showMarkers => state.showMarkerHeader;
- public bool muted => timeline.markerTrack != null && timeline.markerTrack.muted;
- public bool locked => timeline.markerTrack.locked;
- public LayerZOrder zOrder => m_ZOrder;
-
- Rect IRowGUI.ToWindowSpace(Rect rect)
- {
- //header gui is already in global coordinates
- return rect;
- }
-
- public void Draw(Rect markerHeaderRect, Rect markerContentRect, WindowState state)
- {
- boundingRect = markerContentRect;
- var data = new DrawData
- {
- headerRect = markerHeaderRect,
- contentRect = markerContentRect,
- trackHeaderFont = DirectorStyles.Instance.trackHeaderFont,
- colorTrackFont = DirectorStyles.Instance.customSkin.colorTrackFont,
- isMuted = muted,
- isSelected = IsSelected()
- };
-
- if (state.showMarkerHeader)
- {
- DrawMarkerDrawer(data);
- if (Event.current.type == EventType.Repaint)
- state.spacePartitioner.AddBounds(this, boundingRect);
- }
-
- if (asset != null && Hash() != m_TrackHash)
- Rebuild();
-
- Rect rect = state.showMarkerHeader ? markerContentRect : state.timeAreaRect;
- using (new GUIViewportScope(rect))
- {
- if (m_Layer != null)
- m_Layer.Draw(rect, state);
-
- HandleDragAndDrop();
- }
-
- if (state.showMarkerHeader && data.isMuted)
- DrawMuteOverlay(data);
- }
-
- public void Rebuild()
- {
- if (asset == null)
- return;
-
- m_Layer = new MarkersLayer(Layer.MarkersOnHeader, this);
- m_TrackHash = Hash();
- }
-
- void HandleDragAndDrop()
- {
- if (state.editSequence.isReadOnly || !state.showMarkerHeader)
- return;
-
- if (Event.current == null || Event.current.type != EventType.DragUpdated &&
- Event.current.type != EventType.DragPerform && Event.current.type != EventType.DragExited)
- return;
-
- var objectsBeingDropped = DragAndDrop.objectReferences.OfType<Object>();
- var candidateTime = TimelineHelpers.GetCandidateTime(Event.current.mousePosition);
- var perform = Event.current.type == EventType.DragPerform;
- var director = state.editSequence != null ? state.editSequence.director : null;
- DragAndDrop.visualMode = TimelineDragging.HandleClipPaneObjectDragAndDrop(objectsBeingDropped, timeline.markerTrack, perform,
- timeline, null, director, candidateTime, ResolveType);
- if (perform && DragAndDrop.visualMode == DragAndDropVisualMode.Copy)
- {
- DragAndDrop.AcceptDrag();
- }
- }
-
- static bool ResolveType(IEnumerable<Type> types, Action<Type> onComplete, string formatString)
- {
- void CreateMarkerTrackOnComplete(Type type)
- {
- WindowState state = TimelineWindow.instance.state;
- state.editSequence.asset.CreateMarkerTrack();
- state.showMarkerHeader = true;
- onComplete(type);
- }
-
- return TimelineDragging.ResolveType(types, CreateMarkerTrackOnComplete, formatString);
- }
-
- int Hash()
- {
- return timeline.markerTrack == null ? 0 : timeline.markerTrack.Hash();
- }
-
- static void DrawMarkerDrawer(DrawData data)
- {
- DrawMarkerDrawerHeaderBackground(data);
- DrawMarkerDrawerHeader(data);
- DrawMarkerDrawerContentBackground(data);
- }
-
- static void DrawMarkerDrawerHeaderBackground(DrawData data)
- {
- Color backgroundColor = data.isSelected
- ? DirectorStyles.Instance.customSkin.colorSelection
- : DirectorStyles.Instance.customSkin.markerHeaderDrawerBackgroundColor;
- EditorGUI.DrawRect(data.headerRect, backgroundColor);
- }
-
- static void DrawMarkerDrawerHeader(DrawData data)
- {
- var textStyle = data.trackHeaderFont;
- textStyle.normal.textColor = data.colorTrackFont;
- var labelRect = data.headerRect;
- labelRect.x += DirectorStyles.kBaseIndent;
-
- EditorGUI.LabelField(labelRect, DirectorStyles.timelineMarkerTrackHeader);
-
- const float buttonSize = WindowConstants.trackHeaderButtonSize;
- const float padding = WindowConstants.trackHeaderButtonPadding;
- var x = data.headerRect.xMax - buttonSize - padding - 2f;
- var y = data.headerRect.y + (data.headerRect.height - buttonSize) / 2.0f;
- var buttonRect = new Rect(x, y, buttonSize, buttonSize);
-
- DrawTrackDropDownMenu(buttonRect);
- buttonRect.x -= 21.0f;
-
- DrawMuteButton(buttonRect, data);
- }
-
- static void DrawMarkerDrawerContentBackground(DrawData data)
- {
- Color trackBackgroundColor = DirectorStyles.Instance.customSkin.markerDrawerBackgroundColor;
- if (data.isSelected)
- trackBackgroundColor = DirectorStyles.Instance.customSkin.colorTrackBackgroundSelected;
- EditorGUI.DrawRect(data.contentRect, trackBackgroundColor);
- }
-
- static void DrawMuteOverlay(DrawData data)
- {
- DirectorStyles styles = TimelineWindow.styles;
-
- var colorOverlay = OverlayDrawer.CreateColorOverlay(GUIClip.Unclip(data.contentRect), styles.customSkin.colorTrackDarken);
- colorOverlay.Draw();
-
- Rect textRect = Graphics.CalculateTextBoxSize(data.contentRect, styles.fontClip, k_Muted, WindowConstants.overlayTextPadding);
- var boxOverlay = OverlayDrawer.CreateTextBoxOverlay(
- GUIClip.Unclip(textRect),
- k_Muted.text,
- styles.fontClip,
- Color.white,
- styles.customSkin.colorLockTextBG,
- styles.displayBackground);
- boxOverlay.Draw();
- }
-
- static void DrawTrackDropDownMenu(Rect rect)
- {
- if (GUI.Button(rect, GUIContent.none, DirectorStyles.Instance.trackOptions))
- {
- SelectionManager.SelectOnly(TimelineEditor.inspectedAsset.markerTrack);
- SequencerContextMenu.ShowTrackContextMenu(null);
- }
- }
-
- static void DrawMuteButton(Rect rect, DrawData data)
- {
- bool muted = GUI.Toggle(rect, data.isMuted, string.Empty, TimelineWindow.styles.trackMuteButton);
- if (muted != data.isMuted)
- new[] { TimelineEditor.inspectedAsset.markerTrack }.Invoke<MuteTrack>();
- }
-
- bool IsSelected()
- {
- return SelectionManager.Contains(asset);
- }
- }
- }
|