예제 #1
0
        static void Remove(TrackAsset track, IEnumerable <ITimelineItem> items)
        {
            if (track == null)
            {
                return;
            }

            //can only ripple items of the same type as those selected
            var itemTypes        = ItemsUtils.GetItemTypes(items);
            var siblingsToRipple = ItemsUtils.GetItemsExcept(track, items)
                                   .Where(i => itemTypes.Contains(i.GetType()))
                                   .OrderBy(c => c.start)
                                   .ToArray();

            var orderedItems = items
                               .OrderBy(c => c.start)
                               .ToArray();

            var cumulativeOffset = 0.0;

            foreach (var item in orderedItems)
            {
                var offset = item.end - item.start;
                var start  = item.start - cumulativeOffset;
                var end    = item.end - cumulativeOffset;

                var nextItem = siblingsToRipple.FirstOrDefault(c => (DiscreteTime)c.start > (DiscreteTime)start && (DiscreteTime)c.start < (DiscreteTime)end);
                if (nextItem != null)
                {
                    offset -= end - nextItem.start;
                }

                var prevItem = siblingsToRipple.FirstOrDefault(c => (DiscreteTime)c.end > (DiscreteTime)start && (DiscreteTime)c.end < (DiscreteTime)end);
                if (prevItem != null)
                {
                    offset -= prevItem.end - start;
                }

                if (offset <= 0.0)
                {
                    continue;
                }

                cumulativeOffset += offset;

                for (int i = siblingsToRipple.Length - 1; i >= 0; --i)
                {
                    var c = siblingsToRipple[i];
                    if ((DiscreteTime)c.start < (DiscreteTime)start)
                    {
                        break;
                    }

                    c.start = c.start - offset;
                }
            }
        }
예제 #2
0
        public static void Insert(IEnumerable <ItemsPerTrack> itemsGroups)
        {
            var start = double.MaxValue;
            var end   = double.MinValue;

            foreach (var itemsGroup in itemsGroups)
            {
                start = Math.Min(start, itemsGroup.items.Min(c => c.start));
                end   = Math.Max(end, itemsGroup.items.Max(c => c.end));
            }

            var offset           = 0.0;
            var discreteStart    = (DiscreteTime)start;
            var discreteEnd      = (DiscreteTime)end;
            var itemTypes        = ItemsUtils.GetItemTypes(itemsGroups);
            var siblingsToRipple = new List <ITimelineItem>();

            foreach (var itemsGroup in itemsGroups)
            {
                //can only ripple items of the same type as those selected
                siblingsToRipple.AddRange(ItemsUtils.GetItemsExcept(itemsGroup.targetTrack, itemsGroup.items).Where(i => itemTypes.Contains(i.GetType())));
                foreach (var item in siblingsToRipple)
                {
                    var discreteItemStart = (DiscreteTime)item.start;
                    var discreteItemEnd   = (DiscreteTime)item.end;

                    if ((discreteItemStart < discreteStart && discreteItemEnd > discreteStart) || (discreteItemStart >= discreteStart && discreteItemStart < discreteEnd))
                    {
                        offset = Math.Max(offset, end - item.start);
                    }
                }
            }

            if (offset > 0.0)
            {
                foreach (var sibling in siblingsToRipple)
                {
                    if ((DiscreteTime)sibling.end > (DiscreteTime)start)
                    {
                        sibling.start += offset;
                    }
                }
            }
        }
        public void BeginMove(IEnumerable <ItemsPerTrack> itemsGroups)
        {
            m_NextItems.Clear();
            m_PreviousItem.Clear();
            var itemTypes = ItemsUtils.GetItemTypes(itemsGroups).ToList();

            foreach (var itemsGroup in itemsGroups)
            {
                //can only ripple items of the same type as those selected
                var sortedSelectedItems    = itemsGroup.items.OrderBy(i => i.start).ToList();
                var siblings               = itemsGroup.targetTrack.GetItemsExcept(itemsGroup.items);
                var sortedSiblingsToRipple = siblings.Where(i => itemTypes.Contains(i.GetType())).OrderBy(i => i.start).ToList();
                var start = sortedSelectedItems.First().start;

                m_NextItems.Add(itemsGroup.targetTrack, sortedSiblingsToRipple.Where(i => i.start > start).ToList());
                m_PreviousItem.Add(itemsGroup.targetTrack, CalculatePrevItemInfo(sortedSelectedItems, sortedSiblingsToRipple, itemTypes));
            }

            m_PreviousEnd = itemsGroups.Max(m => m.items.Max(c => c.end));
        }
        public void BeginMove(IEnumerable <ItemsPerTrack> itemsGroups)
        {
            m_NextItems.Clear();
            m_PreviousItem.Clear();
            var itemTypes = ItemsUtils.GetItemTypes(itemsGroups);

            foreach (var itemsGroup in itemsGroups)
            {
                //can only ripple items of the same type as those selected
                var siblingsToRipple = itemsGroup.targetTrack.GetItemsExcept(itemsGroup.items).Where(i => itemTypes.Contains(i.GetType()));
                var start            = itemsGroup.items.Min(i => i.start); //TODO-marker: have a method to get the start of the group (already cached)
                m_NextItems.Add(itemsGroup.targetTrack, siblingsToRipple.Where(i => i.start > start).ToList());

                var prevItem = siblingsToRipple.Where(i => i.duration > 0.0).OrderBy(i => i.start).LastOrDefault(i => i.start <= start);
                m_PreviousItem.Add(itemsGroup.targetTrack, new PrevItemInfo {
                    item = prevItem, blending = prevItem != null && prevItem.end > start
                });
            }

            m_PreviousEnd = itemsGroups.Max(m => m.items.Max(c => c.end));
        }