Version finale #73

Merged
remi.lavergne merged 2 commits from remi into master 2 years ago

@ -5,14 +5,29 @@ using GameAtlas.Views;
namespace GameAtlas; namespace GameAtlas;
/// <summary>
/// Classe partielle pour l'application principale.
/// </summary>
public partial class App : Application public partial class App : Application
{ {
/// <summary>
/// Nom du fichier de données.
/// </summary>
public string FileName { get; set; } = "data.json"; // data.xml public string FileName { get; set; } = "data.json"; // data.xml
/// <summary>
/// Chemin du fichier de données.
/// </summary>
public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory);
/// <summary>
/// Gestionnaire principal de l'application.
/// </summary>
public Manager MyManager { get; private set; } = new Manager(new Stub.Stub());//new Manager(new DataContractPersistance.DataContractPers()); public Manager MyManager { get; private set; } = new Manager(new Stub.Stub());//new Manager(new DataContractPersistance.DataContractPers());
/// <summary>
/// Constructeur de l'application.
/// </summary>
public App() public App()
{ {
InitializeComponent(); InitializeComponent();

@ -2,9 +2,15 @@
namespace GameAtlas; namespace GameAtlas;
/// <summary>
/// Classe partielle pour la base de l'application.
/// </summary>
public partial class AppShell : Shell public partial class AppShell : Shell
{ {
public AppShell() /// <summary>
/// Constructeur de la base de l'application.
/// </summary>
public AppShell()
{ {
InitializeComponent(); InitializeComponent();

@ -3,9 +3,16 @@ using Microsoft.Extensions.Logging;
namespace GameAtlas; namespace GameAtlas;
/// <summary>
/// Classe principale du programme pour l'application Maui.
/// </summary>
public static class MauiProgram public static class MauiProgram
{ {
public static MauiApp CreateMauiApp() /// <summary>
/// Crée et configure l'application MAUI.
/// </summary>
/// <returns>L'application MAUI configurée.</returns>
public static MauiApp CreateMauiApp()
{ {
var builder = MauiApp.CreateBuilder(); var builder = MauiApp.CreateBuilder();
builder builder

@ -3,7 +3,9 @@ using System.Collections.ObjectModel;
namespace GameAtlas.Views; namespace GameAtlas.Views;
/// <summary>
/// Code-Behind pour la page d'accueil.
/// </summary>
public partial class PageAcceuil : ContentPage public partial class PageAcceuil : ContentPage
{ {

@ -10,29 +10,41 @@ using System.Diagnostics;
namespace GameAtlas.Views; namespace GameAtlas.Views;
/// <summary>
/// Code-Behind pour la page d'admin.
/// </summary>
public partial class PageAdmin : ContentPage public partial class PageAdmin : ContentPage
{ {
/// <summary>
/// Gestionnaire d'administration.
/// </summary>
public Manager AdminManager => (App.Current as App).MyManager; public Manager AdminManager => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la page d'administration.
/// </summary>
public PageAdmin() public PageAdmin()
{ {
InitializeComponent(); InitializeComponent();
} }
/** /// <summary>
* \brief Flèche de retour en arrière /// Méthode appelée lorsqu'on appuie sur la flèche de retour en arrière.
* \return void /// </summary>
*/ /// <param name="sender">L'objet qui a déclenché l'événement.</param>
/// <param name="e">Les arguments de l'événement.</param>
async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e) async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{ {
await Navigation.PopAsync(); await Navigation.PopAsync();
} }
/** /// <summary>
* \brief Bouton d'ajout de jeu /// Méthode appelée lorsqu'on appuie sur le bouton d'ajout de jeu.
* Affiche une succession de pop-up, pour remplir les champs un par un. /// Affiche une succession de pop-up pour remplir les champs un par un.
* Traitement et vérification des champs. /// Traite et vérifie les champs pour ajouter un jeu.
* \return void /// </summary>
*/ /// <param name="sender">L'objet qui a déclenché l'événement.</param>
/// <param name="e">Les arguments de l'événement.</param>
private async void OnButtonClicked(object sender, EventArgs e) private async void OnButtonClicked(object sender, EventArgs e)
{ {
string nom = string.Empty; string nom = string.Empty;
@ -145,6 +157,13 @@ public partial class PageAdmin : ContentPage
} }
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur le bouton de suppression d'un jeu.
/// Affiche une liste de jeux à supprimer.
/// Supprime le jeu sélectionné.
/// </summary>
/// <param name="sender">L'objet qui a déclenché l'événement.</param>
/// <param name="e">Les arguments de l'événement.</param>
private async void OnDeleteClicked(object sender, EventArgs e) private async void OnDeleteClicked(object sender, EventArgs e)
{ {
var gameNames = GetGameNames().ToArray(); var gameNames = GetGameNames().ToArray();
@ -163,11 +182,19 @@ public partial class PageAdmin : ContentPage
} }
} }
/// <summary>
/// Retourne une liste de noms de jeux.
/// </summary>
/// <returns>La liste des noms de jeux.</returns>
private List<string> GetGameNames() private List<string> GetGameNames()
{ {
return AdminManager.ListJeux.Select(jeu => jeu.Nom).ToList(); return AdminManager.ListJeux.Select(jeu => jeu.Nom).ToList();
} }
/// <summary>
/// Retourne une liste de noms de jeux.
/// </summary>
/// <returns>La liste des noms de jeux.</returns>
private Jeu GetGameByName(string name) private Jeu GetGameByName(string name)
{ {
return AdminManager.ListJeux.FirstOrDefault(jeu => jeu.Nom == name); return AdminManager.ListJeux.FirstOrDefault(jeu => jeu.Nom == name);

@ -10,21 +10,33 @@ using Models;
using System.Diagnostics; using System.Diagnostics;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
/// <summary>
/// Code-Behind pour la page de connexion.
/// </summary>
public partial class PageConnexion : ContentPage public partial class PageConnexion : ContentPage
{ {
private bool connexionWorked; private bool connexionWorked;
/// <summary>
/// Gestionnaire de connexion.
/// </summary>
public Manager ConnexionManager => (App.Current as App).MyManager; public Manager ConnexionManager => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la page de connexion.
/// </summary>
public PageConnexion() public PageConnexion()
{ {
InitializeComponent(); InitializeComponent();
} }
/** /// <summary>
* \brief Bouton "Connexion" /// Méthode appelée lorsqu'on appuie sur le bouton "Connexion".
* Réaction au clic sur le bouton, vérification des champs non vide. /// Vérifie les champs non vides et effectue la vérification de la connexion.
* \return void /// </summary>
*/ /// <param name="sender">L'objet qui a déclenché l'événement.</param>
/// <param name="e">Les arguments de l'événement.</param>
private async void OnSignInClicked(object sender, EventArgs e) private async void OnSignInClicked(object sender, EventArgs e)
{ {
@ -41,28 +53,28 @@ public partial class PageConnexion : ContentPage
connexionWorked = Verification(username, password); connexionWorked = Verification(username, password);
if (connexionWorked) if (connexionWorked)
{ {
//await Navigation.PushAsync(new PageAcceuil());
await Navigation.PopAsync(); await Navigation.PopAsync();
//await Shell.Current.GoToAsync("//page/PageAccueil");
} }
} }
/** /// <summary>
* \brief Texte "S'inscrire" /// Méthode appelée lorsqu'on appuie sur le texte "S'inscrire".
* Réaction au clic sur le texte, envoie sur le page d'Inscription. /// Affiche la page d'inscription.
* \return void /// </summary>
*/ /// <param name="sender">L'objet qui a déclenché l'événement.</param>
/// <param name="e">Les arguments de l'événement.</param>
private async void OnInscrire_Tapped(object sender, EventArgs e) private async void OnInscrire_Tapped(object sender, EventArgs e)
{ {
await Navigation.PushModalAsync(new PageInscription()); await Navigation.PushModalAsync(new PageInscription());
} }
/** /// <summary>
* \brief Texte "Mot de Passe oublié" /// Méthode appelée lorsqu'on appuie sur le texte "Mot de Passe oublié".
* Réaction au clic sur le texte, affichage de pop-ups. /// Affiche des pop-ups avec des messages.
* \return void /// </summary>
*/ /// <param name="sender">L'objet qui a déclenché l'événement.</param>
/// <param name="e">Les arguments de l'événement.</param>
private async void OnMotDePasseOublie_Tapped(object sender, EventArgs e) private async void OnMotDePasseOublie_Tapped(object sender, EventArgs e)
{ {
await DisplayAlert("Oh non !", "Le mot de passe va te revenir à force", "Concentration"); await DisplayAlert("Oh non !", "Le mot de passe va te revenir à force", "Concentration");
@ -79,14 +91,14 @@ public partial class PageConnexion : ContentPage
} }
} }
/** /// <summary>
* \brief Vérification et Chargement /// Vérifie la présence de l'utilisateur dans la liste des utilisateurs et effectue la vérification du mot de passe.
* Vérification de la présence de l'utilisateur dans la Liste d'Utilisateurs. /// Charge l'utilisateur connecté si la vérification est réussie.
* Si c'est le cas, comparaison du mot de passe fournis par celui de l'utilisateur. /// Affiche un message d'erreur sinon.
* Si tout est bon, chargement de l'utilisateur dans ConnectedUser. /// </summary>
* Dans le cas contraire, on renvoie un message d'erreur et termine la vérification. /// <param name="username">Le nom d'utilisateur saisi.</param>
* \return bool true si la connexion a fonctionnée, false sinon. /// <param name="password">Le mot de passe saisi.</param>
*/ /// <returns>True si la connexion a réussi, false sinon.</returns>
public bool Verification(string username, string password) public bool Verification(string username, string password)
{ {
foreach (Utilisateur user in ConnexionManager.Utilisateurs.Concat(ConnexionManager.Admins)) foreach (Utilisateur user in ConnexionManager.Utilisateurs.Concat(ConnexionManager.Admins))

@ -8,17 +8,32 @@ using CommunityToolkit.Maui.Core;
using CommunityToolkit.Maui.Alerts; using CommunityToolkit.Maui.Alerts;
using Font = Microsoft.Maui.Font; using Font = Microsoft.Maui.Font;
/// <summary>
/// Code-Behind pour la page d'inscription.
/// </summary>
public partial class PageInscription : ContentPage public partial class PageInscription : ContentPage
{ {
/// <summary>
/// Chemin d'accès à l'image par défaut pour le profil utilisateur.
/// </summary>
string ImagePath { get; set; } = "default_user.png"; string ImagePath { get; set; } = "default_user.png";
/// <summary>
/// Gestionnaire d'inscription.
/// </summary>
public Manager InscriptionManager => (App.Current as App).MyManager; public Manager InscriptionManager => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la page d'inscription.
/// </summary>
public PageInscription() public PageInscription()
{ {
InitializeComponent(); InitializeComponent();
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur le bouton "S'inscrire".
/// </summary>
private async void OnSignUpClicked(object sender, EventArgs e) private async void OnSignUpClicked(object sender, EventArgs e)
{ {
@ -53,42 +68,48 @@ public partial class PageInscription : ContentPage
await DisplayAlert("Compte créer avec succès !","Vous pouvez maintenant vous connecter.", cancel: "Ok"); await DisplayAlert("Compte créer avec succès !","Vous pouvez maintenant vous connecter.", cancel: "Ok");
await Shell.Current.GoToAsync("//page/PageAccueil"); await Shell.Current.GoToAsync("//page/PageAccueil");
}
/// <summary>
/// Vérifie si le mot de passe est assez fort.
/// </summary>
/// <param name="password">Le mot de passe à vérifier.</param>
/// <returns>True si le mot de passe est assez fort, False sinon.</returns>
bool IsPasswordStrong(string password)
{
// Vérifier si le mot de passe est assez long
if (password.Length < 8)
{
return false;
}
// Vérifier si le mot de passe contient au moins une majuscule, une minuscule et un chiffre
bool hasUppercase = false;
bool hasLowercase = false;
bool hasDigit = false;
bool IsPasswordStrong(string password) foreach (char c in password)
{ {
// Vérifier si le mot de passe est assez long if (char.IsUpper(c))
if (password.Length < 8)
{ {
return false; hasUppercase = true;
} }
else if (char.IsLower(c))
// Vérifier si le mot de passe contient au moins une majuscule, une minuscule et un chiffre
bool hasUppercase = false;
bool hasLowercase = false;
bool hasDigit = false;
foreach (char c in password)
{ {
if (char.IsUpper(c)) hasLowercase = true;
{ }
hasUppercase = true; else if (char.IsDigit(c))
} {
else if (char.IsLower(c)) hasDigit = true;
{
hasLowercase = true;
}
else if (char.IsDigit(c))
{
hasDigit = true;
}
} }
return hasUppercase && hasLowercase && hasDigit;
} }
return hasUppercase && hasLowercase && hasDigit;
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur le bouton "Sélectionner une photo".
/// </summary>
private async void OnSelectPhotoClicked(object sender, EventArgs e) private async void OnSelectPhotoClicked(object sender, EventArgs e)
{ {
var photo = await MediaPicker.PickPhotoAsync(); var photo = await MediaPicker.PickPhotoAsync();

@ -6,13 +6,24 @@ using Font = Microsoft.Maui.Font;
namespace GameAtlas.Views; namespace GameAtlas.Views;
/// <summary>
/// Code-Behind pour la page de jeu.
/// </summary>
public partial class PageJeu : ContentPage public partial class PageJeu : ContentPage
{ {
/// <summary>
/// Modèle de jeu.
/// </summary>
public Jeu JeuModel { get; set; } public Jeu JeuModel { get; set; }
//public Manager JeuManager { get; set; } = new Manager(); /// <summary>
/// Gestionnaire de jeu.
/// </summary>
public Manager JeuManager => (App.Current as App).MyManager; public Manager JeuManager => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la page de jeu.
/// </summary>
public PageJeu() public PageJeu()
{ {
InitializeComponent(); InitializeComponent();
@ -20,6 +31,10 @@ public partial class PageJeu : ContentPage
BindingContext = JeuManager; BindingContext = JeuManager;
} }
/// <summary>
/// Constructeur de la page de jeu avec un jeu spécifique.
/// </summary>
/// <param name="jeu">Le jeu qui doit être affiché.</param>
public PageJeu(Jeu jeu) public PageJeu(Jeu jeu)
{ {
@ -30,10 +45,11 @@ public partial class PageJeu : ContentPage
InitializeComponent(); InitializeComponent();
BindingContext = this; BindingContext = this;
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur le bouton "Ajouter".
/// </summary>
async void OnAddTapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e) async void OnAddTapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{ {
if (JeuManager.ConnectedUser != null) if (JeuManager.ConnectedUser != null)
@ -98,6 +114,9 @@ public partial class PageJeu : ContentPage
} }
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur le bouton "Ajouter un commentaire".
/// </summary>
async void OnAddCommentClicked(object sender, EventArgs args) async void OnAddCommentClicked(object sender, EventArgs args)
{ {
if (JeuManager.ConnectedUser != null) if (JeuManager.ConnectedUser != null)
@ -124,11 +143,17 @@ public partial class PageJeu : ContentPage
} }
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur l'icône de retour.
/// </summary>
async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e) async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{ {
await Navigation.PopAsync(); await Navigation.PopAsync();
} }
/// <summary>
/// Affiche une alerte indiquant qu'il faut être connecté pour effectuer une action. (Snackbar MAUI Toolkit)
/// </summary>
private async void Alert() private async void Alert()
{ {
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

@ -1,43 +1,60 @@
namespace GameAtlas.Views; namespace GameAtlas.Views
using Models;
using System.Collections.ObjectModel;
public partial class PageParcourir : ContentPage
{ {
using Models;
using System.Collections.ObjectModel;
public Manager ParcourirManager => (App.Current as App).MyManager; /// <summary>
public PageParcourir() /// Code-Behind pour la page parcourir.
{ /// </summary>
InitializeComponent(); public partial class PageParcourir : ContentPage
BindingContext = ParcourirManager;
}
async void OnGame_Tapped(System.Object sender, EventArgs e)
{ {
var selectedjeu = (sender as ImageButton)?.BindingContext as Jeu; /// <summary>
if (selectedjeu != null) /// Gestionnaire de parcours.
/// </summary>
public Manager ParcourirManager => (App.Current as App).MyManager;
/// <summary>
/// Constructeur de la page de parcours.
/// </summary>
public PageParcourir()
{ {
InitializeComponent();
await Navigation.PushAsync(new PageJeu(selectedjeu)); BindingContext = ParcourirManager;
} }
}
async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e) /// <summary>
{ /// Méthode appelée lorsqu'un jeu est sélectionné.
await Navigation.PopAsync(); /// </summary>
} async void OnGame_Tapped(System.Object sender, EventArgs e)
{
var selectedjeu = (sender as ImageButton)?.BindingContext as Jeu;
if (selectedjeu != null)
{
await Navigation.PushAsync(new PageJeu(selectedjeu));
}
}
private void SearchBar_TextChanged(object sender, TextChangedEventArgs e) /// <summary>
{ /// Méthode appelée lorsqu'on appuie sur l'icône de retour.
if(string.IsNullOrWhiteSpace(e.NewTextValue)) /// </summary>
async void Back_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{ {
searchResults.ItemsSource = ParcourirManager.ListJeux; await Navigation.PopAsync();
} }
else
/// <summary>
/// Méthode appelée lorsque le texte de la barre de recherche change.
/// </summary>
private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
{ {
searchResults.ItemsSource = ParcourirManager.ListJeux.Where(i => i.Nom.ToLower().Contains(e.NewTextValue.ToLower())); if (string.IsNullOrWhiteSpace(e.NewTextValue))
{
searchResults.ItemsSource = ParcourirManager.ListJeux;
}
else
{
searchResults.ItemsSource = ParcourirManager.ListJeux.Where(i => i.Nom.ToLower().Contains(e.NewTextValue.ToLower()));
}
} }
} }
} }

@ -2,21 +2,37 @@ using Models;
namespace GameAtlas.Views; namespace GameAtlas.Views;
/// <summary>
/// Code-Behind pour la page de profil.
/// </summary>
public partial class PageProfil : ContentPage public partial class PageProfil : ContentPage
{ {
/// <summary>
/// Gestionnaire de profil. Manager
/// </summary>
public Manager ProfilManager => (App.Current as App).MyManager; public Manager ProfilManager => (App.Current as App).MyManager;
public PageProfil()
/// <summary>
/// Constructeur de la page de profil.
/// </summary>
public PageProfil()
{ {
InitializeComponent(); InitializeComponent();
BindingContext = ProfilManager; BindingContext = ProfilManager;
} }
/// <summary>
/// Méthode appelée lorsque la page est affichée.
/// </summary>
protected override void OnAppearing() protected override void OnAppearing()
{ {
base.OnAppearing(); base.OnAppearing();
SwitchPage(); SwitchPage();
} }
/// <summary>
/// Méthode pour basculer vers une autre page en fonction de l'utilisateur connecté.
/// </summary>
async void SwitchPage() async void SwitchPage()
{ {
if (ProfilManager.ConnectedUser == null) if (ProfilManager.ConnectedUser == null)
@ -29,6 +45,9 @@ public partial class PageProfil : ContentPage
} }
} }
/// <summary>
/// Méthode appelée lorsqu'un jeu est sélectionné.
/// </summary>
async void OnGame_Tapped(System.Object sender, EventArgs e) async void OnGame_Tapped(System.Object sender, EventArgs e)
{ {
var selectedjeu = (sender as ImageButton)?.BindingContext as Jeu; var selectedjeu = (sender as ImageButton)?.BindingContext as Jeu;
@ -40,11 +59,17 @@ public partial class PageProfil : ContentPage
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur l'icône d'administration.
/// </summary>
async void OnAdmin_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e) async void OnAdmin_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{ {
await Shell.Current.GoToAsync(nameof(PageAdmin)); await Shell.Current.GoToAsync(nameof(PageAdmin));
} }
/// <summary>
/// Méthode appelée lorsqu'on appuie sur l'icône de déconnexion.
/// </summary>
async void OnDisconnect_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e) async void OnDisconnect_Tapped(System.Object sender, Microsoft.Maui.Controls.TappedEventArgs e)
{ {
await Shell.Current.GoToAsync("//page/PageAccueil"); await Shell.Current.GoToAsync("//page/PageAccueil");

@ -27,7 +27,7 @@ namespace Models
private ObservableCollection<Jeu> topRatedGames; private ObservableCollection<Jeu> topRatedGames;
/// <summary> /// <summary>
/// Les jeux les mieux notés. /// Les jeux les mieux notes.
/// </summary> /// </summary>
public ObservableCollection<Jeu> TopRatedGames public ObservableCollection<Jeu> TopRatedGames
{ {
@ -79,7 +79,7 @@ namespace Models
} }
/// <summary> /// <summary>
/// Gestionnaire de persistance utilisé pour charger et sauvegarder les données. /// Gestionnaire de persistance utilisé pour charger et sauvegarder les donnees.
/// </summary> /// </summary>
public IPersistanceManager Persistance { get; set; } public IPersistanceManager Persistance { get; set; }

Loading…
Cancel
Save