using System.Collections.Generic; using System.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Media; using CRD.Downloader.Crunchyroll; using CRD.Utils.Structs.History; namespace CRD.Utils.UI; public class EpisodeHighlightTextBlock : TextBlock{ public static readonly StyledProperty SeriesProperty = AvaloniaProperty.Register(nameof(Series)); public static readonly StyledProperty SeasonProperty = AvaloniaProperty.Register(nameof(Season)); public static readonly StyledProperty EpisodeProperty = AvaloniaProperty.Register(nameof(Episode)); public static readonly StyledProperty StreamingServiceProperty = AvaloniaProperty.Register(nameof(StreamingService)); private HistorySeries? _lastSeries; private HistorySeason? _lastSeason; public HistorySeries? Series{ get => GetValue(SeriesProperty); set => SetValue(SeriesProperty, value); } public HistorySeason? Season{ get => GetValue(SeasonProperty); set => SetValue(SeasonProperty, value); } public HistoryEpisode? Episode{ get => GetValue(EpisodeProperty); set => SetValue(EpisodeProperty, value); } public StreamingService StreamingService{ get => GetValue(StreamingServiceProperty); set => SetValue(StreamingServiceProperty, value); } private void SubscribeSeries(HistorySeries series){ series.HistorySeriesDubLangOverride.CollectionChanged += OnCollectionChanged; series.HistorySeriesSoftSubsOverride.CollectionChanged += OnCollectionChanged; } private void UnsubscribeSeries(HistorySeries series){ series.HistorySeriesDubLangOverride.CollectionChanged -= OnCollectionChanged; series.HistorySeriesSoftSubsOverride.CollectionChanged -= OnCollectionChanged; } private void SubscribeSeason(HistorySeason season){ season.HistorySeasonDubLangOverride.CollectionChanged += OnCollectionChanged; season.HistorySeasonSoftSubsOverride.CollectionChanged += OnCollectionChanged; } private void UnsubscribeSeason(HistorySeason season){ season.HistorySeasonDubLangOverride.CollectionChanged -= OnCollectionChanged; season.HistorySeasonSoftSubsOverride.CollectionChanged -= OnCollectionChanged; } protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e){ base.OnDetachedFromVisualTree(e); if (_lastSeries != null) UnsubscribeSeries(_lastSeries); if (_lastSeason != null) UnsubscribeSeason(_lastSeason); } private void OnCollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e){ UpdateText(); } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change){ base.OnPropertyChanged(change); if (change.Property == SeriesProperty){ if (_lastSeries != null) UnsubscribeSeries(_lastSeries); _lastSeries = change.NewValue as HistorySeries; if (_lastSeries != null) SubscribeSeries(_lastSeries); } if (change.Property == SeasonProperty){ if (_lastSeason != null) UnsubscribeSeason(_lastSeason); _lastSeason = change.NewValue as HistorySeason; if (_lastSeason != null) SubscribeSeason(_lastSeason); } if (change.Property == SeriesProperty || change.Property == SeasonProperty || change.Property == StreamingServiceProperty){ UpdateText(); } } private void UpdateText(){ Text = "E" + Episode?.Episode + " - " + Episode?.EpisodeTitle; var streamingService = Series?.SeriesStreamingService ?? StreamingService; var dubSet = Season?.HistorySeasonDubLangOverride.Any() == true ? new HashSet(Season.HistorySeasonDubLangOverride) : Series?.HistorySeriesDubLangOverride.Any() == true ? new HashSet(Series.HistorySeriesDubLangOverride) : streamingService == StreamingService.Crunchyroll ? new HashSet(CrunchyrollManager.Instance.CrunOptions.DubLang) : new HashSet(); var subSet = Season?.HistorySeasonSoftSubsOverride.Any() == true ? new HashSet(Season.HistorySeasonSoftSubsOverride) : Series?.HistorySeriesSoftSubsOverride.Any() == true ? new HashSet(Series.HistorySeriesSoftSubsOverride) : streamingService == StreamingService.Crunchyroll ? new HashSet(CrunchyrollManager.Instance.CrunOptions.DlSubs) : new HashSet(); var higlight = dubSet.IsSubsetOf(Episode?.HistoryEpisodeAvailableDubLang ?? []) && subSet.IsSubsetOf(Episode?.HistoryEpisodeAvailableSoftSubs ?? []); if (higlight){ Foreground = Brushes.Orange; } else{ ClearValue(ForegroundProperty); } } }