public Playlist(ViewModelServiceContainer container, IValidator <Playlist> validator, DialogViewModel dialogViewModel, Data.Playlist model) : base(model, validator, container.Messenger) { using (BusyStack.GetToken()) { _itemsLock = new object(); _dialogViewModel = dialogViewModel ?? throw new ArgumentNullException(nameof(dialogViewModel), $"{nameof(dialogViewModel)} {Resources.IsRequired}"); _sequenceProvider = container.SequenceService; _translator = container.LocalizationService; _title = model.Title; _description = model.Description; _repeatMode = (RepeatMode)model.RepeatMode; _isShuffeling = model.IsShuffeling; _sequence = model.Sequence; RepeatModes = new RangeObservableCollection <RepeatMode>(Enum.GetValues(typeof(RepeatMode)).Cast <RepeatMode>().ToList()); History = new Stack <int>(); Items = new RangeObservableCollection <MediaItem>(); Items.CollectionChanged += (o, e) => OnPropertyChanged(nameof(Count)); BindingOperations.EnableCollectionSynchronization(Items, _itemsLock); View = CollectionViewSource.GetDefaultView(Items); OnPropertyChanged(nameof(Count)); InitializeCommands(); Validate(); } }
private async Task StartTimedSynchronization(CancellationToken token) { using (BusyStack.GetToken()) { try { await Dispatcher.Invoke(() => IsActive = true, token).ConfigureAwait(false); do { await Synchronize(token).ConfigureAwait(false); await UpdateExecution().ConfigureAwait(false); await Task.Delay(Interval).ConfigureAwait(false); } while (!token.IsCancellationRequested); } finally { await Dispatcher.Invoke(() => IsActive = false).ConfigureAwait(false); await UpdateExecution().ConfigureAwait(false); } } async Task UpdateExecution() { var nextExecution = DateTime.Now + Interval; await Dispatcher.Invoke(() => NextExecution = nextExecution).ConfigureAwait(false); } }
public virtual MediaItem Next() { using (BusyStack.GetToken()) { if (Items != null && Items.Any()) { if (IsShuffeling) { return(NextShuffle()); } else { switch (RepeatMode) { case RepeatMode.All: return(NextRepeatAll()); case RepeatMode.None: return(NextRepeatNone()); case RepeatMode.Single: return(NextRepeatSingle()); default: throw new NotImplementedException(nameof(RepeatMode)); } } } return(null); } }
public virtual MediaItem Previous() { using (BusyStack.GetToken()) { Items.ToList().ForEach(p => p.IsSelected = false); // deselect all items in the list if (_history?.Any() == true) { while (_history.Any()) { var previous = _history.Pop(); //if (previous == SelectedItem?.Sequence) // the most recent item in the history, is the just played item, so we wanna skip that // continue; if (previous > -1) { var previousItems = Items.Where(p => p.Sequence == previous); // try to get the last played item if (previousItems.Any()) { var foundItem = previousItems.First(); foundItem.IsSelected = true; return(foundItem); } } } } return(null); } }
private async Task Add(CancellationToken token) { using (BusyStack.GetToken()) { await Add(new Pattern(CommandBuilder, CommandManager, _directoriesViewModel, Content)).ConfigureAwait(false); } }
public void ValidateState(Action action) { using (BusyStack.GetToken()) { action?.Invoke(); } }
public async Task AddRange() { using (BusyStack.GetToken()) { await AddRange(Enumerable.Range(0, 5).Select(_ => new DataEntryViewModel(CommandBuilder))).ConfigureAwait(false); } }
/// <summary> /// Previouses this instance. /// </summary> public void Previous() { using (BusyStack.GetToken()) { var item = Playlist.Previous(); Player.Play(item); } }
private Operation() { BusyStack = new BusyStack(); BusyStack.OnChanged = (hasItems) => { IsBusy = hasItems; }; }
/// <summary> /// Nexts this instance. /// </summary> public void Next() { using (BusyStack.GetToken()) { var item = Playlist.Next(); Player.Play(item); } }
private async Task LoadFromUrl(CancellationToken token) { using (BusyStack.GetToken()) { var items = await _dialogViewModel.ShowUrlParseDialog(token).ConfigureAwait(true); AddRange(items); } }
private async Task LoadFromUrl() { using (BusyStack.GetToken()) { var items = await _dialogViewModel.ShowUrlParseDialog().ConfigureAwait(true); Items.AddRange(items); } }
private void RemoveRange(IList items) { if (items == null) { throw new ArgumentNullException(nameof(items), $"{nameof(items)} {Resources.IsRequired}"); } using (BusyStack.GetToken()) RemoveRangeInternal(items.Cast <MediaItem>().ToList()); }
public virtual void RemoveRange(IEnumerable <MediaItem> items) { if (items == null) { throw new ArgumentNullException(nameof(items), $"{nameof(items)} {Resources.IsRequired}"); } using (BusyStack.GetToken()) RemoveRangeInternal(items.ToList()); }
public virtual void Remove(MediaItem item) { using (BusyStack.GetToken()) { while (Items.Contains(item)) { RemoveInternal(item); } } }
/// <summary> /// Adds the range. /// </summary> /// <param name="mediaItems">The media items.</param> public void AddRange(IEnumerable <MediaItem> mediaItems) { using (BusyStack.GetToken()) { foreach (var item in mediaItems) { Playlist.Add(item); } } }
public MediaRepository(IPlaylistMapper playlistMapper, IMediaItemMapper mediaItemMapper, IMediaPlayerMapper mediaPlayerMapper, IPlaylistContext context) { _context = context ?? throw new ArgumentNullException(nameof(context)); _mediaItemMapper = mediaItemMapper ?? throw new ArgumentNullException(nameof(mediaItemMapper)); _playlistMapper = playlistMapper ?? throw new ArgumentNullException(nameof(playlistMapper)); _mediaPlayerMapper = mediaPlayerMapper ?? throw new ArgumentNullException(nameof(mediaPlayerMapper)); _busyStack = new BusyStack(); _busyStack.OnChanged += (hasItems) => { IsBusy = hasItems; }; }
private Task LoadFromFile() { using (BusyStack.GetToken()) { var options = new FileSystemBrowserOptions() { CanCancel = true, MultiSelection = false, Title = _translator.Translate(nameof(Resources.SelectFiles)), }; return(_dialogViewModel.ShowFileBrowserDialog(options)); } }
public async Task AddLinked() { using (BusyStack.GetToken()) { var result = await Task.Run(() => { return(DateTime.UtcNow.ToLongTimeString()); }); DemoItems.Items.Add(new DemoItem(result)); LogItems.Items.Add(new LogItem(result)); } }
private async Task Parse() { using (BusyStack.GetToken()) { Result = await _dataParsingService.Parse(Source, ParseResultType.Playlists) .ConfigureAwait(true); if (Result.Count > 0 && Result.Playlists?.Count > 0) { AddRange(_mapper.GetMany(Result.Playlists)); } } }
/// <summary> /// Initializes a new instance of the <see cref="Scene"/> class. /// </summary> /// <param name="manager">The manager.</param> public Scene(ILocalizationService manager) { _manager = manager ?? throw new ArgumentNullException(nameof(manager), $"{nameof(manager)} {Resources.IsRequired}"); _manager.PropertyChanged += (o, e) => { if (e.PropertyName == nameof(_manager.CurrentLanguage)) { UpdateDisplayName(); } }; _busyStack = new BusyStack(); _busyStack.OnChanged += (hasItems) => IsBusy = hasItems; }
public Playlist(ViewModelServiceContainer container, IValidator <Playlist> validator, IDialogViewModel dialogViewModel, IMediaItemMapper mediaItemMapper, PlaylistModel model) : base(model, validator, container?.Messenger) { if (container == null) { throw new ArgumentNullException(nameof(container), $"{nameof(container)} {Resources.IsRequired}"); } SkipChangeTracking = true; using (BusyStack.GetToken()) { _itemsLock = new object(); _mediaItemMapper = mediaItemMapper ?? throw new ArgumentNullException(nameof(mediaItemMapper), $"{nameof(mediaItemMapper)} {Resources.IsRequired}"); _dialogViewModel = dialogViewModel ?? throw new ArgumentNullException(nameof(dialogViewModel), $"{nameof(dialogViewModel)} {Resources.IsRequired}"); _sequenceProvider = container.SequenceService; _translator = container.LocalizationService; _title = model.Title; _description = model.Description; _repeatMode = (RepeatMode)model.RepeatMode; _isShuffeling = model.IsShuffeling; _sequence = model.Sequence; RepeatModes = new RangeObservableCollection <RepeatMode>(Enum.GetValues(typeof(RepeatMode)).Cast <RepeatMode>().ToList()); _history = new Stack <int>(); Items = new RangeObservableCollection <MediaItem>(); _items.CollectionChanged += (o, e) => OnPropertyChanged(nameof(Count)); BindingOperations.EnableCollectionSynchronization(Items, _itemsLock); View = CollectionViewSource.GetDefaultView(Items); // TODO add sorting by sequence OnPropertyChanged(nameof(Count)); LoadFromFileCommand = AsyncCommand.Create(LoadFromFile, () => CanLoadFromFile()); LoadFromFolderCommand = AsyncCommand.Create(LoadFromFolder, () => CanLoadFromFolder()); LoadFromUrlCommand = AsyncCommand.Create(LoadFromUrl, () => CanLoadFromUrl()); RemoveCommand = new RelayCommand <object>(Remove, CanRemove); RemoveRangeCommand = new RelayCommand <IList>(RemoveRange, CanRemoveRange); ClearCommand = new RelayCommand(() => Clear(), CanClear); AddRange(_mediaItemMapper.GetMany(model.MediaItems)); MessageTokens.Add(Messenger.Subscribe <PlayingMediaItemMessage>(OnPlaybackItemChanged, m => m.PlaylistId == Id && _items.Contains(m.Content))); Validate(); } SkipChangeTracking = false; }
public ParentViewModel() { BusyStack = new BusyStack(); BusyStack.OnChanged = (hasItems) => { IsBusy = hasItems; }; DemoItems = new DemoItems(); LogItems = new LogItems(); AddLinkedCommand = new AsyncRelayCommand(AddLinked, CanAddLink); AddRangeCommand = new AsyncRelayCommand(AddRange, CanAddRange); }
public virtual void Remove(MediaItem item) { if (item == null) { throw new ArgumentNullException(nameof(item), $"{nameof(item)} {Resources.IsRequired}"); } using (BusyStack.GetToken()) { while (Items.Contains(item)) { RemoveInternal(item); } } }
public Scenes() { var content = new[] { new Scene { Content = new Default(), DisplayName = "Loading a ParentViewModel", GetDataContext = () => new ParentViewModel(), IsSelected = true, }, new Scene { Content = new Empty(), DisplayName = "No datacontext loading", IsSelected = false, }, new Scene { Content = new ImagesView(), DisplayName = "async image loading", GetDataContext = () => ImageFactory.GetImages(), IsSelected = false, }, new Scene { Content = new DragAndDrop(), DisplayName = "async image dragging and dropping", GetDataContext = () => new ProcessingImagesViewModel(), IsSelected = false, }, }; using (BusyStack.GetToken()) { AddRange(content); using (View.DeferRefresh()) { View.SortDescriptions.Add(new SortDescription(nameof(Scene.DisplayName), ListSortDirection.Ascending)); } } }
public MediaRepository(IPlaylistMapper playlistMapper, IMediaItemMapper mediaItemMapper, IMediaPlayerMapper mediaPlayerMapper, IMediaItemRepository mediaItemRepository, IMediaPlayerRepository mediaPlayerRepository, IPlaylistRepository playlistRepository) { _mediaItemMapper = mediaItemMapper ?? throw new ArgumentNullException(nameof(mediaItemMapper), $"{nameof(mediaItemMapper)} {Resources.IsRequired}"); _playlistMapper = playlistMapper ?? throw new ArgumentNullException(nameof(playlistMapper), $"{nameof(playlistMapper)} {Resources.IsRequired}"); _mediaPlayerMapper = mediaPlayerMapper ?? throw new ArgumentNullException(nameof(mediaPlayerMapper), $"{nameof(mediaPlayerMapper)} {Resources.IsRequired}"); _mediaItemRepository = mediaItemRepository ?? throw new ArgumentNullException(nameof(mediaItemRepository), $"{nameof(mediaItemRepository)} {Resources.IsRequired}"); _mediaPlayerRepository = mediaPlayerRepository ?? throw new ArgumentNullException(nameof(mediaPlayerRepository), $"{nameof(mediaPlayerRepository)} {Resources.IsRequired}"); _playlistRepository = playlistRepository ?? throw new ArgumentNullException(nameof(playlistRepository), $"{nameof(playlistRepository)} {Resources.IsRequired}"); _busyStack = new BusyStack(); _busyStack.OnChanged += (hasItems) => { IsBusy = hasItems; }; }
public async Task AddRange() { using (BusyStack.GetToken()) { var result = await Task.Run(() => { var items = new List <string>(); for (var i = 0; i < 5; i++) { items.Add(Guid.NewGuid().ToString()); } return(items); }); LogItems.AddRange(result.Select(p => new LogItem(p))); DemoItems.AddRange(result.Select(p => new DemoItem(p))); } }
private async Task LoadFromFile(CancellationToken token) { using (BusyStack.GetToken()) { var options = new FileSystemBrowserOptions() { CanCancel = true, MultiSelection = false, Title = _translator.Translate(nameof(Resources.SelectFiles)), }; (var Result, var MediaItems) = await _dialogViewModel.ShowMediaItemSelectionDialog(options, token).ConfigureAwait(true); if (Result) { AddRange(MediaItems); } } }
public virtual void Add(MediaItem item) { if (item == null) { throw new ArgumentNullException(nameof(item), $"{nameof(item)} {Resources.IsRequired}"); } using (BusyStack.GetToken()) { var sequence = _sequenceProvider.Get(Items.Select(p => (ISequence)p).ToList()); item.Sequence = sequence; AddInternal(item); if (SelectedItem == null) { SelectedItem = Items.First(); } } }
public override async Task Add(LogEntry item, CancellationToken token) { if (item is null) { throw new ArgumentNullException(nameof(item)); } using (BusyStack.GetToken()) { await Dispatcher.Invoke(delegate { _items.Insert(0, item); }, token).ConfigureAwait(continueOnCapturedContext: false); await Dispatcher.Invoke(delegate { OnPropertyChanged(nameof(Count)); }, token).ConfigureAwait(continueOnCapturedContext: false); } }