ClipsLayer.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.Timeline;
  5. namespace UnityEditor.Timeline
  6. {
  7. class ClipsLayer : ItemsLayer
  8. {
  9. static readonly GUIStyle k_ConnectorIcon = DirectorStyles.Instance.connector;
  10. public ClipsLayer(Layer layerOrder, IRowGUI parent) : base(layerOrder)
  11. {
  12. var track = parent.asset;
  13. track.SortClips();
  14. TimelineClipGUI previousClipGUI = null;
  15. foreach (var clip in track.clips)
  16. {
  17. var oldClipGUI = ItemToItemGui.GetGuiForClip(clip);
  18. var isInvalid = oldClipGUI != null && oldClipGUI.isInvalid; // HACK Make sure to carry invalidy state when refereshing the cache.
  19. var currentClipGUI = new TimelineClipGUI(clip, parent, this) {isInvalid = isInvalid};
  20. if (previousClipGUI != null) previousClipGUI.nextClip = currentClipGUI;
  21. currentClipGUI.previousClip = previousClipGUI;
  22. AddItem(currentClipGUI);
  23. previousClipGUI = currentClipGUI;
  24. }
  25. }
  26. public override void Draw(Rect rect, WindowState state)
  27. {
  28. base.Draw(rect, state); //draw clips
  29. DrawConnector(items.OfType<TimelineClipGUI>());
  30. }
  31. static void DrawConnector(IEnumerable<TimelineClipGUI> clips)
  32. {
  33. if (Event.current.type != EventType.Repaint)
  34. return;
  35. foreach (var clip in clips)
  36. {
  37. if (clip.previousClip != null && clip.visible && clip.treeViewRect.width > 14 &&
  38. (DiscreteTime)clip.start == (DiscreteTime)clip.previousClip.end)
  39. {
  40. // draw little connector widget
  41. var localRect = clip.treeViewRect;
  42. localRect.x -= Mathf.Floor(k_ConnectorIcon.fixedWidth / 2.0f);
  43. localRect.width = k_ConnectorIcon.fixedWidth;
  44. localRect.height = k_ConnectorIcon.fixedHeight;
  45. GUI.Label(localRect, GUIContent.none, k_ConnectorIcon);
  46. }
  47. }
  48. }
  49. }
  50. }