public RankingCategoryListPageViewModel( IMessenger messenger, ApplicationLayoutManager applicationLayoutManager, PageManager pageManager, Services.DialogService dialogService, VideoRankingSettings rankingSettings, AppFlagsRepository appFlagsRepository, RankingProvider rankingProvider ) { _messenger = messenger; ApplicationLayoutManager = applicationLayoutManager; PageManager = pageManager; HohoemaDialogService = dialogService; RankingSettings = rankingSettings; _appFlagsRepository = appFlagsRepository; _rankingProvider = rankingProvider; WeakReferenceMessenger.Default.Register <SettingsRestoredMessage>(this); // TODO: ログインユーザーが成年であればR18ジャンルを表示するように _RankingGenreItemsSource = new List <RankingGenreItem>(); FavoriteItems = new ObservableCollection <RankingItem>(GetFavoriteRankingItems()); _favoriteRankingGenreGroupItem = new FavoriteRankingGenreGroupItem() { Label = "FavoriteRankingTag".Translate(), Items = new AdvancedCollectionView(FavoriteItems) }; _RankingGenreItemsSource.Add(_favoriteRankingGenreGroupItem); var sourceGenreItems = Enum.GetValues(typeof(RankingGenre)).Cast <RankingGenre>() .Where(x => x != RankingGenre.R18) .Select(genre => { var rankingItems = ToRankingItem(genre, _rankingProvider.GetRankingGenreTagsFromCache(genre)); var acv = new AdvancedCollectionView(new ObservableCollection <RankingItem>(rankingItems), isLiveShaping: true) { Filter = (item) => { if (item is RankingItem rankingItem && rankingItem.Genre != null) { return(!(RankingSettings.IsHiddenGenre(rankingItem.Genre.Value) || RankingSettings.IsHiddenTag(rankingItem.Genre.Value, rankingItem.Tag))); }
public RankingCategoryListPageViewModel( ApplicationLayoutManager applicationLayoutManager, Services.PageManager pageManager, Services.DialogService dialogService, RankingSettings rankingSettings, IEventAggregator eventAggregator, AppFlagsRepository appFlagsRepository, RankingProvider rankingProvider ) { ApplicationLayoutManager = applicationLayoutManager; PageManager = pageManager; HohoemaDialogService = dialogService; RankingSettings = rankingSettings; _eventAggregator = eventAggregator; _appFlagsRepository = appFlagsRepository; _rankingProvider = rankingProvider; // TODO: ログインユーザーが成年であればR18ジャンルを表示するように _RankingGenreItemsSource = new List <RankingGenreItem>(); FavoriteItems = new ObservableCollection <RankingItem>(GetFavoriteRankingItems()); _favoriteRankingGenreGroupItem = new FavoriteRankingGenreGroupItem() { Label = "FavoriteRankingTag".Translate(), IsDisplay = true, Items = new AdvancedCollectionView(FavoriteItems), }; _RankingGenreItemsSource.Add(_favoriteRankingGenreGroupItem); var sourceGenreItems = Enum.GetValues(typeof(RankingGenre)).Cast <RankingGenre>() .Where(x => x != RankingGenre.R18) .Select(x => { var acv = new AdvancedCollectionView(new ObservableCollection <RankingItem>(GetGenreTagRankingItems(x, RankingSettings)), isLiveShaping: true) { Filter = (item) => (item as RankingItem).IsDisplay, }; acv.ObserveFilterProperty(nameof(RankingItem.IsDisplay)); return(new RankingGenreItem() { Genre = x, Label = x.Translate(), IsDisplay = !RankingSettings.IsHiddenGenre(x), Items = acv }); }); foreach (var genreItem in sourceGenreItems) { _RankingGenreItemsSource.Add(genreItem); } foreach (var item in _RankingGenreItemsSource) { if (item.Genre == null) { _RankingGenreItems.Add(item); } else if (!RankingSettings.IsHiddenGenre(item.Genre.Value)) { _RankingGenreItems.Add(item); } } { RankingGenreItems = new CollectionViewSource() { Source = _RankingGenreItems, ItemsPath = new Windows.UI.Xaml.PropertyPath(nameof(RankingGenreItem.Items)), IsSourceGrouped = true, }; } _eventAggregator.GetEvent <Events.RankingGenreShowRequestedEvent>() .Subscribe((args) => { // Tagの指定が無い場合はジャンル自体の非表示として扱う var genreItem = _RankingGenreItemsSource.First(x => x.Genre == args.RankingGenre); if (string.IsNullOrEmpty(args.Tag)) { genreItem.IsDisplay = true; RankingSettings.RemoveHiddenGenre(args.RankingGenre); _ = RankingSettings.Save(); _RankingGenreItems.Clear(); foreach (var item in _RankingGenreItemsSource) { if (item.Genre == null) { _RankingGenreItems.Add(item); } else if (!RankingSettings.IsHiddenGenre(item.Genre.Value)) { _RankingGenreItems.Add(item); } } System.Diagnostics.Debug.WriteLine($"Genre Show: {args.RankingGenre}"); } else { var sameTagItem = genreItem.Items.SourceCollection.Cast <RankingItem>().FirstOrDefault(x => x.Tag == args.Tag); if (sameTagItem != null) { sameTagItem.IsDisplay = true; RankingSettings.RemoveHiddenTag(args.RankingGenre, args.Tag); _ = RankingSettings.Save(); System.Diagnostics.Debug.WriteLine($"Tag Show: {args.Tag}"); } } }) .AddTo(_CompositeDisposable); _eventAggregator.GetEvent <Events.RankingGenreHiddenRequestedEvent>() .Subscribe((args) => { // Tagの指定が無い場合はジャンル自体の非表示として扱う var genreItem = _RankingGenreItemsSource.First(x => x.Genre == args.RankingGenre); if (string.IsNullOrEmpty(args.Tag)) { genreItem.IsDisplay = false; RankingSettings.AddHiddenGenre(args.RankingGenre); _ = RankingSettings.Save(); _RankingGenreItems.Clear(); foreach (var item in _RankingGenreItemsSource) { if (item.Genre == null) { _RankingGenreItems.Add(item); } else if (!RankingSettings.IsHiddenGenre(item.Genre.Value)) { _RankingGenreItems.Add(item); } } System.Diagnostics.Debug.WriteLine($"Genre Hidden: {args.RankingGenre}"); } else { var sameTagItem = genreItem.Items.SourceCollection.Cast <RankingItem>().FirstOrDefault(x => x.Tag == args.Tag); if (sameTagItem != null) { sameTagItem.IsDisplay = false; RankingSettings.AddHiddenTag(sameTagItem.Genre.Value, sameTagItem.Tag, sameTagItem.Label); _ = RankingSettings.Save(); System.Diagnostics.Debug.WriteLine($"Tag Hidden: {args.Tag}"); } } }) .AddTo(_CompositeDisposable); _eventAggregator.GetEvent <Events.RankingGenreFavoriteRequestedEvent>() .Subscribe((args) => { if (false == FavoriteItems.Any(x => x.Genre == args.RankingGenre && x.Tag == args.Tag)) { var addedItem = new RankingItem() { Genre = args.RankingGenre, IsDisplay = true, IsFavorite = true, Label = args.Label, Tag = args.Tag }; FavoriteItems.Add(addedItem); RankingSettings.AddFavoriteTag(addedItem.Genre.Value, addedItem.Tag, addedItem.Label); _ = RankingSettings.Save(); System.Diagnostics.Debug.WriteLine($"Favorite added: {args.Label}"); } }) .AddTo(_CompositeDisposable); _eventAggregator.GetEvent <Events.RankingGenreUnFavoriteRequestedEvent>() .Subscribe((args) => { var unFavoriteItem = FavoriteItems.FirstOrDefault(x => x.Genre == args.RankingGenre && x.Tag == args.Tag); if (unFavoriteItem != null) { FavoriteItems.Remove(unFavoriteItem); RankingSettings.RemoveFavoriteTag(unFavoriteItem.Genre.Value, unFavoriteItem.Tag); _ = RankingSettings.Save(); System.Diagnostics.Debug.WriteLine($"Favorite removed: {args.RankingGenre} {args.Tag}"); } }) .AddTo(_CompositeDisposable); }
public RankingCategoryPageViewModel( PageManager pageManager, Services.HohoemaPlaylist hohoemaPlaylist, NicoVideoProvider nicoVideoProvider, RankingProvider rankingProvider, RankingSettings rankingSettings, NGSettings ngSettings, IScheduler scheduler, IEventAggregator eventAggregator ) { PageManager = pageManager; HohoemaPlaylist = hohoemaPlaylist; NicoVideoProvider = nicoVideoProvider; RankingProvider = rankingProvider; RankingSettings = rankingSettings; NgSettings = ngSettings; _scheduler = scheduler; _eventAggregator = eventAggregator; IsFailedRefreshRanking = new ReactiveProperty <bool>(false) .AddTo(_CompositeDisposable); CanChangeRankingParameter = new ReactiveProperty <bool>(false) .AddTo(_CompositeDisposable); SelectedRankingTag = new ReactiveProperty <Database.Local.RankingGenreTag>(); SelectedRankingTerm = new ReactiveProperty <RankingTerm?>(RankingTerm.Hour); CurrentSelectableRankingTerms = new[] { this.ObserveProperty(x => RankingGenre).ToUnit(), SelectedRankingTag.ToUnit() } .CombineLatest() .Select(x => { if (RankingGenre != RankingGenre.HotTopic) { if (string.IsNullOrEmpty(SelectedRankingTag.Value?.Tag)) { return(NiconicoRanking.Constants.AllRankingTerms); } else { return(NiconicoRanking.Constants.GenreWithTagAccepteRankingTerms); } } else { return(NiconicoRanking.Constants.HotTopicAccepteRankingTerms); } }) .ToReadOnlyReactivePropertySlim() .AddTo(_CompositeDisposable); new[] { this.ObserveProperty(x => RankingGenre).ToUnit(), SelectedRankingTag.ToUnit(), SelectedRankingTerm.Where(x => !_nowInitializeRankingTerm).ToUnit() } .CombineLatest() .Where(_ => _IsNavigateCompleted) .Throttle(TimeSpan.FromMilliseconds(250)) .Subscribe(__ => { _ = ResetList(); }) .AddTo(_CompositeDisposable); CurrentSelectableRankingTerms .Delay(TimeSpan.FromMilliseconds(50)) .Subscribe(x => { _nowInitializeRankingTerm = true; SelectedRankingTerm.Value = x[0]; _nowInitializeRankingTerm = false; }) .AddTo(_CompositeDisposable); }