public static void ShowSubtitle( [NotNull] this IEnumerable <OutlinedLabel> labels, [NotNull] SubtitleSegment segment) { if (labels == null) { throw new ArgumentNullException(nameof(labels)); } if (segment == null) { throw new ArgumentNullException(nameof(segment)); } if (_currentlyShownSubtitles.ContainsKey(segment)) { return; } var lines = GetAvailableLines(segment, labels).ToArray(); foreach (var line in lines) { line.Label.Text = line.Value; } _currentlyShownSubtitles.Add(segment, lines.Select(l => l.Label)); }
private async Task ScheduleSubtitleHidingAsync(SubtitleSegment subtitle, TimeSpan span) { var startTime = DateTime.Now; await Task.Delay(span, _pauseToken.Token) .ContinueWith(task => { if (task.Status == TaskStatus.RanToCompletion) { if (_currentlyShownSubtitles.Remove(subtitle)) { OnHideSubtitle(subtitle); } } }, TaskScheduler.Current); var leftTime = span.Subtract(TimeSpan.FromTicks(DateTime.Now.Subtract(startTime).Ticks)); if (leftTime > TimeSpan.FromMilliseconds(1)) { await _manualResetEventAsync.WaitAsync(); if (!_forceHidingToken.IsCancellationRequested) { await ScheduleSubtitleHidingAsync(subtitle, leftTime); } } }
private static IEnumerable <SubtitleLabelWrapper> GetAvailableLines( SubtitleSegment segment, IEnumerable <OutlinedLabel> labels) { var splitedLines = segment.Content.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); var availableLines = labels.Where(l => string.IsNullOrEmpty(l.Text)); return(splitedLines.Reverse().Zip(availableLines, (s, label) => new SubtitleLabelWrapper(label, s))); }
private async Task ShowSubtitleAsync(SubtitleSegment subtitle, TimeSpan duration) { var clone = subtitle.SerializedClone(); OnDisplaySubtitle(clone); _currentlyShownSubtitles.Add(clone); _forceHidingToken = new CancellationTokenSource(); await ScheduleSubtitleHidingAsync(clone, duration); }
public static void HideSubtitle( [NotNull] this IEnumerable <OutlinedLabel> labels, [NotNull] SubtitleSegment segment) { if (labels == null) { throw new ArgumentNullException(nameof(labels)); } if (segment == null) { throw new ArgumentNullException(nameof(segment)); } if (_currentlyShownSubtitles.TryGetValue(segment, out var shownLabels)) { foreach (var label in shownLabels) { label.Text = string.Empty; } _currentlyShownSubtitles.Remove(segment); } }
private void OnDisplaySubtitle(SubtitleSegment subtitle) { OnNotify(SubtitlesEventType.Display, subtitle); }
private void OnHideSubtitle(SubtitleSegment subtitle) { OnNotify(SubtitlesEventType.Hide, subtitle); }