From 989addb761865530dc709b7b361815e82584de05 Mon Sep 17 00:00:00 2001 From: HMatheo Date: Tue, 6 Jun 2023 18:25:34 +0200 Subject: [PATCH 1/2] Added all the documentation for doxygen --- MangaMap/App.xaml.cs | 27 +- MangaMap/AppShell.xaml.cs | 13 +- MangaMap/CustomHeader.xaml.cs | 31 +- MangaMap/Stub/DataToPersist.cs | 12 +- MangaMap/Stub/IPersistanceManager.cs | 12 + MangaMap/Stub/Stub.cs | 17 +- MangaMap/Views/Composants/ListOeuvre.xaml.cs | 14 +- MangaMap/Views/Composants/StyleBouton.xaml.cs | 46 +- MangaMap/Views/CreateOeuvre.xaml.cs | 29 +- MangaMap/Views/FicheAnime.xaml.cs | 442 ++++++++++-------- MangaMap/Views/homePage.xaml.cs | 141 +++--- MangaMap/Views/listPage.xaml.cs | 12 +- MangaMap/Views/loginAdminPage.xaml.cs | 27 +- MangaMap/Views/loginPage.xaml.cs | 32 +- MangaMap/Views/settingsPage.xaml.cs | 34 +- MangaMap/Views/signUpPage.xaml.cs | 35 +- 16 files changed, 590 insertions(+), 334 deletions(-) diff --git a/MangaMap/App.xaml.cs b/MangaMap/App.xaml.cs index ca385c8..a13dace 100644 --- a/MangaMap/App.xaml.cs +++ b/MangaMap/App.xaml.cs @@ -4,22 +4,41 @@ using MangaMap.Views; namespace MangaMap; +/// +/// Classe représentant l'application principale. +/// public partial class App : Application { + /// + /// Nom du fichier de sauvegarde des données. + /// public string FileName { get; set; } = "SauvegardeDonnees.xml"; + + /// + /// Chemin du fichier de sauvegarde des données. + /// public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); - public Manager MyManager { get; private set; } = new Manager(new Stub.Stub()); //pour utiliser le stub comme moyen de persistance. + /// + /// Gestionnaire principal de l'application. + /// + public Manager MyManager { get; private set; } = new Manager(new Stub.Stub()); // Utilise le Stub comme moyen de persistance. + /// + /// Administrateur principal de l'application. + /// public Admin MyAdmin { get; private set; } = new Admin("test", "test@test.ts", "Pseudo_test"); + /// + /// Constructeur de l'application. + /// public App() { InitializeComponent(); if (File.Exists(Path.Combine(FilePath, FileName))) { - MyManager = new Manager(new Stub.DataContract()); //pour utiliser le dataContract comme moyen de persistance. + MyManager = new Manager(new Stub.DataContract()); // Utilise le DataContract comme moyen de persistance. } MyManager.charger(); @@ -29,10 +48,10 @@ public partial class App : Application if (!File.Exists(Path.Combine(FilePath, FileName))) { - MyManager.Persistance = new DataContract(); //pour utiliser le stub comme moyen de persistance. + MyManager.Persistance = new DataContract(); // Utilise le Stub comme moyen de persistance. } MyManager.sauvegarder(); - Console.WriteLine("sauvegarde faite"); + Console.WriteLine("Sauvegarde effectuée."); } } \ No newline at end of file diff --git a/MangaMap/AppShell.xaml.cs b/MangaMap/AppShell.xaml.cs index ce60124..07a2440 100644 --- a/MangaMap/AppShell.xaml.cs +++ b/MangaMap/AppShell.xaml.cs @@ -2,12 +2,19 @@ namespace MangaMap; +/// +/// Classe représentant le Shell. +/// public partial class AppShell : Shell { - public AppShell() - { - InitializeComponent(); + /// + /// Constructeur du shell de l'application. + /// + public AppShell() + { + InitializeComponent(); + // Enregistrement des routes pour les pages de l'application Routing.RegisterRoute("homePagedetails", typeof(homePage)); Routing.RegisterRoute("inscriptionPagedetails", typeof(signUpPage)); Routing.RegisterRoute("connexionPagedetails", typeof(loginPage)); diff --git a/MangaMap/CustomHeader.xaml.cs b/MangaMap/CustomHeader.xaml.cs index ea77c51..f62f384 100644 --- a/MangaMap/CustomHeader.xaml.cs +++ b/MangaMap/CustomHeader.xaml.cs @@ -4,33 +4,58 @@ using MangaMap.Model; using System.ComponentModel; using INotifyPropertyChanged = System.ComponentModel.INotifyPropertyChanged; +/// +/// Classe représentant le contenu d'en-tête personnalisé (CustomHeader). +/// public partial class NewContent1 : ContentView, INotifyPropertyChanged { public Manager my_manager => (App.Current as App).MyManager; + + /// + /// Constructeur du contenu d'en-tête personnalisé. + /// public NewContent1() { InitializeComponent(); - } + + /// + /// Gère l'événement de clic sur le bouton d'accueil. + /// + /// L'objet déclencheur de l'événement. + /// Les arguments de l'événement. async void ImageButton_Clicked(System.Object sender, System.EventArgs e) { - //Navigation.PushAsync(new homePage()); await Shell.Current.GoToAsync("//page/homePage"); } + /// + /// Gère l'événement de clic sur le bouton de paramètres. + /// + /// L'objet déclencheur de l'événement. + /// Les arguments de l'événement. async void SettingButton_Clicked(object sender, System.EventArgs e) { await Shell.Current.GoToAsync("//page/secondaire/settingsPage"); } + /// + /// Gère l'événement de clic sur le bouton de compte. + /// + /// L'objet déclencheur de l'événement. + /// Les arguments de l'événement. async void AccountButton_Clicked(object sender, System.EventArgs e) { await Shell.Current.GoToAsync("//page/secondaire/connexionPage"); } + /// + /// Gère l'événement de clic sur le bouton de liste. + /// + /// L'objet déclencheur de l'événement. + /// Les arguments de l'événement. async void ListButton_Clicked(object sender, System.EventArgs e) { - //await Shell.Current.GoToAsync("//page/secondaire/listPage"); await Navigation.PushAsync(new listPage()); } } \ No newline at end of file diff --git a/MangaMap/Stub/DataToPersist.cs b/MangaMap/Stub/DataToPersist.cs index a747a77..0f30580 100644 --- a/MangaMap/Stub/DataToPersist.cs +++ b/MangaMap/Stub/DataToPersist.cs @@ -8,11 +8,19 @@ using System.Collections.ObjectModel; namespace MangaMap.Stub { - //Cette classe permet de définir ce qui doit être enregistrer par la persistance. + /// + /// Classe de données pour la persistance contenant les listes des oeuvres et des utilisateurs. + /// public class DataToPersist { + /// + /// Obtient ou définit la liste des oeuvres à persister. + /// public ObservableCollection Oeuvres { get; set; } = new ObservableCollection(); + + /// + /// Obtient ou définit la liste des utilisateurs à persister. + /// public List Utilisateurs { get; set; } = new List(); - } } diff --git a/MangaMap/Stub/IPersistanceManager.cs b/MangaMap/Stub/IPersistanceManager.cs index 8ce3354..784f4a6 100644 --- a/MangaMap/Stub/IPersistanceManager.cs +++ b/MangaMap/Stub/IPersistanceManager.cs @@ -8,10 +8,22 @@ using MangaMap.Model; namespace MangaMap.Stub { + /// + /// Interface pour la gestion de la persistance des données. + /// public interface IPersistanceManager { + /// + /// Charge les données persistantes et renvoie les listes des oeuvres et des utilisateurs. + /// + /// Un tuple contenant la liste des oeuvres et la liste des utilisateurs. (ObservableCollection, List) chargeDonne(); + /// + /// Sauvegarde les listes des oeuvres et des utilisateurs. + /// + /// La liste des oeuvres à sauvegarder. + /// La liste des utilisateurs à sauvegarder. void sauvegarder(ObservableCollection o, List u); } } diff --git a/MangaMap/Stub/Stub.cs b/MangaMap/Stub/Stub.cs index 4160251..db3f7b3 100644 --- a/MangaMap/Stub/Stub.cs +++ b/MangaMap/Stub/Stub.cs @@ -8,11 +8,15 @@ using System.Threading.Tasks; namespace MangaMap.Stub { + /// + /// Classe de stub pour la gestion de la persistance des données. + /// public class Stub : IPersistanceManager - - //Cette classe sert à faire charger un jeu de données qui n'est pas celui enregistrer dans le fichier sur l'ordinateur. - //Il permet de faire des transistion entre différent moyen de persister. { + /// + /// Charge un jeu de données en mémoire. + /// + /// Un tuple contenant la liste des oeuvres et la liste des utilisateurs. public (ObservableCollection, List) chargeDonne() { ObservableCollection l1 = new ObservableCollection(); @@ -39,9 +43,14 @@ namespace MangaMap.Stub return (l1, l2); } + /// + /// Méthode non implémentée pour la sauvegarde des données. + /// + /// La liste des oeuvres à sauvegarder. + /// La liste des utilisateurs à sauvegarder. public void sauvegarder(ObservableCollection o, List u) { throw new NotImplementedException(); } } -} \ No newline at end of file +} diff --git a/MangaMap/Views/Composants/ListOeuvre.xaml.cs b/MangaMap/Views/Composants/ListOeuvre.xaml.cs index b7d133f..9c8d065 100644 --- a/MangaMap/Views/Composants/ListOeuvre.xaml.cs +++ b/MangaMap/Views/Composants/ListOeuvre.xaml.cs @@ -6,12 +6,20 @@ public partial class ListOeuvre : ContentView { public Manager my_manager => (App.Current as App).MyManager; + /// + /// Constructeur de la liste d'oeuvres. + /// public ListOeuvre() - { - InitializeComponent(); + { + InitializeComponent(); BindingContext = this; } + /// + /// Gère l'événement de clic sur l'image de l'anime dans la liste. + /// + /// L'objet déclencheur de l'événement. + /// Les arguments de l'événement. private async void AnimeImageClickedList(object sender, EventArgs e) { var selectedAnime = (sender as ImageButton)?.BindingContext as Oeuvre; @@ -21,4 +29,4 @@ public partial class ListOeuvre : ContentView await Navigation.PushAsync(new ficheAnime(selectedAnime)); } } -} \ No newline at end of file +} diff --git a/MangaMap/Views/Composants/StyleBouton.xaml.cs b/MangaMap/Views/Composants/StyleBouton.xaml.cs index 165852d..9ae2237 100644 --- a/MangaMap/Views/Composants/StyleBouton.xaml.cs +++ b/MangaMap/Views/Composants/StyleBouton.xaml.cs @@ -1,23 +1,39 @@ -namespace MangaMap.Views.Composants; using MangaMap.Model; -public partial class StyleBouton : ContentView +namespace MangaMap.Views.Composants { - public Manager my_manager => (App.Current as App).MyManager; + /// + /// Code-behind pour le UserControl StyleBouton.xaml. + /// + public partial class StyleBouton : ContentView + { + /// + /// Instance du manager pour accéder aux données. + /// + public Manager my_manager => (App.Current as App).MyManager; - public StyleBouton() - { - InitializeComponent(); - BindingContext = my_manager; - } + /// + /// Constructeur de la classe StyleBouton. + /// + public StyleBouton() + { + InitializeComponent(); + BindingContext = my_manager; + } - private async void AnimeImageClickedList(object sender, EventArgs e) - { - var selectedAnime = (sender as ImageButton)?.BindingContext as Oeuvre; - if (selectedAnime != null) + /// + /// Gère l'événement lorsqu'une image d'anime est cliquée. + /// + /// L'objet déclenchant l'événement. + /// Les arguments de l'événement. + private async void AnimeImageClickedList(object sender, EventArgs e) { - // Naviguez vers la page de la fiche d'anime en passant l'objet sélectionné - await Navigation.PushAsync(new ficheAnime(selectedAnime)); + var selectedAnime = (sender as ImageButton)?.BindingContext as Oeuvre; + if (selectedAnime != null) + { + // Naviguez vers la page de la fiche d'anime en passant l'objet sélectionné + await Navigation.PushAsync(new ficheAnime(selectedAnime)); + } } } -} \ No newline at end of file +} diff --git a/MangaMap/Views/CreateOeuvre.xaml.cs b/MangaMap/Views/CreateOeuvre.xaml.cs index fd60ff4..4fa4d98 100644 --- a/MangaMap/Views/CreateOeuvre.xaml.cs +++ b/MangaMap/Views/CreateOeuvre.xaml.cs @@ -11,13 +11,21 @@ public partial class createOeuvre : ContentPage public Manager my_manager => (App.Current as App).MyManager; private string imagePath; + /// + /// Constructeur de la page de création d'oeuvre. + /// public createOeuvre() - { - InitializeComponent(); + { + InitializeComponent(); BindingContext = this; - } + } - async void SelectImageClicked(object sender, EventArgs e) + /// + /// Gère l'événement de clic sur le bouton de sélection d'image. + /// + /// L'objet déclencheur de l'événement. + /// Les arguments de l'événement. + private async void SelectImageClicked(object sender, EventArgs e) { var result = await FilePicker.PickAsync(new PickOptions { @@ -33,7 +41,12 @@ public partial class createOeuvre : ContentPage } } - async void AddClicked(object sender, System.EventArgs e) + /// + /// Gère l'événement de clic sur le bouton d'ajout d'oeuvre. + /// + /// L'objet déclencheur de l'événement. + /// Les arguments de l'événement. + private async void AddClicked(object sender, System.EventArgs e) { // Récupérer les valeurs des entrées string nom = nameEntry.Text; @@ -51,7 +64,7 @@ public partial class createOeuvre : ContentPage } if (string.IsNullOrWhiteSpace(nom) || - string.IsNullOrWhiteSpace(description) || string.IsNullOrWhiteSpace(type)) + string.IsNullOrWhiteSpace(description) || string.IsNullOrWhiteSpace(type)) { await DisplayAlert("Erreur", "Veuillez remplir tous les champs.", "OK"); return; @@ -59,7 +72,7 @@ public partial class createOeuvre : ContentPage if (nbEp < 0) { - await DisplayAlert("Erreur", "Il faut avoir au 1 épisode pour l'application.", "OK"); + await DisplayAlert("Erreur", "Il faut avoir au moins 1 épisode pour l'application.", "OK"); return; } @@ -69,4 +82,4 @@ public partial class createOeuvre : ContentPage await Navigation.PushAsync(new homePage()); return; } -} \ No newline at end of file +} diff --git a/MangaMap/Views/FicheAnime.xaml.cs b/MangaMap/Views/FicheAnime.xaml.cs index 2c6b3b6..e8ccf95 100644 --- a/MangaMap/Views/FicheAnime.xaml.cs +++ b/MangaMap/Views/FicheAnime.xaml.cs @@ -1,265 +1,293 @@ -namespace MangaMap.Views; - -using Model; -using System.ComponentModel; -using System.Diagnostics; -using System.Drawing; -using System.Windows.Input; -using System.Xml.Linq; -using Microsoft.Maui.Graphics; - - -public partial class ficheAnime : ContentPage, INotifyPropertyChanged +namespace MangaMap.Views { - public Manager my_manager => (App.Current as App).MyManager; - public Oeuvre AnimeModel { get; set; } - - public ficheAnime() + using Model; + using System.ComponentModel; + using System.Diagnostics; + using System.Drawing; + using System.Windows.Input; + using System.Xml.Linq; + using Microsoft.Maui.Graphics; + + public partial class ficheAnime : ContentPage, INotifyPropertyChanged { - InitializeComponent(); + public Manager my_manager => (App.Current as App).MyManager; + public Oeuvre AnimeModel { get; set; } - BindingContext = this; + /// + /// Constructeur par défaut de la page ficheAnime. + /// + public ficheAnime() + { + InitializeComponent(); - } + BindingContext = this; + } - public ficheAnime(Oeuvre anime) - { - AnimeModel = anime; + /// + /// Constructeur de la page ficheAnime prenant en paramètre un objet Oeuvre. + /// + /// L'objet Oeuvre à afficher dans la fiche. + public ficheAnime(Oeuvre anime) + { + AnimeModel = anime; - InitializeComponent(); + InitializeComponent(); - BindingContext = this; + BindingContext = this; - SetNote(); - } - - public async void AjouterListe(object sender, EventArgs e) - { - if (my_manager.UtilisateurActuel.Email == null) - { - await DisplayAlert("Erreur", "Vous n'êtes pas connecté.", "OK"); - return; + SetNote(); } - // Si la série est déjà dans la liste il faut bloquer l'ajout. - foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvreEnVisionnage) + /// + /// Gère l'événement lorsqu'on clique sur le bouton d'ajout à la liste. + /// + /// L'objet déclenchant l'événement. + /// Les arguments de l'événement. + public async void AjouterListe(object sender, EventArgs e) { - if (oeuvre.Nom == AnimeModel.Nom) + if (my_manager.UtilisateurActuel.Email == null) { - await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'En visionnage'.", "OK"); + await DisplayAlert("Erreur", "Vous n'êtes pas connecté.", "OK"); return; } - } - foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvreDejaVu) - { - if (oeuvre.Nom == AnimeModel.Nom) + + // Si la série est déjà dans la liste il faut bloquer l'ajout. + foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvreEnVisionnage) { - await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'Déjà vu'.", "OK"); - return; + if (oeuvre.Nom == AnimeModel.Nom) + { + await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'En visionnage'.", "OK"); + return; + } } - } - foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvreFavorites) - { - if (oeuvre.Nom == AnimeModel.Nom) + foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvreDejaVu) { - await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'En favoris'.", "OK"); - return; + if (oeuvre.Nom == AnimeModel.Nom) + { + await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'Déjà vu'.", "OK"); + return; + } } - } - foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvrePourPlusTard) - { - if (oeuvre.Nom == AnimeModel.Nom) + foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvreFavorites) { - await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'Pour plus tard'.", "OK"); - return; + if (oeuvre.Nom == AnimeModel.Nom) + { + await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'En favoris'.", "OK"); + return; + } + } + foreach (Oeuvre oeuvre in my_manager.UtilisateurActuel.ListeOeuvrePourPlusTard) + { + if (oeuvre.Nom == AnimeModel.Nom) + { + await DisplayAlert("Erreur", "Avez déjà cette série dans une la liste 'Pour plus tard'.", "OK"); + return; + } } - } - - string selectedOption = await DisplayActionSheet("Ajouter à quelle liste ?", "Annuler", null, "En Visionnage", "Déjà Vu", "Pour Plus Tard", "Favoris"); - - if (selectedOption == "Annuler" || selectedOption == null) - return; - Debug.WriteLine("Selected Option: " + selectedOption); + string selectedOption = await DisplayActionSheet("Ajouter à quelle liste ?", "Annuler", null, "En Visionnage", "Déjà Vu", "Pour Plus Tard", "Favoris"); - // Ajouter l'anime à la liste sélectionnée - switch (selectedOption) - { - case "En Visionnage": - Debug.WriteLine("Ajout à la liste En Visionnage"); - my_manager.UtilisateurActuel.ListeOeuvreEnVisionnage.Add(AnimeModel); - break; - case "Déjà Vu": - Debug.WriteLine("Ajout à la liste Déjà Vu"); - my_manager.UtilisateurActuel.ListeOeuvreDejaVu.Add(AnimeModel); - break; - case "Pour Plus Tard": - Debug.WriteLine("Ajout à la liste Pour Plus Tard"); - my_manager.UtilisateurActuel.ListeOeuvrePourPlusTard.Add(AnimeModel); - break; - case "Favoris": - Debug.WriteLine("Ajout à la liste Favoris"); - my_manager.UtilisateurActuel.ListeOeuvreFavorites.Add(AnimeModel); - break; - } + if (selectedOption == "Annuler" || selectedOption == null) + return; - my_manager.sauvegarder(); + Debug.WriteLine("Selected Option: " + selectedOption); - await Navigation.PushAsync(new listPage()); - } + // Ajouter l'anime à la liste sélectionnée + switch (selectedOption) + { + case "En Visionnage": + Debug.WriteLine("Ajout à la liste En Visionnage"); + my_manager.UtilisateurActuel.ListeOeuvreEnVisionnage.Add(AnimeModel); + break; + case "Déjà Vu": + Debug.WriteLine("Ajout à la liste Déjà Vu"); + my_manager.UtilisateurActuel.ListeOeuvreDejaVu.Add(AnimeModel); + break; + case "Pour Plus Tard": + Debug.WriteLine("Ajout à la liste Pour Plus Tard"); + my_manager.UtilisateurActuel.ListeOeuvrePourPlusTard.Add(AnimeModel); + break; + case "Favoris": + Debug.WriteLine("Ajout à la liste Favoris"); + my_manager.UtilisateurActuel.ListeOeuvreFavorites.Add(AnimeModel); + break; + } - public async void SupprimerListe(object sender, EventArgs e) - { - if (my_manager.UtilisateurActuel.ListeOeuvreEnVisionnage.Remove(AnimeModel) || - my_manager.UtilisateurActuel.ListeOeuvreDejaVu.Remove(AnimeModel) || - my_manager.UtilisateurActuel.ListeOeuvreFavorites.Remove(AnimeModel) || - my_manager.UtilisateurActuel.ListeOeuvrePourPlusTard.Remove(AnimeModel)) my_manager.sauvegarder(); - else - { - await DisplayAlert("Erreur", "Avez n'avez pas cette série dans une liste.", "OK"); - return; + await Navigation.PushAsync(new listPage()); } - } - private void SetNote() - { - stars.Children.Clear(); - bool test = my_manager.UtilisateurActuel.notesNombres.ContainsKey(AnimeModel.Nom); - List x; + /// + /// Gère l'événement lorsqu'on clique sur le bouton de suppression de la liste. + /// + /// L'objet déclenchant l'événement. + /// Les arguments de l'événement. + public async void SupprimerListe(object sender, EventArgs e) + { + if (my_manager.UtilisateurActuel.ListeOeuvreEnVisionnage.Remove(AnimeModel) || + my_manager.UtilisateurActuel.ListeOeuvreDejaVu.Remove(AnimeModel) || + my_manager.UtilisateurActuel.ListeOeuvreFavorites.Remove(AnimeModel) || + my_manager.UtilisateurActuel.ListeOeuvrePourPlusTard.Remove(AnimeModel)) + my_manager.sauvegarder(); + else + { + await DisplayAlert("Erreur", "Avez n'avez pas cette série dans une liste.", "OK"); + return; + } + } - for (int i = 0; i < 5; i++) + /// + /// Affiche les étoiles de notation de l'anime. + /// + private void SetNote() { - if (my_manager.UtilisateurActuel.notesNombres.TryGetValue(AnimeModel.Nom,out x) && i < x[0]) + stars.Children.Clear(); + bool test = my_manager.UtilisateurActuel.notesNombres.ContainsKey(AnimeModel.Nom); + List x; + + for (int i = 0; i < 5; i++) { - ImageButton imageButton = new ImageButton + if (my_manager.UtilisateurActuel.notesNombres.TryGetValue(AnimeModel.Nom, out x) && i < x[0]) + { + ImageButton imageButton = new ImageButton + { + Source = "star_full.png", + BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"), + WidthRequest = 50, + HeightRequest = 50, + AutomationId = i.ToString(), + Margin = 10, + }; + + imageButton.Clicked += StarClicked; + + Grid.SetRow(imageButton, 0); + Grid.SetColumn(imageButton, i); + stars.Children.Add(imageButton); + } + else if (!test && i < AnimeModel.Note) { - Source = "star_full.png", - BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"), - WidthRequest = 50, - HeightRequest = 50, - AutomationId = i.ToString(), - Margin = 10, - }; - - imageButton.Clicked += StarClicked; - - Grid.SetRow(imageButton, 0); - Grid.SetColumn(imageButton, i); - stars.Children.Add(imageButton); + ImageButton imageButton = new ImageButton + { + Source = "star_full.png", + BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"), + WidthRequest = 50, + HeightRequest = 50, + AutomationId = i.ToString(), + Margin = 10, + }; + + imageButton.Clicked += StarClicked; + + Grid.SetRow(imageButton, 0); + Grid.SetColumn(imageButton, i); + stars.Children.Add(imageButton); + } + else + { + ImageButton imageButton = new ImageButton + { + Source = "star_empty.png", + BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"), + WidthRequest = 50, + HeightRequest = 50, + AutomationId = i.ToString(), + Margin = 10, + }; + + imageButton.Clicked += StarClicked; + + Grid.SetRow(imageButton, 0); + Grid.SetColumn(imageButton, i); + stars.Children.Add(imageButton); + } } - else if (!test && i < AnimeModel.Note) + } + + /// + /// Gère l'événement lorsqu'on clique sur une étoile. + /// + /// L'objet déclenchant l'événement. + /// Les arguments de l'événement. + private async void StarClicked(object sender, EventArgs e) + { + if (my_manager.UtilisateurActuel.Email == null) { - ImageButton imageButton = new ImageButton - { - Source = "star_full.png", - BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"), - WidthRequest = 50, - HeightRequest = 50, - AutomationId = i.ToString(), - Margin = 10, - }; - - imageButton.Clicked += StarClicked; - - Grid.SetRow(imageButton, 0); - Grid.SetColumn(imageButton, i); - stars.Children.Add(imageButton); + await DisplayAlert("Erreur", "Vous n'êtes pas connecté.", "OK"); + return; } - else + + var button = (ImageButton)sender; + var idAutomation = button.AutomationId; + List x = new List(); + int somme = 0; + int compteur = 0; + + if (int.TryParse(idAutomation, out int id)) { - ImageButton imageButton = new ImageButton + if (my_manager.UtilisateurActuel.notesNombres.ContainsKey(AnimeModel.Nom)) + { + my_manager.UtilisateurActuel.notesNombres.Remove(AnimeModel.Nom, out x); + x[0] = id + 1; + my_manager.UtilisateurActuel.notesNombres.Add(AnimeModel.Nom, x); + BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"); + } + else + { + x.Add(id + 1); + x.Add(0); + my_manager.UtilisateurActuel.notesNombres.Add(AnimeModel.Nom, x); + //BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"); + } + + SetNote(); + + foreach (Utilisateur u in my_manager.Utilisateurs) { - Source = "star_empty.png", - BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"), - WidthRequest = 50, - HeightRequest = 50, - AutomationId = i.ToString(), - Margin = 10, - }; - - imageButton.Clicked += StarClicked; - - Grid.SetRow(imageButton, 0); - Grid.SetColumn(imageButton, i); - stars.Children.Add(imageButton); + if (u.notesNombres.TryGetValue(AnimeModel.Nom, out x) && x[0] != 0) + { + compteur = compteur + 1; + somme = somme + x[0]; + } + } + + AnimeModel.Note = somme / compteur; + my_manager.sauvegarder(); } } - } - private async void StarClicked(object sender, EventArgs e) - { - if (my_manager.UtilisateurActuel.Email == null) + /// + /// Gère l'événement lorsqu'on clique sur le bouton de validation du nombre d'épisodes. + /// + /// L'objet déclenchant l'événement. + /// Les arguments de l'événement. + private async void NbEpCheck(object sender, EventArgs e) { - await DisplayAlert("Erreur", "Vous n'êtes pas connecté.", "OK"); - return; - } + if (my_manager.UtilisateurActuel.Email == null) + { + await DisplayAlert("Erreur", "Vous n'êtes pas connecté.", "OK"); + return; + } - var button = (ImageButton)sender; - var idAutomation = button.AutomationId; - List x = new List(); - int somme = 0; - int compteur = 0; + List x = new List(); + int nb = Convert.ToInt32(nombreEP.Text); - if (int.TryParse(idAutomation, out int id)) - { if (my_manager.UtilisateurActuel.notesNombres.ContainsKey(AnimeModel.Nom)) { my_manager.UtilisateurActuel.notesNombres.Remove(AnimeModel.Nom, out x); - x[0] = id + 1; + x[1] = nb; my_manager.UtilisateurActuel.notesNombres.Add(AnimeModel.Nom, x); - BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"); + return; } else { - x.Add(id + 1); x.Add(0); + x.Add(nb); my_manager.UtilisateurActuel.notesNombres.Add(AnimeModel.Nom, x); - //BackgroundColor = Microsoft.Maui.Graphics.Color.FromHex("1E1E1E"); - } - - SetNote(); - - foreach (Utilisateur u in my_manager.Utilisateurs) - { - if(u.notesNombres.TryGetValue(AnimeModel.Nom, out x) && x[0] != 0) - { - compteur = compteur + 1; - somme = somme + x[0]; - } } - AnimeModel.Note = somme / compteur; my_manager.sauvegarder(); } } - - private async void NbEpCheck(object sender, EventArgs e) - { - if (my_manager.UtilisateurActuel.Email == null) - { - await DisplayAlert("Erreur", "Vous n'êtes pas connecté.", "OK"); - return; - } - - List x = new List(); - int nb = Convert.ToInt32(nombreEP.Text); - - if (my_manager.UtilisateurActuel.notesNombres.ContainsKey(AnimeModel.Nom)) - { - my_manager.UtilisateurActuel.notesNombres.Remove(AnimeModel.Nom, out x); - x[1] = nb; - my_manager.UtilisateurActuel.notesNombres.Add(AnimeModel.Nom, x); - return; - } - else - { - x.Add(0); - x.Add(nb); - my_manager.UtilisateurActuel.notesNombres.Add(AnimeModel.Nom, x); - } - - my_manager.sauvegarder(); - } -} \ No newline at end of file +} diff --git a/MangaMap/Views/homePage.xaml.cs b/MangaMap/Views/homePage.xaml.cs index a6d5e14..8cdc9c4 100644 --- a/MangaMap/Views/homePage.xaml.cs +++ b/MangaMap/Views/homePage.xaml.cs @@ -1,83 +1,104 @@ -namespace MangaMap.Views; - -using MangaMap.Model; -using System.Collections.ObjectModel; - -public partial class homePage : ContentPage +namespace MangaMap.Views { - public Manager my_manager => (App.Current as App).MyManager; + using MangaMap.Model; + using System.Collections.ObjectModel; - public homePage() + /// + /// Classe représentant la page d'accueil de l'application. + /// + public partial class homePage : ContentPage { - InitializeComponent(); - BindingContext = my_manager; - searchResults.ItemsSource = my_manager.Oeuvres; - //chargerSerie(); - } + /// + /// Référence au gestionnaire de l'application. + /// + public Manager my_manager => (App.Current as App).MyManager; - private async void AnimeImageClicked(object sender, EventArgs e) - { - var selectedAnime = (sender as ImageButton)?.BindingContext as Oeuvre; - if (selectedAnime != null) + /// + /// Constructeur de la page d'accueil. + /// + public homePage() { - // Naviguez vers la page de la fiche d'anime en passant l'objet sélectionné - await Navigation.PushAsync(new ficheAnime(selectedAnime)); + InitializeComponent(); + BindingContext = my_manager; + searchResults.ItemsSource = my_manager.Oeuvres; + //chargerSerie(); } - /*var button = (ImageButton)sender; - var idAutomation = button.AutomationId; - - if (int.TryParse(idAutomation, out int id)) + /// + /// Gestionnaire d'événement lorsqu'une image d'anime est cliquée. + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. + private async void AnimeImageClicked(object sender, EventArgs e) { - await Navigation.PushAsync(new ficheAnime(my_manager.Oeuvres[id])); - }*/ - } + var selectedAnime = (sender as ImageButton)?.BindingContext as Oeuvre; + if (selectedAnime != null) + { + // Naviguer vers la page de la fiche d'anime en passant l'objet sélectionné + await Navigation.PushAsync(new ficheAnime(selectedAnime)); + } - /*private void chargerSerie() - { - int imagesParLigne = 4; - int indice = 0; + /*var button = (ImageButton)sender; + var idAutomation = button.AutomationId; - for (int i = 0; i < my_manager.Oeuvres.Count; i++) + if (int.TryParse(idAutomation, out int id)) + { + await Navigation.PushAsync(new ficheAnime(my_manager.Oeuvres[id])); + }*/ + } + + /*private void chargerSerie() { - Oeuvre favoris = my_manager.Oeuvres[i]; + int imagesParLigne = 4; + int indice = 0; - ImageButton imageButton = new ImageButton + for (int i = 0; i < my_manager.Oeuvres.Count; i++) { - Source = favoris.Affiche, - WidthRequest = 170, - MaximumHeightRequest = 190, - MinimumHeightRequest = 190, - HeightRequest = 190, - CornerRadius = 15, - Aspect = Aspect.Fill, - AutomationId = indice.ToString(), - Margin = 90 - }; + Oeuvre favoris = my_manager.Oeuvres[i]; - imageButton.Clicked += AnimeImageClicked; + ImageButton imageButton = new ImageButton + { + Source = favoris.Affiche, + WidthRequest = 170, + MaximumHeightRequest = 190, + MinimumHeightRequest = 190, + HeightRequest = 190, + CornerRadius = 15, + Aspect = Aspect.Fill, + AutomationId = indice.ToString(), + Margin = 90 + }; - int ligne = 1 + (indice / imagesParLigne); - int colonne = indice % imagesParLigne; + imageButton.Clicked += AnimeImageClicked; - Grid.SetRow(imageButton, ligne); - Grid.SetColumn(imageButton, colonne); - grille.Children.Add(imageButton); + int ligne = 1 + (indice / imagesParLigne); + int colonne = indice % imagesParLigne; - indice++; - } - }*/ + Grid.SetRow(imageButton, ligne); + Grid.SetColumn(imageButton, colonne); + grille.Children.Add(imageButton); - private void OnTextChanged(object sender, TextChangedEventArgs e) - { + indice++; + } + }*/ - if(string.IsNullOrWhiteSpace(e.NewTextValue)) + /// + /// Gestionnaire d'événement lorsqu'un texte est modifié dans la zone de recherche. + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement contenant le nouveau texte. + private void OnTextChanged(object sender, TextChangedEventArgs e) { - searchResults.ItemsSource = my_manager.Oeuvres; - } - else - { - searchResults.ItemsSource = my_manager.Oeuvres.Where(i => i.Nom.ToLower().Contains(e.NewTextValue.ToLower())); + if (string.IsNullOrWhiteSpace(e.NewTextValue)) + { + // Afficher toutes les œuvres si le champ de recherche est vide + searchResults.ItemsSource = my_manager.Oeuvres; + } + else + { + // Filtrer les œuvres en fonction du texte de recherche + searchResults.ItemsSource = my_manager.Oeuvres.Where(i => i.Nom.ToLower().Contains(e.NewTextValue.ToLower())); + } } } } diff --git a/MangaMap/Views/listPage.xaml.cs b/MangaMap/Views/listPage.xaml.cs index 4edf59a..2a5ed04 100644 --- a/MangaMap/Views/listPage.xaml.cs +++ b/MangaMap/Views/listPage.xaml.cs @@ -2,11 +2,17 @@ namespace MangaMap.Views; using MangaMap.Model; using static System.Net.Mime.MediaTypeNames; + +/// +/// Classe représentant la page de liste de l'application. +/// public partial class listPage : ContentPage { - + /// + /// Constructeur de la page de liste. + /// public listPage() { - InitializeComponent(); - } + InitializeComponent(); + } } \ No newline at end of file diff --git a/MangaMap/Views/loginAdminPage.xaml.cs b/MangaMap/Views/loginAdminPage.xaml.cs index 58e550d..bd4f519 100644 --- a/MangaMap/Views/loginAdminPage.xaml.cs +++ b/MangaMap/Views/loginAdminPage.xaml.cs @@ -4,20 +4,39 @@ using System.Threading.Tasks; using MangaMap.Stub; using MangaMap.Model; +/// +/// Classe représentant la page de connexion administrateur de l'application. +/// public partial class loginAdminPage : ContentPage { + /// + /// Référence au gestionnaire de l'application. + /// public Manager my_manager => (App.Current as App).MyManager; + /// + /// Constructeur de la page de connexion administrateur. + /// public loginAdminPage() - { - InitializeComponent(); - } + { + InitializeComponent(); + } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Utilisateur". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. async void userClicked(object sender, EventArgs e) { await Shell.Current.GoToAsync("//page/secondaire/inscriptionPage"); } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Connexion". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. async void OnLoginClicked(object sender, EventArgs e) { // Récupération du pseudo et du mot de passe entrés @@ -39,7 +58,7 @@ public partial class loginAdminPage : ContentPage return; } - // On garde la connection admin + // On garde la connexion admin my_manager.isAdmin = true; // Rediriger l'utilisateur vers la page principale await Shell.Current.GoToAsync("//page/homePage"); diff --git a/MangaMap/Views/loginPage.xaml.cs b/MangaMap/Views/loginPage.xaml.cs index ce85f37..ac3565c 100644 --- a/MangaMap/Views/loginPage.xaml.cs +++ b/MangaMap/Views/loginPage.xaml.cs @@ -4,23 +4,42 @@ using System.Threading.Tasks; using MangaMap.Stub; using MangaMap.Model; +/// +/// Classe représentant la page de connexion de l'application. +/// public partial class loginPage : ContentPage { + /// + /// Référence au gestionnaire de l'application. + /// public Manager my_manager => (App.Current as App).MyManager; + /// + /// Constructeur de la page de connexion. + /// public loginPage() - { - InitializeComponent(); - } + { + InitializeComponent(); + } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Inscription". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. async void OnSignUpClicked(object sender, EventArgs e) { await Shell.Current.GoToAsync("//page/secondaire/inscriptionPage"); } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Connexion". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. async void OnLoginClicked(object sender, EventArgs e) { - // Récupération de l'email et du mot de passe entrés + // Récupération de l'e-mail et du mot de passe entrés string email = emailEntry.Text; string password = passwordEntry.Text; @@ -34,7 +53,7 @@ public partial class loginPage : ContentPage // Vérifier que l'e-mail a la bonne forme //if (!Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$")) //{ - // await DisplayAlert("Erreur", "L'email n'est pas valide.", "OK"); + // await DisplayAlert("Erreur", "L'e-mail n'est pas valide.", "OK"); // return; //} @@ -50,7 +69,6 @@ public partial class loginPage : ContentPage my_manager.UtilisateurActuel = utilisateur; // Rediriger l'utilisateur vers la page principale - await Shell.Current.GoToAsync("//page/homePage"); + await Shell.Current.GoToAsync("//page/homePage"); } - } diff --git a/MangaMap/Views/settingsPage.xaml.cs b/MangaMap/Views/settingsPage.xaml.cs index 89986c2..6d007c7 100644 --- a/MangaMap/Views/settingsPage.xaml.cs +++ b/MangaMap/Views/settingsPage.xaml.cs @@ -1,15 +1,29 @@ namespace MangaMap.Views; using Model; +/// +/// Classe représentant la page des paramètres de l'application. +/// public partial class settingsPage : ContentPage { + /// + /// Référence au gestionnaire de l'application. + /// public Manager my_manager => (App.Current as App).MyManager; - public settingsPage() - { - InitializeComponent(); - } + /// + /// Constructeur de la page des paramètres. + /// + public settingsPage() + { + InitializeComponent(); + } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Déconnexion". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. private async void OnDisconnectClicked(object sender, EventArgs e) { my_manager.UtilisateurActuel = new Utilisateur(); @@ -17,14 +31,24 @@ public partial class settingsPage : ContentPage await Shell.Current.GoToAsync("//page/secondaire/connexionPage"); } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Connexion Administrateur". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. private async void LoginAdminClicked(object sender, EventArgs e) { await Shell.Current.Navigation.PushAsync(new loginAdminPage()); } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Ajouter". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. private async void AddClicked(object sender, EventArgs e) { - if(!my_manager.isAdmin) + if (!my_manager.isAdmin) { await DisplayAlert("Erreur", "Vous n'êtes pas connecté en tant qu'Administrateur.", "OK"); return; diff --git a/MangaMap/Views/signUpPage.xaml.cs b/MangaMap/Views/signUpPage.xaml.cs index b3df9bd..8c87c23 100644 --- a/MangaMap/Views/signUpPage.xaml.cs +++ b/MangaMap/Views/signUpPage.xaml.cs @@ -4,21 +4,39 @@ using MangaMap.Model; using System.Text.RegularExpressions; using static System.Runtime.InteropServices.JavaScript.JSType; +/// +/// Classe représentant la page d'inscription de l'application. +/// public partial class signUpPage : ContentPage { - + /// + /// Référence au gestionnaire de l'application. + /// public Manager my_manager => (App.Current as App).MyManager; - public signUpPage() - { + /// + /// Constructeur de la page d'inscription. + /// + public signUpPage() + { InitializeComponent(); - } + } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Connexion". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. async void OnLoginClicked(object sender, EventArgs e) { await Shell.Current.GoToAsync("//page/secondaire/connexionPage"); } + /// + /// Gestionnaire d'événement lorsqu'un utilisateur clique sur le bouton "Inscription". + /// + /// L'objet qui a déclenché l'événement. + /// Arguments de l'événement. async void OnSignUpClicked(object sender, System.EventArgs e) { // Récupérer les valeurs des entrées @@ -32,7 +50,7 @@ public partial class signUpPage : ContentPage foreach (Utilisateur u in my_manager.Utilisateurs) { - if (u.Email == email ||u.Pseudo==pseudo) + if (u.Email == email || u.Pseudo == pseudo) { await DisplayAlert("Erreur", "L'utilisateur existe déjà.", "OK"); return; @@ -40,7 +58,7 @@ public partial class signUpPage : ContentPage } if (string.IsNullOrWhiteSpace(email) || - string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(confirmPassword)) + string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(confirmPassword)) { await DisplayAlert("Erreur", "Veuillez remplir tous les champs.", "OK"); return; @@ -83,6 +101,11 @@ public partial class signUpPage : ContentPage } } + /// + /// Vérifie si un mot de passe est suffisamment fort. + /// + /// Le mot de passe à vérifier. + /// True si le mot de passe est suffisamment fort, sinon False. bool IsPasswordStrong(string password) { // Vérifier si le mot de passe est assez long From 7d97a74f9262395c2d09c126733c7cad8b21e69f Mon Sep 17 00:00:00 2001 From: HMatheo Date: Tue, 6 Jun 2023 18:35:06 +0200 Subject: [PATCH 2/2] Added DisplayAlert when deleting a anime from the list. --- MangaMap/Views/FicheAnime.xaml.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MangaMap/Views/FicheAnime.xaml.cs b/MangaMap/Views/FicheAnime.xaml.cs index e8ccf95..ab40e22 100644 --- a/MangaMap/Views/FicheAnime.xaml.cs +++ b/MangaMap/Views/FicheAnime.xaml.cs @@ -135,6 +135,7 @@ namespace MangaMap.Views await DisplayAlert("Erreur", "Avez n'avez pas cette série dans une liste.", "OK"); return; } + await DisplayAlert("Succès", "La série a bien été supprimée de la liste.", "OK"); } ///