public TimedTextElement() { Type = "captionelement"; Style = new TimedTextStyle(); Animations = new MediaMarkerCollection <TimedTextAnimation>(); Children = new MediaMarkerCollection <TimedTextElement>(); }
private static void UpdateCaptions <TElement>(MediaMarkerCollection <TElement> originalElements, IEnumerable <TElement> newElements) where TElement : TimedTextElement { foreach (var updatedElement in newElements) { if (originalElements.ContainsId(updatedElement.Id)) { bool updated = false; var originalElement = originalElements.GetById(updatedElement.Id); if (originalElement.Begin > updatedElement.Begin) { updated = true; originalElement.Begin = updatedElement.Begin; } if (originalElement.End < updatedElement.End) { updated = true; originalElement.End = updatedElement.End; } if (updated) { originalElement.NotifyPositionChanged(); } UpdateCaptions(originalElement.Children, updatedElement.Children); } else { originalElements.Add(updatedElement); } } }
public TimedTextElement() { Type = "captionelement"; Style = new TimedTextStyle(); Animations = new MediaMarkerCollection<TimedTextAnimation>(); Children = new MediaMarkerCollection<TimedTextElement>(); }
/// <summary> /// Checks for markers that have been skipped. /// </summary> public void CheckForSkippedMarkers(TimeSpan mediaPosition, MediaMarkerCollection <T> markers) { if (PreviousPosition.HasValue) { bool movingForward = mediaPosition > PreviousPosition.Value; TimeSpan rangeStart = movingForward ? PreviousPosition.Value : mediaPosition; TimeSpan rangeEnd = movingForward ? mediaPosition : PreviousPosition.Value; var skippedMarkers = markers.WhereContainedByRange(rangeStart, rangeEnd); skippedMarkers.ForEach(OnMarkerSkipped); } }
/// <summary> /// Checks for markers whose position has been reached or left. /// </summary> public void CheckMarkerPositions(TimeSpan mediaPosition, MediaMarkerCollection <TMediaMarker> markers, bool seeking = false, bool ignoreSearchWindow = false) { lock (_syncObject) { // clean up any previously active markers that are no longer in the markers list PreviouslyActiveMarkers.ToList() .Where(i => !markers.Contains(i)) .ForEach(OnMarkerLeft) .ForEach(i => PreviouslyActiveMarkers.Remove(i)); //Safeguard against large unusual position changes if (!seeking && PreviousPosition.HasValue) { var rangeStart = PreviousPosition.Value < mediaPosition ? PreviousPosition.Value : mediaPosition; var rangeEnd = PreviousPosition.Value > mediaPosition ? PreviousPosition.Value : mediaPosition; seeking = rangeEnd.Subtract(rangeStart) > LargestNormalStepSize; } IList <TMediaMarker> activeMarkers; var searchAfter = SeekingSearchWindow.HasValue && !ignoreSearchWindow ? mediaPosition.Subtract(SeekingSearchWindow.Value) : (TimeSpan?)null; if (!seeking && PreviousPosition.HasValue) { var rangeStart = PreviousPosition.Value < mediaPosition ? PreviousPosition.Value : mediaPosition; var rangeEnd = PreviousPosition.Value > mediaPosition ? PreviousPosition.Value : mediaPosition; activeMarkers = markers.WhereActiveInRange(rangeStart, rangeEnd, searchAfter).ToList(); } else { activeMarkers = markers.WhereActiveAtPosition(mediaPosition, searchAfter).ToList(); } PreviouslyActiveMarkers.Where(i => !i.IsActiveAtPosition(mediaPosition)) .ForEach(OnMarkerLeft) .ForEach(i => activeMarkers.Remove(i)); activeMarkers.Where(i => !PreviousPosition.HasValue || !PreviouslyActiveMarkers.Contains(i)) .ForEach(i => OnMarkerReached(i, seeking)); PreviouslyActiveMarkers = PreviouslyActiveMarkers.Where(i => i.IsActiveAtPosition(mediaPosition) && !activeMarkers.Contains(i)) .Concat(activeMarkers) .ToList(); PreviousPosition = mediaPosition; } }
public TimedTextCaptions(IMarkerManager<CaptionRegion> CaptionManager = null, Func<MediaMarkerCollection<TimedTextElement>, IMarkerManager<TimedTextElement>> RegionManagerFactory = null) { DefaultStyleKey = typeof(TimedTextCaptions); factory.NewMarkers += NewMarkers; factory.MarkersRemoved += MarkersRemoved; this.SizeChanged += this_SizeChanged; captionManager = CaptionManager ?? new MediaMarkerManager<CaptionRegion>(); regionManagerFactory = RegionManagerFactory ?? (m => new MediaMarkerManager<TimedTextElement>() { Markers = m }); Captions = new MediaMarkerCollection<CaptionRegion>(); captionManager.MarkerLeft += captionManager_MarkerLeft; captionManager.MarkerReached += captionManager_MarkerReached; }
private void OnCaptionsChanged(MediaMarkerCollection<CaptionRegion> oldValue, MediaMarkerCollection<CaptionRegion> newValue) { if (newValue != null) { newValue.CollectionChanged += Captions_CollectionChanged; newValue.MarkerPositionChanged += CaptionPositionChanged; } if (oldValue != null) { oldValue.CollectionChanged -= Captions_CollectionChanged; oldValue.MarkerPositionChanged -= CaptionPositionChanged; } }
private void OnChaptersChanged(MediaMarkerCollection<Chapter> oldChapters, MediaMarkerCollection<Chapter> newChapters) { oldChapters.IfNotNull(i => i.CollectionChanged -= Chapters_CollectionChanged); newChapters.IfNotNull(i => i.CollectionChanged += Chapters_CollectionChanged); ChaptersChanged.IfNotNull(i => i(this, EventArgs.Empty)); }
private void OnAdMarkersChanged(MediaMarkerCollection<AdMarker> oldAdMarkers, MediaMarkerCollection<AdMarker> newAdMarkers) { oldAdMarkers.IfNotNull(i => i.CollectionChanged -= AdMarkers_CollectionChanged); newAdMarkers.IfNotNull(i => i.CollectionChanged += AdMarkers_CollectionChanged); AdMarkersChanged.IfNotNull(i => i(this, EventArgs.Empty)); }
private void OnTimelineMarkersChanged(MediaMarkerCollection<TimelineMediaMarker> oldTimelineMarkers, MediaMarkerCollection<TimelineMediaMarker> newTimelineMarkers) { oldTimelineMarkers.IfNotNull(i => i.CollectionChanged -= TimelineMarkers_CollectionChanged); newTimelineMarkers.IfNotNull(i => i.CollectionChanged += TimelineMarkers_CollectionChanged); TimelineMarkersChanged.IfNotNull(i => i(this, EventArgs.Empty)); }
public MediaMarkerManager() { Markers = new MediaMarkerCollection(); }