public SearchResultTagPageViewModel( HohoemaApp hohoemaApp, PageManager pageManager, MylistRegistrationDialogService mylistDialogService, ContentSelectDialogService contentSelectDialogService ) : base(hohoemaApp, pageManager, mylistDialogService, useDefaultPageTitle: false) { _ContentFinder = HohoemaApp.ContentFinder; _ContentSelectDialogService = contentSelectDialogService; FailLoading = new ReactiveProperty <bool>(false) .AddTo(_CompositeDisposable); LoadedPage = new ReactiveProperty <int>(1) .AddTo(_CompositeDisposable); IsFavoriteTag = new ReactiveProperty <bool>(mode: ReactivePropertyMode.DistinctUntilChanged) .AddTo(_CompositeDisposable); CanChangeFavoriteTagState = new ReactiveProperty <bool>() .AddTo(_CompositeDisposable); AddFavoriteTagCommand = CanChangeFavoriteTagState .ToReactiveCommand() .AddTo(_CompositeDisposable); RemoveFavoriteTagCommand = IsFavoriteTag .ToReactiveCommand() .AddTo(_CompositeDisposable); IsFavoriteTag.Subscribe(async x => { if (_NowProcessFavorite) { return; } _NowProcessFavorite = true; CanChangeFavoriteTagState.Value = false; if (x) { if (await FavoriteTag()) { Debug.WriteLine(SearchOption.Keyword + "のタグをお気に入り登録しました."); } else { // お気に入り登録に失敗した場合は状態を差し戻し Debug.WriteLine(SearchOption.Keyword + "のタグをお気に入り登録に失敗"); IsFavoriteTag.Value = false; } } else { if (await UnfavoriteTag()) { Debug.WriteLine(SearchOption.Keyword + "のタグをお気に入り解除しました."); } else { // お気に入り解除に失敗した場合は状態を差し戻し Debug.WriteLine(SearchOption.Keyword + "のタグをお気に入り解除に失敗"); IsFavoriteTag.Value = true; } } CanChangeFavoriteTagState.Value = IsFavoriteTag.Value == true || HohoemaApp.FollowManager.CanMoreAddFollow(FollowItemType.Tag); _NowProcessFavorite = false; }) .AddTo(_CompositeDisposable); }
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 UserInfoPageViewModel( HohoemaApp hohoemaApp , PageManager pageManager , Views.Service.ContentSelectDialogService contentSelectDialogService ) : base(hohoemaApp, pageManager) { _ContentSelectDialogService = contentSelectDialogService; HasOwnerVideo = true; MylistGroups = new ObservableCollection <MylistGroupListItem>(); VideoInfoItems = new ObservableCollection <VideoInfoControlViewModel>(); IsFavorite = new ReactiveProperty <bool>() .AddTo(_CompositeDisposable); CanChangeFavoriteState = new ReactiveProperty <bool>() .AddTo(_CompositeDisposable); IsFavorite .Where(x => UserId != null) .Subscribe(async x => { if (_NowProcessFavorite) { return; } _NowProcessFavorite = true; CanChangeFavoriteState.Value = false; if (x) { if (await FavoriteUser()) { Debug.WriteLine(UserName + "をお気に入り登録しました."); } else { // お気に入り登録に失敗した場合は状態を差し戻し Debug.WriteLine(UserName + "をお気に入り登録に失敗"); IsFavorite.Value = false; } } else { if (await UnfavoriteUser()) { Debug.WriteLine(UserName + "をお気に入り解除しました."); } else { // お気に入り解除に失敗した場合は状態を差し戻し Debug.WriteLine(UserName + "お気に入り解除に失敗"); IsFavorite.Value = true; } } CanChangeFavoriteState.Value = IsFavorite.Value == true || HohoemaApp.FollowManager.CanMoreAddFollow(FollowItemType.User); _NowProcessFavorite = false; }) .AddTo(_CompositeDisposable); OpenUserVideoPageCommand = VideoInfoItems.ObserveProperty(x => x.Count) .Select(x => x > 0) .ToReactiveCommand() .AddTo(_CompositeDisposable); OpenUserVideoPageCommand.Subscribe(x => { PageManager.OpenPage(HohoemaPageType.UserVideo, UserId); }) .AddTo(_CompositeDisposable); IsNGVideoOwner = new ReactiveProperty <bool>(false); AddNGVideoOwnerCommand = new ReactiveCommand(); AddNGVideoOwnerCommand.Subscribe(_ => { HohoemaApp.UserSettings.NGSettings.AddNGVideoOwnerId(UserId, UserName); IsNGVideoOwner.Value = true; HohoemaApp.UserSettings.NGSettings.Save().ConfigureAwait(false); Debug.WriteLine(UserName + "をNG動画投稿者として登録しました。"); }); RemoveNGVideoOwnerCommand = new ReactiveCommand(); RemoveNGVideoOwnerCommand.Subscribe(_ => { HohoemaApp.UserSettings.NGSettings.RemoveNGVideoOwnerId(UserId); IsNGVideoOwner.Value = false; HohoemaApp.UserSettings.NGSettings.Save().ConfigureAwait(false); Debug.WriteLine(UserName + "をNG動画投稿者の指定を解除しました。"); }); }