Résolution conflit
continuous-integration/drone/push Build is failing Details

master
Leana BESSON 2 years ago
commit bc8ec385d3

File diff suppressed because it is too large Load Diff

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,852 @@
/*!
* \file Program.cs
* \author Léana Besson
*/
using Model;
/*!
* \namespace MyProject
*/
namespace MyProject;
/*!
* \class Program
* \brief Group functions to run functional tests
*/
class Program
{
/*!
* \brief Contains pet lists and species lists
*/
static private Theque Theque { get; set; } = Stub.LoadTheque();
/*!
* \fn Main(string[] args)
* \brief It launches the main menu
* \param args string[] -
*/
static void Main(string[] args)
{
MenusPrincipal();
}
/*!
* \fn MenusPrincipal()
* \brief It displays the main menu, the user enters a number and the function launches the selected menu or closes the application
*/
static private void MenusPrincipal()
{
while (true)
{
Console.WriteLine("MENUS PRINCIPAL");
Console.WriteLine("\t1- Les espèces");
Console.WriteLine("\t2- Vos animaux");
Console.WriteLine("\t9- Quitter");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while(choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
Console.Clear();
MenusEspece();
break;
case 2:
Console.Clear();
MenusAnimal();
break;
case 9:
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn MenusEspece()
* \brief It displays the species menu, the user enters a number and the function launches the chosen function or returns to the main menu
*/
static private void MenusEspece()
{
while (true)
{
Console.WriteLine("LES ESPECES");
Console.WriteLine("\t1- Afficher les espèces");
Console.WriteLine("\t2- Sélectionner une espèce");
Console.WriteLine("\t9- Retour");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while (choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
Console.Clear();
AfficherListeEspece();
break;
case 2:
Console.Clear();
SelectionnerEspece();
break;
case 9:
Console.Clear();
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn AfficherListeEspece()
* \brief Displays species from the Theque species list, displays name and scientific name
*/
static private void AfficherListeEspece()
{
Console.WriteLine("LISTE DES ESPECES : ");
foreach (Espece espece in Theque.ListeEspeces)
{
Console.WriteLine("\t" + espece.Nom + " (" + espece.NomScientifique + ")");
}
Console.WriteLine("\n");
}
/*!
* \fn SelectionnerEspece()
* \brief It displays the list of species, the user enters the name of a species and the function asks the question again until the user has entered a species from the list, or -1 to return to the species menu
*/
static private void SelectionnerEspece()
{
string? choix = null;
while (choix != "-1")
{
AfficherListeEspece();
Console.Write("\n\tEntrer le nom de l'espèce à sélectionner (-1 pour annuler) : ");
choix = Console.ReadLine();
if(choix != null)
{
Espece? espece = Theque.RechercherEspece(choix);
if (espece != null)
{
AfficherEspece(espece);
}
else Console.WriteLine("\tChoix incorrect\n");
}
}
}
/*!
* \fn AfficherEspece(Espece espece)
* \brief Displays species information, displays a menu, the user enters the number, the chosen function is launched or returns to the species menu
* \param espece Espece - Species to display
*/
static private void AfficherEspece(Espece espece)
{
Console.WriteLine("\n" + espece.Nom);
Console.WriteLine("\tNom scientifique : " + espece.NomScientifique);
Console.WriteLine("\tEspérance de vie : " + espece.EsperanceVie);
Console.WriteLine("\tPoids moyen : " + espece.PoidsMoyen);
Console.WriteLine("\tTaille moyenne : " + espece.TailleMoyenne);
Console.WriteLine("\tComportement : " + espece.Comportement);
Console.WriteLine("\tSanté : " + espece.Sante);
Console.WriteLine("\tEducation : " + espece.Education);
Console.WriteLine("\tEntretien : " + espece.Entretien);
Console.WriteLine("\tCout : " + espece.Cout);
Console.WriteLine("\tConseil : " + espece.Conseil);
AfficherListeRace(espece);
while (true)
{
Console.WriteLine("\n\t1- Sélectionner une race");
Console.WriteLine("\t9- Retour");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while (choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
SelectionnerRace(espece);
break;
case 9:
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn AfficherListeRace(Espece espece)
* \brief Displays the list of breeds of the selected species, showing the name and scientific name of the breed
* \param espece Espece - The species for which the breed list is to be displayed
*/
static private void AfficherListeRace(Espece espece)
{
Console.WriteLine("\nLISTE DES RACES : ");
if (espece.ListeRaces != null)
{
foreach (Race race in espece.ListeRaces)
{
Console.WriteLine("\t" + race.Nom + " (" + race.NomScientifique + ")");
}
Console.WriteLine("\n");
}
else Console.WriteLine("\tAucune race connue.\n");
}
/*!
* \fn SelectionnerRace(Espece espece)
* \biref It displays the list of breeds of the species, the user enters the name of a breed and the function asks again until the user has entered a breed from the list or -1 to return to the species display
* \param espece - Espece The species selected by the user for which the breed is to be selected
*/
static private void SelectionnerRace(Espece espece)
{
string? choix = "";
while (choix != "-1")
{
Console.Write("\n\tEntrer le nom de la race à sélectionner (-1 pour annuler) : ");
choix = Console.ReadLine();
if (choix != "-1")
{
Race? race = espece.RechercherRace(choix);
if (race != null)
{
AfficherRace(race);
}
else Console.WriteLine("\tChoix incorrect\n");
}
}
}
/*!
* \fn AfficherRace(Race race)
* \brief Displays information on the selected breed
* \param race Race - The breed to display
*/
static private void AfficherRace(Race race)
{
Console.WriteLine("\n " + race.Nom);
Console.WriteLine("\tNom scientifique : " + race.NomScientifique);
Console.WriteLine("\tEspérance de vie : " + race.EsperanceVie);
Console.WriteLine("\tPoids moyen : " + race.PoidsMoyen);
Console.WriteLine("\tTaille moyenne : " + race.TailleMoyenne);
Console.WriteLine("\tComportement : " + race.Comportement);
Console.WriteLine("\tSante : " + race.Sante);
Console.WriteLine("\tEducation : " + race.Education);
Console.WriteLine("\tEntretien : " + race.Entretien);
Console.WriteLine("\tCout : " + race.Cout);
Console.WriteLine("\tConseil : " + race.Conseil + "\n\n");
}
/*!
* \fn MenusAnimal()
* \brief It displays the animal menu, the user enters a number and the function launches the chosen function or returns to the main menu
*/
static private void MenusAnimal()
{
while (true)
{
Console.WriteLine("LES ANIMAUX");
Console.WriteLine("\t1- Afficher les animaux");
Console.WriteLine("\t2- Ajouter un animal");
Console.WriteLine("\t3- Sélectionner un animal");
Console.WriteLine("\t9- Retour");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while (choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
Console.Clear();
AfficherListeAnimaux();
break;
case 2:
Console.Clear();
Animal animal = Theque.AjouterAnimal();
ModifierNom(animal);
ModifierAnimal(animal);
break;
case 3:
Console.Clear();
SelectionnerAnimal();
break;
case 9:
Console.Clear();
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn AfficherListeAnimaux()
* \brief Displays animals from the Theque animal list
*/
static private void AfficherListeAnimaux()
{
Console.WriteLine("VOS ANIMAUX : ");
foreach (Animal animal in Theque.ListeAnimaux)
{
if(animal.Espece != null) Console.WriteLine(animal.Nom + "(" + animal.Espece + ")");
else Console.WriteLine(animal.Nom);
}
}
/*!
* \fn SelectionnerAnimal()
* \brief It displays the list of pets, the user enters the name of a pet and the function asks the question again until the user has entered a pet from the list, or -1 to return to the pet menus
*/
static private void SelectionnerAnimal()
{
string? choix = "";
while (choix != "-1")
{
AfficherListeAnimaux();
Console.Write("\n\tEntrer le nom de l'animal à sélectionner (-1 pour annuler) : ");
choix = Console.ReadLine();
Animal? animal = Theque.RechercherAnimal(choix);
if (animal != null)
{
AfficherAnimal(animal);
}
else Console.WriteLine("\tChoix incorrect\n");
}
}
/*!
* \fn AfficherAnimal(Animal animal)
* \brief Displays information on the selected animal, displays a menu of pet functions, the user enters the number, the selected function is launched or returns to the animal menu
* \param animal Animal - Animal selected for display
*/
static private void AfficherAnimal(Animal animal)
{
Console.Clear();
while (true)
{
Console.WriteLine("\n" + animal.Nom);
if (animal.Espece != null) Console.WriteLine("\tEspece : " + animal.Espece.Nom);
if (animal.Race != null) Console.WriteLine("\tRace : " + animal.Race.Nom);
Console.WriteLine("\tDate de naissance : " + animal.DateNaissance);
Console.WriteLine("\tSexe : " + animal.Sexe);
Console.WriteLine("\tDate d'adoption : " + animal.DateAdoption);
Console.WriteLine("\tTaille : " + animal.Taille);
Console.WriteLine("\tPoids : " + animal.Poids);
Console.WriteLine("\tAlimentation : " + animal.Alimentation);
Console.WriteLine("\tPETSITTER : ");
AfficherEntite(animal.Petsitter);
Console.WriteLine("\tCHENIL : ");
AfficherEntite(animal.Chenil);
Console.WriteLine("\tVETERINAIRE : ");
AfficherVeterinaire(animal.Veterinaire);
Console.WriteLine("\tMAGASIN ALIMENTAIRE : ");
AfficherEntite(animal.MagasinAlimentaire);
Console.WriteLine("\tREFUGE, ELEVAGE, CHENIL DE PROVENANCE : ");
AfficherEntite(animal.Provenance);
Console.WriteLine("\n\t1- Modifier");
Console.WriteLine("\t2- Supprimer");
Console.WriteLine("\t9- Retour");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while (choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
ModifierAnimal(animal);
break;
case 2:
Theque.SupprimerAnimal(animal);
return;
case 9:
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn AfficherEntite(Entite entite)
* \brief Displays information on the selected entity
* \param entite Entite - Selected entity to display
*/
static private void AfficherEntite(Entite entite)
{
Console.WriteLine("\t\tNom : " + entite.Nom);
Console.WriteLine("\t\tAdresse : " + entite.Adresse + "," + Convert.ToInt32(entite.CodePostal) + " " + entite.Ville);
Console.WriteLine("\t\tNuméro de téléphone : " + Convert.ToInt32(entite.NumTel));
}
/*!
* \fn AfficherVeterinaire(Veterinaire veterinaire)
* \brief Displays information about the selected veterinarian
* \param veterinaire Veterinaire - Veterinarian selected to display
*/
static private void AfficherVeterinaire(Veterinaire veterinaire)
{
Console.WriteLine("\t\tNom : " + veterinaire.Nom);
Console.WriteLine("\t\tClinique : " + veterinaire.Clinique);
Console.WriteLine("\t\tAdresse : " + veterinaire.Adresse + "," + Convert.ToInt32(veterinaire.CodePostal) + " " + veterinaire.Ville);
Console.WriteLine("\t\tNuméro de téléphone : " + Convert.ToInt32(veterinaire.NumTel));
}
/*!
* \fn ModifierAnimal(Animal animal)
* \brief Displays the pet's menu of items to be modified, the user enters the number of the item to be modified, launches the function of the item to be modified or returns to the pet display
* \param animal Animal - Pet to modify
*/
static private void ModifierAnimal(Animal animal)
{
while (true)
{
Console.WriteLine("MODIFIER L'ANIMAL ", animal.Nom);
Console.WriteLine("\t1- Nom");
Console.WriteLine("\t2- Espece");
Console.WriteLine("\t3- Race");
Console.WriteLine("\t4- Date de naissance");
Console.WriteLine("\t5- Sexe");
Console.WriteLine("\t6- Date d'adoption");
Console.WriteLine("\t7- Taille");
Console.WriteLine("\t8- Poids");
Console.WriteLine("\t9- Alimentation");
Console.WriteLine("\t10- Petsitter");
Console.WriteLine("\t11- Chenil");
Console.WriteLine("\t12- Vétérinaire");
Console.WriteLine("\t13- Magasin alimentaire");
Console.WriteLine("\t14- Refuge, élevage et chenil de provenance");
Console.WriteLine("\t19- Retour");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while (choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
ModifierNom(animal);
break;
case 2:
ModifierEspece(animal);
break;
case 3:
ModifierRace(animal);
break;
case 4:
ModifierDateNaissance(animal);
break;
case 5:
ModifierSexe(animal);
break;
case 6:
ModifierDateAdoption(animal);
break;
case 7:
ModifierTaille(animal);
break;
case 8:
ModifierPoids(animal);
break;
case 9:
ModifierAlimentation(animal);
break;
case 10:
ModifierEntite(animal.Petsitter);
break;
case 11:
ModifierEntite(animal.Chenil);
break;
case 12:
ModifierVeterinaire(animal.Veterinaire);
break;
case 13:
ModifierEntite(animal.MagasinAlimentaire);
break;
case 14:
ModifierEntite(animal.Provenance);
break;
case 19:
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn ModifierNom(Animal animal)
* \brief The user enters the name of the pet to be modified, checks if it is valid, asks the question again until the name is valid, changes the pet's name
* \param animal Animal - Pet to modify
*/
static private void ModifierNom(Animal animal)
{
Console.Write("\tNom : ");
string nom = Console.ReadLine()??"";
while(!animal.NomValidate(nom))
{
Console.Write("\nNom incorrect. Nom : ");
nom = Console.ReadLine() ??"";
}
animal.Nom = nom;
}
/*!
* \fn ModifierEspece(Animal animal)
* \brief The user enters the species name of the pet to be modified, checks if the pet exists, asks the question again until the pet written does not exist, then changes the animal species
* \param animal Animal - animal Animal - Pet to modify
*/
static private void ModifierEspece(Animal animal)
{
Console.Write("\tEspèce (appuyer sur entrée pour passer): ");
string? nomEspece = Console.ReadLine();
Espece? espece = Theque.RechercherEspece(nomEspece);
while (nomEspece != null && espece == null)
{
Console.Write("\tEspèce inconnue. Espèce : ");
nomEspece = Console.ReadLine();
espece = Theque.RechercherEspece(nomEspece);
}
animal.Espece = espece;
}
/*!
* \fn ModifierSexe(Animal animal)
* \brief The user enters the species name of the pet to be modified, checks if the species exists, asks the question again until the species written does not exist, then changes the pet sexe
* \param animal Animal - Pet to modify
*/
static private void ModifierSexe(Animal animal)
{
string? sexe = null;
while (sexe != "Male" && sexe != "Femelle" && sexe != null)
{
Console.Write("\tSexe [Male|Femelle] (appuyer sur entrer pour passer) : ");
sexe = Console.ReadLine();
}
animal.Sexe = sexe;
}
/*!
* \fn ModifierTaille(Animal animal)
* \brief The user enters new size, the function checks whether it is valid and, if it is not valid, modifies the size
* \param animal Animal - Pet to modify
*/
static private void ModifierTaille(Animal animal)
{
Console.Write("\tTaille (appuyer sur entrer pour passer) : ");
string? taille = Console.ReadLine();
while(taille != null && !Theque.FloatValidate(taille))
{
Console.Write("\tTaille incorrect. Taille : ");
taille = Console.ReadLine();
}
animal.Taille = Convert.ToSingle(taille);
}
/*!
* \fn ModifierPoids(Animal animal)
* \brief The user enters new weight, the function checks whether it is valid and asks the question again if it is not valid, modifying the pet weight
* \param animal Animal - Pet to modify
*/
static private void ModifierPoids(Animal animal)
{
Console.Write("\tPoids (appuyer sur entrer pour passer) : ");
string? poids = Console.ReadLine();
while (poids != null && !Theque.FloatValidate(poids))
{
Console.Write("\tTaille incorrect. Poids : ");
poids = Console.ReadLine();
}
animal.Poids = Convert.ToSingle(poids);
}
/*!
* \fn ModifierAlimentation(Animal animal)
* \brief User enters new feed, function modifies pet feed
* \param animal Animal - Pet to modify
*/
static private void ModifierAlimentation(Animal animal)
{
Console.Write("\tAlimentation (appuyer sur entrer pour passer) : ");
animal.Alimentation = Console.ReadLine();
}
/*!
* \fn ModifierDateNaissance(Animal animal)
* \brief The user enters the new date of birth, the function checks that it is valid and asks the question again if it is not, then changes the pet's date of birth
* \param animal Animal - Pet to modify
*/
static private void ModifierDateNaissance(Animal animal)
{
Console.Write("\tDate de naissance (appuyer sur entrer pour passer) : ");
string? dateNaissance = Console.ReadLine();
while (dateNaissance != null && !Theque.DateTimeValidate(dateNaissance))
{
Console.Write("\tTaille incorrect. Date de naissance : ");
dateNaissance = Console.ReadLine();
}
animal.DateNaissance = Convert.ToDateTime(dateNaissance);
}
/*!
* \fn ModifierDateAdoption(Animal animal)
* \brief The user enters the new adoption date, the function checks that it's valid and asks again if it isn't, then changes the pet's adoption date
* \param animal Animal - Pet to modify
*/
static private void ModifierDateAdoption(Animal animal)
{
Console.Write("\tDate d'adoption (appuyer sur entrer pour passer) : ");
string? dateAdoption = Console.ReadLine();
while (dateAdoption != null && !Theque.DateTimeValidate(dateAdoption))
{
Console.Write("\tTaille incorrect. Date d'adoption : ");
dateAdoption = Console.ReadLine();
}
animal.DateAdoption = Convert.ToDateTime(dateAdoption);
}
/*!
* \fn ModifierRace(Animal animal)
* \brief The user enters the name of the new breed, the function checks that the breed exists and asks again if it doesn't, then changes the pet's breed.
* \param animal Animal - Pet to modify
*/
static private void ModifierRace(Animal animal)
{
if (animal.Espece != null)
{
Console.Write("\tRace (appuyer sur entrée pour passer): ");
string? nomRace = Console.ReadLine();
Race? race = animal.Espece.RechercherRace(nomRace);
while (nomRace != null && race == null)
{
Console.Write("\tRace inconnue. Race : ");
nomRace = Console.ReadLine();
race = animal.Espece.RechercherRace(nomRace);
}
animal.Race = race;
}
else Console.WriteLine("\tL'animal ne peut pas avoir une race sans espèce");
}
/*!
* \fn ModifierEntite(Entite entite)
* \brief Displays the elements to be modified in the entity, the user enters a number and the associated function is launched. The function repeats the same actions until the user enters the return number.
* \param entite Entite - Entity to modify
*/
static private void ModifierEntite(Entite entite)
{
while (true)
{
Console.WriteLine("MODIFIER L'ENTITE ", entite);
Console.WriteLine("\t1- Nom");
Console.WriteLine("\t2- Adresse");
Console.WriteLine("\t3- Code postal");
Console.WriteLine("\t4- Ville");
Console.WriteLine("\t9- Retour");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while (choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
ModifierNomEntite(entite);
break;
case 2:
ModifierAdresseEntite(entite);
break;
case 3:
ModifierCodePostalEntite(entite);
break;
case 4:
ModifierVilleEntite(entite);
break;
case 9:
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn ModifierVeterinaire(Veterinaire veterinaire)
* \brief Affiche les éléments à modifier dans le vétérinaire, l'utilisateur entre un numéro, la fonction associé se lance. La fonction refait les mêmes actions jusqu'à ce que l'utilisateur entre le numéro de retour.
* \param veterinaire Veterinaire - Veterinarian to modify
*/
static private void ModifierVeterinaire(Veterinaire veterinaire)
{
while (true)
{
Console.WriteLine("MODIFIER L'ENTITE ", veterinaire);
Console.WriteLine("\t1- Nom");
Console.WriteLine("\t2- Clinique");
Console.WriteLine("\t3- Adresse");
Console.WriteLine("\t4- Code postal");
Console.WriteLine("\t5- Ville");
Console.WriteLine("\t9- Retour");
Console.Write("\n\tEntrer votre choix : ");
string? choix = Console.ReadLine();
while (choix == null || !Theque.IntValidate(choix))
{
Console.Write("\n\tChoix incorrect. Entrer votre choix : ");
choix = Console.ReadLine();
}
switch (Convert.ToInt32(choix))
{
case 1:
ModifierNomEntite(veterinaire);
break;
case 2:
ModifierClinique(veterinaire);
break;
case 3:
ModifierAdresseEntite(veterinaire);
break;
case 4:
ModifierCodePostalEntite(veterinaire);
break;
case 5:
ModifierVilleEntite(veterinaire);
break;
case 9:
return;
default:
Console.WriteLine("\tChoix incorrect\n");
break;
}
}
}
/*!
* \fn ModifierNomEntite(Entite entite)
* \brief User enters new entity name and function modifies entity name
* \param entite Entite - Entity to modify
*/
static private void ModifierNomEntite(Entite entite)
{
Console.Write("\tNom (appuyer sur entrer pour passer) : ");
entite.Nom = Console.ReadLine();
}
/*!
* \fn ModifierAdresseEntite(Entite entite)
* \brief User enters new entity address and function modifies entity address
* \param entite Entite - Entity to modify
*/
static private void ModifierAdresseEntite(Entite entite)
{
Console.Write("\tAdresse (appuyer sur entrer pour passer) : ");
entite.Adresse = Console.ReadLine();
}
/*!
* \fn ModifierCodePostalEntite(Entite entite)
* \brief The user enters the new zip code, the function checks that it is valid and asks the question again if it is not. It changes the entity's zip code
* \param entite Entite - Entity to modify
*/
static private void ModifierCodePostalEntite(Entite entite)
{
Console.Write("\tCode postal (appuyer sur entrer pour passer) : ");
string? codePostal = Console.ReadLine();
while(!entite.CodePostalValidate(codePostal)) {
Console.Write("\tCode postal (appuyer sur entrer pour passer) : ");
codePostal = Console.ReadLine();
}
entite.CodePostal = Convert.ToInt32(codePostal);
}
/*!
* \fn ModifierVilleEntite(Entite entite)
* \brief User enters new entity city and function modifies entity city
* \param entite Entite - Entity to modify
*/
static private void ModifierVilleEntite(Entite entite)
{
Console.Write("\tVille (appuyer sur entrer pour passer) : ");
entite.Ville = Console.ReadLine();
}
/*!
* \fn ModifierClinique(Veterinaire veterinaire)
* \brief The user enters a new veterinary clinic and the function modifies the veterinary clinic.
* \param veterinaire Veterinaire - Veterinarian to modify
*/
static private void ModifierClinique(Veterinaire veterinaire)
{
Console.Write("\tClinique (appuyer sur entrer pour passer) : ");
veterinaire.Clinique = Console.ReadLine();
}
}

@ -0,0 +1,292 @@
/*!
* \file Animal.cs
* \author Léana Besson
*/
using System.ComponentModel;
using System.Runtime.Serialization;
/*!
* \namespace Model
*/
namespace Model
{
/*!
* \class Animal
* \brief Regroups all properties and functions related to the pet
*/
[DataContract(Name = "animal")]
public class Animal : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
[DataMember(Name = "nom")]
public string? Nom
{
get => nom;
set
{
if (nom == value)
return;
nom = value;
NomIsValid = NomValidate(nom);
OnPropertyChanged(nameof(Nom));
}
}
private string? nom;
[DataMember(Name = "nomValid")]
public bool NomIsValid
{
get => nomIsValid;
set
{
if (nomIsValid == value)
return;
nomIsValid = value;
OnPropertyChanged(nameof(NomIsValid));
}
}
private bool nomIsValid;
[DataMember(Name = "naissance")]
public DateTime? DateNaissance
{
get => dateNaissance;
set
{
if (dateNaissance == value)
return;
dateNaissance = value;
OnPropertyChanged(nameof(DateNaissance));
}
}
private DateTime? dateNaissance;
[DataMember(Name = "sexe")]
public string? Sexe
{
get => sexe;
set {
if (sexe == value)
return;
sexe = value;
OnPropertyChanged(nameof(Sexe));
}
}
private string? sexe;
[DataMember(Name = "adoption")]
public DateTime? DateAdoption
{
get => dateAdoption;
set
{
if (dateAdoption == value)
return;
dateAdoption = value;
OnPropertyChanged(nameof(DateAdoption));
}
}
private DateTime? dateAdoption;
[DataMember(Name = "taille")]
public float? Taille
{
get => taille;
set
{
if (taille == value)
return;
taille = value;
OnPropertyChanged(nameof(Taille));
}
}
private float? taille;
[DataMember(Name = "poids")]
public float? Poids
{
get => poids;
set
{
if (poids == value)
return;
poids = value;
OnPropertyChanged(nameof(Poids));
}
}
private float? poids;
[DataMember(Name = "alimentation")]
public string? Alimentation
{
get => alimentation;
set
{
if (alimentation == value)
return;
alimentation = value;
OnPropertyChanged(nameof(Alimentation));
}
}
private string? alimentation;
[DataMember(Name = "espece")]
public Espece? Espece
{
get => espece;
set
{
if (espece == value)
return;
espece = value;
OnPropertyChanged(nameof(Espece));
}
}
private Espece? espece;
[DataMember(Name = "race")]
public Race? Race
{
get => race;
set
{
if(race == value)
return;
race = value;
OnPropertyChanged(nameof(Race));
}
}
private Race? race;
[DataMember(Name = "veterinaire")]
public Veterinaire Veterinaire
{
get => veterinaire;
set
{
if(veterinaire == value)
return;
veterinaire = value;
OnPropertyChanged(nameof(Veterinaire));
}
}
private Veterinaire veterinaire = new Veterinaire();
[DataMember(Name = "chenil")]
public Entite Chenil
{
get => chenil;
set
{
if (chenil == value)
return;
chenil = value;
OnPropertyChanged(nameof(Chenil));
}
}
private Entite chenil = new Entite();
[DataMember(Name = "magasin")]
public Entite MagasinAlimentaire
{
get => magasinAlimentaire;
set
{
if (magasinAlimentaire == value)
return;
magasinAlimentaire = value;
OnPropertyChanged(nameof(MagasinAlimentaire));
}
}
private Entite magasinAlimentaire = new Entite();
[DataMember(Name = "provenance")]
public Entite Provenance
{
get => provenance;
set
{
if (provenance == value)
return;
provenance = value;
OnPropertyChanged(nameof(Petsitter));
}
}
private Entite provenance = new Entite();
[DataMember(Name = "petsitter")]
public Entite Petsitter
{
get => petsitter;
set
{
if (petsitter == value)
return;
petsitter = value;
OnPropertyChanged(nameof(Petsitter));
}
}
private Entite petsitter = new Entite() ;
[DataMember(Name = "image")]
public string? Image
{
get => image;
set
{
if (image == value)
return;
image = value;
OnPropertyChanged(nameof(Image));
}
}
private string? image;
/*!
* \fn Animal()
* \brief Animal class constructor
*/
public Animal()
{
Nom = "";
NomIsValid = false;
DateNaissance = DateTime.MinValue;
Sexe = "";
DateAdoption = DateTime.MinValue;
Taille = null;
Poids = null;
Alimentation = "";
Espece = null;
Race = null;
Image = "";
}
/*!
* \fn OnPropertyChanged(string propertyName)
* \brief The function checks whether the property has been modified
* \param propertyName string - Property name modify
*/
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
/*!
* \fn NomValidate(string? nom)
* \brief The function checks if the name is not null, if it has more than 0 letters and if it doesn't start with an empty space
* \param nom string? - Pet name to be verified
* \return bool - Boolean which is false when the name is invalid and true if it is valid
*/
public bool NomValidate(string? nom)
{
if (nom == null || nom.Length <= 0 || nom.StartsWith(" ")) return false;
return true;
}
}
}

@ -0,0 +1,130 @@
/*!
* \file Entite.cs
* \author Léana Besson
*/
using System.ComponentModel;
using System.Runtime.Serialization;
/*!
* \namespace Model
*/
namespace Model
{
/*!
* \class Entite
* \brief Regroups all properties and functions related to the entity
*/
[DataContract(Name = "entite")]
public class Entite : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
[DataMember(Name = "nom")]
public string? Nom
{
get => nom;
set
{
if (nom == value)
return;
nom = value;
OnPropertyChanged(nameof(Nom));
}
}
private string? nom;
[DataMember(Name = "adresse")]
public string? Adresse
{
get => adresse;
set
{
if (adresse == value)
return;
adresse = value;
OnPropertyChanged(nameof(Adresse));
}
}
private string? adresse;
[DataMember(Name = "codePostal")]
public int? CodePostal
{
get => codePostal;
set
{
if (codePostal == value)
return;
codePostal = value;
OnPropertyChanged(nameof(CodePostal));
}
}
private int? codePostal;
[DataMember(Name = "ville")]
public string? Ville
{
get => ville;
set
{
if (ville == value)
return;
ville = value;
OnPropertyChanged(nameof(Ville));
}
}
private string? ville;
[DataMember(Name = "numTel")]
public int? NumTel
{
get => numTel;
set
{
if(numTel == value)
return;
numTel = value;
OnPropertyChanged(nameof(NumTel));
}
}
private int? numTel;
/*!
* \fn Entite()
* \brief Entite class constructor
*/
public Entite()
{
Nom = "";
Adresse = "";
CodePostal = null;
Ville = "";
NumTel = null;
}
/*!
* \fn OnPropertyChanged(string propertyName)
* \brief The function checks whether the property has been modified
* \param propertyName string - Property name modify
*/
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
/*!
* \fn CodePostalValidate(string? codePostal)
* \brief Check that the postal code is non-zero and an integer between 10000 and 99999
* \param codePostal string? - Postal code of entity to be verified
* \return bool - Boolean which is false when the Postal code is invalid and true if it is valid
*/
public bool CodePostalValidate(string? codePostal)
{
if ((codePostal != null && !Theque.IntValidate(codePostal)) || (codePostal != null && Theque.IntValidate(codePostal) && Convert.ToInt32(codePostal) < 10000 && Convert.ToInt32(codePostal) > 99999)) return false;
return true;
}
}
}

@ -0,0 +1,111 @@
/*!
* \file Espece.cs
* \author Léana Besson
*/
using System.Runtime.Serialization;
/*!
* \namespace Model
*/
namespace Model
{
/*!
* \class Espece
* \brief Regroups all properties and functions related to the species
*/
[DataContract(Name = "espece")]
public class Espece
{
[DataMember(Name = "nom")]
public string Nom { get; set; }
[DataMember(Name = "scientifique")]
public string NomScientifique { get; set; }
[DataMember(Name = "image")]
public string Image { get; set; }
[DataMember(Name = "esperance")]
public string EsperanceVie { get; set; }
[DataMember(Name = "poids")]
public string PoidsMoyen { get; set; }
[DataMember(Name = "taille")]
public string TailleMoyenne { get; set; }
[DataMember(Name = "races")]
public List<Race>? ListeRaces { get; set; } = new List<Race>();
[DataMember(Name = "comportement")]
public string Comportement { get; set; }
[DataMember(Name = "sante")]
public string Sante { get; set; }
[DataMember(Name = "education")]
public string Education { get; set; }
[DataMember(Name = "entretien")]
public string Entretien { get; set; }
[DataMember(Name = "cout")]
public string Cout { get; set; }
[DataMember(Name = "conseil")]
public string Conseil { get; set; }
/*!
* \fn Espece(string nom = "", string nomScientifique = "", string image = "", string esperanceVie = "", string poidsMoyen = "", string tailleMoyenne = "", List<Race>? races = null, string comportement = "", string sante = "", string education = "", string entretien = "", string cout = "", string conseil = "")
* \brief Espece class constructor
*/
public Espece(string nom = "", string nomScientifique = "", string image = "", string esperanceVie = "", string poidsMoyen = "", string tailleMoyenne = "", List<Race>? races = null, string comportement = "", string sante = "", string education = "", string entretien = "", string cout = "", string conseil = "")
{
Nom = nom;
NomScientifique = nomScientifique;
Image = image;
EsperanceVie = esperanceVie;
PoidsMoyen = poidsMoyen;
TailleMoyenne = tailleMoyenne;
ListeRaces = races;
Comportement = comportement;
Sante = sante;
Education = education;
Entretien = entretien;
Cout = cout;
Conseil = conseil;
}
/*!
* \fn ToString()
* \brief Element to display
* \return string - Element to display
*/
public override string ToString()
{
return Nom;
}
/*!
* \fn RechercherRace(string? choix)
* \brief Retrieves each item in the species list and checks whether the breed name and the name entered by the user are identical
* \param choix string? - Name of breed to search for
* \return Race? - A breed to search if it exists or null
*/
public Race? RechercherRace(string? choix)
{
if (ListeRaces != null && choix != "")
{
foreach (Race race in ListeRaces)
{
if (race.Nom == choix)
{
return race;
}
}
Console.WriteLine("\n");
}
return null;
}
}
}

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

@ -0,0 +1,84 @@
/*!
* \file Race.cs
* \author Léana Besson
*/
using System.Runtime.Serialization;
/*!
* \namespace Model
*/
namespace Model
{
/*!
* \class Race
* \brief Regroups all properties and functions related to the breed
*/
[DataContract(Name = "race")]
public class Race
{
[DataMember(Name = "nom")]
public string Nom { get; set; }
[DataMember(Name = "scientique")]
public string NomScientifique { get; set; }
[DataMember(Name = "esperance")]
public string EsperanceVie { get; set; }
[DataMember(Name = "poids")]
public string PoidsMoyen { get; set; }
[DataMember(Name = "taille")]
public string TailleMoyenne { get; set; }
[DataMember(Name = "comportement")]
public string Comportement { get; set; }
[DataMember(Name = "sante")]
public string Sante { get; set; }
[DataMember(Name = "education")]
public string Education { get; set; }
[DataMember(Name = "entretien")]
public string Entretien { get; set; }
[DataMember(Name = "cout")]
public string Cout { get; set; }
[DataMember(Name = "conseil")]
public string Conseil { get; set; }
[DataMember(Name = "image")]
public string? Image { get; set; }
/*!
* \fn Race(string nom = "Inconnu", string nomScientifique = "Inconnu", string esperanceVie = "Inconnue", string poidsMoyen = "Inconnu", string tailleMoyenne = "Inconnu", string comportement = "Auncune information", string sante = "Aucune information", string education = "Auncune information", string entretien = "Aucune information", string cout = "Auncune information", string conseil = "Aucun conseil")
* \brief Race class constructor
*/
public Race(string nom = "Inconnu", string nomScientifique = "Inconnu", string esperanceVie = "Inconnue", string poidsMoyen = "Inconnu", string tailleMoyenne = "Inconnu", string comportement = "Auncune information", string sante = "Aucune information", string education = "Auncune information", string entretien = "Aucune information", string cout = "Auncune information", string conseil = "Aucun conseil")
{
Nom = nom;
NomScientifique = nomScientifique;
EsperanceVie = esperanceVie;
PoidsMoyen = poidsMoyen;
TailleMoyenne = tailleMoyenne;
Comportement = comportement;
Sante = sante;
Education = education;
Entretien = entretien;
Cout = cout;
Conseil = conseil;
}
/*!
* \fn ToString()
* \brief Element to display
* \return string - Element to display
*/
public override string ToString()
{
return Nom;
}
}
}

@ -0,0 +1,49 @@
/*!
* \file Stub.cs
* \author Léana Besson
* \namespace Model
*/
namespace Model
{
/*!
* \class Stub
* \brief Includes all functions for retrieving data for the application
*/
public class Stub
{
/*!
* \fn LoadEspecetheque()
* \brief Created a species list and filled it with data
* \return List<Espece> - Species list with application data
*/
public static List<Espece> LoadEspecetheque()
{
List<Espece> ListeEspeces = new List<Espece>();
List<Race> Races = new List<Race>();
Races.Add(new("Abyssin", "", "", "", "", "", "", "", "", "", "Conseil Abyssin"));
Races.Add(new("American curl"));
ListeEspeces.Add(new("Chien", "Canis lupus familiaris", "chien.jpg"));
ListeEspeces.Add(new("Chat", "Felis catus", "chat.jpg", "15 à 20 ans", "15 à 20 kg", "10 à 15 cm", Races, "Les chats ont un comportement très solitaire", "Les chats ont une bonne santé", "Les chats s'éduque assez facilement", "Il faut changé leur caisse mais il se nettoie seul, sauf les chatons", "Vétérinaire, alimentation adapté, jouet", "Un conseil pour un chat"));
ListeEspeces.Add(new("Hamster", "Cricetinae"));
ListeEspeces.Add(new("Lapin", "Oryctolagus cuniculus"));
return ListeEspeces;
}
/*!
* \fn LoadTheque()
* \brief Create a theque and fill it with data
* \return Theque - Theque with application data
*/
public static Theque LoadTheque()
{
Theque theque = new Theque();
theque.ListeEspeces = LoadEspecetheque();
return theque;
}
}
}

@ -0,0 +1,166 @@
/*!
* \file Theque.cs
* \author Léana Besson
*/
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
/*!
* \namespace Model
*/
namespace Model
{
/*!
* \class Theque
* \brief Regroups all the species and animals as well as the functions to make it work
*/
[DataContract(Name = "theque")]
public class Theque
{
[DataMember(Name = "especes")]
public List<Espece> ListeEspeces { get; set; }
[DataMember(Name = "animaux")]
public ObservableCollection<Animal> ListeAnimaux { get; set; }
/*!
* \fn Theque()
* \brief Theque class constructor
*/
public Theque()
{
ListeEspeces = new List<Espece>();
ListeAnimaux = new ObservableCollection<Animal>();
}
/*!
* \fn AjouterAnimal()
* \brief Add an animal to the animal list
* \return Animal - Animal add to list
*/
public Animal AjouterAnimal()
{
Animal animal = new Animal();
ListeAnimaux.Add(animal);
return animal;
}
/*!
* \fn SupprimerAnimal(Animal animal)
* \brief Remove animal from animal list
* \param animal Animal - Animal to remove from list
*/
public void SupprimerAnimal(Animal animal)
{
ListeAnimaux.Remove(animal);
}
/*!
* \fn RechercherAnimal(string? choix)
* \brief Retrieves each animal from the animal list and checks whether the animal's name matches the name searched for
* \param choix string? - Name of pet wanted
* \return Animal? - Pet wanted or null if not found
*/
public Animal? RechercherAnimal(string? choix)
{
foreach (Animal animal in ListeAnimaux)
{
if (animal.Nom == choix)
{
return animal;
}
}
return null;
}
/*!
* \fn RechercherEspece(string? choix)
* \brief Retrieves each species from the species list and checks whether the species name and the name searched for are identical
* \param choix string? - Name of species wanted
* \return Espece? - Species wanted or null if not found
*/
public Espece? RechercherEspece(string? choix)
{
foreach (Espece espece in ListeEspeces)
{
if (espece.Nom == choix)
{
return espece;
}
}
return null;
}
/*!
* \fn IntValidate(string? response)
* \brief Checks whether the string is null or convertible to an integer
* \param response string? - Character string to check
* \return bool - True if null or convertible and False if not
*/
public static bool IntValidate(string? response)
{
if (response == null)
return true;
else
{
try
{
int number = Convert.ToInt32(response);
return true;
}
catch (Exception ex)
{
return false;
}
}
}
/*!
* \fn FloatValidate(string? response)
* \brief Checks whether the string is null or convertible to a float
* \param response string? - Character string to check
* \return bool - True if null or convertible and False if not
*/
public static bool FloatValidate(string? response)
{
if (response == null)
return true;
else
{
try
{
float numFloat = Convert.ToSingle(response);
return true;
}
catch (Exception ex)
{
return false;
}
}
}
/*!
* \fn DateTimeValidate(string? response)
* \brief Checks whether the string is null or convertible to a DateTime
* \param response string? - Character string to check
* \return True if null or convertible and False if not
*/
public static bool DateTimeValidate(string? response)
{
if (response == null)
return true;
else
{
try
{
DateTime date = Convert.ToDateTime(response);
return true;
}
catch (Exception ex)
{
return false;
}
}
}
}
}

@ -0,0 +1,33 @@
/*!
* \file Veterinaire.cs
* \author Léana Besson
*/
using System.Runtime.Serialization;
/*!
* \namespace Model
*/
namespace Model
{
/*!
* \class Veterinaire
* \brief Brings together all veterinary-related information and functions
*/
[DataContract(Name = "veterinaire")]
public class Veterinaire : Entite
{
[DataMember(Name = "clinique")]
public string? Clinique
{
get => clinique;
set
{
if(clinique == value)
return;
clinique = value;
OnPropertyChanged(nameof(Clinique));
}
}
private string? clinique;
}
}

@ -0,0 +1,77 @@
/*!
* \file DataSerializerBinary.cs
* \author Léana Besson
*/
using Model;
using System.Runtime.Serialization;
using System.Xml;
/*!
* \namespace Persistance
*/
namespace Persistance
{
/*!
* \class DataSerializerBinary
* \brief Contains all the information and functions needed to serialize information in binary format
*/
public class DataSerializerBinary
{
/*!
* \fn Serializer(string path, Theque theque)
* \brief Serializes theque information in the file theque.txt
* \param path string - Path of the file in which the file is to be saved
* \param theque Theque - Theque to be serialized
*/
public static void Serializer(string path, Theque theque)
{
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
string txtFile = "theque.txt";
var serializer = new DataContractSerializer(typeof(Theque), new DataContractSerializerSettings() { PreserveObjectReferences = true });
using (FileStream stream = File.Create(txtFile))
{
using (XmlDictionaryWriter xmlDicoWriter = XmlDictionaryWriter.CreateBinaryWriter(stream))
{
serializer.WriteObject(xmlDicoWriter, theque);
}
}
}
/*!
* \fn Deserializer(string path)
* \brief Deserializes the information contained in theque.txt file if it exists, otherwise it retrieves the information from the stub
* \param path string - Path of the file in which the file is to be saved
* \return Theque - Theque with recovered data
*/
public static Theque Deserializer(string path)
{
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
string txtFile = "theque.txt";
var serializer = new DataContractSerializer(typeof(Theque), new DataContractSerializerSettings() { PreserveObjectReferences = true });
Theque? theque = new Theque();
if (File.Exists(txtFile))
{
using (FileStream stream = File.OpenRead(txtFile))
{
using (XmlDictionaryReader xmlDicoReader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
{
Theque? thequeOpt = serializer.ReadObject(xmlDicoReader) as Theque;
if (thequeOpt != null)
theque = thequeOpt;
else
Console.WriteLine("Theque est null");
}
}
}
else
{
theque = Stub.LoadTheque();
}
return theque;
}
}
}

@ -0,0 +1,72 @@
/*!
* \file DataSerializerJson.cs
* \author Léana Besson
*/using Model;
using System.Runtime.Serialization.Json;
/*!
* \namespace Persistance
*/
namespace Persistance
{
/*!
* \class DataSerializerJson
* \brief Contains all the information and functions needed to serialize information in Json format
*/
public class DataSerializerJson
{
/*!
* \fn Serializer(string path, Theque theque)
* \brief Serializes theque information in the file theque.json
* \param path string - Path of the file in which the file is to be saved
* \param theque Theque - Theque to be serialized
*/
public static void Serializer(string path, Theque theque)
{
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
string jsonFile = "theque.json";
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Theque));
using (FileStream stream = File.Create(jsonFile))
{
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, System.Text.Encoding.UTF8, false, true))
{
jsonSerializer.WriteObject(writer, theque);
}
}
}
/*!
* \fn Deserializer(string path)
* \brief Deserializes the information contained in theque.json file if it exists, otherwise it retrieves the information from the stub
* \param path string - Path of the file in which the file is to be saved
* \return Theque - Theque with recovered data
*/
public static Theque Deserializer(string path)
{
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
string jsonFile = "theque.json";
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Theque));
Theque? theque = new Theque();
if (File.Exists(jsonFile))
{
using (Stream stream = File.OpenRead(jsonFile))
{
Theque? thequeOpt = jsonSerializer.ReadObject(stream) as Theque;
if (thequeOpt != null)
theque = thequeOpt;
else
Console.WriteLine("Theque est null");
}
}
else
{
theque = Stub.LoadTheque();
}
return theque;
}
}
}

@ -0,0 +1,75 @@
/*!
* \file DataSerializerXML.cs
* \author Léana Besson
*/
using System.Runtime.Serialization;
using System.Xml;
using Model;
/*!
* \namespace Persistance
*/
namespace Persistance
{
/*!
* \class DataSerializerXML
* \brief Contains all the information and functions needed to serialize information in XML format
*/
public class DataSerializerXML
{
/*!
* \fn Serializer(string path, Theque theque)
* \brief Serializes theque information in the file theque.xml
* \param path string - Path of the file in which the file is to be saved
* \param theque Theque - Theque to be serialized
*/
public static void Serializer(string path, Theque theque)
{
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
string xmlFile = "theque.xml";
var serializer = new DataContractSerializer(typeof(Theque), new DataContractSerializerSettings() { PreserveObjectReferences = true });
XmlWriterSettings settings = new XmlWriterSettings() { Indent = true };
using (TextWriter tw = File.CreateText(xmlFile))
{
using (XmlWriter writer = XmlWriter.Create(tw, settings))
{
serializer.WriteObject(writer, theque);
}
}
}
/*!
* \fn Deserializer(string path)
* \brief Deserializes the information contained in theque.xml file if it exists, otherwise it retrieves the information from the stub
* \param path string - Path of the file in which the file is to be saved
* \return Theque - Theque with recovered data
*/
public static Theque Deserializer(string path)
{
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
string xmlFile = "theque.xml";
var serializer = new DataContractSerializer(typeof(Theque), new DataContractSerializerSettings() { PreserveObjectReferences = true });
Theque theque = new Theque();
if(File.Exists(xmlFile))
{
using (Stream stream = File.OpenRead(xmlFile))
{
Theque? thequeOpt = serializer.ReadObject(stream) as Theque;
if (thequeOpt != null)
theque = thequeOpt;
else
Console.WriteLine("Theque est null");
}
}
else
{
theque = Stub.LoadTheque();
}
return theque;
}
}
}

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage x:Class="Views.Animaux"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
Title="Wikipet's"
IconImageSource="{FontImage FontFamily=Raleway}">
<ScrollView>
<!-- To manage the position of elements on the page -->
<toolkit:DockLayout>
<!-- To add a pet -->
<Button Text="+"
toolkit:DockLayout.DockPosition="Bottom"
VerticalOptions="End"
HorizontalOptions="End"
Clicked="Button_OnClick"
FontSize="30"
Padding="2"/>
<VerticalStackLayout>
<Grid RowDefinitions="Auto, *"
RowSpacing="20">
<!-- To display the list of pets -->
<ListView ItemsSource="{Binding ListeAnimaux}"
Grid.Row="1"
ItemTapped="OnClick">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Margin="0,10,0,10">
<Border>
<Grid ColumnDefinitions="Auto, *"
RowDefinitions="3*"
ColumnSpacing="15">
<!-- To display the image -->
<Frame Grid.RowSpan="3">
<Image Source="{Binding Image}"/>
</Frame>
<VerticalStackLayout Grid.Column="1">
<!-- To display the pet's name -->
<Label Text="{Binding Nom}"
FontSize="Large"/>
<!-- To display species -->
<Label Text="{Binding Espece}"
FontSize="12"
FontFamily="Raleway"/>
</VerticalStackLayout>
</Grid>
</Border>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</VerticalStackLayout>
</toolkit:DockLayout>
</ScrollView>
</ContentPage>

@ -0,0 +1,53 @@
/*!
* \file Animal.xaml.cs
* \author Léana Besson
*/
using Model;
/*!
* \namespace Views
*/
namespace Views;
/*!
* \class Animaux
* \brief Regroups functions for the proper operation of the Pets page
*/
public partial class Animaux : ContentPage
{
/*!
* \fn Animaux()
* \brief Animaux page constructor with component initialization and context binding assignment
*/
public Animaux()
{
InitializeComponent();
BindingContext = (App.Current as App).Theque;
}
/*!
* \fn OnClick(object sender, ItemTappedEventArgs e)
* \brief Saves the pet selected by the user and opens a new DetailAnimal page
* \param sender object - Event emitter information, namely the Animaux.xaml page
* \param e ItemTappedEventArgs - Information on selected pet
*/
public void OnClick(object sender, ItemTappedEventArgs e)
{
(App.Current as App).AnimalSelectionner = e.Item as Animal;
Navigation.PushAsync(new DetailAnimal());
}
/*!
* \fn Button_OnClick(object sender, EventArgs e)
* \brief Adds an pet to the theque and opens the pet's data entry page
* \param sender object - Event emitter information, namely the Animals.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
public async void Button_OnClick(object sender, EventArgs e)
{
(App.Current as App).AnimalSelectionner = (App.Current as App).Theque.AjouterAnimal();
(App.Current as App).PageDeSaisie?.InitBinding();
await Shell.Current.GoToAsync("//New_DetailAnimal");
}
}

@ -0,0 +1,14 @@
<?xml version = "1.0" encoding = "UTF-8" ?>
<Application xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Views"
x:Class="Views.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Styles/Colors.xaml" />
<ResourceDictionary Source="Resources/Styles/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

@ -0,0 +1,48 @@
/*!
* \file App.xaml.cs
* \author Léana Besson
*/
using Model;
using Persistance;
using System.ComponentModel;
/*!
* \namespace Views
*/
namespace Views
{
/*!
* \class App
* \brief Regroups functions for App operation
*/
public partial class App : Application, INotifyPropertyChanged
{
public string SerializationPath = FileSystem.Current.AppDataDirectory;
static private string serializationPath = FileSystem.Current.AppDataDirectory;
public Theque Theque { get; set; } = DataSerializerBinary.Deserializer(serializationPath);
public Animal AnimalSelectionner
{
get => animalSelectionner;
set
{
animalSelectionner = value;
OnPropertyChanged(nameof(AnimalSelectionner));
}
}
private Animal animalSelectionner;
public Espece EspeceSelectionner { get; set; }
public Race RaceSelectionner { get; set; }
public New_DetailAnimal PageDeSaisie { get; set; }
/*!
* \fn App()
* \brief App constructor with component initialization and creation of a new AppShell
*/
public App()
{
InitializeComponent();
MainPage = new AppShell();
}
}
}

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="Views.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Views"
Shell.FlyoutBehavior="Disabled">
<!-- Page navigation bar -->
<TabBar>
<!-- Go to home page -->
<ShellContent Title="Accueil"
ContentTemplate="{DataTemplate local:MainPage}"
Route="MainPage" />
<!-- To go to the species list -->
<ShellContent Title="Les espèces"
ContentTemplate="{DataTemplate local:Especes}"
Route="Especes" />
<!-- To go to the user's pet list -->
<ShellContent Title="Vos animaux"
ContentTemplate="{DataTemplate local:Animaux}"
Route="Animaux"/>
</TabBar>
<!-- To go to the add a pet page without the page being in the navigation bar -->
<ShellContent Title="Ajout d'un animal"
ContentTemplate="{DataTemplate local:New_DetailAnimal}"
Route="New_DetailAnimal"/>
</Shell>

@ -0,0 +1,23 @@
/*!
* \file AppShell.xaml.cs
* \author Léana Besson
* \namespace Views
*/
namespace Views
{
/*!
* \class Animaux
* \brief Regroups functions for AppShell operation
*/
public partial class AppShell : Shell
{
/*!
* \fn AppShell()
* \brief Application builder with component initialization
*/
public AppShell()
{
InitializeComponent();
}
}
}

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:Views"
x:Class="Views.DetailAnimal"
Title="{Binding Nom}">
<ScrollView>
<VerticalStackLayout>
<HorizontalStackLayout VerticalOptions="Start"
HorizontalOptions="End">
<!-- To delete the pet -->
<Button Text="Supprimer"
Clicked="Button_OnClick"/>
</HorizontalStackLayout>
<controls:View_DetailAnimal/>
<VerticalStackLayout x:Name="PetAdvice"
Margin="0,10,0,10">
<Label Text="Conseils"
FontSize="Large"/>
<Border>
<Label Text="{Binding Conseil}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
</VerticalStackLayout>
</ScrollView>
</ContentPage>

@ -0,0 +1,64 @@
/*!
* \file Animal.xaml.cs
* \author Léana Besson
*/
using Model;
using Persistance;
/*!
* \namespace Views
*/
namespace Views;
/*!
* \class DetailAnimal
* \brief Regroups functions for DetailAnimal page operation
*/
public partial class DetailAnimal : ContentPage
{
/*!
* \fn AppShell()
* \brief Animaux page constructor with component initialization and context binding assignment
*/
public DetailAnimal()
{
InitializeComponent();
BindingContext = (App.Current as App).AnimalSelectionner;
if((App.Current as App).AnimalSelectionner.Espece != null)
{
if ((App.Current as App).AnimalSelectionner.Race != null)
{
PetAdvice.BindingContext = (App.Current as App).AnimalSelectionner.Race;
}
else PetAdvice.BindingContext = (App.Current as App).AnimalSelectionner.Espece;
}
}
/*!
* \fn Button_OnClick(object sender, EventArgs e)
* \brief Delete the animal from the theque, serialize the theque and go to the Animaux page
* \param sender object - Event emitter information, namely the DetailAnimal.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
public async void Button_OnClick(object sender, EventArgs e)
{
(App.Current as App).Theque.SupprimerAnimal((App.Current as App).AnimalSelectionner);
DataSerializerBinary.Serializer((App.Current as App).SerializationPath, (App.Current as App).Theque);
await Shell.Current.GoToAsync("//Animaux");
}
/*!
* \fn OnBackButtonPressed()
* \brief If the Name is valid the theque is serialized
* \return False if the button is pressed and True otherwise
*/
protected override bool OnBackButtonPressed()
{
if((App.Current as App).AnimalSelectionner.NomIsValid == true)
{
DataSerializerBinary.Serializer((App.Current as App).SerializationPath, (App.Current as App).Theque);
return base.OnBackButtonPressed();
}
return true;
}
}

@ -0,0 +1,168 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- To diplay species name -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Views.DetailEspece"
Title="{Binding Nom}"
IconImageSource="{FontImage FontFamily=Raleway}">
<ScrollView>
<VerticalStackLayout>
<!-- To diplay species image -->
<Image Source="{Binding Image}"
MaximumWidthRequest="300"
Margin="20"
HorizontalOptions="Center"/>
<Border VerticalOptions="Start"
Grid.Column="1"
Margin="0,10,0,10">
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *"
RowSpacing="8">
<!-- To diplay species scientific name -->
<Label Text="Nom scientifique"/>
<Label Grid.Column="1"
HorizontalOptions="End"
Text="{Binding NomScientifique}"
FontAttributes="None"
FontFamily="Raleway"/>
<!-- To diplay species life expectancy -->
<Label Grid.Row="1"
Text="Espérance de vie"/>
<Label Grid.Column="2"
Grid.Row="1"
HorizontalOptions="End"
Text="{Binding EsperanceVie}"
FontAttributes="None"
FontFamily="Raleway"/>
<!-- To diplay species average weight -->
<Label Grid.Row="2"
Text="Poids moyen"/>
<Label Grid.Column="2"
Grid.Row="2"
HorizontalOptions="End"
Text="{Binding PoidsMoyen}"
FontAttributes="None"
FontFamily="Raleway"/>
<!-- To diplay species average height -->
<Label Grid.Row="3"
Text="Taille moyenne"/>
<Label Grid.Column="2"
Grid.Row="3"
HorizontalOptions="End"
Text="{Binding TailleMoyenne}"
FontAttributes="None"
FontFamily="Raleway"/>
</Grid>
</Border>
<!-- To diplay information on the species behavior -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Comportement"
FontSize="Large"/>
<Border>
<Label Text="{Binding Comportement}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the species health -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Santé"
FontSize="Large"/>
<Border>
<Label Text="{Binding Sante}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the species education -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Education"
FontSize="Large"/>
<Border>
<Label Text="{Binding Education}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the species maintenance -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Entretien"
FontSize="Large"/>
<Border>
<Label Text="{Binding Entretien}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the species cost -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Coût potentiel"
FontSize="Large"/>
<Border>
<Label Text="{Binding Cout}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay species advice -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Conseils"
FontSize="Large"/>
<Border>
<Label Text="{Binding Conseil}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To display the list of species breeds -->
<Grid RowDefinitions="Auto, *"
RowSpacing="20"
Margin="0,10,0,0">
<Label Text="Les Races"
FontSize="Large"/>
<ListView ItemsSource="{Binding ListeRaces}"
Grid.Row="1"
ItemTapped="OnClick">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Margin="0,10,0,10">
<Border>
<Grid ColumnDefinitions="Auto, *"
RowDefinitions="3*"
ColumnSpacing="15">
<!-- To display the image -->
<Frame Grid.RowSpan="3">
<Image Source="{Binding Image}"/>
</Frame>
<VerticalStackLayout Grid.Column="1">
<!-- To display the breed name -->
<Label Text="{Binding Nom}"
FontSize="Large"/>
<!-- To display the breed scientific name -->
<Label Text="{Binding NomScientifique}"
FontSize="12"
FontFamily="Raleway"/>
</VerticalStackLayout>
</Grid>
</Border>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</VerticalStackLayout>
</ScrollView>
</ContentPage>

@ -0,0 +1,39 @@
/*!
* \file DetailEspece.xmal.cs
* \author Léana Besson
*/
using Model;
/*!
* \namespece Views
*/
namespace Views;
/*!
* \class DetailEspece
* \brief Regroups functions for DetailEspece page operation
*/
public partial class DetailEspece : ContentPage
{
/*!
* \fn DetailEspece()
* \brief DetailEspece page constructor with component initialization and context binding assignment
*/
public DetailEspece()
{
InitializeComponent();
BindingContext = (App.Current as App).EspeceSelectionner;
}
/*!
* \fn OnClick(object sender, ItemTappedEventArgs e)
* \brief Saves the breed selected by the user and opens a new DetailRace page
* \param sender object - Event emitter information, namely the DetailEspece.xaml page
* \param e ItemTappedEventArgs - Information on selected breed
*/
public async void OnClick(object sender, ItemTappedEventArgs e)
{
(App.Current as App).RaceSelectionner = e.Item as Race;
await Navigation.PushAsync(new DetailRace());
}
}

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- To diplay breed name -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Views.DetailRace"
Title="{Binding Nom}"
IconImageSource="{FontImage FontFamily=Raleway}">
<ScrollView>
<VerticalStackLayout>
<!-- To diplay breed image -->
<Image Source="{Binding Image}"
MaximumWidthRequest="300"
Margin="20"
HorizontalOptions="Center"/>
<Border VerticalOptions="Start"
Grid.Column="1"
Margin="0,10,0,10">
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *"
RowSpacing="8">
<!-- To diplay breed scientific name -->
<Label Text="Nom scientifique"/>
<Label Grid.Column="1"
HorizontalOptions="End"
Text="{Binding NomScientifique}"
FontAttributes="None"
FontFamily="Raleway"/>
<!-- To diplay breed life expectancy -->
<Label Grid.Row="1"
Text="Espérance de vie"/>
<Label Grid.Column="2"
Grid.Row="1"
HorizontalOptions="End"
Text="{Binding EsperanceVie}"
FontAttributes="None"
FontFamily="Raleway"/>
<!-- To diplay breed average weight -->
<Label Grid.Row="2"
Text="Poids moyen"/>
<Label Grid.Column="2"
Grid.Row="2"
HorizontalOptions="End"
Text="{Binding PoidsMoyen}"
FontAttributes="None"
FontFamily="Raleway"/>
<!-- To diplay breed average height -->
<Label Grid.Row="3"
Text="Taille moyenne"/>
<Label Grid.Column="2"
Grid.Row="3"
HorizontalOptions="End"
Text="{Binding TailleMoyenne}"
FontAttributes="None"
FontFamily="Raleway"/>
</Grid>
</Border>
<!-- To diplay information on the breed behavior -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Comportement"
FontSize="Large"/>
<Border>
<Label Text="{Binding Comportement}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the breed health -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Santé"
FontSize="Large"/>
<Border>
<Label Text="{Binding Sante}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the breed education -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Education"
FontSize="Large"/>
<Border>
<Label Text="{Binding Education}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the breed maintenance -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Entretien"
FontSize="Large"/>
<Border>
<Label Text="{Binding Entretien}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay information on the breed cost -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Coût potentiel"
FontSize="Large"/>
<Border>
<Label Text="{Binding Cout}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
<!-- To diplay breed advice -->
<VerticalStackLayout Margin="0,10,0,10">
<Label Text="Conseils"
FontSize="Large"/>
<Border>
<Label Text="{Binding Conseil}"
FontAttributes="None"
FontFamily="Raleway"/>
</Border>
</VerticalStackLayout>
</VerticalStackLayout>
</ScrollView>
</ContentPage>

@ -0,0 +1,23 @@
/*!
* \file DetailRace.xmal.cs
* \author Léana Besson
* \namespace Views
*/
namespace Views;
/*!
* \class DetailRace
* \brief Regroups functions for DetailRace page operation
*/
public partial class DetailRace : ContentPage
{
/*!
* \fn DetailRace()
* \brief DetailRace page constructor with component initialization and context binding assignment
*/
public DetailRace()
{
InitializeComponent();
BindingContext = (App.Current as App).RaceSelectionner;
}
}

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Views.Especes"
Title="Wikipet's">
<ScrollView>
<Grid RowDefinitions="Auto, *"
RowSpacing="20">
<!-- To display the list of species -->
<ListView ItemsSource="{Binding ListeEspeces}"
Grid.Row="1"
ItemTapped="OnClick">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Margin="0,10,0,10">
<Border>
<Grid ColumnDefinitions="Auto, *"
RowDefinitions="3*"
ColumnSpacing="15">
<!-- To display the image -->
<Frame Grid.RowSpan="3">
<Image Source="{Binding Image}"/>
</Frame>
<VerticalStackLayout Grid.Column="1">
<!-- To display the species' name -->
<Label Text="{Binding Nom}"
FontSize="Large"/>
<!-- To display the species' scientific name -->
<Label Text="{Binding NomScientifique}"
FontSize="12"
FontFamily="Raleway"/>
</VerticalStackLayout>
</Grid>
</Border>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</ScrollView>
</ContentPage>

@ -0,0 +1,39 @@
/*!
* \file Especes.xmal.cs
* \author Léana Besson
*/
using Model;
/*!
* \namespace Views
*/
namespace Views;
/*!
* \class Especes
* \brief Regroups functions for Especes page operation
*/
public partial class Especes : ContentPage
{
/*!
* \fn DetailRace()
* \brief Especes page constructor with component initialization and context binding assignment
*/
public Especes()
{
InitializeComponent();
BindingContext = (App.Current as App).Theque;
}
/*!
* \fn OnClick(object sender, ItemTappedEventArgs e)
* \brief Saves the species selected by the user and opens a new DetailEspece page
* \param sender object - Event emitter information, namely the Especes.xaml page
* \param e ItemTappedEventArgs - Information on selected species
*/
public void OnClick(object sender, ItemTappedEventArgs e)
{
(App.Current as App).EspeceSelectionner = e.Item as Espece;
Navigation.PushAsync(new DetailEspece());
}
}

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:local="clr-namespace:Views"
x:Class="Views.MainPage"
Title="Wikipet's"
IconImageSource="{FontImage FontFamily=Raleway}">
<ScrollView>
<VerticalStackLayout>
<!-- To display the home image -->
<Image Source="accueil.png"
MaximumWidthRequest="200"/>
<!-- To display the welcome message -->
<Label HorizontalOptions="Center"
FontSize="Large"
Text="Bienvenue sur Wikipet's"/>
<!-- To display a description of the application -->
<Label MaximumWidthRequest="350"
HorizontalOptions="Center"
HorizontalTextAlignment="Center"
FontFamily="Raleway"
FontAttributes="None"
Text="Notre application va vous permettre de découvrir l'animal de compagnie qui convient le mieux à vous et votre quotidien. Une fois l'animal adopté, vous pourrez sauvegardé tous les informations dont vous avez besoin."/>
</VerticalStackLayout>
</ScrollView>
</ContentPage>

@ -0,0 +1,23 @@
/*!
* \file MainPage.xmal.cs
* \author Léana Besson
* \namespace Views
*/
namespace Views
{
/*!
* \class MainPage
* \brief Regroups functions for Especes page operation
*/
public partial class MainPage : ContentPage
{
/*!
* \fn MainPage()
* \brief MainPage page constructor with component initialization and context binding assignment
*/
public MainPage()
{
InitializeComponent();
}
}
}

@ -0,0 +1,27 @@
using Microsoft.Extensions.Logging;
using CommunityToolkit.Maui;
namespace Views
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseMauiCommunityToolkit()
.ConfigureFonts(fonts =>
{
fonts.AddFont("DMSerifDisplay-Regular.ttf", "DMSerifDisplay");
fonts.AddFont("Raleway-Light.ttf", "Raleway");
});
#if DEBUG
builder.Logging.AddDebug();
#endif
return builder.Build();
}
}
}

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="clr-namespace:Views"
x:Class="Views.New_DetailAnimal"
x:Name="page_creation">
<ScrollView>
<VerticalStackLayout>
<HorizontalStackLayout VerticalOptions="Start"
HorizontalOptions="End">
<!-- To validate the addition of the pet -->
<Button Text="Valider"
Clicked="Validate_OnClick"/>
<!-- To delete the pet -->
<Button Text="Supprimer"
Clicked="Button_OnClick"/>
</HorizontalStackLayout>
<controls:View_DetailAnimal/>
</VerticalStackLayout>
</ScrollView>
</ContentPage>

@ -0,0 +1,68 @@
/*!
* \file New_DetailAnimal.xmal.cs
* \author Léana Besson
*/
using Model;
using Persistance;
/*!
* \namespace Views
*/
namespace Views;
/*!
* \class New_DetailAnimal
* \brief Regroups functions for New_DetailAnimal page operation
*/
public partial class New_DetailAnimal : ContentPage
{
private Animal AnimalSelectione => (App.Current as App).AnimalSelectionner;
/*!
* \fn MainPage()
* \brief New_DetailAnimal page constructor with component initialization and context binding assignment
*/
public New_DetailAnimal()
{
InitializeComponent();
(App.Current as App).PageDeSaisie = this;
InitBinding();
}
/*!
* \fn InitBinding()
* \brief Initializes binding context
*/
public void InitBinding()
{
BindingContext = AnimalSelectione;
}
/*!
* \fn Button_OnClick(object sender, EventArgs e)
* \brief Remove an pet to the theque and opens the pet's data entry page
* \param sender object - Event emitter information, namely the New_DetailAnimal.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
public async void Button_OnClick(object sender, EventArgs e)
{
(App.Current as App).Theque.SupprimerAnimal((App.Current as App).AnimalSelectionner);
DataSerializerBinary.Serializer((App.Current as App).SerializationPath, (App.Current as App).Theque);
await Shell.Current.GoToAsync("//Animaux");
}
/*!
* \fn Button_OnClick(object sender, EventArgs e)
* \brief If the animal name is valid, the function serializes the theque and goes to the Animal page
* \param sender object - Event emitter information, namely the New_DetailAnimal.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
public async void Validate_OnClick(object sender, EventArgs e)
{
if ((App.Current as App).AnimalSelectionner.NomIsValid == true)
{
DataSerializerBinary.Serializer((App.Current as App).SerializationPath, (App.Current as App).Theque);
await Shell.Current.GoToAsync("//Animaux");
}
}
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

@ -0,0 +1,11 @@
using Android.App;
using Android.Content.PM;
using Android.OS;
namespace Views
{
[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
}
}

@ -0,0 +1,30 @@
using Android.App;
using Android.Runtime;
// Needed for Picking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.ReadExternalStorage, MaxSdkVersion = 32)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadMediaAudio)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadMediaImages)]
[assembly: UsesPermission(Android.Manifest.Permission.ReadMediaVideo)]
// Needed for Taking photo/video
[assembly: UsesPermission(Android.Manifest.Permission.Camera)]
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage, MaxSdkVersion = 32)]
// Add these properties if you would like to filter out devices that do not have cameras, or set to false to make them optional
[assembly: UsesFeature("android.hardware.camera", Required = true)]
[assembly: UsesFeature("android.hardware.camera.autofocus", Required = true)]
namespace Views
{
[Application]
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#512BD4</color>
<color name="colorPrimaryDark">#2B0B98</color>
<color name="colorAccent">#2B0B98</color>
</resources>

@ -0,0 +1,10 @@
using Foundation;
namespace Views
{
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
}

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs access to the photo gallery for picking photos and videos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to photos gallery for picking photos and videos.</string>
</dict>
</plist>

@ -0,0 +1,16 @@
using ObjCRuntime;
using UIKit;
namespace Views
{
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}
}

@ -0,0 +1,17 @@
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
using System;
namespace Views
{
internal class Program : MauiApplication
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
static void Main(string[] args)
{
var app = new Program();
app.Run(args);
}
}
}

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="maui-application-id-placeholder" version="0.0.0" api-version="7" xmlns="http://tizen.org/ns/packages">
<profile name="common" />
<ui-application appid="maui-application-id-placeholder" exec="Views.dll" multiple="false" nodisplay="false" taskmanage="true" type="dotnet" launch_mode="single">
<label>maui-application-title-placeholder</label>
<icon>maui-appicon-placeholder</icon>
<metadata key="http://tizen.org/metadata/prefer_dotnet_aot" value="true" />
</ui-application>
<shortcut-list />
<privileges>
<privilege>http://tizen.org/privilege/internet</privilege>
</privileges>
<dependencies />
<provides-appdefined-privileges />
</manifest>

@ -0,0 +1,8 @@
<maui:MauiWinUIApplication
x:Class="Views.WinUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:maui="using:Microsoft.Maui"
xmlns:local="using:Views.WinUI">
</maui:MauiWinUIApplication>

@ -0,0 +1,24 @@
using Microsoft.UI.Xaml;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace Views.WinUI
{
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : MauiWinUIApplication
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
}

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
IgnorableNamespaces="uap rescap">
<Identity Name="maui-package-name-placeholder" Publisher="CN=User Name" Version="0.0.0.0" />
<mp:PhoneIdentity PhoneProductId="3B45322D-321D-4222-BA65-C4107D8E4118" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
<Properties>
<DisplayName>$placeholder$</DisplayName>
<PublisherDisplayName>User Name</PublisherDisplayName>
<Logo>$placeholder$.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName="$placeholder$"
Description="$placeholder$"
Square150x150Logo="$placeholder$.png"
Square44x44Logo="$placeholder$.png"
BackgroundColor="transparent">
<uap:DefaultTile Square71x71Logo="$placeholder$.png" Wide310x150Logo="$placeholder$.png" Square310x310Logo="$placeholder$.png" />
<uap:SplashScreen Image="$placeholder$.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
</Capabilities>
</Package>

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="Views.WinUI.app"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<!-- The combination of below two tags have the following effect:
1) Per-Monitor for >= Windows 10 Anniversary Update
2) System < Windows 10 Anniversary Update
-->
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
</windowsSettings>
</application>
</assembly>

@ -0,0 +1,10 @@
using Foundation;
namespace Views
{
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
}

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>XSAppIconAssets</key>
<string>Assets.xcassets/appicon.appiconset</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>This app needs access to the photo gallery for picking photos and videos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to photos gallery for picking photos and videos.</string>
</dict>
</plist>

@ -0,0 +1,16 @@
using ObjCRuntime;
using UIKit;
namespace Views
{
public class Program
{
// This is the main entry point of the application.
static void Main(string[] args)
{
// if you want to use a different Application Delegate class from "AppDelegate"
// you can specify it here.
UIApplication.Main(args, null, typeof(AppDelegate));
}
}
}

@ -0,0 +1,8 @@
{
"profiles": {
"Windows Machine": {
"commandName": "MsixPackage",
"nativeDebugging": false
}
}
}

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="456" height="456" fill="#512BD4" />
</svg>

After

Width:  |  Height:  |  Size: 231 B

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

@ -0,0 +1,93 @@
<svg width="419" height="519" viewBox="0 0 419 519" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M284.432 247.568L284.004 221.881C316.359 221.335 340.356 211.735 355.308 193.336C382.408 159.996 372.893 108.183 372.786 107.659L398.013 102.831C398.505 105.432 409.797 167.017 375.237 209.53C355.276 234.093 324.719 246.894 284.432 247.568Z" fill="#8A6FE8"/>
<path d="M331.954 109.36L361.826 134.245C367.145 138.676 375.055 137.959 379.497 132.639C383.928 127.32 383.211 119.41 377.891 114.969L348.019 90.0842C342.7 85.6531 334.79 86.3702 330.348 91.6896C325.917 97.0197 326.634 104.929 331.954 109.36Z" fill="#8A6FE8"/>
<path d="M407.175 118.062L417.92 94.2263C420.735 87.858 417.856 80.4087 411.488 77.5831C405.12 74.7682 397.67 77.6473 394.845 84.0156L383.831 108.461L407.175 118.062Z" fill="#8A6FE8"/>
<path d="M401.363 105.175L401.234 69.117C401.181 62.1493 395.498 56.541 388.53 56.5945C381.562 56.648 375.954 62.3313 376.007 69.2989L376.018 96.11L401.363 105.175Z" fill="#8A6FE8"/>
<path d="M386.453 109.071L378.137 73.9548C376.543 67.169 369.757 62.9628 362.971 64.5575C356.185 66.1523 351.979 72.938 353.574 79.7237L362.04 115.482L386.453 109.071Z" fill="#8A6FE8"/>
<path d="M381.776 142.261C396.359 142.261 408.181 130.44 408.181 115.857C408.181 101.274 396.359 89.4527 381.776 89.4527C367.194 89.4527 355.372 101.274 355.372 115.857C355.372 130.44 367.194 142.261 381.776 142.261Z" fill="url(#paint0_radial)"/>
<path d="M248.267 406.979C248.513 384.727 245.345 339.561 222.376 301.736L199.922 315.372C220.76 349.675 222.323 389.715 221.841 407.182C221.798 408.627 235.263 409.933 248.267 406.979Z" fill="url(#paint1_linear)"/>
<path d="M221.841 406.936L242.637 406.84L262.052 518.065L220.311 518.258C217.132 518.269 214.724 515.711 214.938 512.532L221.841 406.936Z" fill="#522CD5"/>
<path d="M306.566 488.814C310.173 491.661 310.109 495.782 309.831 500.127L308.964 513.452C308.803 515.839 306.727 517.798 304.34 517.809L260.832 518.012C258.125 518.023 256.08 515.839 256.262 513.142L256.551 499.335C256.883 494.315 255.192 492.474 251.307 487.744C244.649 479.663 224.967 435.62 226.84 406.925L248.256 406.829C249.691 423.858 272.167 461.682 306.566 488.814Z" fill="url(#paint2_linear)"/>
<path d="M309.82 500.127C310.023 497.088 310.077 494.176 308.889 491.715L254.635 491.961C256.134 494.166 256.765 496.092 256.562 499.314L256.273 513.121C256.091 515.828 258.146 518.012 260.843 517.99L304.34 517.798C306.727 517.787 308.803 515.828 308.964 513.442L309.82 500.127Z" fill="url(#paint3_radial)"/>
<path d="M133.552 407.471C133.103 385.22 135.864 340.021 158.49 301.993L181.073 315.425C160.545 349.921 159.346 389.972 159.989 407.428C160.042 408.884 146.578 410.318 133.552 407.471Z" fill="url(#paint4_linear)"/>
<path d="M110.798 497.152C110.765 494.187 111.204 491.575 112.457 487.23C131.882 434.132 133.52 407.364 133.52 407.364L159.999 407.246C159.999 407.246 161.819 433.512 181.716 486.427C183.289 490.195 183.471 493.641 183.674 496.831L183.792 513.816C183.803 516.374 181.716 518.483 179.158 518.494L177.873 518.504L116.781 518.782L115.496 518.793C112.927 518.804 110.83 516.728 110.819 514.159L110.798 497.152Z" fill="url(#paint5_linear)"/>
<path d="M110.798 497.152C110.798 496.67 110.808 496.199 110.83 495.739C110.969 494.262 111.643 492.603 114.875 492.582L180.207 492.282C182.561 492.367 183.343 494.176 183.589 495.311C183.621 495.814 183.664 496.328 183.696 496.82L183.813 513.806C183.824 515.411 183.011 516.824 181.769 517.669C181.031 518.172 180.132 518.472 179.179 518.483L177.895 518.494L116.802 518.772L115.528 518.782C114.244 518.793 113.077 518.269 112.232 517.434C111.386 516.599 110.862 515.432 110.851 514.148L110.798 497.152Z" fill="url(#paint6_radial)"/>
<path d="M314.979 246.348C324.162 210.407 318.008 181.777 318.008 181.777L326.452 181.734L326.656 181.574C314.262 115.75 256.326 66.0987 186.949 66.4198C108.796 66.773 45.7233 130.424 46.0765 208.577C46.4297 286.731 110.08 349.803 188.234 349.45C249.905 349.172 302.178 309.474 321.304 254.343C321.872 251.999 321.797 247.804 314.979 246.348Z" fill="url(#paint7_radial)"/>
<path d="M310.237 279.035L65.877 280.148C71.3998 289.428 77.95 298.012 85.3672 305.761L290.972 304.829C298.336 297.005 304.8 288.368 310.237 279.035Z" fill="#D8CFF7"/>
<path d="M235.062 312.794L280.924 312.585L280.74 272.021L234.877 272.23L235.062 312.794Z" fill="#512BD4"/>
<path d="M243.001 297.626C242.691 297.626 242.434 297.53 242.22 297.327C242.006 297.123 241.899 296.866 241.899 296.588C241.899 296.299 242.006 296.042 242.22 295.839C242.434 295.625 242.691 295.528 243.001 295.528C243.312 295.528 243.568 295.635 243.782 295.839C243.996 296.042 244.114 296.299 244.114 296.588C244.114 296.877 244.007 297.123 243.793 297.327C243.568 297.519 243.312 297.626 243.001 297.626Z" fill="white"/>
<path d="M255.192 297.434H253.212L247.967 289.203C247.839 289 247.721 288.775 247.636 288.55H247.593C247.636 288.786 247.657 289.299 247.657 290.091L247.668 297.444H245.912L245.891 286.228H247.999L253.062 294.265C253.276 294.597 253.415 294.833 253.479 294.95H253.511C253.458 294.651 253.437 294.148 253.437 293.441L253.426 286.217H255.17L255.192 297.434Z" fill="white"/>
<path d="M263.733 297.412L257.589 297.423L257.568 286.206L263.465 286.195V287.779L259.387 287.79L259.398 290.969L263.155 290.958V292.532L259.398 292.542L259.409 295.86L263.733 295.85V297.412Z" fill="white"/>
<path d="M272.445 287.758L269.298 287.769L269.32 297.401H267.5L267.479 287.769L264.343 287.779V286.195L272.434 286.174L272.445 287.758Z" fill="white"/>
<path d="M315.279 246.337C324.355 210.836 318.457 182.483 318.308 181.798L171.484 182.462C171.484 182.462 162.226 181.563 162.268 190.018C162.311 198.463 162.761 222.341 162.878 248.746C162.9 254.172 167.363 256.773 170.863 256.751C170.874 256.751 311.618 252.213 315.279 246.337Z" fill="url(#paint8_radial)"/>
<path d="M227.685 246.798C227.685 246.798 250.183 228.827 254.571 225.499C258.959 222.17 262.812 221.977 266.869 225.445C270.925 228.913 293.616 246.498 293.616 246.498L227.685 246.798Z" fill="#A08BE8"/>
<path d="M320.748 256.141C320.748 256.141 324.943 248.414 315.279 246.348C315.289 246.305 170.927 246.894 170.927 246.894C167.566 246.905 163.232 244.925 162.846 241.671C162.857 244.004 162.878 246.369 162.889 248.756C162.91 253.68 166.582 256.27 169.878 256.698C170.21 256.73 170.542 256.773 170.874 256.773L180.742 256.73L320.748 256.141Z" fill="#512BD4"/>
<path d="M206.4 233.214C212.511 233.095 217.302 224.667 217.102 214.39C216.901 204.112 211.785 195.878 205.674 195.997C199.563 196.116 194.772 204.544 194.973 214.821C195.173 225.099 200.289 233.333 206.4 233.214Z" fill="#512BD4"/>
<path d="M306.249 214.267C306.356 203.989 301.488 195.605 295.377 195.541C289.266 195.478 284.225 203.758 284.118 214.037C284.011 224.315 288.878 232.699 294.99 232.763C301.101 232.826 306.142 224.545 306.249 214.267Z" fill="#512BD4"/>
<path d="M205.905 205.291C208.152 203.022 211.192 202.016 214.157 202.262C215.912 205.495 217.014 209.733 217.111 214.389C217.164 217.3 216.811 220.04 216.158 222.513C212.669 223.519 208.752 222.662 205.979 219.922C201.912 215.909 201.88 209.348 205.905 205.291Z" fill="#8065E0"/>
<path d="M294.996 204.285C297.255 202.016 300.294 200.999 303.259 201.256C305.164 204.628 306.309 209.209 306.256 214.239C306.224 216.808 305.892 219.259 305.303 221.485C301.793 222.523 297.843 221.678 295.061 218.916C291.004 214.892 290.972 208.342 294.996 204.285Z" fill="#8065E0"/>
<path d="M11.6342 357.017C10.9171 354.716 -5.72611 300.141 21.3204 258.903C36.9468 235.078 63.3083 221.035 99.6664 217.15L102.449 243.276C74.3431 246.273 54.4676 256.345 43.3579 273.202C23.0971 303.941 36.5722 348.733 36.7113 349.183L11.6342 357.017Z" fill="url(#paint9_linear)"/>
<path d="M95.1498 252.802C109.502 252.802 121.137 241.167 121.137 226.815C121.137 212.463 109.502 200.828 95.1498 200.828C80.7976 200.828 69.1628 212.463 69.1628 226.815C69.1628 241.167 80.7976 252.802 95.1498 252.802Z" fill="url(#paint10_radial)"/>
<path d="M72.0098 334.434L33.4683 329.307C26.597 328.397 20.2929 333.214 19.3725 340.085C18.4627 346.956 23.279 353.26 30.1504 354.181L68.6919 359.308C75.5632 360.217 81.8673 355.401 82.7878 348.53C83.6975 341.658 78.8705 335.344 72.0098 334.434Z" fill="#8A6FE8"/>
<path d="M3.73535 367.185L7.35297 393.076C8.36975 399.968 14.7702 404.731 21.6629 403.725C28.5556 402.708 33.3185 396.308 32.3124 389.415L28.5984 362.861L3.73535 367.185Z" fill="#8A6FE8"/>
<path d="M15.5194 374.988L34.849 405.427C38.6058 411.292 46.4082 413.005 52.2735 409.248C58.1387 405.491 59.8512 397.689 56.0945 391.823L41.7953 369.144L15.5194 374.988Z" fill="#8A6FE8"/>
<path d="M26.0511 363.739L51.8026 389.019C56.7688 393.911 64.7532 393.846 69.6445 388.88C74.5358 383.914 74.4715 375.929 69.516 371.038L43.2937 345.297L26.0511 363.739Z" fill="#8A6FE8"/>
<path d="M26.4043 381.912C40.987 381.912 52.8086 370.091 52.8086 355.508C52.8086 340.925 40.987 329.104 26.4043 329.104C11.8216 329.104 0 340.925 0 355.508C0 370.091 11.8216 381.912 26.4043 381.912Z" fill="url(#paint11_radial)"/>
<path d="M184.73 63.6308L157.819 66.5892L158.561 38.5412L177.888 36.4178L184.73 63.6308Z" fill="#8A6FE8"/>
<path d="M170.018 41.647C180.455 39.521 187.193 29.3363 185.067 18.8988C182.941 8.46126 172.757 1.72345 162.319 3.84944C151.882 5.97543 145.144 16.1601 147.27 26.5976C149.396 37.0351 159.58 43.773 170.018 41.647Z" fill="#D8CFF7"/>
<path d="M196.885 79.385C198.102 79.2464 198.948 78.091 198.684 76.8997C195.851 64.2818 183.923 55.5375 170.773 56.9926C157.622 58.4371 147.886 69.5735 147.865 82.4995C147.863 83.7232 148.949 84.6597 150.168 84.5316L196.885 79.385Z" fill="url(#paint12_radial)"/>
<defs>
<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(382.004 103.457) scale(26.4058)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<linearGradient id="paint1_linear" x1="214.439" y1="303.482" x2="236.702" y2="409.505" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="231.673" y1="404.144" x2="297.805" y2="522.048" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint3_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(280.957 469.555) rotate(-0.260742) scale(45.8326)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<linearGradient id="paint4_linear" x1="166.061" y1="303.491" x2="144.763" y2="409.709" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<linearGradient id="paint5_linear" x1="146.739" y1="407.302" x2="147.246" y2="518.627" gradientUnits="userSpaceOnUse">
<stop stop-color="#522CD5"/>
<stop offset="0.4397" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint6_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(148.63 470.023) rotate(179.739) scale(50.2476)">
<stop offset="0.034" stop-color="#522CD5"/>
<stop offset="0.9955" stop-color="#8A6FE8"/>
</radialGradient>
<radialGradient id="paint7_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(219.219 153.929) rotate(179.739) scale(140.935)">
<stop offset="0.4744" stop-color="#A08BE8"/>
<stop offset="0.8618" stop-color="#8065E0"/>
</radialGradient>
<radialGradient id="paint8_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(314.861 158.738) rotate(179.739) scale(146.053)">
<stop offset="0.0933" stop-color="#E1DFDD"/>
<stop offset="0.6573" stop-color="white"/>
</radialGradient>
<linearGradient id="paint9_linear" x1="54.1846" y1="217.159" x2="54.1846" y2="357.022" gradientUnits="userSpaceOnUse">
<stop offset="0.3344" stop-color="#9780E6"/>
<stop offset="0.8488" stop-color="#8A6FE8"/>
</linearGradient>
<radialGradient id="paint10_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.3494 218.071) rotate(-0.260742) scale(25.9924)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint11_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(25.805 345.043) scale(26.4106)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
<radialGradient id="paint12_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(169.113 67.3662) rotate(-32.2025) scale(21.0773)">
<stop stop-color="#8065E0"/>
<stop offset="1" stop-color="#512BD4"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

@ -0,0 +1,15 @@
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories). Deployment of the asset to your application
is automatically handled by the following `MauiAsset` Build Action within your `.csproj`.
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
These files will be deployed with you package and will be accessible using Essentials:
async Task LoadMauiAsset()
{
using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
using var reader = new StreamReader(stream);
var contents = reader.ReadToEnd();
}

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="456" height="456" viewBox="0 0 456 456" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="m 105.50037,281.60863 c -2.70293,0 -5.00091,-0.90042 -6.893127,-2.70209 -1.892214,-1.84778 -2.837901,-4.04181 -2.837901,-6.58209 0,-2.58722 0.945687,-4.80389 2.837901,-6.65167 1.892217,-1.84778 4.190197,-2.77167 6.893127,-2.77167 2.74819,0 5.06798,0.92389 6.96019,2.77167 1.93749,1.84778 2.90581,4.06445 2.90581,6.65167 0,2.54028 -0.96832,4.73431 -2.90581,6.58209 -1.89221,1.80167 -4.212,2.70209 -6.96019,2.70209 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 213.56111,280.08446 H 195.99044 L 149.69953,207.0544 c -1.17121,-1.84778 -2.14037,-3.76515 -2.90581,-5.75126 h -0.40578 c 0.36051,2.12528 0.54076,6.67515 0.54076,13.6496 v 65.13172 h -15.54349 v -99.36009 h 18.71925 l 44.7374,71.29798 c 1.89222,2.95695 3.1087,4.98917 3.64945,6.09751 h 0.26996 c -0.45021,-2.6325 -0.67573,-7.09015 -0.67573,-13.37293 v -64.02256 h 15.47557 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="m 289.25134,280.08446 h -54.40052 v -99.36009 h 52.23835 v 13.99669 h -36.15411 v 28.13085 h 33.31621 v 13.9271 h -33.31621 v 29.37835 h 38.31628 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
<path d="M 366.56466,194.72106 H 338.7222 v 85.3634 h -16.08423 v -85.3634 h -27.77455 v -13.99669 h 71.70124 z" style="fill:#ffffff;fill-rule:nonzero;stroke-width:0.838376" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Color x:Key="Primary">#ff9d5e</Color>
<Color x:Key="Secondary">#402e32</Color>
<Color x:Key="Error">#FF5349</Color>
<Color x:Key="Tertiary">#2B0B98</Color>
<Color x:Key="White">#faf5f0</Color>
<Color x:Key="Black">Black</Color>
<Color x:Key="Gray100">#E1E1E1</Color>
<Color x:Key="Gray200">#C8C8C8</Color>
<Color x:Key="Gray300">#ACACAC</Color>
<Color x:Key="Gray400">#919191</Color>
<Color x:Key="Gray500">#6E6E6E</Color>
<Color x:Key="Gray600">#404040</Color>
<Color x:Key="Gray900">#212121</Color>
<Color x:Key="Gray950">#141414</Color>
<SolidColorBrush x:Key="PrimaryBrush" Color="{StaticResource Primary}"/>
<SolidColorBrush x:Key="SecondaryBrush" Color="{StaticResource Secondary}"/>
<SolidColorBrush x:Key="TertiaryBrush" Color="{StaticResource Tertiary}"/>
<SolidColorBrush x:Key="WhiteBrush" Color="{StaticResource White}"/>
<SolidColorBrush x:Key="BlackBrush" Color="{StaticResource Black}"/>
<SolidColorBrush x:Key="Gray100Brush" Color="{StaticResource Gray100}"/>
<SolidColorBrush x:Key="Gray200Brush" Color="{StaticResource Gray200}"/>
<SolidColorBrush x:Key="Gray300Brush" Color="{StaticResource Gray300}"/>
<SolidColorBrush x:Key="Gray400Brush" Color="{StaticResource Gray400}"/>
<SolidColorBrush x:Key="Gray500Brush" Color="{StaticResource Gray500}"/>
<SolidColorBrush x:Key="Gray600Brush" Color="{StaticResource Gray600}"/>
<SolidColorBrush x:Key="Gray900Brush" Color="{StaticResource Gray900}"/>
<SolidColorBrush x:Key="Gray950Brush" Color="{StaticResource Gray950}"/>
<Color x:Key="Yellow100Accent">#F7B548</Color>
<Color x:Key="Yellow200Accent">#FFD590</Color>
<Color x:Key="Yellow300Accent">#FFE5B9</Color>
<Color x:Key="Cyan100Accent">#28C2D1</Color>
<Color x:Key="Cyan200Accent">#7BDDEF</Color>
<Color x:Key="Cyan300Accent">#C3F2F4</Color>
<Color x:Key="Blue100Accent">#3E8EED</Color>
<Color x:Key="Blue200Accent">#72ACF1</Color>
<Color x:Key="Blue300Accent">#A7CBF6</Color>
</ResourceDictionary>

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xaml-comp compile="true" ?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
<Style TargetType="Border">
<Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Primary}}" />
<Setter Property="StrokeShape" Value="Rectangle"/>
<Setter Property="StrokeThickness" Value="2"/>
<Setter Property="Background" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Primary}}"/>
<Setter Property="Padding" Value="15"/>
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Primary}}" />
<Setter Property="FontFamily" Value="Raleway"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="10"/>
<Setter Property="MinimumHeightRequest" Value="40"/>
<Setter Property="MinimumWidthRequest" Value="40"/>
<Setter Property="Margin" Value="0,10,0,10"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="DatePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="Raleway"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="40"/>
<Setter Property="MinimumWidthRequest" Value="40"/>
<Setter Property="MinimumDate" Value="01/01/2000"/>
<Setter Property="HorizontalOptions" Value="End"/>
<Setter Property="Grid.Column" Value="1"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Primary}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Entry">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="Raleway"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="MinimumHeightRequest" Value="40"/>
<Setter Property="MinimumWidthRequest" Value="40"/>
<Setter Property="HorizontalOptions" Value="End"/>
<Setter Property="Grid.Column" Value="1"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Primary}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Frame">
<Setter Property="HasShadow" Value="False" />
<Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Primary}}" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="HeightRequest" Value="60"/>
<Setter Property="WidthRequest" Value="60"/>
<Setter Property="Padding" Value="0"/>
</Style>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="DMSerifDisplay" />
<Setter Property="FontSize" Value="14" />
<Setter Property="FontAttributes" Value="Bold"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource White}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Picker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="Raleway"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="MinimumHeightRequest" Value="40"/>
<Setter Property="MinimumWidthRequest" Value="40"/>
<Setter Property="HorizontalOptions" Value="End"/>
<Setter Property="Grid.Column" Value="1"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Primary}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Page" ApplyToDerivedTypes="True">
<Setter Property="Padding" Value="0"/>
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Secondary}}" />
</Style>
<Style TargetType="ScrollView">
<Setter Property="Margin" Value="40"/>
</Style>
<Style TargetType="Shell" ApplyToDerivedTypes="True">
<Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Primary}}" />
<Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Secondary}}" />
<Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Secondary}}" />
<Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Primary}}" />
</Style>
</ResourceDictionary>

@ -0,0 +1,338 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Views.View_DetailAnimal">
<VerticalStackLayout>
<!-- Pet image -->
<Image Source="{Binding Image}"
MaximumWidthRequest="300"
HorizontalOptions="Center"/>
<!-- To add or change the image -->
<Button Text="Ajouter photo"
VerticalOptions="Center"
HorizontalOptions="End"
Clicked="TakePhoto"/>
<!-- Display and change pet name -->
<HorizontalStackLayout HorizontalOptions="Center">
<Label Text="Nom"
VerticalOptions="Center"/>
<Entry Text="{Binding Nom}"
Margin="20,0,0,0">
<!-- To change the background if there is a name -->
<Entry.Triggers>
<DataTrigger TargetType="Entry"
Binding="{Binding NomIsValid}"
Value="false">
<Setter Property="BackgroundColor" Value="{StaticResource Error}" />
</DataTrigger>
<DataTrigger TargetType="Entry"
Binding="{Binding NomIsValid}"
Value="true">
<Setter Property="BackgroundColor" Value="Transparent" />
</DataTrigger>
</Entry.Triggers>
</Entry>
</HorizontalStackLayout>
<Border VerticalOptions="Start"
Grid.Column="1"
Margin="0, 10, 0, 10">
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *"
RowSpacing="8">
<!-- Display and change date of birth -->
<Label Text="Date de naissance"/>
<DatePicker Date="{Binding DateNaissance}"/>
<!-- Display and change gender -->
<Label Grid.Row="1"
Text="Sexe"/>
<Picker Grid.Row="1"
SelectedItem="{Binding Sexe}"
SelectedIndexChanged="SexeClick">
<Picker.Items>
<x:String>Femelle</x:String>
<x:String>Male</x:String>
</Picker.Items>
</Picker>
<!-- Display and change date of adoption -->
<Label Grid.Row="2"
Text="Date d'adoption"/>
<DatePicker Grid.Row="2"
Date="{Binding DateAdoption}"/>
<!-- Display and change size -->
<Label Grid.Row="3"
Text="Taille"/>
<HorizontalStackLayout Grid.Column="1"
Grid.Row="3"
HorizontalOptions="End">
<Entry Text="{Binding Taille}"/>
<Label Text=" cm"
VerticalOptions="Center"
FontFamily="Raleway"
FontAttributes="None"/>
</HorizontalStackLayout>
<!-- Display and change weight -->
<Label Grid.Row="4"
Text="Poids"/>
<HorizontalStackLayout Grid.Column="2"
Grid.Row="4"
HorizontalOptions="End">
<Entry Text="{Binding Poids}"/>
<Label Text=" kg"
VerticalOptions="Center"
FontFamily="Raleway"
FontAttributes="None"/>
</HorizontalStackLayout>
<!-- Display and change power supply -->
<Label Grid.Row="5"
Text="Alimentation"/>
<Entry Grid.Row="5"
Text="{Binding Alimentation}"/>
<!-- Display and change species -->
<Label Grid.Row="6"
Text="Espèce"/>
<Grid Grid.Row="6"
Grid.Column="1"
ColumnDefinitions="*"
RowDefinitions="Auto, Auto">
<Label Text="{Binding Espece}"
VerticalOptions="Start"
HorizontalOptions="End"
FontFamily="Raleway"
FontAttributes="None"/>
<Picker x:Name="Picker_especes"
Grid.Row="1"
ItemsSource="{Binding ListeEspeces}"
ItemDisplayBinding="{Binding Nom}"
SelectedIndexChanged="EspeceClic">
</Picker>
</Grid>
<!-- Display and change breed -->
<Label Grid.Row="7"
Text="Race"/>
<Grid Grid.Row="7"
Grid.Column="1"
ColumnDefinitions="*"
RowDefinitions="Auto, Auto">
<Label Text="{Binding Race}"
VerticalOptions="Start"
HorizontalOptions="End"
FontFamily="Raleway"
FontAttributes="None"/>
<Picker Grid.Row="1"
ItemsSource="{Binding Espece.ListeRaces}"
ItemDisplayBinding="{Binding Nom}"
SelectedIndexChanged="RaceClic">
</Picker>
</Grid>
</Grid>
</Border>
<!-- Display and change petsitter -->
<VerticalStackLayout Margin="0, 10, 0, 10">
<Label Text="Petsitter"
FontSize="Large"/>
<Border>
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *">
<!-- Display and change petsitter's name -->
<Label Text="Nom"/>
<Entry Text="{Binding Petsitter.Nom}"/>
<!-- Display and change petsitter's address -->
<Label Grid.Row="1"
Text="Adresse"/>
<Entry Grid.Row="1"
Text="{Binding Petsitter.Adresse}"/>
<!-- Display and change petsitter's zip code -->
<Label Grid.Row="2"
Text="Code postal"/>
<Entry Grid.Row="2"
Text="{Binding Petsitter.CodePostal}"/>
<!-- Display and change petsitter's city -->
<Label Grid.Row="3"
Text="Ville"/>
<Entry Grid.Row="3"
Text="{Binding Petsitter.Ville}"/>
<!-- Display and change petsitter's phone number -->
<Label Grid.Row="4"
Text="Numéro de téléphone"/>
<Entry Grid.Row="4"
Text="{Binding Petsitter.NumTel}"/>
</Grid>
</Border>
</VerticalStackLayout>
<!-- Display and change kennel -->
<VerticalStackLayout Margin="0, 10, 0, 10">
<Label Text="Chenil"
FontSize="Large"/>
<Border>
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *">
<!-- Display and change kennel's name -->
<Label Text="Nom"/>
<Entry Text="{Binding Chenil.Nom}"/>
<!-- Display and change kennel's address -->
<Label Grid.Row="1"
Text="Adresse"/>
<Entry Grid.Row="1"
Text="{Binding Chenil.Adresse}"/>
<!-- Display and change kennel's zip code -->
<Label Grid.Row="2"
Text="Code postal"/>
<Entry Grid.Row="2"
Text="{Binding Chenil.CodePostal}"/>
<!-- Display and change kennel's city -->
<Label Grid.Row="3"
Text="Ville"/>
<Entry Grid.Row="3"
Text="{Binding Chenil.Ville}"/>
<!-- Display and change kennel's phone number -->
<Label Grid.Row="4"
Text="Numéro de téléphone"/>
<Entry Grid.Row="4"
Text="{Binding Chenil.NumTel}"/>
</Grid>
</Border>
</VerticalStackLayout>
<!-- Display and change veterinarian -->
<VerticalStackLayout Margin="0, 10, 0, 10">
<Label Text="Vétérinaire"
FontSize="Large"/>
<Border>
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *">
<!-- Display and change vet's name -->
<Label Text="Nom"/>
<Entry Text="{Binding Veterinaire.Nom}"/>
<!-- Display and change vet's clinic -->
<Label Grid.Row="1"
Text="Clinique"/>
<Entry Grid.Row="1"
Text="{Binding Veterinaire.Clinique}"/>
<!-- Display and change vet's address -->
<Label Grid.Row="2"
Text="Adresse"/>
<Entry Grid.Row="2"
Text="{Binding Veterinaire.Adresse}"/>
<!-- Display and change vet's zip code -->
<Label Grid.Row="3"
Text="Code postal"/>
<Entry Grid.Row="3"
Text="{Binding Veterinaire.CodePostal}"/>
<!-- Display and change vet's city -->
<Label Grid.Row="4"
Text="Ville"/>
<Entry Grid.Row="4"
Text="{Binding Veterinaire.Ville}"/>
<!-- Display and change vet's phone number -->
<Label Grid.Row="5"
Text="Numéro de téléphone"/>
<Entry Grid.Row="5"
Text="{Binding Veterinaire.NumTel}"/>
</Grid>
</Border>
</VerticalStackLayout>
<!-- Display and change food store -->
<VerticalStackLayout Margin="0, 10, 0, 10">
<Label Text="Magasin alimentaire"
FontSize="Large"/>
<Border>
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *">
<!-- Display and change food store name -->
<Label Text="Nom"/>
<Entry Text="{Binding MagasinAlimentaire.Nom}"/>
<!-- Display and change food store address -->
<Label Grid.Row="1"
Text="Adresse"/>
<Entry Text="{Binding MagasinAlimentaire.Adresse}"/>
<!-- Display and change food store zip code -->
<Label Grid.Row="2"
Text="Code postal"/>
<Entry Grid.Row="2"
Text="{Binding MagasinAlimentaire.CodePostal}"/>
<!-- Display and change food store city -->
<Label Grid.Row="3"
Text="Ville"/>
<Entry Grid.Row="3"
Text="{Binding MagasinAlimentaire.Ville}"/>
<!-- Display and change food store phone number -->
<Label Grid.Row="4"
Text="Numéro de téléphone"/>
<Entry Grid.Row="4"
Text="{Binding MagasinAlimentaire.NumTel}"/>
</Grid>
</Border>
</VerticalStackLayout>
<!-- Display and change provenance -->
<VerticalStackLayout Margin="0, 10, 0, 10">
<Label Text="Refuge, élevage, chenil de provenance"
FontSize="Large"/>
<Border>
<Grid RowDefinitions="Auto, Auto, Auto, Auto, Auto"
ColumnDefinitions="*, *">
<!-- Display and change provenance's name -->
<Label Text="Nom"/>
<Entry Text="{Binding Provenance.Nom}"/>
<!-- Display and change provenance's address -->
<Label Grid.Row="1"
Text="Adresse"/>
<Entry Grid.Row="1"
Text="{Binding Provenance.Adresse}"/>
<!-- Display and change provenance's zip code -->
<Label Grid.Row="2"
Text="Code postal"/>
<Entry Grid.Row="2"
Text="{Binding Provenance.CodePostal}"/>
<!-- Display and change provenance's city -->
<Label Grid.Row="3"
Text="Ville"/>
<Entry Grid.Row="3"
Text="{Binding Provenance.Ville}"/>
<!-- Display and change provenance's phone number -->
<Label Grid.Row="4"
Text="Numéro de téléphone"/>
<Entry Grid.Row="4"
Text="{Binding Provenance.NumTel}"/>
</Grid>
</Border>
</VerticalStackLayout>
</VerticalStackLayout>
</ContentView>

@ -0,0 +1,88 @@
/*!
* \file View_DetailAnimal.xmal.cs
* \author Léana Besson
*/
using Model;
/*!
* \namespace Views
*/
namespace Views;
/*!
* \class View-DetailAnimal
* \brief Regroups functions for View_DetailAnimal page operation
*/
public partial class View_DetailAnimal : ContentView
{
/*!
* \fn View_DetailAnimal()
* \brief View_DetailAnimal page constructor with component initialization and context binding assignment
*/
public View_DetailAnimal()
{
InitializeComponent();
Picker_especes.BindingContext = (App.Current as App).Theque;
}
/*!
* \fn EspeceClic(object sender, EventArgs e)
* \brief Changes the species of the selected pet and makes the race null
* \param sender object - Event emitter information, namely the View_DetailAnimal.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
private void EspeceClic(object sender, EventArgs e)
{
(App.Current as App).AnimalSelectionner.Espece = (sender as Picker).SelectedItem as Espece;
(App.Current as App).AnimalSelectionner.Race = null;
}
/*!
* \fn RaceClic(object sender, EventArgs e)
* \brief Modifies the breed of the selected pet
* \param sender object - Event emitter information, namely the View_DetailAnimal.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
private void RaceClic(object sender, EventArgs e)
{
(App.Current as App).AnimalSelectionner.Race = (sender as Picker).SelectedItem as Race;
}
/*!
* \fn SexeClick(object sender, EventArgs e)
* \brief Modifies the gender of the selected pet
* \param sender object - Event emitter information, namely the View_DetailAnimal.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
private void SexeClick(object sender, EventArgs e)
{
(App.Current as App).AnimalSelectionner.Sexe = (sender as Picker).SelectedItem as string;
}
/*!
* \fn TakePhoto(object sender, EventArgs e)
* \brief Opens photo picker, loads photo into AppDataDirectory file and changes image of selected pet
* \param sender object - Event emitter information, namely the View_DetailAnimal.xaml page
* \param e EventArgs - Information related to the clicked button event
*/
public async void TakePhoto(object sender, EventArgs e)
{
if (MediaPicker.Default.IsCaptureSupported)
{
FileResult photo = await MediaPicker.Default.PickPhotoAsync();
if (photo != null)
{
string localFilePath = Path.Combine(FileSystem.AppDataDirectory, photo.FileName);
using Stream sourceStream = await photo.OpenReadAsync();
using FileStream localFileStream = File.OpenWrite(localFilePath);
await sourceStream.CopyToAsync(localFileStream);
(App.Current as App).AnimalSelectionner.Image = Path.Combine(FileSystem.AppDataDirectory, photo.FileName);
}
}
}
}

@ -0,0 +1,94 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
<!-- <TargetFrameworks>$(TargetFrameworks);net7.0-tizen</TargetFrameworks> -->
<OutputType>Exe</OutputType>
<RootNamespace>Views</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<!-- Display name -->
<ApplicationTitle>Views</ApplicationTitle>
<!-- App Identifier -->
<ApplicationId>com.companyname.views</ApplicationId>
<ApplicationIdGuid>89315e73-85a7-4786-8542-6423c34898ac</ApplicationIdGuid>
<!-- Versions -->
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">11.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">13.1</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
</PropertyGroup>
<ItemGroup>
<!-- App Icon -->
<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />
<!-- Splash Screen -->
<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />
<!-- Images -->
<MauiImage Include="Resources\Images\*" />
<MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />
<!-- Custom Fonts -->
<MauiFont Include="Resources\Fonts\*" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Maui" Version="5.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\Persistance\Persistance.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Especes.xaml.cs">
<DependentUpon>Especes.xaml</DependentUpon>
</Compile>
<Compile Update="Animaux.xaml.cs">
<DependentUpon>Animaux.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<MauiXaml Update="DetailAnimal.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="DetailEspece.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="DetailRace.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="Espece.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="Especes.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="Animaux.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="View_DetailAnimal.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
</ItemGroup>
</Project>

@ -0,0 +1,128 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33424.131
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console", "Console\Console.csproj", "{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Model", "Model\Model.csproj", "{83309215-075B-406F-A72E-45E40AD47E43}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Views", "Views\Views.csproj", "{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}"
ProjectSection(ProjectDependencies) = postProject
{83309215-075B-406F-A72E-45E40AD47E43} = {83309215-075B-406F-A72E-45E40AD47E43}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Persistance", "Persistance\Persistance.csproj", "{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|ARM.ActiveCfg = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|ARM.Build.0 = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|ARM64.Build.0 = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|x64.ActiveCfg = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|x64.Build.0 = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|x86.ActiveCfg = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|x86.Build.0 = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|Any CPU.Build.0 = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|ARM.ActiveCfg = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|ARM.Build.0 = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|ARM64.ActiveCfg = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|ARM64.Build.0 = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|x64.ActiveCfg = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|x64.Build.0 = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|x86.ActiveCfg = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|x86.Build.0 = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|ARM.ActiveCfg = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|ARM.Build.0 = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|ARM64.Build.0 = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|x64.ActiveCfg = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|x64.Build.0 = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|x86.ActiveCfg = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|x86.Build.0 = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|Any CPU.Build.0 = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|ARM.ActiveCfg = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|ARM.Build.0 = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|ARM64.ActiveCfg = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|ARM64.Build.0 = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|x64.ActiveCfg = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|x64.Build.0 = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|x86.ActiveCfg = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|x86.Build.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|ARM.ActiveCfg = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|ARM.Build.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|ARM.Deploy.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|ARM64.Build.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|ARM64.Deploy.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|x64.ActiveCfg = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|x64.Build.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|x64.Deploy.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|x86.ActiveCfg = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|x86.Build.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Debug|x86.Deploy.0 = Debug|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|Any CPU.Build.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|Any CPU.Deploy.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|ARM.ActiveCfg = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|ARM.Build.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|ARM.Deploy.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|ARM64.ActiveCfg = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|ARM64.Build.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|ARM64.Deploy.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|x64.ActiveCfg = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|x64.Build.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|x64.Deploy.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|x86.ActiveCfg = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|x86.Build.0 = Release|Any CPU
{6FB34AC9-C9A0-4223-96A0-C8D3D7C3242F}.Release|x86.Deploy.0 = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|ARM.ActiveCfg = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|ARM.Build.0 = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|ARM64.ActiveCfg = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|ARM64.Build.0 = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|x64.ActiveCfg = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|x64.Build.0 = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|x86.ActiveCfg = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Debug|x86.Build.0 = Debug|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|Any CPU.Build.0 = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|ARM.ActiveCfg = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|ARM.Build.0 = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|ARM64.ActiveCfg = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|ARM64.Build.0 = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|x64.ActiveCfg = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|x64.Build.0 = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|x86.ActiveCfg = Release|Any CPU
{E056C06A-C2FF-40FE-A8B2-CE581F415BB6}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B8A5349C-3C89-45FC-94B1-9702CDFE90DF}
EndGlobalSection
EndGlobal

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33424.131
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console", "Console\Console.csproj", "{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Model", "Model\Model.csproj", "{83309215-075B-406F-A72E-45E40AD47E43}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{66D1B4E7-A14F-4DCE-89D1-31CC53E5F3B9}.Release|Any CPU.Build.0 = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83309215-075B-406F-A72E-45E40AD47E43}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B8A5349C-3C89-45FC-94B1-9702CDFE90DF}
EndGlobalSection
EndGlobal
Loading…
Cancel
Save