Exemplo n.º 1
0
        public async Task CanLoadNormalPhotographsExistsDB()
        {
            var vrcPhotographs = new VrcPhotographs(new DBCacheServiceMockExistInDB());
            var filePaths      = Directory.GetFiles(@"../../../Resources/NormalPhotos", "*.png");

            vrcPhotographs.Collection.ObserveAddChanged()
            .Select(x => x.FilePath)
            .Subscribe(f =>
            {
                Assert.IsTrue(filePaths.Contains(f));
            });
            await vrcPhotographs.LoadVRCPhotoListAsync(@"../../../Resources/NormalPhotos", new CancellationToken());

            Assert.AreEqual(5, vrcPhotographs.Collection.Count);
        }
Exemplo n.º 2
0
        public void CanCreateInstance()
        {
            var vrcPhotographs = new VrcPhotographs(new DBCacheServiceMockNotExistInDB());

            Assert.IsNotNull(vrcPhotographs);
        }
Exemplo n.º 3
0
        public MainViewModel(MainWindow mainWindow)
        {
            _mainWindow = mainWindow;

            _db = new DBCacheService($"{AppCache.Instance.CacheFolderPath}{Path.DirectorySeparatorChar}cache.db");

            _vrcPhotographs = new VrcPhotographs(_db).AddTo(Disposable);
            _searchResult   = new SearchResult(_vrcPhotographs.Collection).AddTo(Disposable);
            _users          = new Users(_vrcPhotographs.Collection).AddTo(Disposable);

            SearchText = _searchResult.SearchText.ToReactivePropertyAsSynchronized(x => x.Value).AddTo(Disposable);

            ShowedPhotoList = _searchResult.ShowedPhotoList.ObserveAddChanged()
                              .ToReadOnlyReactiveCollection(
                onReset: Observable.Merge(
                    _searchResult.SearchText,
                    _searchResult.ResearchCommand,
                    _searchResult.ResetCommand)
                .Select(_ => Unit.Default))
                              .AddTo(Disposable);
            HaveNoShowedPhoto = ShowedPhotoList.ObserveAddChanged().Select(_ => !ShowedPhotoList.Any()).ToReactiveProperty().AddTo(Disposable);
            PhotoCount        = Observable.Merge(
                ShowedPhotoList.ObserveAddChanged().Select(_ => Unit.Default),
                ShowedPhotoList.ObserveRemoveChanged().Select(_ => Unit.Default),
                ShowedPhotoList.ObserveResetChanged().Select(_ => Unit.Default)
                ).Select(_ => $"{ShowedPhotoList.Count} 枚").ToReactiveProperty().AddTo(Disposable);

            SearchDate = _searchResult.SearchedDate.ToReactivePropertyAsSynchronized(x => x.Value).AddTo(Disposable);
            SearchWithUserNameCommand = new ReactiveCommand <string>().AddTo(Disposable);
            SearchWithUserNameCommand.Subscribe(_searchResult.SearchWithUserName).AddTo(Disposable);
            SearchWithWorldNameCommand = new ReactiveCommand <string>().AddTo(Disposable);
            SearchWithWorldNameCommand.Subscribe(_searchResult.SearchWithWorldName).AddTo(Disposable);
            SearchWithDateCommand = new ReactiveCommand <string>().AddTo(Disposable);
            SearchWithDateCommand.Subscribe(dateString => _searchResult.SearchWithDate(DateTime.Parse(dateString, new CultureInfo("en-US")))).AddTo(Disposable);
            SearchWithDateTypeCommand = new ReactiveCommand <DateSearchType>().AddTo(Disposable);
            SearchWithDateTypeCommand.Subscribe(type =>
            {
                var now = DateTime.Now;

                if (type == DateSearchType.TODAY)
                {
                    SearchDate.Value = now;
                }
                else if (type == DateSearchType.WEEK)
                {
                    _searchResult.SearchWithDatePeriodString(now.AddDays(-7).ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US")), now.ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US")));
                }
                else if (type == DateSearchType.MONTH)
                {
                    _searchResult.SearchWithDatePeriodString(now.AddMonths(-1).ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US")), now.ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US")));
                }
            });
            ClearSearchText = new ReactiveCommand().AddTo(Disposable);
            ClearSearchText.Subscribe(() => SearchText.Value = string.Empty).AddTo(Disposable);

            CurrentUserSortType = new ReactiveProperty <UserSortType>(UserSortType.None).AddTo(Disposable);
            CurrentUserSortType.Subscribe(type => _users.SortType.Value = CurrentUserSortType.Value).AddTo(Disposable);
            UserList = _users.SortedUserList.ObserveAddChanged()
                       .Select(u => u.Name)
                       .ToReadOnlyReactiveCollection(
                onReset: Observable.Merge(_users.SortCommand, _users.ResetCommand).Select(_ => Unit.Default))
                       .AddTo(Disposable);

            SortUserWithAlphabetCommand = new ReactiveCommand().AddTo(Disposable);
            SortUserWithCountCommand    = new ReactiveCommand().AddTo(Disposable);
            SortUserWithAlphabetCommand.Subscribe(() => CurrentUserSortType.Value = UserSortType.Alphabet).AddTo(Disposable);
            SortUserWithCountCommand.Subscribe(() => CurrentUserSortType.Value    = UserSortType.Count).AddTo(Disposable);
            CanUseToSorting = _users.SortedUserList.CollectionChangedAsObservable()
                              .Select(_ => _users.SortedUserList.Any()).ToReactiveProperty(false).AddTo(Disposable);

            OpenPhotoPreviewCommand = new ReactiveCommand <Photo>().AddTo(Disposable);
            OpenPhotoPreviewCommand.Subscribe(photo => { if (!(photo is null))
                                                         {
                                                             WindowHelper.OpenPhotoPreviewWindow(photo, ShowedPhotoList.ToList(), _searchResult, _mainWindow);
                                                         }
                                              }).AddTo(Disposable);
            OpenSettingCommand = new ReactiveCommand().AddTo(Disposable);
            OpenSettingCommand.Subscribe(() => WindowHelper.OpenSettingDialog(_mainWindow)).AddTo(Disposable);

            LoadResourcesCommand = new ReactiveCommand().AddTo(Disposable);
            LoadResourcesCommand.Subscribe(() =>
            {
                _loadingCancel  = new CancellationTokenSource().AddTo(Disposable);
                var folderPaths = GetPhotoFolders(Setting.Instance.Data.PhotoFolders);
                _loadingTask    = _vrcPhotographs.LoadVRCPhotoListAsync(folderPaths, _loadingCancel.Token);
            }).AddTo(Disposable);

            CancelLoadingCommand = new ReactiveCommand().AddTo(Disposable);
            CancelLoadingCommand.Subscribe(() =>
            {
                if (!(_loadingCancel is null))
                {
                    try
                    {
                        _loadingCancel.Cancel();
                    }
                    catch (TaskCanceledException e) { }
                }
            });

            RebootCommand = new ReactiveCommand().AddTo(Disposable);
            RebootCommand.Subscribe(async() =>
            {
                CancelLoadingCommand.Execute();
                // キャンセルにラグがあるので少し待つ
                await Task.Delay(2000).ConfigureAwait(true);
                _searchResult.ResetCommand.Execute();
                _users.ResetCommand.Execute();
                LoadResourcesCommand.Execute();
            }).AddTo(Disposable);

            DeleteCacheCommand = new ReactiveCommand().AddTo(Disposable);
            DeleteCacheCommand.Subscribe(async() =>
            {
                CancelLoadingCommand.Execute();
                await _db.DeleteAll().ConfigureAwait(true);
                AppCache.Instance.DeleteCacheFileAll();
            });

            ActiveProgressRing = new ReactiveProperty <bool>(true).AddTo(Disposable);
            _vrcPhotographs.Collection.ObserveAddChangedItems().Subscribe(_ => ActiveProgressRing.Value = false).AddTo(Disposable);
            _vrcPhotographs.Collection.ObserveResetChanged().Subscribe(_ => ActiveProgressRing.Value    = true).AddTo(Disposable);
        }