using CoreLibrary.Joueurs; using CoreLibrary.Statistiques; using CoreLibrary.Regles; using System.ComponentModel; using System.Runtime.CompilerServices; namespace MauiSpark.Pages { /// /// Représente un joueur dans le classement. /// partial class Enfant { private readonly Classement classement; /// /// Obtient ou définit le joueur associé à cet enfant. /// public Joueur Joueur { get; set; } /// /// Obtient la place du joueur dans le classement. /// public int Place => classement.Enfants.ToList().IndexOf(this) + 1; /// /// Obtient les statistiques du joueur dans le classement. /// public IEnumerable Statistiques => Enum.GetValues() .Select(statistique => (int)Joueur.Statistique(classement.Regles, statistique)); /// /// Obtient une liste des objets de cet enfant dans le classement (Son nom et sa place). /// public IEnumerable Objets => new List([$"{Place}", Joueur.Nom]) .Concat(Statistiques.Select(statistique => $"{statistique}")); /// /// Initialise une nouvelle instance de la classe . /// /// Le joueur associé à cet enfant. /// Le classement auquel cet enfant appartient. public Enfant(Joueur joueur, Classement classement) { this.classement = classement; Joueur = joueur; } /// /// Détermine si l'objet spécifié est égal à l'objet actuel. /// public override bool Equals(object? obj) { if (obj == null || obj is not Enfant) return false; return Joueur == ((Enfant)obj).Joueur; } /// /// Retourne le code de hachage de cet objet. /// public override int GetHashCode() => Joueur.GetHashCode(); } /// /// Représente le classement des joueurs. /// partial class Classement : INotifyPropertyChanged { /// /// Se produit lorsque la valeur d'une propriété de l'objet change. /// public event PropertyChangedEventHandler? PropertyChanged; /// /// Déclenche l'événement pour notifier les modifications de propriété. /// /// Le nom de la propriété qui a changé. public void QuandProprieteChangee([CallerMemberName] string? propriete = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propriete)); private int indiceRegles = 0; /// /// Obtient les règles actuelles du classement. /// public IRegles Regles => ClassementPage.ToutesRegles.ElementAt(indiceRegles); private Statistique statistique = Enum.GetValues().First(); /// /// Obtient ou définit la statistique utilisée pour classer les joueurs. /// public Statistique Statistique { get => statistique; set { statistique = value; QuandProprieteChangee(nameof(Enfants)); } } private bool inverser = true; /// /// Obtient ou définit une valeur indiquant si le classement est inversé. /// public bool Inverser { get => inverser; set { inverser = value; QuandProprieteChangee(nameof(Enfants)); } } /// /// Obtient les titres des colonnes du classement. /// public IEnumerable Titres => new List(["Place", "Nom"]).Concat( Enum.GetValues().Select( statistique => string.Concat((Enum.GetName(typeof(Statistique), statistique) ?? "").Select( (lettre, indice) => indice > 0 && char.IsUpper(lettre) ? $" {lettre}" : $"{lettre}") ) ) ); /// /// Obtient la liste des enfants (joueurs) dans le classement, triée en fonction de la statistique et des règles actuelles. /// public IEnumerable Enfants => Inverser ? MauiProgram.Manageur.Joueurs .OrderBy(joueur => joueur.Statistique(Regles, Statistique)) .Select(joueur => new Enfant(joueur, this)).Reverse() : MauiProgram.Manageur.Joueurs .OrderBy(joueur => joueur.Statistique(Regles, Statistique)) .Select(joueur => new Enfant(joueur, this)); /// /// Incrémente l'indice des règles du classement selon une valeur spécifiée. /// /// La valeur à ajouter à l'indice des règles. public void IncrementerRegles(int valeur) { if ((indiceRegles += valeur) < 0) indiceRegles = ClassementPage.ToutesRegles.Count() - 1; else if (indiceRegles >= ClassementPage.ToutesRegles.Count()) indiceRegles = 0; QuandProprieteChangee(nameof(Regles)); QuandProprieteChangee(nameof(Enfants)); } } /// /// Partie de la logique de l'interface utilisateur de la page de classement. /// Gère les calculs de classement, l'affichage des statistiques et le changement des règles de jeu. /// public partial class ClassementPage : ContentPage { /// /// Obtient toutes les règles de jeu disponibles. /// public static IEnumerable ToutesRegles => typeof(IRegles).Assembly.GetTypes() .Where(type => typeof(IRegles).IsAssignableFrom(type) && type.IsClass) .Select(type => (Activator.CreateInstance(type) as IRegles)!) .OrderBy(regles => regles.Indice); /// /// Constructeur de la page de classement des joueurs. /// Initialise les paramètres de navigation et les composants de la page. /// public ClassementPage() { InitializeComponent(); NavigationPage.SetHasNavigationBar(this, false); BindingContext = new Classement(); } /// /// Méthode appelée lorsqu'un bouton de changement de règles est pressé. /// Augmente ou diminue l'indice des règles selon le bouton pressé. /// public void ChangerReglesPresse(object sender, EventArgs e) { ((Classement)BindingContext).IncrementerRegles(sender == DiminuerRegles ? -1 : 1); } /// /// Méthode appelée lorsqu'un bouton statistique est pressée. /// Modifie la statistique de classement ou inverse l'ordre du classement si la même statistique est déjà sélectionnée. /// public void StatistiquePressee(object sender, EventArgs e) { if (sender is not Label || !Enum.IsDefined(typeof(Statistique), ((Label)sender).Text.Replace(" ", ""))) return; Statistique statistique = Enum.Parse(((Label)sender).Text.Replace(" ", "")); Classement classement = (Classement)BindingContext; if (classement.Statistique == statistique) { classement.Inverser = !classement.Inverser; return; } classement.Inverser = true; classement.Statistique = statistique; } } }