Example #1
0
    public MainViewModel(MainState state, ICloudFactory factory, CloudViewModelFactory createViewModel)
    {
        _factory = factory;
        Refresh  = ReactiveCommand.Create(state.Clouds.Refresh);

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

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

        state
        .Clouds
        .Connect()
        .Transform(ps => createViewModel(ps, factory.CreateCloud(ps.Parameters)))
        .Sort(SortExpressionComparer <ICloudViewModel> .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.Clouds.RemoveKey(SelectedProvider.Id),
            canRemove);

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

        Add = ReactiveCommand.Create(
            () => state.Clouds.AddOrUpdate(new CloudState {
            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 = Clouds
                                      .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);
    }