Esempio n. 1
0
 private MainViewModel BuildMainViewModel(IScheduler scheduler, ProviderViewModelFactory factory = null)
 {
     return(new MainViewModel(
                factory ?? ((provider, auth) => Substitute.For <IProviderViewModel>()),
                provider => Substitute.For <IAuthViewModel>(),
                _providerStorage,
                scheduler,
                scheduler
                ));
 }
Esempio n. 2
0
        public MainViewModel(MainState state, IProviderFactory factory, ProviderViewModelFactory createViewModel)
        {
            _factory = factory;
            Refresh  = ReactiveCommand.Create(state.Providers.Refresh);

            _isLoading = Refresh
                         .IsExecuting
                         .ToProperty(this, x => x.IsLoading);

            _isReady = Refresh
                       .IsExecuting
                       .Select(executing => !executing)
                       .ToProperty(this, x => x.IsReady);

            state.Providers.Connect()
            .Transform(ps => createViewModel(ps, factory.CreateProvider(ps.Parameters)))
            .Sort(SortExpressionComparer <IProviderViewModel> .Descending(x => x.Created))
            .ObserveOn(RxApp.MainThreadScheduler)
            .Bind(out _providers)
            .Subscribe();

            var canRemove = this
                            .WhenAnyValue(x => x.SelectedProvider)
                            .Select(provider => provider != null);

            Remove = ReactiveCommand.Create(
                () => state.Providers.RemoveKey(SelectedProvider.Id),
                canRemove);

            var canAddProvider = this
                                 .WhenAnyValue(x => x.SelectedSupportedType)
                                 .Select(type => Enum.IsDefined(typeof(ProviderType), type));

            Add = ReactiveCommand.Create(
                () => state.Providers.AddOrUpdate(new ProviderState {
                Type = SelectedSupportedType
            }),
                canAddProvider);

            _welcomeScreenVisible = this
                                    .WhenAnyValue(x => x.SelectedProvider)
                                    .Select(provider => provider == null)
                                    .ToProperty(this, x => x.WelcomeScreenVisible);

            _welcomeScreenCollapsed = this
                                      .WhenAnyValue(x => x.WelcomeScreenVisible)
                                      .Select(visible => !visible)
                                      .ToProperty(this, x => x.WelcomeScreenCollapsed);

            var canUnselect = this
                              .WhenAnyValue(x => x.SelectedProvider)
                              .Select(provider => provider != null);

            Unselect = ReactiveCommand.Create(() => Unit.Default, canUnselect);
            Unselect.Subscribe(unit => SelectedProvider = null);

            var outputCollectionChanges = Providers
                                          .ToObservableChangeSet(x => x.Id)
                                          .Publish()
                                          .RefCount();

            outputCollectionChanges
            .Filter(provider => provider.Id == state.SelectedProviderId)
            .ObserveOn(RxApp.MainThreadScheduler)
            .OnItemAdded(provider => SelectedProvider = provider)
            .Subscribe();

            outputCollectionChanges
            .OnItemRemoved(provider => SelectedProvider = null)
            .Subscribe();

            this.WhenAnyValue(x => x.SelectedProvider)
            .Skip(1)
            .Select(provider => provider?.Id ?? Guid.Empty)
            .Subscribe(id => state.SelectedProviderId = id);

            SelectedSupportedType = state.SelectedSupportedType ?? SupportedTypes.First();
            this.WhenAnyValue(x => x.SelectedSupportedType)
            .Subscribe(type => state.SelectedSupportedType = type);
        }
Esempio n. 3
0
        public MainViewModel(
            ProviderViewModelFactory providerFactory,
            AuthViewModelFactory authFactory,
            IProviderStorage storage,
            IFileManager files,
            IScheduler current,
            IScheduler main)
        {
            _storage = storage;
            _refresh = ReactiveCommand.CreateFromTask(
                storage.Refresh,
                outputScheduler: main);

            var providers = storage.Providers();

            providers.Transform(x => providerFactory(x, files, authFactory(x)))
            .ObserveOn(RxApp.MainThreadScheduler)
            .StartWithEmpty()
            .Bind(out _providers)
            .Subscribe();

            _isLoading = _refresh
                         .IsExecuting
                         .ToProperty(this, x => x.IsLoading, scheduler: current);

            _isReady = _refresh
                       .IsExecuting
                       .Skip(1)
                       .Select(executing => !executing)
                       .ToProperty(this, x => x.IsReady, scheduler: current);

            providers.Where(changes => changes.Any())
            .ObserveOn(RxApp.MainThreadScheduler)
            .OnItemAdded(x => SelectedProvider   = Providers.LastOrDefault())
            .OnItemRemoved(x => SelectedProvider = null)
            .Subscribe();

            var canRemove = this
                            .WhenAnyValue(x => x.SelectedProvider)
                            .Select(provider => provider != null);

            _remove = ReactiveCommand.CreateFromTask(
                () => storage.Remove(SelectedProvider.Id),
                canRemove);

            var canAddProvider = this
                                 .WhenAnyValue(x => x.SelectedSupportedType)
                                 .Select(type => !string.IsNullOrWhiteSpace(type));

            _add = ReactiveCommand.CreateFromTask(
                () => storage.Add(SelectedSupportedType),
                canAddProvider);

            _welcomeScreenVisible = this
                                    .WhenAnyValue(x => x.SelectedProvider)
                                    .Select(provider => provider == null)
                                    .ToProperty(this, x => x.WelcomeScreenVisible);

            _welcomeScreenCollapsed = this
                                      .WhenAnyValue(x => x.WelcomeScreenVisible)
                                      .Select(visible => !visible)
                                      .ToProperty(this, x => x.WelcomeScreenCollapsed);

            var canUnSelect = this
                              .WhenAnyValue(x => x.SelectedProvider)
                              .Select(provider => provider != null);

            _unselect = ReactiveCommand.Create(
                () => { SelectedProvider = null; },
                canUnSelect);

            Activator = new ViewModelActivator();
            this.WhenActivated(disposables =>
            {
                SelectedSupportedType = SupportedTypes.FirstOrDefault();
                _refresh.Execute()
                .Subscribe()
                .DisposeWith(disposables);
            });
        }