using System.Collections; using MaBibli.Shared.Dtos; namespace MaBibli.Client.Composants; /// /// Vue « liste de noms » des auteurs d'une saisie, pour que SaisieListe les remplisse /// comme il remplit les thèmes. /// /// /// ⚠️ Un auteur n'est pas un nom : il porte aussi son rôle sur ce livre (scénario, /// dessin…), qui vit sur le lien et non sur la personne. Renommer par l'indexeur conserve /// donc le rôle — c'est ce qui remplace la reprise des rôles que faisait /// EnregistrementLivre.Decouper quand le champ des noms se reconstruisait à chaque /// frappe : ici la ligne n'est pas reconstruite, elle est corrigée. /// /// La liste sous-jacente est celle de la saisie, modifiée en place : cette vue n'en garde /// aucune copie qui pourrait diverger. /// /// public sealed class NomsAuteurs(IList auteurs) : IList { public int Count => auteurs.Count; public bool IsReadOnly => false; public string this[int index] { get => auteurs[index].Nom; set => auteurs[index] = auteurs[index] with { Nom = value }; } public void Add(string nom) => auteurs.Add(new AuteurSaisi(nom)); public void Insert(int index, string nom) => auteurs.Insert(index, new AuteurSaisi(nom)); public void RemoveAt(int index) => auteurs.RemoveAt(index); public void Clear() => auteurs.Clear(); public bool Contains(string nom) => IndexOf(nom) >= 0; public int IndexOf(string nom) { for (var i = 0; i < auteurs.Count; i++) { if (auteurs[i].Nom == nom) { return i; } } return -1; } public bool Remove(string nom) { var index = IndexOf(nom); if (index < 0) { return false; } auteurs.RemoveAt(index); return true; } public void CopyTo(string[] tableau, int index) { foreach (var auteur in auteurs) { tableau[index++] = auteur.Nom; } } public IEnumerator GetEnumerator() => auteurs.Select(a => a.Nom).GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); }