void ResetRankingCategoryItems() { RankingCategoryItems.Clear(); RankingCategoryItems.Add( new RankingCategoryHostListItem("好きなランキング") { ChildItems = RankingSettings.HighPriorityCategory .Select(x => new RankingCategoryListPageListItem(x.Category, true, OnRankingCategorySelected)) .ToList() } ); foreach (var categoryList in RankingCategories) { // 非表示ランキングを除外したカテゴリリストを作成 var label = categoryList.First().ToCulturelizeString(); var list = categoryList .Where(x => !RankingSettings.IsDislikeRankingCategory(x)) .Select(x => CreateRankingCategryListItem(x)) .ToList(); // 表示対象があればリストに追加 if (list.Count > 0) { RankingCategoryItems.Add(new RankingCategoryHostListItem(label) { ChildItems = list }); } } RaisePropertyChanged(nameof(RankingCategoryItems)); }
public RankingCategoryPageViewModel( PageManager pageManager, Services.HohoemaPlaylist hohoemaPlaylist, NicoVideoProvider nicoVideoProvider, RankingSettings rankingSettings, NGSettings ngSettings ) : base(pageManager, useDefaultPageTitle: false) { HohoemaPlaylist = hohoemaPlaylist; NicoVideoProvider = nicoVideoProvider; RankingSettings = rankingSettings; NgSettings = ngSettings; SelectedRankingTarget = RankingSettings.ToReactivePropertyAsSynchronized(x => x.Target, mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(_CompositeDisposable); SelectedRankingTimeSpan = RankingSettings.ToReactivePropertyAsSynchronized(x => x.TimeSpan, mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(_CompositeDisposable); IsFailedRefreshRanking = new ReactiveProperty <bool>(false) .AddTo(_CompositeDisposable); CanChangeRankingParameter = new ReactiveProperty <bool>(false) .AddTo(_CompositeDisposable); new[] { SelectedRankingTarget.ToUnit(), SelectedRankingTimeSpan.ToUnit() } .Merge() .Subscribe(__ => { _ = ResetList(); }) .AddTo(_CompositeDisposable); }
static IEnumerable <RankingItem> GetGenreTagRankingItems(RankingGenre genre, RankingSettings rankingSettings) { // アプリ上の要請としてジャンルトップの「すべて」or「話題」を除外して表示したい // (GroupItemと表示錠の役割が重複してしまうような、ユーザーを混乱させてしまう可能性を除去したい) var info = Database.Local.RankingGenreTagsDb.Get(genre); if (info == null) { return(Enumerable.Empty <RankingItem>()); } return(info.Tags .Where(x => !string.IsNullOrEmpty(x.Tag) && x.Tag != "all") .Select(y => new RankingItem() { Genre = genre, IsDisplay = !rankingSettings.IsHiddenTag(genre, y.Tag), Label = y.DisplayName, Tag = y.Tag } )); }
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 SettingsPageViewModel( PageManager pageManager, NotificationService toastService, Services.DialogService dialogService, NGSettings ngSettings, RankingSettings rankingSettings, ActivityFeedSettings activityFeedSettings, AppearanceSettings appearanceSettings, CacheSettings cacheSettings ) : base(pageManager) { ToastNotificationService = toastService; NgSettings = ngSettings; RankingSettings = rankingSettings; _HohoemaDialogService = dialogService; NgSettings = ngSettings; RankingSettings = rankingSettings; ActivityFeedSettings = activityFeedSettings; AppearanceSettings = appearanceSettings; CacheSettings = cacheSettings; IsLiveAlertEnabled = ActivityFeedSettings.ToReactivePropertyAsSynchronized(x => x.IsLiveAlertEnabled) .AddTo(_CompositeDisposable); // NG Video Owner User Id NGVideoOwnerUserIdEnable = NgSettings.ToReactivePropertyAsSynchronized(x => x.NGVideoOwnerUserIdEnable); NGVideoOwnerUserIds = NgSettings.NGVideoOwnerUserIds .ToReadOnlyReactiveCollection(); OpenUserPageCommand = new DelegateCommand <UserIdInfo>(userIdInfo => { pageManager.OpenPage(HohoemaPageType.UserInfo, userIdInfo.UserId); }); // NG Keyword on Video Title NGVideoTitleKeywordEnable = NgSettings.ToReactivePropertyAsSynchronized(x => x.NGVideoTitleKeywordEnable); NGVideoTitleKeywords = new ReactiveProperty <string>(); NGVideoTitleKeywordError = NGVideoTitleKeywords .Select(x => { if (x == null) { return(null); } var keywords = x.Split('\r'); var invalidRegex = keywords.FirstOrDefault(keyword => { Regex regex = null; try { regex = new Regex(keyword); } catch { } return(regex == null); }); if (invalidRegex == null) { return(null); } else { return($"Error in \"{invalidRegex}\""); } }) .ToReadOnlyReactiveProperty(); // アピアランス var currentTheme = App.GetTheme(); SelectedApplicationTheme = new ReactiveProperty <string>(currentTheme.ToString(), mode: ReactivePropertyMode.DistinctUntilChanged); SelectedApplicationTheme.Subscribe(x => { var type = (ApplicationTheme)Enum.Parse(typeof(ApplicationTheme), x); App.SetTheme(type); // 一度だけトースト通知 if (!ThemeChanged) { toastService.ShowToast("Hohoemaを再起動するとテーマが適用されます。", ""); } ThemeChanged = true; RaisePropertyChanged(nameof(ThemeChanged)); }); IsTVModeEnable = AppearanceSettings .ToReactivePropertyAsSynchronized(x => x.IsForceTVModeEnable); IsXbox = Services.Helpers.DeviceTypeHelper.IsXbox; IsForceMobileModeEnable = AppearanceSettings .ToReactivePropertyAsSynchronized(x => x.IsForceMobileModeEnable); IsDefaultFullScreen = new ReactiveProperty <bool>(ApplicationView.PreferredLaunchWindowingMode == ApplicationViewWindowingMode.FullScreen); IsDefaultFullScreen.Subscribe(x => { if (x) { ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.FullScreen; } else { ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.Auto; } }); StartupPageType = AppearanceSettings .ToReactivePropertyAsSynchronized(x => x.StartupPageType); // キャッシュ DefaultCacheQuality = CacheSettings.ToReactivePropertyAsSynchronized(x => x.DefaultCacheQuality); IsAllowDownloadOnMeteredNetwork = CacheSettings.ToReactivePropertyAsSynchronized(x => x.IsAllowDownloadOnMeteredNetwork); DefaultCacheQualityOnMeteredNetwork = CacheSettings.ToReactivePropertyAsSynchronized(x => x.DefaultCacheQualityOnMeteredNetwork); // シェア IsLoginTwitter = new ReactiveProperty <bool>(/*TwitterHelper.IsLoggedIn*/ false); TwitterAccountScreenName = new ReactiveProperty <string>(/*TwitterHelper.TwitterUser?.ScreenName ?? ""*/); // アバウト var version = Windows.ApplicationModel.Package.Current.Id.Version; #if DEBUG VersionText = $"{version.Major}.{version.Minor}.{version.Build} DEBUG"; #else VersionText = $"{version.Major}.{version.Minor}.{version.Build}"; #endif var dispatcher = Window.Current.CoreWindow.Dispatcher; LisenceSummary.Load() .ContinueWith(async prevResult => { await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { var lisenceSummary = prevResult.Result; LisenceItems = lisenceSummary.Items .OrderBy(x => x.Name) .Select(x => new LisenceItemViewModel(x)) .ToList(); RaisePropertyChanged(nameof(LisenceItems)); }); }); IsDebugModeEnabled = new ReactiveProperty <bool>((App.Current as App).IsDebugModeEnabled, mode: ReactivePropertyMode.DistinctUntilChanged); IsDebugModeEnabled.Subscribe(isEnabled => { (App.Current as App).IsDebugModeEnabled = isEnabled; }) .AddTo(_CompositeDisposable); }
protected override void OnHohoemaNavigatingFrom(NavigatingFromEventArgs e, Dictionary <string, object> viewModelState, bool suspending) { RankingSettings.Save().ConfigureAwait(false); base.OnHohoemaNavigatingFrom(e, viewModelState, suspending); }
public async Task OnNavigatedToAsync(INavigationParameters parameters) { if (!_appFlagsRepository.IsRankingInitialUpdate) { try { foreach (var genreItem in _RankingGenreItems) { if (genreItem.Genre == null) { continue; } var genre = genreItem.Genre.Value; var tags = await _rankingProvider.GetRankingGenreTagsAsync(genre, true); using (var refresh = genreItem.Items.DeferRefresh()) { var rankingItems = tags .Where(x => !string.IsNullOrEmpty(x.Tag) && x.Tag != "all") .Select(y => new RankingItem() { Genre = genre, IsDisplay = !RankingSettings.IsHiddenTag(genre, y.Tag), Label = y.DisplayName, Tag = y.Tag } ); genreItem.Items.Clear(); foreach (var tag in rankingItems) { genreItem.Items.Add(tag); } } await Task.Delay(500); } } finally { _appFlagsRepository.IsRankingInitialUpdate = true; } } else { if (_prevSelectedGenre != null) { var updateTargetGenre = _RankingGenreItems.FirstOrDefault(x => x.Genre == _prevSelectedGenre); if (updateTargetGenre != null) { updateTargetGenre.Items.Clear(); var items = GetGenreTagRankingItems(updateTargetGenre.Genre.Value, RankingSettings); using (updateTargetGenre.Items.DeferRefresh()) { foreach (var a in items) { updateTargetGenre.Items.Add(a); } } } } } }
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 SettingsPageViewModel( PageManager pageManager, NotificationService toastService, Services.DialogService dialogService, PlayerSettings playerSettings, NGSettings ngSettings, RankingSettings rankingSettings, ActivityFeedSettings activityFeedSettings, AppearanceSettings appearanceSettings, CacheSettings cacheSettings, ApplicationLayoutManager applicationLayoutManager ) { ToastNotificationService = toastService; NgSettings = ngSettings; RankingSettings = rankingSettings; _HohoemaDialogService = dialogService; PlayerSettings = playerSettings; NgSettings = ngSettings; RankingSettings = rankingSettings; ActivityFeedSettings = activityFeedSettings; AppearanceSettings = appearanceSettings; CacheSettings = cacheSettings; ApplicationLayoutManager = applicationLayoutManager; // NG Video Owner User Id NGVideoOwnerUserIdEnable = NgSettings.ToReactivePropertyAsSynchronized(x => x.NGVideoOwnerUserIdEnable); NGVideoOwnerUserIds = NgSettings.NGVideoOwnerUserIds .ToReadOnlyReactiveCollection(); OpenUserPageCommand = new DelegateCommand <UserIdInfo>(userIdInfo => { pageManager.OpenPageWithId(HohoemaPageType.UserInfo, userIdInfo.UserId); }); // NG Keyword on Video Title NGVideoTitleKeywordEnable = NgSettings.ToReactivePropertyAsSynchronized(x => x.NGVideoTitleKeywordEnable); NGVideoTitleKeywords = new ReactiveProperty <string>(); NGVideoTitleKeywordError = NGVideoTitleKeywords .Select(x => { if (x == null) { return(null); } var keywords = x.Split('\r'); var invalidRegex = keywords.FirstOrDefault(keyword => { Regex regex = null; try { regex = new Regex(keyword); } catch { } return(regex == null); }); if (invalidRegex == null) { return(null); } else { return($"Error in \"{invalidRegex}\""); } }) .ToReadOnlyReactiveProperty(); // アピアランス var currentTheme = App.GetTheme(); SelectedTheme = new ReactiveProperty <ElementTheme>(AppearanceSettings.Theme, mode: ReactivePropertyMode.DistinctUntilChanged); SelectedTheme.Subscribe(theme => { AppearanceSettings.Theme = theme; ApplicationTheme appTheme; if (theme == ElementTheme.Default) { appTheme = Views.Helpers.SystemThemeHelper.GetSystemTheme(); } else if (theme == ElementTheme.Dark) { appTheme = ApplicationTheme.Dark; } else { appTheme = ApplicationTheme.Light; } App.SetTheme(appTheme); var appView = ApplicationView.GetForCurrentView(); if (appTheme == ApplicationTheme.Light) { appView.TitleBar.ButtonForegroundColor = Colors.Black; appView.TitleBar.ButtonHoverBackgroundColor = Colors.DarkGray; appView.TitleBar.ButtonHoverForegroundColor = Colors.Black; appView.TitleBar.ButtonInactiveForegroundColor = Colors.Gray; } else { appView.TitleBar.ButtonForegroundColor = Colors.White; appView.TitleBar.ButtonHoverBackgroundColor = Colors.DimGray; appView.TitleBar.ButtonHoverForegroundColor = Colors.White; appView.TitleBar.ButtonInactiveForegroundColor = Colors.DarkGray; } }); IsDefaultFullScreen = new ReactiveProperty <bool>(ApplicationView.PreferredLaunchWindowingMode == ApplicationViewWindowingMode.FullScreen); IsDefaultFullScreen.Subscribe(x => { if (x) { ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.FullScreen; } else { ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.Auto; } }); StartupPageType = AppearanceSettings .ToReactivePropertyAsSynchronized(x => x.StartupPageType); AppearanceSettings.ObserveProperty(x => x.Locale, isPushCurrentValueAtFirst: false).Subscribe(locale => { I18NPortable.I18N.Current.Locale = locale; }); // キャッシュ DefaultCacheQuality = CacheSettings.ToReactivePropertyAsSynchronized(x => x.DefaultCacheQuality); IsAllowDownloadOnMeteredNetwork = CacheSettings.ToReactivePropertyAsSynchronized(x => x.IsAllowDownloadOnMeteredNetwork); DefaultCacheQualityOnMeteredNetwork = CacheSettings.ToReactivePropertyAsSynchronized(x => x.DefaultCacheQualityOnMeteredNetwork); // シェア IsLoginTwitter = new ReactiveProperty <bool>(/*TwitterHelper.IsLoggedIn*/ false); TwitterAccountScreenName = new ReactiveProperty <string>(/*TwitterHelper.TwitterUser?.ScreenName ?? ""*/); // アバウト var version = Windows.ApplicationModel.Package.Current.Id.Version; #if DEBUG VersionText = $"{version.Major}.{version.Minor}.{version.Build} DEBUG"; #else VersionText = $"{version.Major}.{version.Minor}.{version.Build}"; #endif var dispatcher = Window.Current.CoreWindow.Dispatcher; LisenceSummary.Load() .ContinueWith(async prevResult => { await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { var lisenceSummary = prevResult.Result; LisenceItems = lisenceSummary.Items .OrderBy(x => x.Name) .Select(x => new LisenceItemViewModel(x)) .ToList(); RaisePropertyChanged(nameof(LisenceItems)); }); }); IsDebugModeEnabled = new ReactiveProperty <bool>((App.Current as App).IsDebugModeEnabled, mode: ReactivePropertyMode.DistinctUntilChanged); IsDebugModeEnabled.Subscribe(isEnabled => { (App.Current as App).IsDebugModeEnabled = isEnabled; }) .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); }