You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
8.6 KiB
214 lines
8.6 KiB
using UnityEditor.IMGUI.Controls; |
|
using UnityEngine; |
|
using UnityEngine.Timeline; |
|
|
|
namespace UnityEditor.Timeline |
|
{ |
|
abstract class TimelineTrackBaseGUI : TreeViewItem, IBounds |
|
{ |
|
static class Styles |
|
{ |
|
public static readonly GUIContent s_LockedAndMuted = L10n.TextContent("Locked / Muted"); |
|
public static readonly GUIContent s_LockedAndPartiallyMuted = L10n.TextContent("Locked / Partially Muted"); |
|
public static readonly GUIContent s_Locked = L10n.TextContent("Locked"); |
|
public static readonly GUIContent s_Muted = L10n.TextContent("Muted"); |
|
public static readonly GUIContent s_PartiallyMuted = L10n.TextContent("Partially Muted"); |
|
|
|
public static readonly GUIContent trackMuteBtnOnTooltip = L10n.TextContent(string.Empty, "Umute"); |
|
public static readonly GUIContent trackMuteBtnOffTooltip = L10n.TextContent(string.Empty, "Mute"); |
|
public static readonly GUIContent trackLockBtnOnTooltip = L10n.TextContent(string.Empty, "Unlock"); |
|
public static readonly GUIContent trackLockBtnOffTooltip = L10n.TextContent(string.Empty, "Lock"); |
|
|
|
public static readonly Texture2D lockBg = DirectorStyles.GetBackgroundImage(DirectorStyles.Instance.trackLockOverlay); |
|
} |
|
|
|
protected bool m_IsRoot = false; |
|
|
|
readonly TimelineTreeViewGUI m_TreeViewGUI; |
|
readonly TrackDrawer m_Drawer; |
|
|
|
public Vector2 treeViewToWindowTransformation { get; set; } |
|
public bool isExpanded { get; set; } |
|
public bool isDropTarget { protected get; set; } |
|
public TrackAsset track { get; } |
|
TreeViewController treeView { get; } |
|
|
|
public TimelineWindow TimelineWindow |
|
{ |
|
get |
|
{ |
|
if (m_TreeViewGUI == null) |
|
return null; |
|
|
|
return m_TreeViewGUI.TimelineWindow; |
|
} |
|
} |
|
|
|
public TrackDrawer drawer |
|
{ |
|
get { return m_Drawer; } |
|
} |
|
|
|
public virtual float GetVerticalSpacingBetweenTracks() |
|
{ |
|
return 3.0f; |
|
} |
|
|
|
public bool visibleRow { get; set; } // is the header row visible |
|
public bool visibleExpanded { get; set; } // is the expanded area (group) visible |
|
public bool drawInsertionMarkerBefore { get; set; } |
|
public bool drawInsertionMarkerAfter { get; set; } |
|
|
|
public abstract Rect boundingRect { get; } |
|
public abstract bool expandable { get; } |
|
public abstract void Draw(Rect headerRect, Rect contentRect, WindowState state); |
|
public abstract void OnGraphRebuilt(); // callback when the corresponding graph is rebuilt. This can happen, but not have the GUI rebuilt. |
|
|
|
protected TimelineTrackBaseGUI(int id, int depth, TreeViewItem parent, string displayName, TrackAsset trackAsset, TreeViewController tv, TimelineTreeViewGUI tvgui) |
|
: base(id, depth, parent, displayName) |
|
{ |
|
m_Drawer = TrackDrawer.CreateInstance(trackAsset); |
|
m_Drawer.sequencerState = tvgui.TimelineWindow.state; |
|
|
|
isExpanded = false; |
|
isDropTarget = false; |
|
track = trackAsset; |
|
treeView = tv; |
|
|
|
m_TreeViewGUI = tvgui; |
|
} |
|
|
|
public static TimelineTrackBaseGUI FindGUITrack(TrackAsset track) |
|
{ |
|
var allTracks = TimelineWindow.instance.allTracks; |
|
return allTracks.Find(x => x.track == track); |
|
} |
|
|
|
protected void DrawTrackState(Rect trackRect, Rect expandedRect, TrackAsset track) |
|
{ |
|
if (Event.current.type == EventType.Layout) |
|
{ |
|
bool needStateBox = false; |
|
|
|
//Mute |
|
if (track.muted && !TimelineUtility.IsParentMuted(track)) |
|
{ |
|
Rect bgRect = expandedRect; |
|
TimelineWindow.instance.OverlayDrawData.Add(OverlayDrawer.CreateColorOverlay( |
|
GUIClip.Unclip(bgRect), |
|
DirectorStyles.Instance.customSkin.colorTrackDarken)); |
|
needStateBox = true; |
|
} |
|
|
|
//Lock |
|
if (!needStateBox && track.locked && !TimelineUtility.IsLockedFromGroup(track)) |
|
{ |
|
Rect bgRect = expandedRect; |
|
TimelineWindow.instance.OverlayDrawData.Add(OverlayDrawer.CreateTextureOverlay( |
|
GUIClip.Unclip(bgRect), |
|
Styles.lockBg)); |
|
needStateBox = true; |
|
} |
|
|
|
if (needStateBox) |
|
{ |
|
DrawTrackStateBox(trackRect, track); |
|
} |
|
} |
|
} |
|
|
|
static void DrawTrackStateBox(Rect trackRect, TrackAsset track) |
|
{ |
|
var styles = DirectorStyles.Instance; |
|
|
|
bool locked = track.locked && !TimelineUtility.IsLockedFromGroup(track); |
|
bool muted = track.muted && !TimelineUtility.IsParentMuted(track); |
|
bool allSubTrackMuted = TimelineUtility.IsAllSubTrackMuted(track); |
|
|
|
GUIContent content = null; |
|
if (locked && muted) |
|
{ |
|
content = Styles.s_LockedAndMuted; |
|
if (!allSubTrackMuted) |
|
content = Styles.s_LockedAndPartiallyMuted; |
|
} |
|
else if (locked) content = Styles.s_Locked; |
|
else if (muted) |
|
{ |
|
content = Styles.s_Muted; |
|
if (!allSubTrackMuted) |
|
content = Styles.s_PartiallyMuted; |
|
} |
|
|
|
// the track could be locked, but we only show the 'locked portion' on the upper most track |
|
// that is causing the lock |
|
if (content == null) |
|
return; |
|
|
|
Rect textRect = Graphics.CalculateTextBoxSize(trackRect, styles.fontClip, content, WindowConstants.overlayTextPadding); |
|
|
|
TimelineWindow.instance.OverlayDrawData.Add( |
|
OverlayDrawer.CreateTextBoxOverlay( |
|
GUIClip.Unclip(textRect), |
|
content.text, styles.fontClip, |
|
Color.white, |
|
styles.customSkin.colorLockTextBG, |
|
styles.displayBackground)); |
|
} |
|
|
|
protected void DrawMuteButton(Rect rect, WindowState state) |
|
{ |
|
using (new EditorGUI.DisabledScope(TimelineUtility.IsParentMuted(track))) |
|
{ |
|
EditorGUI.BeginChangeCheck(); |
|
var isMuted = track.mutedInHierarchy; |
|
var tooltip = isMuted ? Styles.trackMuteBtnOnTooltip : Styles.trackMuteBtnOffTooltip; |
|
var muted = GUI.Toggle(rect, isMuted, tooltip, TimelineWindow.styles.trackMuteButton); |
|
if (EditorGUI.EndChangeCheck()) |
|
MuteTrack.Mute(new[] { track }, muted); |
|
} |
|
} |
|
|
|
protected void DrawLockButton(Rect rect, WindowState state) |
|
{ |
|
using (new EditorGUI.DisabledScope(TimelineUtility.IsLockedFromGroup(track))) |
|
{ |
|
EditorGUI.BeginChangeCheck(); |
|
var isLocked = track.lockedInHierarchy; |
|
var tooltip = isLocked ? Styles.trackLockBtnOnTooltip : Styles.trackLockBtnOffTooltip; |
|
var locked = GUI.Toggle(rect, track.lockedInHierarchy, tooltip, TimelineWindow.styles.trackLockButton); |
|
if (EditorGUI.EndChangeCheck()) |
|
LockTrack.SetLockState(new[] { track }, locked); |
|
} |
|
} |
|
|
|
public void DrawInsertionMarkers(Rect rowRectWithIndent) |
|
{ |
|
const float insertionHeight = WindowConstants.trackInsertionMarkerHeight; |
|
if (Event.current.type == EventType.Repaint && (drawInsertionMarkerAfter || drawInsertionMarkerBefore)) |
|
{ |
|
if (drawInsertionMarkerBefore) |
|
{ |
|
var rect = new Rect(rowRectWithIndent.x, rowRectWithIndent.y - insertionHeight * 0.5f - 2.0f, rowRectWithIndent.width, insertionHeight); |
|
EditorGUI.DrawRect(rect, Color.white); |
|
} |
|
|
|
if (drawInsertionMarkerAfter) |
|
{ |
|
var rect = new Rect(rowRectWithIndent.x, rowRectWithIndent.y + rowRectWithIndent.height - insertionHeight * 0.5f + 1.0f, rowRectWithIndent.width, insertionHeight); |
|
EditorGUI.DrawRect(rect, Color.white); |
|
} |
|
} |
|
} |
|
|
|
public void ClearDrawFlags() |
|
{ |
|
if (Event.current.type == EventType.Repaint) |
|
{ |
|
isDropTarget = false; |
|
drawInsertionMarkerAfter = false; |
|
drawInsertionMarkerBefore = false; |
|
} |
|
} |
|
} |
|
}
|
|
|