//Corrects clips durations to fit at insertion point, if needed public static void PrepareItemsForInsertion(IEnumerable <ItemsPerTrack> itemsGroups) { foreach (var itemsGroup in itemsGroups) { var siblings = ItemsUtils.GetItemsExcept(itemsGroup.targetTrack, itemsGroup.items); foreach (var item in itemsGroup.items.OfType <ITrimmable>()) { var eatenItems = siblings.Where(c => EditModeUtils.IsItemWithinRange(c, item.start, item.end)).ToList(); var intersectedItem = EditModeUtils.GetFirstIntersectedItem(siblings, item.end); if (intersectedItem != null) { eatenItems.Add(intersectedItem); } var blendableItems = eatenItems.OfType <IBlendable>(); if (blendableItems.Any()) { var minTime = blendableItems.Min(c => c.end - c.rightBlendDuration); if (item.end > minTime) { item.SetEnd(minTime, false); } } } } }
public double AdjustStartTime(WindowState state, ItemsPerTrack itemsGroup, double time) { var track = itemsGroup.targetTrack; if (track == null) { return(time); } double start; double end; if (EditModeUtils.IsInfiniteTrack(track)) { EditModeUtils.GetInfiniteClipBoundaries(track, out start, out end); } else { var siblings = ItemsUtils.GetItemsExcept(track, itemsGroup.items); var firstIntersectedItem = EditModeUtils.GetFirstIntersectedItem(siblings, time); if (firstIntersectedItem == null) { return(time); } start = firstIntersectedItem.start; end = firstIntersectedItem.end; } var closestTime = Math.Abs(time - start) < Math.Abs(time - end) ? start : end; var pixelTime = state.TimeToPixel(time); var pixelClosestTime = state.TimeToPixel(closestTime); if (Math.Abs(pixelTime - pixelClosestTime) < k_SnapToEdgeDistance) { return(closestTime); } return(time); }
public void DrawGUI(WindowState state, IEnumerable <MovingItems> movingItems, Color color) { var operationWillReplace = false; foreach (var itemsPerTrack in movingItems) { var bounds = itemsPerTrack.onTrackItemsBounds; var counter = 0; foreach (var item in itemsPerTrack.items) { if (EditModeUtils.GetFirstIntersectedItem(itemsPerTrack.items, item.start) != null) { EditModeGUIUtils.DrawBoundsEdge(bounds[counter], color, TrimEdge.Start); operationWillReplace = true; } if (EditModeUtils.GetFirstIntersectedItem(itemsPerTrack.items, item.end) != null) { EditModeGUIUtils.DrawBoundsEdge(bounds[counter], color, TrimEdge.End); operationWillReplace = true; } counter++; // TODO Display swallowed clips? } } if (operationWillReplace) { TimelineCursors.SetCursor(TimelineCursors.CursorType.Replace); } else { TimelineCursors.ClearCursor(); } }