Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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
            }
                           ));
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        protected override void OnHohoemaNavigatingFrom(NavigatingFromEventArgs e, Dictionary <string, object> viewModelState, bool suspending)
        {
            RankingSettings.Save().ConfigureAwait(false);

            base.OnHohoemaNavigatingFrom(e, viewModelState, suspending);
        }
Ejemplo n.º 7
0
        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);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 8
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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }