public LiveCommentSidePaneContentViewModel( NGSettings settings, Microsoft.Toolkit.Uwp.UI.AdvancedCollectionView comments, Services.ExternalAccessService externalAccessService, Commands.NicoLiveUserIdAddToNGCommand nicoLiveUserIdAddToNGCommand, Commands.NicoLiveUserIdRemoveFromNGCommand nicoLiveUserIdRemoveFromNGCommand ) { NGSettings = settings; Comments = comments; ExternalAccessService = externalAccessService; NicoLiveUserIdAddToNGCommand = nicoLiveUserIdAddToNGCommand; NicoLiveUserIdRemoveFromNGCommand = nicoLiveUserIdRemoveFromNGCommand; IsCommentListScrollWithVideo = new ReactiveProperty <bool>(CurrentWindowContextScheduler, false) .AddTo(_CompositeDisposable); NGUsers = new ReadOnlyObservableCollection <NGUserIdInfo>(NGSettings.NGLiveCommentUserIds); IsNGCommentUserIdEnabled = NGSettings.ToReactivePropertyAsSynchronized(x => x.IsNGLiveCommentUserEnable, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); }
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); }
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 SettingsSidePaneContentViewModel(NGSettings ngSettings, PlayerSettings playerSettings, PlaylistSettings playlistSettings) { _NGSettings = ngSettings; _PlayerSettings = playerSettings; _PlaylistSettings = playlistSettings; VideoPlayingQuality = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.DefaultQuality, convert: x => VideoPlayingQualityList.First(y => y.Value == x), convertBack: x => x.Value, raiseEventScheduler: CurrentWindowContextScheduler, mode: ReactivePropertyMode.DistinctUntilChanged ) .AddTo(_CompositeDisposable); VideoPlayingQuality.Subscribe(x => { VideoQualityChanged?.Invoke(this, x.Value); }) .AddTo(_CompositeDisposable); VideoPlaybackRate = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.PlaybackRate); SetPlaybackRateCommand = VideoPlaybackRate.Select( rate => rate != 1.0 ) .ToReactiveCommand <double?>(CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); SetPlaybackRateCommand.Subscribe( (rate) => VideoPlaybackRate.Value = rate.HasValue ? rate.Value : 1.0 ) .AddTo(_CompositeDisposable); LiveVideoPlayingQuality = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.DefaultLiveQuality, convert: x => LivePlayingQualityList.FirstOrDefault(y => y.Value == x), convertBack: x => x.Value, raiseEventScheduler: CurrentWindowContextScheduler, mode: ReactivePropertyMode.DistinctUntilChanged ) .AddTo(_CompositeDisposable); IsLowLatency = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.LiveWatchWithLowLatency, CurrentWindowContextScheduler, mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(_CompositeDisposable); IsKeepDisplayInPlayback = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.IsKeepDisplayInPlayback, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); ScrollVolumeFrequency = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.SoundVolumeChangeFrequency, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); IsForceLandscapeDefault = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.IsForceLandscape, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); AutoHideDelayTime = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.AutoHidePlayerControlUIPreventTime , x => x.TotalSeconds , x => TimeSpan.FromSeconds(x) , CurrentWindowContextScheduler ) .AddTo(_CompositeDisposable); PlaylistEndAction = _PlaylistSettings.ToReactivePropertyAsSynchronized(x => x.PlaylistEndAction, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); AutoMoveNextVideoOnPlaylistEmpty = _PlaylistSettings.ToReactivePropertyAsSynchronized(x => x.AutoMoveNextVideoOnPlaylistEmpty, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); // NG Comment User Id // Comment Display CommentColor = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.CommentColor, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); IsPauseWithCommentWriting = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.PauseWithCommentWriting, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); CommentRenderingFPS = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.CommentRenderingFPS, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); CommentDisplayDuration = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.CommentDisplayDuration, x => x.TotalSeconds, x => TimeSpan.FromSeconds(x), CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); CommentFontScale = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.DefaultCommentFontScale, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); IsDefaultCommentWithAnonymous = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.IsDefaultCommentWithAnonymous, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); CommentOpacity = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.CommentOpacity, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); IsEnableOwnerCommentCommand = new ReactiveProperty <bool>(CurrentWindowContextScheduler, _PlayerSettings.CommentCommandPermission.HasFlag(CommentCommandPermissionType.Owner)) .AddTo(_CompositeDisposable); IsEnableUserCommentCommand = new ReactiveProperty <bool>(CurrentWindowContextScheduler, _PlayerSettings.CommentCommandPermission.HasFlag(CommentCommandPermissionType.User)) .AddTo(_CompositeDisposable); IsEnableAnonymousCommentCommand = new ReactiveProperty <bool>(CurrentWindowContextScheduler, _PlayerSettings.CommentCommandPermission.HasFlag(CommentCommandPermissionType.Anonymous)) .AddTo(_CompositeDisposable); IsEnableOwnerCommentCommand.Subscribe(x => SetCommentCommandPermission(x, CommentCommandPermissionType.Owner)) .AddTo(_CompositeDisposable); IsEnableUserCommentCommand.Subscribe(x => SetCommentCommandPermission(x, CommentCommandPermissionType.User)) .AddTo(_CompositeDisposable); IsEnableAnonymousCommentCommand.Subscribe(x => SetCommentCommandPermission(x, CommentCommandPermissionType.Anonymous)) .AddTo(_CompositeDisposable); NicoScript_Default_Enabled = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.NicoScript_Default_Enabled, raiseEventScheduler: CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); NicoScript_DisallowSeek_Enabled = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.NicoScript_DisallowSeek_Enabled, raiseEventScheduler: CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); NicoScript_DisallowComment_Enabled = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.NicoScript_DisallowComment_Enabled, raiseEventScheduler: CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); NicoScript_Jump_Enabled = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.NicoScript_Jump_Enabled, raiseEventScheduler: CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); NicoScript_Replace_Enabled = _PlayerSettings.ToReactivePropertyAsSynchronized(x => x.NicoScript_Replace_Enabled, raiseEventScheduler: CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); // NG Comment NGCommentUserIdEnable = _NGSettings.ToReactivePropertyAsSynchronized(x => x.NGCommentUserIdEnable, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); NGCommentUserIds = _NGSettings.NGCommentUserIds .ToReadOnlyReactiveCollection(x => RemovableSettingsListItemHelper.UserIdInfoToRemovableListItemVM(x, OnRemoveNGCommentUserIdFromList), CurrentWindowContextScheduler ) .AddTo(_CompositeDisposable); NGCommentKeywordEnable = _NGSettings.ToReactivePropertyAsSynchronized(x => x.NGCommentKeywordEnable, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); NGCommentKeywords = new ReactiveProperty <string>(CurrentWindowContextScheduler, string.Empty) .AddTo(_CompositeDisposable); NGCommentKeywordError = NGCommentKeywords .Select(x => { 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(string.Empty); } else { return($"Error in \"{invalidRegex}\""); } }) .ToReadOnlyReactiveProperty(eventScheduler: CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); NGCommentScoreTypes = ((IEnumerable <NGCommentScore>)Enum.GetValues(typeof(NGCommentScore))).ToList(); SelectedNGCommentScore = _NGSettings.ToReactivePropertyAsSynchronized(x => x.NGCommentScoreType, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); CommentGlassMowerEnable = _PlayerSettings .ToReactivePropertyAsSynchronized(x => x.CommentGlassMowerEnable, CurrentWindowContextScheduler) .AddTo(_CompositeDisposable); }