//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); } } } } }
static void Insert(TrackAsset track, IEnumerable <ITimelineItem> items) { if (track == null) { return; } var orderedItems = ItemsUtils.GetItemsExcept(track, items) .OfType <ITrimmable>() .OrderBy(i => i.start).ToArray(); foreach (var item in items.OfType <ITrimmable>()) { var from = item.start; var to = item.end; var overlappedItems = orderedItems.Where(i => EditModeUtils.Overlaps(i, from, to)); foreach (var overlappedItem in overlappedItems) { if (EditModeUtils.IsItemWithinRange(overlappedItem, from, to)) { overlappedItem.Delete(); } else { if (overlappedItem.start >= from) { overlappedItem.TrimStart(to); } else { overlappedItem.TrimEnd(from); } } } var includingItems = orderedItems.Where(c => c.start <from && c.end> to); foreach (var includingItem in includingItems) { var newItem = includingItem.CloneTo(track, includingItem.start) as ITrimmable; includingItem.TrimStart(to); if (newItem != null) { newItem.SetEnd(from, false); } } } }
public bool ValidateMove(ItemsPerTrack itemsGroup) { var track = itemsGroup.targetTrack; var items = itemsGroup.items; if (EditModeUtils.IsInfiniteTrack(track)) { double startTime; double stopTime; EditModeUtils.GetInfiniteClipBoundaries(track, out startTime, out stopTime); return(items.All(item => !EditModeUtils.IsItemWithinRange(item, startTime, stopTime) && !EditModeUtils.IsRangeWithinItem(startTime, stopTime, item))); } var siblings = ItemsUtils.GetItemsExcept(itemsGroup.targetTrack, items); return(items.All(item => EditModeMixUtils.GetPlacementValidity(item, siblings) == PlacementValidity.Valid)); }