//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);
                    }
                }
            }
        }
Exemple #3
0
        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));
        }