Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts, scan de code-barres, consultation hors-ligne. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
81 lines
2.2 KiB
C#
81 lines
2.2 KiB
C#
using System.Collections;
|
|
using MaBibli.Shared.Dtos;
|
|
|
|
namespace MaBibli.Client.Composants;
|
|
|
|
/// <summary>
|
|
/// Vue « liste de noms » des auteurs d'une saisie, pour que <c>SaisieListe</c> les remplisse
|
|
/// comme il remplit les thèmes.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// ⚠️ <b>Un auteur n'est pas un nom : il porte aussi son rôle sur ce livre</b> (scénario,
|
|
/// dessin…), qui vit sur le lien et non sur la personne. Renommer par l'indexeur <b>conserve
|
|
/// donc le rôle</b> — c'est ce qui remplace la reprise des rôles que faisait
|
|
/// <c>EnregistrementLivre.Decouper</c> quand le champ des noms se reconstruisait à chaque
|
|
/// frappe : ici la ligne n'est pas reconstruite, elle est corrigée.
|
|
/// <para>
|
|
/// La liste sous-jacente est celle de la saisie, modifiée en place : cette vue n'en garde
|
|
/// aucune copie qui pourrait diverger.
|
|
/// </para>
|
|
/// </remarks>
|
|
public sealed class NomsAuteurs(IList<AuteurSaisi> auteurs) : IList<string>
|
|
{
|
|
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<string> GetEnumerator() => auteurs.Select(a => a.Nom).GetEnumerator();
|
|
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
|
}
|