Example #1
0
        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();
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
 private async Task Add(CancellationToken token)
 {
     using (BusyStack.GetToken())
     {
         await Add(new Pattern(CommandBuilder, CommandManager, _directoriesViewModel, Content)).ConfigureAwait(false);
     }
 }
Example #6
0
 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);
     }
 }
Example #8
0
 /// <summary>
 /// Previouses this instance.
 /// </summary>
 public void Previous()
 {
     using (BusyStack.GetToken())
     {
         var item = Playlist.Previous();
         Player.Play(item);
     }
 }
Example #9
0
 private Operation()
 {
     BusyStack           = new BusyStack();
     BusyStack.OnChanged = (hasItems) =>
     {
         IsBusy = hasItems;
     };
 }
Example #10
0
 /// <summary>
 /// Nexts this instance.
 /// </summary>
 public void Next()
 {
     using (BusyStack.GetToken())
     {
         var item = Playlist.Next();
         Player.Play(item);
     }
 }
Example #11
0
        private async Task LoadFromUrl(CancellationToken token)
        {
            using (BusyStack.GetToken())
            {
                var items = await _dialogViewModel.ShowUrlParseDialog(token).ConfigureAwait(true);

                AddRange(items);
            }
        }
Example #12
0
        private async Task LoadFromUrl()
        {
            using (BusyStack.GetToken())
            {
                var items = await _dialogViewModel.ShowUrlParseDialog().ConfigureAwait(true);

                Items.AddRange(items);
            }
        }
Example #13
0
        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());
        }
Example #14
0
        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());
        }
Example #15
0
 public virtual void Remove(MediaItem item)
 {
     using (BusyStack.GetToken())
     {
         while (Items.Contains(item))
         {
             RemoveInternal(item);
         }
     }
 }
Example #16
0
 /// <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);
         }
     }
 }
Example #17
0
        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; };
        }
Example #18
0
 private Task LoadFromFile()
 {
     using (BusyStack.GetToken())
     {
         var options = new FileSystemBrowserOptions()
         {
             CanCancel      = true,
             MultiSelection = false,
             Title          = _translator.Translate(nameof(Resources.SelectFiles)),
         };
         return(_dialogViewModel.ShowFileBrowserDialog(options));
     }
 }
Example #19
0
        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));
            }
        }
Example #20
0
        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));
                }
            }
        }
Example #21
0
        /// <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;
        }
Example #22
0
        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;
        }
Example #23
0
        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);
        }
Example #24
0
        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);
                }
            }
        }
Example #25
0
        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));
                }
            }
        }
Example #26
0
        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; };
        }
Example #27
0
        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)));
            }
        }
Example #28
0
        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);
                }
            }
        }
Example #29
0
        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();
                }
            }
        }
Example #30
0
        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);
            }
        }