using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections.ObjectModel; using System.Diagnostics; using System.ComponentModel; namespace Modele { /// /// Classe Manager permettant la gestion des Titres de l'application. /// public class Manager : INotifyPropertyChanged { /// /// Liste de Titre, implementant INotifyCollectionChanged et INotifyPropertyChanged au changement de la liste /// public ReadOnlyObservableCollection ListeTitre { get; private set; } readonly ObservableCollection listeTitre = new ObservableCollection(); /// /// Liste de CollectionTitre, implementant INotifyCollectionChanged et INotifyPropertyChanged au changement de la liste /// public ReadOnlyObservableCollection ListeCollection { get; private set; } readonly ObservableCollection listeCollection = new ObservableCollection(); /// /// Liste de Titres qui devront etre supprimer lors de la validation de la suppression dans l'application. /// public List ListeTitreSupp { get; private set; } readonly List listeTitreSupp = new List(); public event PropertyChangedEventHandler PropertyChanged; /// /// Titre Selectionne par l'utilisateur, permettra de modifier, supprimer, ajouter aux favoris, ... /// private Titre selectedTitre; public Titre SelectedTitre { get { return selectedTitre; } set { if (selectedTitre == value) { return; } selectedTitre = value; //PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedTitre")); if(PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("SelectedTitre")); } } } /// /// Evenement de type IsFavorisEmptyEventArgs permettant de savoir si les Favoris sont vide /// public event EventHandler IsFavorisEmpty; /// /// Classe IsFavorisEmptyEventArgs, Heritant de EventArgs /// public class IsFavorisEmptyEventArgs : EventArgs { public IsFavorisEmptyEventArgs() { } } /// /// OnFavorisEmpty est un evenement que l'on a cree permettant de changer la vue de l'application lorsque la liste des Favoris est vide. /// /// Evenement lance lorsque les Favoris sont vide public void OnFavorisEmpty(IsFavorisEmptyEventArgs args) => IsFavorisEmpty?.Invoke(this, args); //// Constructeurs de Manager & Persistance /// /// Construit un Manager avec les Titres passe en parametres dans ListeTitre /// /// Liste de Titres a Ajouter au Manager public Manager(params Titre[] desTitres) { ListeTitre = new ReadOnlyObservableCollection(listeTitre); ListeCollection = new ReadOnlyObservableCollection(listeCollection); ListeTitreSupp = new List(listeTitreSupp); //listeTitre.AddRange(desTitres.Where(t => t != null && listeTitre.Contains(t))); foreach (Titre titre in desTitres) { listeTitre.Add(titre); } if (!listeCollection.Any()) { listeCollection.Add(new Favoris()); } } public IPersistanceManager Pers { get; private set; } /// /// Constructeur de Manager avec la persistance /// /// Persistance public Manager(IPersistanceManager pers) { ListeTitre = new ReadOnlyObservableCollection(listeTitre); ListeCollection = new ReadOnlyObservableCollection(listeCollection); ListeTitreSupp = new List(listeTitreSupp); Pers = pers; this.LoadTitres(); this.LoadTitresFavoris(); } /// /// Charge les Titres Favoris dans ListeCollection /// public void LoadTitresFavoris() { // Pour tout les Titres dans la persistance des TitresFavoris, ajouter le titre foreach (Titre t in Pers.LoadTitresFavoris()) { GetListeFavoris().AjouterTitreDansCollection(t); } } /// /// Enregistre les Titre Favoris dans la persistance /// public void SaveTitresFavoris() { Pers.SaveTitresFavoris(GetListeFavoris().ListeTitre); } /// /// Charge les Titres dans ListeTitre avec la persistance /// public void LoadTitres() { listeTitre.Clear(); foreach (Titre titre in Pers.LoadTitres()) { listeTitre.Add(titre); } if (! listeCollection.Any()) { listeCollection.Add(new Favoris()); } if (listeTitre.Count > 0) { SelectedTitre = listeTitre.First(); } } /// /// Enregistre les Titres de ListeTitre dans la persistance /// public void SaveTitres() { Pers.SaveTitres(ListeTitre); } /// /// Affiche les Titres de ListeTitre du Manager /// /// Le string a afficher public override string ToString() { StringBuilder sb = new StringBuilder("Mes Titres : "); foreach (Titre t in listeTitre) { sb.Append($"{t}\t"); } return sb.ToString(); } ////Methodes de Manager pour les Titres /// /// Trouve le Titre grace a son Id dans ListeTitre /// /// L'Id du Titre que l'on veut trouver /// Returne le Titre correspondant a l'Id public Titre GetTitreById(string uniqueId) => listeTitre.SingleOrDefault(t => t.Id == uniqueId); /// /// Ajoute le Titre passe en parametre dans ListeTitre /// /// Titre a ajouter /// True si ca a fonctionne, False si le Titre existe deja public bool AjouterTitre(Titre t) { if(ContenirTitre(t)) { Debug.WriteLine("Le titre existe deja"); return false; } else { listeTitre.Add(t); return true; } } /// /// Verfie si le Titre est contenu dans la ListeTitre /// /// Titre a recherhcer /// True si le Titre est dans ListeTitre, sinon False public bool ContenirTitre(Titre t) { return listeTitre.Contains(t); } /// /// Supprimer le Titre passe en parametre /// /// Titre a supprimer /// True si le Titre est supprime, False sinon public bool SupprimerTitre(Titre t) { if(ContenirTitre(t)) { foreach (var c in listeCollection.Where(c => c.ContenirTitreDansCollection(t))) { c.SupprimerTitreDeCollection(t); } listeTitre.Remove(t); return true; } else { Debug.WriteLine("Le titre n'existe pas"); return false; } } /// /// Modifie le Titre /// /// Titre a modifier /// Titre avec les valeurs a remplacer /// True si ca a marche, False sinon public bool ModifierTitre(Titre t,Titre newT) { if(!ContenirTitre(t)) { Debug.WriteLine("Le titre n'existe pas"); return false; } else { t.Id = newT.Id; t.Nom = newT.Nom; t.NomAlbum = newT.NomAlbum; t.LienVideo = newT.LienVideo; t.NomArtiste = newT.NomArtiste; t.CheminImage = newT.CheminImage; t.Bio = newT.Bio; Debug.WriteLine("Titre modifier"); return t==newT; } } ////Methode de Manager pour les Collections /// /// Ajoute une CollectionTitre a ListeCollection /// /// CollectionTitre a ajouter /// True si ca le titre est ajouter, False sinon public bool AjouterCollection(CollectionTitre collection) { if (ContenirCollection(collection)) { Debug.WriteLine("Le collection existe deja"); return false; } else { listeCollection.Add(collection); return true; } } /// /// Supprime la CollectionTitre de ListeCollection /// /// CollectionTirte a supprimer /// True si la colelction est supprimee, False sinon public bool SupprimerCollection(CollectionTitre collection) { if (!ContenirCollection(collection)) { Debug.WriteLine("La collection existe pas"); return false; } if(collection is Favoris) { Debug.WriteLine("La collection est Favori"); return false; } else { listeCollection.Remove(collection); return true; } } /// /// Recherche la Collection dans ListeCollection /// /// Collection a rechercher /// True si la collection est dans ListeCollection, sinon False public bool ContenirCollection(CollectionTitre collection) { return listeCollection.Contains(collection); } /// /// Renvoie la collection de Type Favoris dans ListeCollection /// /// La premiere CollectionTitre de Type Favoris public CollectionTitre GetListeFavoris() => listeCollection.FirstOrDefault(c => c is Favoris); /// /// Recherche si le Titre est dans la Collection passe en parametre /// /// CollectionTitre a rechercher /// Titre a trouver /// True si le Titre est dans la CollectionTitre, False sinon public bool ContenirTitreInCollection(CollectionTitre c,Titre t) { return c.ContenirTitreDansCollection(t); } /// /// Ajoute le Titre a la CollectionTitre /// /// Collection ou l'on veut ajouter le Titre /// Titre a ajouter /// public bool AjouterTitreToCollection(CollectionTitre c, Titre t) { if (ContenirTitreInCollection(c,t)) { Debug.WriteLine("Le titre existe deja"); return false; } else { c.AjouterTitreDansCollection(t); return true; } } /// /// Supprime le Titre de la CollectionTitre passe en parametre /// /// Collection ou l'on veut suppirmer le Titre /// Titre a supprimer /// public bool SupprimerTitreFromCollection(CollectionTitre c, Titre t) { if (!ContenirTitreInCollection(c, t)) { Debug.WriteLine("Le Titre n'est pas dans la collection"); return false; } else { c.SupprimerTitreDeCollection(t); return true; } } } }