protected override void OnHohoemaNavigatingFrom(NavigatingFromEventArgs e, Dictionary <string, object> viewModelState, bool suspending) { RankingSettings.Save().ConfigureAwait(false); base.OnHohoemaNavigatingFrom(e, viewModelState, suspending); }
public RankingCategoryListPageViewModel( Services.PageManager pageManager, Services.DialogService dialogService, RankingSettings rankingSettings ) : base(pageManager) { HohoemaDialogService = dialogService; RankingSettings = rankingSettings; Func <RankingCategory, bool> checkFavorite = (RankingCategory cat) => { return(RankingSettings.HighPriorityCategory.Any(x => x.Category == cat)); }; RankingCategoryItems = new ObservableCollection <RankingCategoryHostListItem>(); FavoriteRankingCategoryItems = new ObservableCollection <RankingCategoryListPageListItem>(); SelectedRankingCategory = new ReactiveProperty <RankingCategoryListPageListItem>(); AddFavRankingCategory = new DelegateCommand(async() => { var items = new AdvancedCollectionView(); items.SortDescriptions.Add(new SortDescription("IsFavorit", SortDirection.Descending)); items.SortDescriptions.Add(new SortDescription("Category", SortDirection.Ascending)); var highPriCat = RankingSettings.HighPriorityCategory; var lowPriCat = RankingSettings.LowPriorityCategory; foreach (var i in RankingSettings.HighPriorityCategory) { items.Add(new CategoryWithFav() { Category = i.Category, IsFavorit = true }); } var middleRankingCategories = Enum.GetValues(typeof(RankingCategory)).Cast <RankingCategory>() .Where(x => !highPriCat.Any(h => x == h.Category)) .Where(x => !lowPriCat.Any(l => x == l.Category)) ; foreach (var category in middleRankingCategories) { items.Add(new CategoryWithFav() { Category = category }); } items.Refresh(); var choiceItems = await HohoemaDialogService.ShowMultiChoiceDialogAsync( "優先表示にするカテゴリを選択", items.Cast <CategoryWithFav>().Select(x => new RankingCategoryInfo(x.Category)), RankingSettings.HighPriorityCategory.ToArray(), x => x.DisplayLabel ); if (choiceItems == null) { return; } // choiceItemsに含まれるカテゴリをMiddleとLowから削除 RankingSettings.ResetFavoriteCategory(); // HighにchoiceItemsを追加(重複しないよう注意) foreach (var cat in choiceItems) { RankingSettings.AddFavoritCategory(cat.Category); } await RankingSettings.Save(); ResetRankingCategoryItems(); }); AddDislikeRankingCategory = new DelegateCommand(async() => { var items = new AdvancedCollectionView(); items.SortDescriptions.Add(new SortDescription("IsFavorit", SortDirection.Descending)); items.SortDescriptions.Add(new SortDescription("Category", SortDirection.Ascending)); var highPriCat = RankingSettings.HighPriorityCategory; var lowPriCat = RankingSettings.LowPriorityCategory; foreach (var i in lowPriCat) { items.Add(new CategoryWithFav() { Category = i.Category, IsFavorit = true }); } var middleRankingCategories = Enum.GetValues(typeof(RankingCategory)).Cast <RankingCategory>() .Where(x => !highPriCat.Any(h => x == h.Category)) .Where(x => !lowPriCat.Any(l => x == l.Category)) ; foreach (var category in middleRankingCategories) { items.Add(new CategoryWithFav() { Category = category }); } items.Refresh(); var choiceItems = await HohoemaDialogService.ShowMultiChoiceDialogAsync( "非表示にするカテゴリを選択", items.Cast <CategoryWithFav>().Select(x => new RankingCategoryInfo(x.Category)), RankingSettings.LowPriorityCategory, x => x.DisplayLabel ); if (choiceItems == null) { return; } // choiceItemsに含まれるカテゴリをMiddleとLowから削除 RankingSettings.ResetDislikeCategory(); // HighにchoiceItemsを追加(重複しないよう注意) foreach (var cat in choiceItems) { RankingSettings.AddDislikeCategory(cat.Category); } await RankingSettings.Save(); ResetRankingCategoryItems(); }); ResetRankingCategoryItems(); }
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); }