public TransmittalViewModel(Transmittal transmittal) { OkayCommand = new RelayCommand(OkayCommandExecute, OkayCommandCanExecute); CancelCommand = new RelayCommand(CancelCommandExecute, CancelCommandCanExecute); AddFileCommand = new RelayCommand(AddFileExecute, FileEditCanExecute); RemoveFileCommand = new RelayCommand(RemoveFileExecute, FileRemoveCanExecute); EditRecipientsCommand = new RelayCommand(EditRecipientExecute, EditRecipientCanExecute); pg = new Progress <Document>(DocsUpdated); transmittalModel = transmittal; if (transmittalModel.IsLoadedFromDb) { Id = transmittalModel.Id; IssueToWorkshop = transmittalModel.IssueToWorkshop; SentDate = transmittalModel.SentDate; IssueType = transmittalModel.IssueType; TransmittalStatus = transmittalModel.TransmittalStatus; Comments = transmittalModel.Comments; IssueBy = transmittalModel.IssueBy; CreatedBy = transmittalModel.CreatedBy; Project = transmittalModel.Project; if (transmittalModel.ExtendedDataLoaded) { transmittalModel.Files.ForEach(f => files.Add(new FileDataViewModel(f))); Recipients = new RecipientsSelectionViewModel(transmittalModel.Recipients); } } else { CreatedBy = transmittalModel.CreatedBy; TransmittalStatus = TransmittalStatus.Preparing; } if (!transmittalModel.IsLoadedFromDb) { ViewStatus &= ViewStatusTypes.LoadedDb; } if (User.ActiveUser.Group == Groups.NoPermisions) { ViewStatus &= ViewStatusTypes.ViewOnly; } if (TransmittalStatus == TransmittalStatus.Issued) { ViewStatus &= ViewStatusTypes.Approved; } if (!ViewStatus.HasFlag(ViewStatusTypes.ViewOnly) && !ViewStatus.HasFlag(ViewStatusTypes.Approved)) { ViewStatus &= ViewStatusTypes.Editable; //Otherwise it should be editable. } }
public FullPlayerArtistViewModel() { WidthsChanged .ObservableOnThreadPool() .Throttle(TimeSpan.FromSeconds(2)) .Subscribe(_ => Setting.Interface.ArtistPageWidths.OnNext(new double[] { LeftPaneWidthPercent, RightPaneWidthPercent })); Setting.Interface.ArtistPageWidths .Take(1) .SubscribeOnDispatcher() .Subscribe(x => { LeftPaneWidthPercent = x[0]; RightPaneWidthPercent = x[1]; }); var _selectedArtists = ArtistListSelectionChanged.AsObservableList <ArtistViewModel>(); var _selectedAlbums = AlbumGridSelectionChanged.AsObservableList <AlbumViewModel>(); var _selectedTracks = TrackListSelectionChanged.AsObservableList <TrackViewModel>(); var artistOrigin = IndexService.ArtistSource.Connect().RemoveKey(); artistOrigin .ObservableOnThreadPool() .GroupOn(x => x.Name.Substring(0, 1)) .Transform(x => new GroupArtistViewModel(x)) .Sort(SortExpressionComparer <GroupArtistViewModel> .Ascending(x => x.Key)) .ObserveOnCoreDispatcher() .Bind(ArtistCvsSource) .Subscribe(); var albumOrigin = IndexService.AlbumSource.Connect().RemoveKey(); var albumSourceObservable = new ReplaySubject <IObservable <IChangeSet <AlbumViewModel> > >(1); albumSourceObservable .ObservableOnThreadPool() .Switch() .ObserveOnCoreDispatcher() .Bind(AlbumCvsSource) .Subscribe(); var trackOrigin = IndexService.TrackSource.Connect().RemoveKey(); var trackSourceObservable = new Subject <IObservable <IChangeSet <TrackViewModel> > >(); trackSourceObservable .ObservableOnThreadPool() .Switch() .GroupOn(x => x.Title.Substring(0, 1)) .Transform(x => new GroupTrackViewModel(x)) .Sort(SortExpressionComparer <GroupTrackViewModel> .Ascending(x => x.Key)) .DisposeMany() .ObserveOnCoreDispatcher() .Bind(TrackCvsSource) .Subscribe(); Observable.FromEventPattern <NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>( h => TrackCvsSource.CollectionChanged += h, h => TrackCvsSource.CollectionChanged -= h) .ObservableOnThreadPool() .Throttle(TimeSpan.FromMilliseconds(10)) .Select(_ => TrackCvsSource.Sum(x => x.Count)) .ObserveOnCoreDispatcher() .ToPropertyEx(this, x => x.CurrentTrackCount); ArtistListTapped .Where(_ => !_status.HasFlag(ViewStatus.AristTapped)) .Subscribe(_ => { _status |= ViewStatus.AristTapped; _status &= ~ViewStatus.AlbumTapped; AlbumGridSelectedItem = null; var albumSource = _selectedArtists.Connect().MergeManyEx(x => x.Albums.Connect().RemoveKey()); albumSourceObservable.OnNext(albumSource); var trackSource = albumSource.MergeManyEx(x => x.Tracks.Connect().RemoveKey()); trackSourceObservable.OnNext(trackSource); }); RestoreArtistButtonTapped .Where(_ => _status.HasFlag(ViewStatus.AristTapped)) .Subscribe(_ => { _status &= ~ViewStatus.AristTapped; _status &= ~ViewStatus.AlbumTapped; ArtistListSelectedItem = null; AlbumGridSelectedItem = null; albumSourceObservable.OnNext(albumOrigin); trackSourceObservable.OnNext(trackOrigin); }); AlbumGridTapped .Where(_ => !_status.HasFlag(ViewStatus.AlbumTapped)) .Subscribe(_ => { _status |= ViewStatus.AlbumTapped; var trackSource = _selectedAlbums.Connect().MergeManyEx(x => x.Tracks.Connect().RemoveKey()); trackSourceObservable.OnNext(trackSource); }); RestoreAlbumButtonTapped .Where(_ => _status.HasFlag(ViewStatus.AlbumTapped) && !_status.HasFlag(ViewStatus.AristTapped)) .Subscribe(_ => { _status &= ~ViewStatus.AlbumTapped; AlbumGridSelectedItem = null; trackSourceObservable.OnNext(trackOrigin); }); RestoreAlbumButtonTapped .Where(_ => _status.HasFlag(ViewStatus.AlbumTapped) && _status.HasFlag(ViewStatus.AristTapped)) .Subscribe(_ => { _status &= ~ViewStatus.AlbumTapped; AlbumGridSelectedItem = null; var trackSource = AlbumCvsSource.ToObservableChangeSet().MergeManyEx(x => x.Tracks.Connect().RemoveKey()); trackSourceObservable.OnNext(trackSource); }); albumSourceObservable.OnNext(albumOrigin); trackSourceObservable.OnNext(trackOrigin); async Task PlayTrackAsync() { var tracks = await TrackCvsSource.SelectMany(x => x).ToListAsync(); if (_selectedTracks.Count == 1) { await PlaybackService.PlayAsync(tracks, _selectedTracks.Items.First()); } else { await PlaybackService.PlayAsync(tracks); } } TrackListDoubleTapped .SubscribeOnThreadPool() .Subscribe(async _ => await PlayTrackAsync()); }