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));
        }
Exemple #2
0
        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)));
        }
Exemple #4
0
        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);
            }
        }
Exemple #6
0
 private void OnDisplaySubtitle(SubtitleSegment subtitle)
 {
     OnNotify(SubtitlesEventType.Display, subtitle);
 }
Exemple #7
0
 private void OnHideSubtitle(SubtitleSegment subtitle)
 {
     OnNotify(SubtitlesEventType.Hide, subtitle);
 }