public HistoryPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService) : base(hohoemaApp, pageManager, mylistDialogService) { RemoveHistoryCommand = SelectedItems.ObserveProperty(x => x.Count) .Select(x => x > 0) .ToReactiveCommand() .AddTo(_CompositeDisposable); RemoveHistoryCommand.Subscribe(async _ => { var selectedItems = SelectedItems.ToArray(); var action = AsyncInfo.Run <uint>(async(cancelToken, progress) => { foreach (var item in selectedItems) { await RemoveHistory(item.RawVideoId); SelectedItems.Remove(item); await Task.Delay(250); } await UpdateList(); _HistoriesResponse = await HohoemaApp.ContentFinder.GetHistory(); RemoveAllHistoryCommand.RaiseCanExecuteChanged(); }); await PageManager.StartNoUIWork("視聴履歴の削除", selectedItems.Length, () => action); }) .AddTo(_CompositeDisposable); }
public CacheManagementPageViewModel(HohoemaApp app, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService) : base(app, pageManager, mylistDialogService) { if (scheduler == null) { scheduler = new SynchronizationContextScheduler(SynchronizationContext.Current); } _MediaManager = app.MediaManager; OpenCacheSettingsCommand = new DelegateCommand(() => { PageManager.OpenPage(HohoemaPageType.Settings, HohoemaSettingsKind.Cache.ToString()); }); }
public MylistPageViewModel( HohoemaApp hohoemaApp , PageManager pageManager , Views.Service.MylistRegistrationDialogService mylistDialogService , Views.Service.ContentSelectDialogService contentSelectDialogService ) : base(hohoemaApp, pageManager, mylistDialogService, isRequireSignIn: true) { _ContentSelectDialogService = contentSelectDialogService; PlayableList = new ReactiveProperty <IPlayableList>(); MylistOrigin = new ReactiveProperty <Models.PlaylistOrigin>(); IsFavoriteMylist = new ReactiveProperty <bool>(mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(_CompositeDisposable); CanChangeFavoriteMylistState = new ReactiveProperty <bool>() .AddTo(_CompositeDisposable); IsFavoriteMylist .Where(x => PlayableList.Value.Id != null) .Subscribe(async x => { if (PlayableList.Value.Origin != PlaylistOrigin.OtherUser) { return; } if (_NowProcessFavorite) { return; } _NowProcessFavorite = true; CanChangeFavoriteMylistState.Value = false; if (x) { if (await FavoriteMylist()) { Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り登録しました."); } else { // お気に入り登録に失敗した場合は状態を差し戻し Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り登録に失敗"); IsFavoriteMylist.Value = false; } } else { if (await UnfavoriteMylist()) { Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り解除しました."); } else { // お気に入り解除に失敗した場合は状態を差し戻し Debug.WriteLine(_MylistTitle + "のマイリストをお気に入り解除に失敗"); IsFavoriteMylist.Value = true; } } CanChangeFavoriteMylistState.Value = IsFavoriteMylist.Value == true || HohoemaApp.FollowManager.CanMoreAddFollow(FollowItemType.Mylist); _NowProcessFavorite = false; }) .AddTo(_CompositeDisposable); UnregistrationMylistCommand = SelectedItems.ObserveProperty(x => x.Count) .Where(_ => this.CanEditMylist) .Select(x => x > 0) .ToReactiveCommand(false); UnregistrationMylistCommand.Subscribe(async _ => { var mylistGroup = HohoemaApp.UserMylistManager.GetMylistGroup(PlayableList.Value.Id); var items = SelectedItems.ToArray(); var action = AsyncInfo.Run <uint>(async(cancelToken, progress) => { uint progressCount = 0; int successCount = 0; int failedCount = 0; Debug.WriteLine($"マイリストに追加解除を開始..."); foreach (var video in items) { var unregistrationResult = await mylistGroup.Unregistration( video.RawVideoId , withRefresh: false /* あとでまとめてリフレッシュするのでここでは OFF */); if (unregistrationResult == ContentManageResult.Success) { successCount++; } else { failedCount++; } progressCount++; progress.Report(progressCount); Debug.WriteLine($"{video.Title}[{video.RawVideoId}]:{unregistrationResult.ToString()}"); } // 登録解除結果を得るためリフレッシュ await mylistGroup.Refresh(); // ユーザーに結果を通知 var titleText = $"「{mylistGroup.Name}」から {successCount}件 の動画が登録解除されました"; var toastService = App.Current.Container.Resolve <ToastNotificationService>(); var resultText = $""; if (failedCount > 0) { resultText += $"\n登録解除に失敗した {failedCount}件 は選択されたままです"; } toastService.ShowText(titleText, resultText); // 登録解除に失敗したアイテムだけを残すように // マイリストから除外された動画を選択アイテムリストから削除 foreach (var item in SelectedItems.ToArray()) { if (false == mylistGroup.CheckRegistratedVideoId(item.RawVideoId)) { SelectedItems.Remove(item); IncrementalLoadingItems.Remove(item); } } Debug.WriteLine($"マイリストに追加解除完了---------------"); }); await PageManager.StartNoUIWork("マイリストに追加解除", items.Length, () => action); }); CopyMylistCommand = SelectedItems.ObserveProperty(x => x.Count) .Where(_ => this.CanEditMylist) .Select(x => x > 0) .ToReactiveCommand(false); CopyMylistCommand.Subscribe(async _ => { var mylistGroup = HohoemaApp.UserMylistManager.GetMylistGroup(PlayableList.Value.Id); // ターゲットのマイリストを選択する var targetMylist = await MylistDialogService .ShowSelectSingleMylistDialog( SelectedItems.Count , hideMylistGroupId: mylistGroup.GroupId ); if (targetMylist == null) { return; } // すでにターゲットのマイリストに登録されている動画を除外してコピーする var items = SelectedItems .Where(x => !targetMylist.CheckRegistratedVideoId(x.RawVideoId)) .ToList(); var action = AsyncInfo.Run <uint>(async(cancelToken, progress) => { Debug.WriteLine($"マイリストのコピーを開始..."); var result = await mylistGroup.CopyMylistTo( targetMylist , items.Select(video => video.RawVideoId).ToArray() ); Debug.WriteLine($"copy mylist {items.Count} item from {mylistGroup.Name} to {targetMylist.Name} : {result.ToString()}"); // ユーザーに結果を通知 var toastService = App.Current.Container.Resolve <ToastNotificationService>(); string titleText; string contentText; if (result == ContentManageResult.Success) { titleText = $"「{targetMylist.Name}」に {SelectedItems.Count}件 コピーしました"; contentText = $" {SelectedItems.Count}件 の動画をコピーしました"; progress.Report((uint)items.Count); } else { titleText = $"マイリストコピーに失敗"; contentText = $"時間を置いてからやり直してみてください"; } toastService.ShowText(titleText, contentText); // 成功した場合は選択状態を解除 if (result == ContentManageResult.Success) { ClearSelection(); } Debug.WriteLine($"マイリストのコピー完了..."); }); await PageManager.StartNoUIWork("マイリストのコピー", items.Count, () => action); }); MoveMylistCommand = SelectedItems.ObserveProperty(x => x.Count) .Where(_ => this.CanEditMylist) .Select(x => x > 0) .ToReactiveCommand(false); MoveMylistCommand.Subscribe(async _ => { var mylistGroup = HohoemaApp.UserMylistManager.GetMylistGroup(PlayableList.Value.Id); // ターゲットのマイリストを選択する var targetMylist = await MylistDialogService .ShowSelectSingleMylistDialog( SelectedItems.Count , hideMylistGroupId: mylistGroup.GroupId ); if (targetMylist == null) { return; } // すでにターゲットのマイリストに登録されている動画を除外してコピーする var items = SelectedItems .Where(x => !targetMylist.CheckRegistratedVideoId(x.RawVideoId)) .ToList(); Debug.WriteLine($"マイリストの移動を開始..."); var result = await mylistGroup.MoveMylistTo( targetMylist , items.Select(video => video.RawVideoId).ToArray() ); Debug.WriteLine($"move mylist {items.Count} item from {mylistGroup.Name} to {targetMylist.Name} : {result.ToString()}"); // ユーザーに結果を通知 var toastService = App.Current.Container.Resolve <ToastNotificationService>(); string titleText; string contentText; if (result == ContentManageResult.Success) { titleText = $"「{targetMylist.Name}」に {SelectedItems.Count}件 移動しました"; contentText = $" {SelectedItems.Count}件 の動画を移動しました"; } else { titleText = $"マイリスト移動に失敗"; contentText = $"時間を置いてからやり直してみてください"; } toastService.ShowText(titleText, contentText); // 成功した場合は選択状態を解除 if (result == ContentManageResult.Success) { // 移動元のマイリストからは削除されているはず foreach (var item in SelectedItems) { if (!mylistGroup.CheckRegistratedVideoId(item.RawVideoId)) { IncrementalLoadingItems.Remove(item); } else { throw new Exception(); } } ClearSelection(); } Debug.WriteLine($"マイリストの移動完了..."); }); }
public RankingCategoryPageViewModel(HohoemaApp hohoemaApp, EventAggregator ea, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService) : base(hohoemaApp, pageManager, mylistDialogService, useDefaultPageTitle: false) { this.ChangeRequireServiceLevel(HohoemaAppServiceLevel.LoggedIn); ContentFinder = HohoemaApp.ContentFinder; _EventAggregator = ea; // RankingSettings = hohoemaApp.UserSettings.RankingSettings; IsFailedRefreshRanking = new ReactiveProperty <bool>(false) .AddTo(_CompositeDisposable); CanChangeRankingParameter = new ReactiveProperty <bool>(false) .AddTo(_CompositeDisposable); // ランキングの対象 RankingTargetItems = new List <RankingTargetListItem>() { new RankingTargetListItem(RankingTarget.view), new RankingTargetListItem(RankingTarget.res), new RankingTargetListItem(RankingTarget.mylist) }; SelectedRankingTarget = new ReactiveProperty <RankingTargetListItem>(RankingTargetItems[0], ReactivePropertyMode.DistinctUntilChanged) .AddTo(_CompositeDisposable); // ランキングの集計期間 RankingTimeSpanItems = new List <RankingTimeSpanListItem>() { new RankingTimeSpanListItem(RankingTimeSpan.hourly), new RankingTimeSpanListItem(RankingTimeSpan.daily), new RankingTimeSpanListItem(RankingTimeSpan.weekly), new RankingTimeSpanListItem(RankingTimeSpan.monthly), new RankingTimeSpanListItem(RankingTimeSpan.total), }; SelectedRankingTimeSpan = new ReactiveProperty <RankingTimeSpanListItem>(RankingTimeSpanItems[0], ReactivePropertyMode.DistinctUntilChanged) .AddTo(_CompositeDisposable); Observable.Merge( SelectedRankingTimeSpan.ToUnit(), SelectedRankingTarget.ToUnit() ) .SubscribeOnUIDispatcher() .Subscribe(async x => { // NavigateToが呼ばれた後 if (RequireCategoryInfo != null || CategoryInfo != null) { await ResetList(); } }) .AddTo(_CompositeDisposable); }
public CommunityVideoPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService) : base(hohoemaApp, pageManager) { }
public FeedVideoListPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService) : base(hohoemaApp, pageManager, mylistDialogService, isRequireSignIn: true) { LastUpdate = new ReactiveProperty <DateTime>(); AllMarkAsReadCommand = new DelegateCommand(async() => { FeedGroup.ForceMarkAsRead(); await HohoemaApp.FeedManager.SaveOne(FeedGroup); AllMarkAsReadCommand.RaiseCanExecuteChanged(); } , () => { return((FeedGroup?.GetUnreadItemCount() ?? 0) > 0); }); SelectedItemsMarkAsReadCommand = SelectedItems.ToCollectionChanged() .Select(x => SelectedItems.Count(y => y.IsUnread.Value) > 0) .ToReactiveCommand(false) .AddTo(_CompositeDisposable); SelectedItemsMarkAsReadCommand.Subscribe(async _ => { foreach (var item in SelectedItems) { await HohoemaApp.FeedManager.MarkAsRead(item.VideoId); await HohoemaApp.FeedManager.MarkAsRead(item.RawVideoId); } ClearSelection(); }) .AddTo(_CompositeDisposable); OpenFeedGroupPageCommand = new DelegateCommand(() => { if (FeedGroup != null) { PageManager.OpenPage(HohoemaPageType.FeedGroup, FeedGroup.Id); } }); }
public SearchPageViewModel(HohoemaApp hohoemaApp, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService) : base(hohoemaApp, pageManager) { _MylistDialogService = mylistDialogService; SearchText = new ReactiveProperty <string>("") .AddTo(_CompositeDisposable); TargetListItems = new List <SearchTarget>() { SearchTarget.Keyword, SearchTarget.Tag, SearchTarget.Mylist, SearchTarget.Community, SearchTarget.Niconama, }; SelectedTarget = new ReactiveProperty <SearchTarget>(TargetListItems[0]) .AddTo(_CompositeDisposable); SearchOptionVM = new ReactiveProperty <SearchOptionViewModelBase>(); SearchOptionVMDict = new Dictionary <SearchTarget, SearchOptionViewModelBase>(); SelectedTarget.Subscribe(x => { RaiseSearchTargetFlags(); var keyword = SearchOptionVM.Value?.Keyword ?? ""; SearchOptionViewModelBase searchOptionVM = null; if (SearchOptionVMDict.ContainsKey(x)) { searchOptionVM = SearchOptionVMDict[x]; } else { searchOptionVM = SearchOptioniViewModelHelper.CreateFromTarget(x); SearchOptionVMDict.Add(x, searchOptionVM); } searchOptionVM.Keyword = keyword; SearchOptionVM.Value = searchOptionVM; }); DoSearchCommand = SearchText.Select(x => !String.IsNullOrEmpty(x)) .ToReactiveCommand() .AddTo(_CompositeDisposable); SearchText.Subscribe(x => { Debug.WriteLine($"検索:{x}"); }); DoSearchCommand.CanExecuteChangedAsObservable() .Subscribe(x => { Debug.WriteLine(DoSearchCommand.CanExecute()); }); DoSearchCommand.Subscribe(_ => { if (SearchText.Value.Length == 0) { return; } // Note: Keywordの管理はSearchPage側で行うべき? SearchOptionVM.Value.Keyword = SearchText.Value; var searchOption = SearchOptionVM.Value.MakePayload(); // 検索結果を表示 PageManager.Search(searchOption); }) .AddTo(_CompositeDisposable); }
public UserVideoPageViewModel(HohoemaApp app, PageManager pageManager, Views.Service.MylistRegistrationDialogService mylistDialogService) : base(app, pageManager, mylistDialogService, isRequireSignIn: true) { }