protected NetworkSongViewModel(Library library, Guid accessToken, CoreSettings coreSettings, Func <TSong, TViewModel> modelToViewModelConverter, INetworkSongFinder <TSong> songFinder = null) : base(library, coreSettings, accessToken) { if (modelToViewModelConverter == null) { throw new ArgumentNullException(nameof(modelToViewModelConverter)); } this.modelToViewModelConverter = modelToViewModelConverter; this.songFinder = songFinder; IObservable <bool> canPlayNow = this.Library.LocalAccessControl.ObserveAccessPermission(accessToken) .Select(x => x == AccessPermission.Admin || !this.CoreSettings.LockPlayPause); this.playNowCommand = ReactiveCommand.CreateAsyncTask(canPlayNow, _ => this.Library.PlayInstantlyAsync(this.SelectedSongs.Select(vm => vm.Model), accessToken)); this.selectedSong = this.WhenAnyValue(x => x.SelectedSongs) .Select(x => x == null ? null : this.SelectedSongs.FirstOrDefault()) .ToProperty(this, x => x.SelectedSong); this.Search = ReactiveCommand.Create(); this.WhenAnyValue(x => x.SearchText, x => x.Trim()).DistinctUntilChanged().Skip(1) .Throttle(TimeSpan.FromMilliseconds(500), RxApp.TaskpoolScheduler).Select(_ => Unit.Default) .Merge(this.Search.ToUnit()) .StartWith(Unit.Default) .Select(_ => this.StartSearchAsync()) .Switch() .Select(x => x.OrderBy(this.SongOrderFunc).ToList()) .Subscribe(x => { this.SelectableSongs = x; this.SelectedSongs = (IEnumerable <ISongViewModelBase>) this.SelectableSongs.Take(1).ToList(); }); }
public SoundCloudViewModel(Library library, Guid accessToken, CoreSettings coreSettings, ViewSettings viewSettings, INetworkSongFinder <SoundCloudSong> songFinder = null) : base(library, accessToken, coreSettings, song => new SoundCloudSongViewModel(song), songFinder ?? new SoundCloudSongFinder(Locator.Current.GetService <IBlobCache>(BlobCacheKeys.RequestCacheContract))) { if (viewSettings == null) { throw new ArgumentNullException(nameof(viewSettings)); } this.viewSettings = viewSettings; this.OrderByUploaderCommand = ReactiveCommand.Create(); this.OrderByUploaderCommand.Subscribe(_ => this.ApplyOrder(SortHelpers.GetOrderByUploader, ref this.uploaderOrder)); this.OrderByPlaybacksCommand = ReactiveCommand.Create(); this.OrderByPlaybacksCommand.Subscribe(_ => this.ApplyOrder(SortHelpers.GetOrderByPlaybacks, ref this.playbacksOrder)); }