Пример #1
0
        private void OnSongsCollectionChanged(object sender, SongCollectionChangedEventArgs e)
        {
            MobileDebug.Service.WriteEvent("PlaylistSubscribtionHandler.OnSongsCollectionChanged", (sender as ISongCollection)?.Parent?.Name);
            Unsubscribe(e.GetRemoved());
            Subscribe(e.GetAdded());

            SongCollectionChanged?.Invoke(this, new SubscriptionsEventArgs <ISongCollection, SongCollectionChangedEventArgs>(sender, e));
        }
Пример #2
0
        private void Parent_CollectionChanged(object sender, SongCollectionChangedEventArgs e)
        {
            List <ChangeCollectionItem <Song> > adds = new List <ChangeCollectionItem <Song> >();

            foreach (Song addSong in e.GetAdded())
            {
                int index = ran.Next(Count - e.RemovedSongs.Length + adds.Count);

                adds.Add(new ChangeCollectionItem <Song>(index, addSong));
            }

            Change(e.GetRemoved(), adds);
        }
Пример #3
0
        public void Change(IEnumerable <Song> removes, IEnumerable <Song> adds)
        {
            //Song oldCurrentSong, newCurrentSong;
            //newCurrentSong = oldCurrentSong = Parent.CurrentSongFileName;

            //int currentSongIndex = list.IndexOf(oldCurrentSong);
            Song[] removeArray = removes?.ToArray() ?? new Song[0];
            Song[] addArray    = adds?.ToArray() ?? new Song[0];

            List <ChangeCollectionItem <Song> > removeChanges = new List <ChangeCollectionItem <Song> >();
            List <ChangeCollectionItem <Song> > addChanges    = new List <ChangeCollectionItem <Song> >();

            foreach (Song song in removeArray)
            {
                int index = list.IndexOf(song);

                if (index == -1)
                {
                    continue;
                }

                list.RemoveAt(index);
                removeChanges.Add(new ChangeCollectionItem <Song>(index, song));
            }

            foreach (Song song in addArray)
            {
                int index = list.IndexOf(song);

                if (index == -1)
                {
                    continue;
                }

                list.RemoveAt(index);
                removeChanges.Add(new ChangeCollectionItem <Song>(index, song));
            }

            foreach (Song song in addArray)
            {
                addChanges.Add(new ChangeCollectionItem <Song>(Count, song));
                list.Add(song);

                song.Parent = this;
            }

            SongCollectionChangedEventArgs args = new SongCollectionChangedEventArgs(addChanges.ToArray(), removeChanges.ToArray());

            Changed?.Invoke(this, args);
            OnPropertyChanged(nameof(Count));
        }
Пример #4
0
        private void Parent_CollectionChanged(object sender, SongCollectionChangedEventArgs e)
        {
            Song[] ordered = GetOrdered(Parent).ToArray();

            Change(e.GetRemoved(), e.GetAdded().Select(s => new ChangeCollectionItem <Song>(Array.IndexOf(ordered, s), s)));
        }
        private void Parent_CollectionChanged(object sender, SongCollectionChangedEventArgs e)
        {
            Song currentSong      = Parent.Parent.CurrentSong;
            int  shuffleIndex     = GetCurrentSongIndex(Parent.Count);
            int  shuffleCount     = GetCount(Parent.Count);
            int  currentSongIndex = IndexOf(currentSong);

            List <Song> removes = new List <Song>();
            List <ChangeCollectionItem <Song> > adds = new List <ChangeCollectionItem <Song> >();

            foreach (Song remove in e.GetRemoved())
            {
                int index = IndexOf(remove);

                if (index == -1)
                {
                    continue;
                }

                Song add = GetRandomSong(Parent, null, adds.Select(c => c.Item));
                ChangeCollectionItem <Song> addChange = new ChangeCollectionItem <Song>(index, add);

                removes.Add(remove);
                adds.Add(addChange);
            }

            for (int i = currentSongIndex - 1; i >= shuffleIndex; i++)
            {
                Song remove = this.ElementAt(i);

                if (!removes.Contains(remove))
                {
                    removes.Add(remove);
                }
                else
                {
                    adds.Remove(adds.FirstOrDefault(c => c.Index == i));
                }
            }

            for (int i = currentSongIndex; i < shuffleIndex; i++)
            {
                Song add = GetRandomSong(Parent, removes, adds.Select(c => c.Item));
                ChangeCollectionItem <Song> addChange = new ChangeCollectionItem <Song>(i, add);

                adds.Add(addChange);
            }

            while (Parent.Count - removes.Count + adds.Count > shuffleCount)
            {
                if (!adds.Remove(adds.FirstOrDefault(c => c.Index > shuffleIndex)))
                {
                    removes.Add(this.Except(removes).LastOrDefault());
                }
            }

            while (Parent.Count - removes.Count + adds.Count < shuffleCount)
            {
                int  index = Parent.Count - removes.Count + adds.Count;
                Song add   = GetRandomSong(Parent, removes, adds.Select(c => c.Item));
                ChangeCollectionItem <Song> addChange = new ChangeCollectionItem <Song>(index, add);

                adds.Add(addChange);
            }
        }