static bool SelectFirstClipStartingFrom(TrackAsset track)
        {
            List <TrackAsset> visibleTracks = GetVisibleTracks().Select(x => x.track).ToList();
            int           idx  = visibleTracks.IndexOf(track);
            ITimelineItem item = null;

            for (int i = idx; i < visibleTracks.Count; ++i)
            {
                var items = visibleTracks[i].GetItems().OfType <ClipItem>();
                if (!items.Any() || visibleTracks[i].lockedInHierarchy)
                {
                    continue;
                }
                item = items.First();
                break;
            }

            if (item != null)
            {
                SelectionManager.SelectOnly(item);
                TimelineHelpers.FrameItems(new[] { item });
                return(true);
            }

            return(false);
        }
        static PrevItemInfo CalculatePrevItemInfo(List <ITimelineItem> orderedSelection, List <ITimelineItem> orderedSiblings, IEnumerable <Type> itemTypes)
        {
            ITimelineItem previousItem      = null;
            ITimelineItem firstSelectedItem = null;
            var           gap = double.PositiveInfinity;

            foreach (var type in itemTypes)
            {
                var firstSelectedItemOfType = orderedSelection.FirstOrDefault(i => i.GetType() == type);
                if (firstSelectedItemOfType == null)
                {
                    continue;
                }

                var previousItemOfType = orderedSiblings.LastOrDefault(i => i.GetType() == type && i.start < firstSelectedItemOfType.start);
                if (previousItemOfType == null)
                {
                    continue;
                }

                var currentGap = firstSelectedItemOfType.start - previousItemOfType.end;
                if (currentGap < gap)
                {
                    gap = currentGap;
                    firstSelectedItem = firstSelectedItemOfType;
                    previousItem      = previousItemOfType;
                }
            }

            return(new PrevItemInfo(previousItem, firstSelectedItem));
        }
Пример #3
0
 public static bool InvokeByName <T>(string actionName, TimelineWindow.TimelineState state, T item) where T : class, ITimelineItem
 {
     ITimelineItem[] items = new ITimelineItem[]
     {
         item
     };
     return(ItemActionInvoker.InvokeByName <T>(actionName, state, items));
 }
Пример #4
0
        public static double BlendDuration(ITimelineItem item, TrimEdge edge)
        {
            var blendable = item as IBlendable;

            if (blendable == null)
            {
                return(0.0);
            }

            return(edge == TrimEdge.Start ? blendable.leftBlendDuration : blendable.rightBlendDuration);
        }
Пример #5
0
        public static void TrimEnd(ITimelineItem item, double time, bool affectTimeScale)
        {
            var itemToTrim = item as ITrimmable;

            if (itemToTrim == null)
            {
                return;
            }

            trimMode.TrimEnd(itemToTrim, time, affectTimeScale);
        }
Пример #6
0
        public static void TrimStart(ITimelineItem item, double time)
        {
            var itemToTrim = item as ITrimmable;

            if (itemToTrim == null)
            {
                return;
            }

            trimMode.TrimStart(itemToTrim, time);
        }
Пример #7
0
        public static double TimeGapBetweenItems(ITimelineItem leftItem, ITimelineItem rightItem)
        {
            if (leftItem is MarkerItem && rightItem is MarkerItem)
            {
                var markerType = ((MarkerItem)leftItem).marker.GetType();
                var gap        = TimeReferenceUtility.PixelToTime(StyleManager.UssStyleForType(markerType).fixedWidth) - TimeReferenceUtility.PixelToTime(0);
                return(gap);
            }

            return(0.0);
        }
Пример #8
0
        public static double TimeGapBetweenItems(ITimelineItem leftItem, ITimelineItem rightItem, WindowState state)
        {
            if (leftItem is MarkerItem && rightItem is MarkerItem)
            {
                var markerType = ((MarkerItem)leftItem).marker.GetType();
                var gap        = state.PixelDeltaToDeltaTime(StyleManager.UssStyleForType(markerType).fixedWidth);
                return(gap);
            }

            return(0.0);
        }
Пример #9
0
        public static bool HasBlends(ITimelineItem item, TrimEdge edge)
        {
            var blendable = item as IBlendable;

            if (blendable == null)
            {
                return(false);
            }

            return(edge == TrimEdge.Start && blendable.hasLeftBlend || edge == TrimEdge.End && blendable.hasRightBlend);
        }
Пример #10
0
        public static bool Contains(ITimelineItem item)
        {
            var clipItem = item as ClipItem;

            if (clipItem != null)
            {
                return(Contains(clipItem.clip));
            }

            var markerItem = item as MarkerItem;

            return(markerItem != null && Contains(markerItem.marker));
        }
        public static void BeginTrim(ITimelineItem item, TrimEdge trimDirection)
        {
            var itemToTrim = item as ITrimmable;

            if (itemToTrim == null)
            {
                return;
            }

            s_CurrentTrimItem      = itemToTrim;
            s_CurrentTrimDirection = trimDirection;
            trimMode.OnBeforeTrim(itemToTrim, trimDirection);
            TimelineUndo.PushUndo(itemToTrim.parentTrack, "Trim Clip");
        }
Пример #12
0
        public static void BeginTrim(ITimelineItem item, TrimEdge trimDirection)
        {
            var itemToTrim = item as ITrimmable;

            if (itemToTrim == null)
            {
                return;
            }

            s_CurrentTrimItem      = itemToTrim;
            s_CurrentTrimDirection = trimDirection;
            trimMode.OnBeforeTrim(itemToTrim, trimDirection);
            UndoExtensions.RegisterTrack(itemToTrim.parentTrack, L10n.Tr("Trim Clip"));
        }
        public static bool UnCollapseGroup()
        {
            if (TrackHeadActive())
            {
                var quit = false;
                foreach (var track in SelectionManager.SelectedTracks())
                {
                    if (!track.GetChildTracks().Any())
                    {
                        continue;
                    }

                    if (!quit && track.GetCollapsed())
                    {
                        quit = true;
                    }
                    track.SetCollapsed(false);
                }

                if (quit)
                {
                    TimelineEditor.Refresh(RefreshReason.ContentsModified);
                    return(true);
                }

                // Transition to Clip area
                var           visibleTracks = GetVisibleTracks().Select(x => x.track).ToList();
                var           idx           = visibleTracks.IndexOf(SelectionManager.SelectedTracks().Last());
                ITimelineItem item          = null;
                for (var i = idx; i < visibleTracks.Count; ++i)
                {
                    var items = visibleTracks[i].GetItems().OfType <ClipItem>();
                    if (!items.Any())
                    {
                        continue;
                    }
                    item = items.First();
                    break;
                }

                if (item != null)
                {
                    SelectionManager.SelectOnly(item);
                    TimelineHelpers.FrameItems(new[] { item });
                    return(true);
                }
            }
            return(false);
        }
        public static void RangeSelectItems(ITimelineItem lastItemToSelect)
        {
            var selectSorted = SelectionManager.SelectedItems().ToList();
            var firstSelect  = selectSorted.FirstOrDefault();

            if (firstSelect == null)
            {
                SelectionManager.Add(lastItemToSelect);
                return;
            }

            var allItems = TimelineWindow.instance.allTracks.OfType <TimelineTrackGUI>().SelectMany(ttGui => ItemsUtils.GetItems(ttGui.track)).ToList();

            TimelineHelpers.RangeSelect(allItems, selectSorted, lastItemToSelect, SelectionManager.Add, SelectionManager.Remove);
        }
Пример #15
0
        public static void RangeSelectItems(ITimelineItem lastItemToSelect)
        {
            var selectSorted = SelectionManager.SelectedItems().ToList();
            var firstSelect  = selectSorted.FirstOrDefault();

            if (firstSelect == null)
            {
                SelectionManager.Add(lastItemToSelect);
                return;
            }

            var allTracks = TimelineEditor.inspectedAsset.flattenedTracks;
            var allItems  = allTracks.SelectMany(ItemsUtils.GetItems).ToList();

            TimelineHelpers.RangeSelect(allItems, selectSorted, lastItemToSelect, SelectionManager.Add, SelectionManager.Remove);
        }
Пример #16
0
        static void DrawItemInternal(ITimelineItem item, Rect rect, bool isValid)
        {
            var clipGUI = item.gui as TimelineClipGUI;

            if (clipGUI != null)
            {
                if (isValid)
                {
                    clipGUI.DrawGhostClip(rect);
                }
                else
                {
                    clipGUI.DrawInvalidClip(rect);
                }
            }
        }
Пример #17
0
        public static bool Contains(ITimelineItem item)
        {
            TimelineClip timelineClip = item as TimelineClip;
            bool         result;

            if (timelineClip != null)
            {
                result = SelectionManager.Contains(timelineClip);
            }
            else
            {
                TimelineMarker timelineMarker = item as TimelineMarker;
                result = (timelineMarker != null && SelectionManager.Contains(timelineMarker));
            }
            return(result);
        }
Пример #18
0
        internal virtual bool IsCompatibleWithItem(ITimelineItem item)
        {
            TimelineClip timelineClip = item as TimelineClip;
            bool         result;

            if (timelineClip != null)
            {
                result = this.ValidateClipType(timelineClip.asset.GetType());
            }
            else
            {
                TimelineMarker timelineMarker = item as TimelineMarker;
                result = (timelineMarker != null && this is ITimelineMarkerContainer);
            }
            return(result);
        }
Пример #19
0
        public static void Add(ITimelineItem item)
        {
            TimelineClip timelineClip = item as TimelineClip;

            if (timelineClip != null)
            {
                SelectionManager.Add(timelineClip);
            }
            else
            {
                TimelineMarker timelineMarker = item as TimelineMarker;
                if (timelineMarker != null)
                {
                    SelectionManager.Add(timelineMarker);
                }
            }
        }
Пример #20
0
        public static void Add(ITimelineItem item)
        {
            var clipItem = item as ClipItem;

            if (clipItem != null)
            {
                Add(clipItem.clip);
            }
            else
            {
                var markerItem = item as MarkerItem;
                if (markerItem != null)
                {
                    Add(markerItem.marker);
                }
            }
        }
Пример #21
0
        public static void SelectOnly(ITimelineItem item)
        {
            var clipItem = item as ClipItem;

            if (clipItem != null)
            {
                SelectOnly(clipItem.clip);
            }
            else
            {
                var markerItem = item as MarkerItem;
                if (markerItem != null)
                {
                    SelectOnly(markerItem.marker);
                }
            }
        }
        static ITimelineItem NextItem(this ITimelineItem item, bool clipOnly)
        {
            var items = item.parentTrack.GetItems().ToArray();

            if (clipOnly)
            {
                items = items.Where(x => x is ClipItem).ToArray();
            }
            else
            {
                items = items.Where(x => x is MarkerItem).ToArray();
            }

            var idx = Array.IndexOf(items, item);

            return(idx < items.Length - 1 ? items[idx + 1] : null);
        }
Пример #23
0
        public void AddAndIncrementSequence(ITimelineItem timelineItem)
        {
            Add(timelineItem);
            switch (timelineItem)
            {
            case MediaFile _:
                MediaSequence++;
                break;

            case Discontinuity _:
                DiscontinuitySequence = DiscontinuitySequence + 1;
                break;

            default:
                throw new ArgumentException($"Unsupported value: {timelineItem}");
            }
        }
Пример #24
0
        public static bool Overlaps(ITimelineItem item, double from, double to)
        {
            var discreteFrom  = (DiscreteTime)from;
            var discreteTo    = (DiscreteTime)to;
            var discreteStart = (DiscreteTime)item.start;

            if (discreteStart >= discreteFrom && discreteStart < discreteTo)
            {
                return(true);
            }

            var discreteEnd = (DiscreteTime)item.end;

            if (discreteEnd > discreteFrom && discreteEnd <= discreteTo)
            {
                return(true);
            }

            return(false);
        }
Пример #25
0
        public ItemsGroup(IEnumerable <ITimelineItem> items)
        {
            Debug.Assert(items != null && items.Any());

            m_Items         = items.ToArray();
            m_LeftMostItem  = null;
            m_RightMostItem = null;

            foreach (var item in m_Items)
            {
                if (m_LeftMostItem == null || item.start < m_LeftMostItem.start)
                {
                    m_LeftMostItem = item;
                }

                if (m_RightMostItem == null || item.end > m_RightMostItem.end)
                {
                    m_RightMostItem = item;
                }
            }
        }
        static ITimelineItem GetClosestItem(TrackAsset track, ITimelineItem refItem)
        {
            var start = refItem.start;
            var end   = refItem.end;
            var items = track.GetItems().ToList();

            if (refItem is ClipItem)
            {
                items = items.Where(x => x is ClipItem).ToList();
            }
            else
            {
                items = items.Where(x => x is MarkerItem).ToList();
            }

            if (!items.Any())
            {
                return(null);
            }
            ITimelineItem ret         = null;
            var           scoreToBeat = double.NegativeInfinity;

            foreach (var item in items)
            {
                // test for overlap
                var low  = Math.Max(item.start, start);
                var high = Math.Min(item.end, end);
                if (low <= high)
                {
                    var score = high - low;
                    if (score >= scoreToBeat)
                    {
                        scoreToBeat = score;
                        ret         = item;
                    }
                }
            }

            return(ret);
        }
Пример #27
0
 public TimelineItemViewModel(ITimelineItem model)
 {
     this.model = model;
 }
Пример #28
0
 public bool Equals(ITimelineItem other)
 {
     return(Equals((object)other));
 }
Пример #29
0
        public void AddItem(ITimelineItem[] items)
        {
            if (items == null || items.Length == 0)
            {
                return;
            }

            lock (_timelineItems)
            {
                foreach (ITimelineItem item in items)
                {
                    if (_itemDateMax < item.ItemEndTime)
                    {
                        _itemDateMax = item.ItemEndTime;
                    }
                    _timelineItems.Add(item);
                }

                _timelineItems.AddRange(items);

                // int width = (int)Math.Ceiling((_itemDateMax - _worldStartTime).TotalMinutes * _currentWidthPerMinutes);
                // int height = (int)Math.Ceiling(_axes.Count * _axisHeight);
                // SetAutoScrollMinSize(new Size(width, height));
            }
        }
Пример #30
0
 public void AddItem(ITimelineItem item)
 {
     AddItem(new ITimelineItem[] { item });
 }
Пример #31
0
 public ReceivedTimelineEventArgs(ITimelineItem[] receivedItems)
 {
     this.ReceivedItems = receivedItems;
 }
Пример #32
0
 protected virtual void OnReceivedTimeline(ITimelineItem[] receivedItems)
 {
     if (this.ReceivedTimeline != null)
         this.ReceivedTimeline(this, new ReceivedTimelineEventArgs(receivedItems));
 }
 public PrevItemInfo(ITimelineItem item, ITimelineItem firstSelectedItem)
 {
     this.item = item;
     this.firstSelectedItem = firstSelectedItem;
     blending = item != null && item.end > firstSelectedItem.start;
 }
Пример #34
0
        public static PlacementValidity GetPlacementValidity(ITimelineItem item, IEnumerable <ITimelineItem> otherItems)
        {
            if (item.duration <= 0.0)
            {
                return(PlacementValidity.Valid);  //items without any duration can always be placed
            }
            var sortedItems = otherItems.Where(i => i.duration > 0.0).OrderBy(c => c.start);
            var candidates  = new List <ITimelineItem>();

            foreach (var sortedItem in sortedItems)
            {
                if ((DiscreteTime)sortedItem.start >= (DiscreteTime)item.end)
                {
                    // No need to process further
                    break;
                }

                if ((DiscreteTime)sortedItem.end <= (DiscreteTime)item.start)
                {
                    // Skip
                    continue;
                }

                candidates.Add(sortedItem);
            }

            var discreteStart = (DiscreteTime)item.start;
            var discreteEnd   = (DiscreteTime)item.end;

            // Note: Order of tests matters
            for (int i = 0, n = candidates.Count; i < n; i++)
            {
                var candidate = candidates[i];

                var blendItem = item as IBlendable;
                if (blendItem != null && blendItem.supportsBlending)
                {
                    if (EditModeUtils.Contains(candidate.start, candidate.end, item))
                    {
                        return(PlacementValidity.InvalidIsWithin);
                    }

                    if (i < n - 1)
                    {
                        var nextCandidate = candidates[i + 1];

                        var discreteNextCandidateStart = (DiscreteTime)nextCandidate.start;
                        var discreteCandidateEnd       = (DiscreteTime)candidate.end;

                        if (discreteCandidateEnd > discreteNextCandidateStart)
                        {
                            if (discreteStart >= discreteNextCandidateStart)
                            {
                                // Note: In case the placement is fully within a blend,
                                // InvalidStartsInBlend MUST have priority
                                return(PlacementValidity.InvalidStartsInBlend);
                            }

                            if (discreteEnd > discreteNextCandidateStart && discreteEnd <= discreteCandidateEnd)
                            {
                                return(PlacementValidity.InvalidEndsInBlend);
                            }

                            if (discreteStart < discreteNextCandidateStart && discreteEnd > discreteCandidateEnd)
                            {
                                return(PlacementValidity.InvalidContainsBlend);
                            }
                        }
                    }

                    if (EditModeUtils.Contains(item.start, item.end, candidate))
                    {
                        return(PlacementValidity.InvalidContains);
                    }
                }
                else
                {
                    if (EditModeUtils.Overlaps(item, candidate.start, candidate.end) ||
                        EditModeUtils.Overlaps(candidate, item.start, item.end))
                    {
                        return(PlacementValidity.InvalidOverlapWithNonBlendableClip);
                    }
                }
            }

            return(PlacementValidity.Valid);
        }
 public ITimelineItem AddTimelineItem(ITimelineItem timelineItemToAdd, ITimelineItem previousTimelineItem)
 {
     throw new System.NotImplementedException();
 }