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)));
                        }
Example #2
0
        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);
        }