Merge pull request 'ajout code dans master' (#8) from code into master

Reviewed-on: #8
master
Vivien DUFOUR 2 years ago
commit 83411e1e4b

Binary file not shown.

@ -1 +0,0 @@
<mxfile host="Electron" modified="2023-04-07T14:25:18.855Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.10 Chrome/106.0.5249.199 Electron/21.3.5 Safari/537.36" etag="EKfUrMKp8IX080VhHC3_" version="20.8.10" type="device"><diagram id="dKqOANvqvkoLY0ukcHwj" name="Page-1">7VtZc+I4EP41PGbKJ8cjRzIztcluarMzm+ybsIVRRrYoWQ4wv34l37LEEQKYVPECVkvG8tf9dbdaomOPw9VXChbzB+JD3LEMf9WxJx3LMg3X4F9Css4kXcvMBAFFfj6oEjyh37C4M5cmyIexNJARghlayEKPRBH0mCQDlJKlPGxGsPzUBQigInjyAFal/yKfzTNp3+pV8m8QBfPiyWZ3kPWEoBicv0k8Bz5Z1kT2bcceU0JYdhWuxhAL8ApcsvvuNvSWE6MwYvvccOv86BoPD9MpnYa/w9vo/q+5d+Pa2c+8AZzkb5zPlq0LCJZzxODTAniiveRq7tijOQsxb5n8EsSLDPgZWkH+rNEMYTwmmFAu8+EMJJj3jtTp5m/wBimDq5oon/5XSELI6JoPWck2sawpopDNa0oohSBXflD+VIUPv8ghegdcpqmgA31uL3mTUDYnAYkAvq2kI0qSyBfITAzeqsbcE7LIMXyFjK1z4wcJIzLCHDG6fs7vTxsvovHFLZqTVb1zss5bGyFngAaQbXvPHEDxcls1QyEGDL3JZNHBnt/6SBCfS6nRQf6c3DlY/YbiYpJQD+Y3VbobUgrWtWELMSDe/BjL0T/nbs/xZs9omE42g8qQSkgOty1HZd4F2xaM/KFwr7zpYRDHyMuEdwgXP324+dlX85PGO+7pzc+9ml/p/XpX86uNt80zmF+RDFR5yA+GMIoBgwlVLJPnUgtxmYR46DGRaYxEGoF43nYPphA/khgxRCI+ZEoYI2FtwBCjQHQw0khkSMIwiuC4zCS3xtD90xa3Ab+rpjG2JovpniqJcU6b8kUkgkfK9xrI2SpwrqVBrhQeP/8zFOx+EsTt08B8kZK+LksNTzR8FC9IhKZpV9O1YsxXMAKnHVCfBlm7a8kJjqNCaxrOGY3StFsJPyvEnquAw1svtZ4q9ohGFXqKkFVFqRcpSOlDlg/ieTrXrcEp8/nbgLL2jWJHT6I+pmBLoc4/FEHVt7dNjZ4jUUPjrfs6n3MyYvQU3J46Y7szHGDug5EIVsL/JPz9a/7n0lEtc5+2YC2rMhfgb4yD/I25w9/skSIfyyUN9nVJR0+sP0atgUKtexB5MIvn6ZtHIo6LSwwumV5uM2Xvq/QanJVe7awmC3rVyVVSbQe9zM6xV6BHoleL69aP2YC6ptsrchl+wj/CdOgwFJ0eCRdiRadbCrbOPFcObBrmmboide9k1HOvke1o1LM/KfXUbR05smXsGjBKIiIodlmksvry8tTRLE/Pmy322uSU2TkgnB1eUJ1i4v2SGLW1ELabRN19SWRdFom6ConyFauAgX9+j2JGkxCmxVPxLMuYoNkMeWLHM+VXKf+ThJdGMrNRfnasL64aurSVSfdEiLvtbK/qaHYAyXaFLSkmfWQDYzfj+p80bPUVxg1fScJSzpEknQdDNG36acF1Bt4IRRdXX7WMxnqsp6uvnrPob++oXF8okErdyFKB7LlnzARs3e5JF4QCjfycS70FV4yTOi6FgTQkqA7G1CDn0DAZWx5myC/YQFcDOMi3tjwOOKxvihV7XiHyfbxJmbIjPYbyjIHMAk0ttashgX0y5akR/aq8DcpzGumBrdl9O6/y1OBwVd4m5jUPMBlqandW5TlX5h2sPLvftvLUOvlVeZvcZk9WnnVG5bkTdvNsBMH4dZT8F/0BHm+Wd8Vpj89aiH/Xomqj/uorJi1K+5bYi8La+RdM26ZdI+bfWeEhwFWtj8FwQVQraDexdxpne5wzbghroWz3/MmHefKu0yfHKj5ogbQ+J5Wsfah02WVzx5HXW47RMqfca95waNLnmC3nDdeE/XDdaWLZkXTHm9U/xrKz19X/7uzb/wE=</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

@ -1,7 +0,0 @@
Pierre : https://www.hubspot.fr/make-my-persona?persona=-NRsDth3GptLpLd2KlRq
Baptiste : https://www.hubspot.fr/make-my-persona?persona=-NRxkXdvCS2jHr7u5PJz
Corrine : https://www.hubspot.fr/make-my-persona?persona=-NRsEXWJlPfCnBdUqmJl
User Story Pierre : https://www.canva.com/design/DAFe4DrRK-0/4eT5Hl9yj_U46cMt-TdlZw/edit?utm_content=DAFe4DrRK-0&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
User Story Baptiste : https://www.canva.com/design/DAFe4JlhJTA/b1-Dk9lBY3hDeMsNbxcmNA/edit?utm_content=DAFe4JlhJTA&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
User Story Corrine : https://www.canva.com/design/DAFe4IVvv84/H-k_-bL1TaoNv2XO7z2XOg/edit?utm_content=DAFe4IVvv84&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton

@ -0,0 +1,27 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31611.283
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MusiLib", "MusiLib\MusiLib.csproj", "{0990C3B0-336B-4149-A13E-1E10F136A8A8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0990C3B0-336B-4149-A13E-1E10F136A8A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0990C3B0-336B-4149-A13E-1E10F136A8A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0990C3B0-336B-4149-A13E-1E10F136A8A8}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{0990C3B0-336B-4149-A13E-1E10F136A8A8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0990C3B0-336B-4149-A13E-1E10F136A8A8}.Release|Any CPU.Build.0 = Release|Any CPU
{0990C3B0-336B-4149-A13E-1E10F136A8A8}.Release|Any CPU.Deploy.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {61F7FB11-1E47-470C-91E2-47F8143E1572}
EndGlobalSection
EndGlobal

@ -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:MusiLib"
x:Class="MusiLib.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,39 @@
using MusiLib.Model;
namespace MusiLib;
public partial class App : Application
{
public Manager MyManager { get; private set; } = new Manager(new Stub.Stub());
public string FileNameFU { get; set; } = "favorisUtilisateurs.xml";
public string FileNameP { get; set; } = "partitions.xml";
public string FilePath { get; set; } = FileSystem.AppDataDirectory;
public App()
{
InitializeComponent();
string favorisUtilisateursFilePath = Path.Combine(FilePath, FileNameFU);
string partitionsFilePath = Path.Combine(FilePath, FileNameP);
/*Si les fichiers existent déjà, on récupère la persistance car on a donc des favoris à récupérer*/
if (File.Exists(partitionsFilePath) && File.Exists(favorisUtilisateursFilePath))
{
MyManager = new Manager(new DataContractPersistance.DataContractPers());
}
MyManager.chargeDonnees();
MainPage = new AppShell();
if (!File.Exists(partitionsFilePath) && !File.Exists(favorisUtilisateursFilePath))
{
MyManager.Persistance = new DataContractPersistance.DataContractPers();
}
MyManager.sauvegardeDonnees();
}
}

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="MusiLib.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MusiLib"
xmlns:views="clr-namespace:MusiLib.Views"
Shell.FlyoutBehavior="Disabled">
<TabBar>
<ShellContent
Title="Accueil"
ContentTemplate="{DataTemplate views:Accueil}"
Route="Accueil" />
</TabBar>
</Shell>

@ -0,0 +1,9 @@
namespace MusiLib;
public partial class AppShell : Shell
{
public AppShell()
{
InitializeComponent();
}
}

@ -0,0 +1,142 @@
using Microsoft.Maui.Controls.PlatformConfiguration;
using MusiLib.Model;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace MusiLib.DataContractPersistance
{
public class DataContractPers : IPersistanceManager
{
public string FilePath { get; set; } = FileSystem.AppDataDirectory; /* FileSystem.AppDataDirectory permet de renvoyez le chemin d'accès au répertoire spécifique de donnée
* ou l'application peut stocker des fichiers ou des données persistantes*/
public string FileNameFU { get; set; } = "favorisUtilisateurs.xml"; /* déclaration des noms des fichiers stockés pour la persistance*/
public string FileNameP { get; set; } = "partitions.xml";
public (List<Partition>, List<Partition>) chargeDonnees() /*Méthode permettant de charger les données*/
{
var partitionsSerializer = new DataContractSerializer(typeof(List<Partition>));
var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
List<Partition> partitions = new List<Partition>();
List<Partition> favoris = new List<Partition>();
using (Stream partitionsStream = File.OpenRead(Path.Combine(FilePath, "partitions.xml"))) /*Path.Combine permet de combiner plusieurs segments de chemin en une seule chaine de chemin*/
{
partitions = partitionsSerializer.ReadObject(partitionsStream) as List<Partition>; /*Serializer permet de convertir des objets */
}
using (Stream favorisUtilisateursStream = File.OpenRead(Path.Combine(FilePath, "favorisUtilisateurs.xml")))
{
DataToPersist data = favorisUtilisateursSerializer.ReadObject(favorisUtilisateursStream) as DataToPersist;
favoris = data.favoris;
}
return (partitions, favoris);
}
public void sauvegardeDonnees(List<Partition> p, List<Partition> f) /*Méthode permettant de sauvegarder les données*/
{
var partitionsSerializer = new DataContractSerializer(typeof(List<Partition>));
var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
if (!Directory.Exists(FilePath))
{
Debug.WriteLine("Directory créé à l'instant");
Debug.WriteLine(Directory.GetDirectoryRoot(FilePath));
Debug.WriteLine(FilePath);
Directory.CreateDirectory(FilePath);
}
using (Stream partitionsStream = File.Create(Path.Combine(FilePath, FileNameP)))
{
partitionsSerializer.WriteObject(partitionsStream, p);
}
DataToPersist data = new DataToPersist();
data.favoris = f;
using (Stream favorisUtilisateursStream = File.Create(Path.Combine(FilePath, FileNameFU)))
{
favorisUtilisateursSerializer.WriteObject(favorisUtilisateursStream, data);
}
}
public void sauvegardeFavoriAdd(Partition fav) /*Méthode permettant la sauvegarde de favoris*/
{
var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
if (!Directory.Exists(FilePath))
{
Debug.WriteLine("Directory créé à l'instant");
Debug.WriteLine(Directory.GetDirectoryRoot(FilePath));
Debug.WriteLine(FilePath);
Directory.CreateDirectory(FilePath);
}
List<Partition> favoris = new List<Partition>();
using (Stream favorisUtilisateursStream = File.OpenRead(Path.Combine(FilePath, FileNameFU)))
{
DataToPersist data = favorisUtilisateursSerializer.ReadObject(favorisUtilisateursStream) as DataToPersist;
if (data != null && data.favoris != null)
{
favoris = data.favoris;
}
}
favoris.Add(fav);
using (Stream favorisUtilisateursStream = File.Create(Path.Combine(FilePath, FileNameFU)))
{
DataToPersist data = new DataToPersist();
data.favoris = favoris;
favorisUtilisateursSerializer.WriteObject(favorisUtilisateursStream, data);
}
Debug.WriteLine("Nouveau favori sauvegardé !");
}
public void sauvegardeFavoriRemove(Partition fav) /*Méthode permettant la sauvegarde de suppression de favoris */
{
var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist));
if (!Directory.Exists(FilePath))
{
Debug.WriteLine("Directory créé à l'instant");
Debug.WriteLine(Directory.GetDirectoryRoot(FilePath));
Debug.WriteLine(FilePath);
Directory.CreateDirectory(FilePath);
}
List<Partition> favoris = new List<Partition>();
using (Stream favorisUtilisateursStream = File.OpenRead(Path.Combine(FilePath, FileNameFU)))
{
DataToPersist data = favorisUtilisateursSerializer.ReadObject(favorisUtilisateursStream) as DataToPersist;
if (data != null && data.favoris != null)
{
favoris = data.favoris;
}
}
favoris.RemoveAll(f => f.Nom == fav.Nom);
using (Stream favorisUtilisateursStream = File.Create(Path.Combine(FilePath, FileNameFU)))
{
DataToPersist data = new DataToPersist();
data.favoris = favoris;
favorisUtilisateursSerializer.WriteObject(favorisUtilisateursStream, data);
}
Debug.WriteLine("Favori supprimé de la sauvegarde !");
}
}
}

@ -0,0 +1,15 @@
using MusiLib.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MusiLib.DataContractPersistance
{
public class DataToPersist
{
public List<Partition> partitions { get; set; } = new List<Partition>();
public List<Partition> favoris { get; set; } = new List<Partition>();
}
}

@ -0,0 +1,24 @@
using MusiLib.Model;
using MusiLib.Views;
using Plugin.Maui.Audio;
namespace MusiLib;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
builder.Services.AddSingleton(AudioManager.Current);
return builder.Build();
}
}

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MusiLib.Model
{
public interface IPersistanceManager
{
(List<Partition>, List<Partition>) chargeDonnees();
/*déclaration de fonctions abstraites*/
void sauvegardeDonnees(List<Partition> p, List<Partition> f);
void sauvegardeFavoriAdd(Partition fav);
void sauvegardeFavoriRemove(Partition fav);
}
}

@ -0,0 +1,60 @@
using MusiLib.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MusiLib.Model
{
public class Manager
{
public IPersistanceManager Persistance { get; set; }
public List<Partition> partitions { get; private set; }
public List<Partition> favoris { get; private set; }
public Manager()
{
partitions = new List<Partition>();
favoris = new List<Partition>();
}
public Manager(IPersistanceManager persistance)
{
Persistance = persistance;
partitions = new List<Partition>();
favoris = new List<Partition>();
}
public void ajouterPartition(Partition partition)
{
partitions.Add(partition);
}
public void chargeDonnees()
{
var donnees = Persistance.chargeDonnees(); /*variable local, permet d'éviter la répétition d'un nom de type dans une déclaration de variable */
partitions.AddRange(donnees.Item1);
favoris.AddRange(donnees.Item2);
}
public void sauvegardeDonnees() /*Sauvegarde les partitions et favoris*/
{
Persistance.sauvegardeDonnees(partitions, favoris);
}
public void sauvegardeFavoriAdd(Partition fav) /*Sauvegarde des Favoris*/
{
Persistance.sauvegardeFavoriAdd(fav);
}
public void sauvegardeFavoriRemove(Partition fav) /*Suppression d'une partition contenu dans les Favoris*/
{
Persistance.sauvegardeFavoriRemove(fav);
}
}
}

@ -0,0 +1,68 @@
using Plugin.Maui.Audio;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Maui.Controls;
namespace MusiLib.Model
{
public class Metronome
{
public AudioPlayer player;
public bool isMusicPlaying;
public bool isMusicBeginning;
public Metronome()
{
player = DependencyService.Get<AudioPlayer>(); /* DependencyService = méthode utilisée pour obtenir une instance d'un service audio personnalisé.*/
isMusicPlaying = false;
}
public async Task Lancer(string cheminFichier)
{
var fichierAudio = (AudioPlayer)AudioManager.Current.CreatePlayer(await FileSystem.OpenAppPackageFileAsync(cheminFichier)); /*Créer un lecteur Audio à partir d'un fichier se trouvant dans le package de l'application*/
player = fichierAudio;
player.Play(); /*Méthode permettant de lancer la musique venant de Plugin.Maui.Audio */
isMusicPlaying=true;
isMusicBeginning =true;
}
public void PlayMusic() /*Méthode permettant de jouer/relancer la musique*/
{
player.Play();
isMusicPlaying = true;
}
public void PauseMusic() /*Méthode permettant la mise en pause de la musique*/
{
player.Pause();
isMusicPlaying = false;
}
public void StopMusic() /*Méthode permettant de stopper la lecture de la musique*/
{
if (isMusicBeginning)
{
player.Stop(); /*Méthode permettant de stopper la musique venant de Plugin.Maui.Audio*/
isMusicPlaying = false;
isMusicBeginning = false;
}
}
public void ReglerTempo(float tempo) /*Méthode permettant de regler la vitesse d'un objet de classe méttronome*/
{
if(!isMusicBeginning)
{
return;
}
if(!isMusicPlaying)
{
player.Speed = tempo; /*Méthode de Plugin.maui.Audio permettant de régler la vitesse d'un audio/vidéo*/
player.Pause();
return;
}
player.Speed = tempo;
}
}
}

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace MusiLib.Model
{
[DataContract]
public class Partition
{
[DataMember]
public static int idTotal = 0;
[DataMember]
public string Nom { get; private set; }
[DataMember]
public List<string> Image { get; private set; }
[DataMember]
public int IdPartition { get; private set; }
[DataMember]
public string Auteur { get; private set; }
[DataMember]
public string Complexite { get; private set; }
[DataMember]
public string Description { get; private set; }
[DataMember]
public string Instrument { get; private set; }
[DataMember]
public string Son { get; private set; }
public Partition(string nom, string auteur, string complexite, string description, string instrument, string son)
{
Nom = nom;
IdPartition = idTotal;
Auteur = auteur;
Complexite = complexite;
Description = description;
Instrument = instrument;
Image = new List<string>();
Son = son;
}
public void ajouterImage(string image)
{
Image.Add(image);
}
public void supprimerImage(string image)
{
Image.Remove(image);
}
}
}

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using MusiLib.Model;
namespace MusiLib.Model
{
public class Trier
{
private List<Partition> partitionsInitiales;
private List<Partition> partitionsFiltrees;
public Trier(List<Partition> partitions)
{
partitionsInitiales = partitions;
partitionsFiltrees = new List<Partition>(partitionsInitiales);
}
public List<Partition> TrierParInstrument(string instrument) /*Méthode permettant de trier les partitions par instrument*/
{
partitionsFiltrees = partitionsInitiales.Where(p => p.Instrument.ToLower() == instrument.ToLower()).ToList(); /*ToLower permet la convertion d'une chaine de caractères en minuscules*/
return partitionsFiltrees;
}
public List<Partition> TrierParComplexite(string complexite) /*Méthode permettant de trier les partitions par leur complexité (difficulté à les jouer)*/
{
partitionsFiltrees = partitionsInitiales.Where(p => p.Complexite.ToLower() == complexite.ToLower()).ToList();
Console.WriteLine("string : " + complexite);
foreach (Partition partition in partitionsInitiales)
{
Console.WriteLine(partition.Complexite);
}
return partitionsFiltrees;
}
public List<Partition> TrierParOrdreAlphabetique(string ordre) /*Méthode permetttant de trier les partitions par l'ordre alphabétique de leur Nom*/
{
if (ordre == "Croissant")
partitionsFiltrees = partitionsInitiales.OrderBy(p => p.Nom).ToList();
else if (ordre == "Décroissant")
partitionsFiltrees = partitionsInitiales.OrderByDescending(p => p.Nom).ToList();
return partitionsFiltrees;
}
}
}

@ -0,0 +1,65 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0-android;net6.0-ios;net6.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net6.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);net6.0-tizen</TargetFrameworks> -->
<OutputType>Exe</OutputType>
<RootNamespace>MusiLib</RootNamespace>
<UseMaui>true</UseMaui>
<SingleProject>true</SingleProject>
<ImplicitUsings>enable</ImplicitUsings>
<!-- Display name -->
<ApplicationTitle>MusiLib</ApplicationTitle>
<!-- App Identifier -->
<ApplicationId>fr.iut.musilib</ApplicationId>
<ApplicationIdGuid>c2deb312-b3f3-425c-8e4b-18b5328ffd7c</ApplicationIdGuid>
<!-- Versions -->
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
<ApplicationVersion>1</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">14.2</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">14.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">23.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.png" />
<!-- Splash Screen -->
<MauiSplashScreen Include="Resources\Splash\splash.png" 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>
<None Remove="Resources\Images\partition.png" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Plugin.Maui.Audio" Version="1.0.0" />
</ItemGroup>
<ItemGroup>
<Compile Update="Views\PartitionView.xaml.cs">
<DependentUpon>PartitionView.xaml</DependentUpon>
</Compile>
</ItemGroup>
</Project>

@ -0,0 +1,8 @@
<?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" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

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

@ -0,0 +1,15 @@
using Android.App;
using Android.Runtime;
namespace MusiLib;
[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,9 @@
using Foundation;
namespace MusiLib;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -0,0 +1,30 @@
<?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>
</dict>
</plist>

@ -0,0 +1,15 @@
using ObjCRuntime;
using UIKit;
namespace MusiLib;
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,16 @@
using System;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;
namespace MusiLib;
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="MusiLib.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="MusiLib.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:MusiLib.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 MusiLib.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="7A9D67B0-FF6A-4546-AA1E-E6121BBFFCCD" 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="MusiLib.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,9 @@
using Foundation;
namespace MusiLib;
[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}

@ -0,0 +1,32 @@
<?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>
</dict>
</plist>

@ -0,0 +1,15 @@
using ObjCRuntime;
using UIKit;
namespace MusiLib;
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
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

@ -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: 228 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: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 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: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

@ -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();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

@ -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,44 @@
<?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">#512BD4</Color>
<Color x:Key="Secondary">#DFD8F7</Color>
<Color x:Key="Tertiary">#2B0B98</Color>
<Color x:Key="White">White</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,384 @@
<?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="ActivityIndicator">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="IndicatorView">
<Setter Property="IndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}"/>
<Setter Property="SelectedIndicatorColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray100}}"/>
</Style>
<Style TargetType="Border">
<Setter Property="Stroke" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="StrokeShape" Value="Rectangle"/>
<Setter Property="StrokeThickness" Value="1"/>
</Style>
<Style TargetType="BoxView">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Button">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" />
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Padding" Value="14,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="CheckBox">
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Color" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="DatePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<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 Gray200}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Editor">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<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 Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Entry">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<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 Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Frame">
<Setter Property="HasShadow" Value="False" />
<Setter Property="BorderColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="CornerRadius" Value="8" />
</Style>
<Style TargetType="ImageButton">
<Setter Property="Opacity" Value="1" />
<Setter Property="BorderColor" Value="Transparent"/>
<Setter Property="BorderWidth" Value="0"/>
<Setter Property="CornerRadius" Value="0"/>
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="Opacity" Value="0.5" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Label">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<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 Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ListView">
<Setter Property="SeparatorColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray500}}" />
<Setter Property="RefreshControlColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="Picker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<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 Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="TitleColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="ProgressBar">
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="ProgressColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RadioButton">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Black}, Dark={StaticResource White}}" />
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<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 Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="RefreshView">
<Setter Property="RefreshColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="SearchBar">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="CancelButtonColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<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 Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SearchHandler">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="PlaceholderColor" Value="{StaticResource Gray500}" />
<Setter Property="BackgroundColor" Value="Transparent" />
<Setter Property="FontFamily" Value="OpenSansRegular" />
<Setter Property="FontSize" Value="14" />
<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 Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="PlaceholderColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="Shadow">
<Setter Property="Radius" Value="15" />
<Setter Property="Opacity" Value="0.5" />
<Setter Property="Brush" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Offset" Value="10,10" />
</Style>
<Style TargetType="Slider">
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="MinimumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="MaximumTrackColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="SwipeItem">
<Setter Property="BackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
</Style>
<Style TargetType="Switch">
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="ThumbColor" Value="{StaticResource White}" />
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="Disabled">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray300}, Dark={StaticResource Gray600}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="On">
<VisualState.Setters>
<Setter Property="OnColor" Value="{AppThemeBinding Light={StaticResource Secondary}, Dark={StaticResource Gray200}}" />
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Off">
<VisualState.Setters>
<Setter Property="ThumbColor" Value="{AppThemeBinding Light={StaticResource Gray400}, Dark={StaticResource Gray500}}" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
<Style TargetType="TimePicker">
<Setter Property="TextColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource White}}" />
<Setter Property="Background" Value="Transparent"/>
<Setter Property="FontFamily" Value="OpenSansRegular"/>
<Setter Property="FontSize" Value="14"/>
<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 Gray300}, Dark={StaticResource Gray600}}" />
</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 Black}}" />
</Style>
<Style TargetType="Shell" ApplyToDerivedTypes="True">
<Setter Property="Shell.BackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.ForegroundColor" Value="{OnPlatform WinUI={StaticResource Primary}, Default={StaticResource White}}" />
<Setter Property="Shell.TitleColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource White}}" />
<Setter Property="Shell.DisabledColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="Shell.UnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray200}}" />
<Setter Property="Shell.NavBarHasShadow" Value="False" />
<Setter Property="Shell.TabBarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Black}}" />
<Setter Property="Shell.TabBarForegroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarTitleColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="Shell.TabBarUnselectedColor" Value="{AppThemeBinding Light={StaticResource Gray900}, Dark={StaticResource Gray200}}" />
</Style>
<Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
<Setter Property="IconColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource White}}" />
</Style>
<Style TargetType="TabbedPage">
<Setter Property="BarBackgroundColor" Value="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Gray950}}" />
<Setter Property="BarTextColor" Value="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource White}}" />
<Setter Property="UnselectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray200}, Dark={StaticResource Gray950}}" />
<Setter Property="SelectedTabColor" Value="{AppThemeBinding Light={StaticResource Gray950}, Dark={StaticResource Gray200}}" />
</Style>
</ResourceDictionary>

@ -0,0 +1,61 @@
using Microsoft.Maui.Controls;
using MusiLib.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace MusiLib.Stub
{
public class Stub : IPersistanceManager
{
public (List<Partition>, List<Partition>) chargeDonnees()
{
List<Partition> partitions = new List<Partition>();
List<Partition> favoris = new List<Partition>();
/*Charge toutes nos partitions*/
Partition amazing_grace = new Partition("Amazing Grace", "John Newton", "Facile", "Amazing Grace est l'un des cantiques chrétiens les plus célèbres dans le monde anglophone. La première publication des paroles date de 1779. Associé à diverses mélodies au fil des années, il est aujourd'hui interprété sur la musique de New Britain", "piano", "amazing-grace.mid");
Partition au_clair_de_la_lune = new Partition("Au clair de la lune", "Édouard-Léon Scott de Martinville", "Moyen", "Au clair de la lune est une chanson populaire française dont la mélodie, très caractéristique, ainsi que les paroles — surtout celles du premier couplet — sont si familières qu'elles ont fait l'objet d'innombrables citations, adaptations, parodies, pastiches, etc.", "piano", "au_clair_de_la_lune.wav");
Partition aura_lee_love_me = new Partition("aura lee love me", "Elvis Presley", "Facile", " Love Me Tender est une ballade de 1956 enregistrée par Elvis Presley et publiée par Elvis Presley Music du film du même nom de la 20th Century Fox . Les paroles sont créditées à Vera Matson (bien que le parolier réel était son mari, Ken Darby) et Elvis Presley lui-même. La mélodie est identique à la ballade sentimentale de la guerre civile Aura Lea et donc attribuée au compositeur d'Aura Lea, l'Anglais George R. Poulton.", "piano", "aura-lee-love-me-tender.mid");
Partition ode_a_la_joie = new Partition("Hymne à la joie", "Friedrich von Schiller", "Difficile", "Ode à la joie — appelée également Hymne à la joie1 — est un poème de Friedrich von Schiller écrit en 1785. Il est surtout connu comme finale du quatrième et dernier mouvement de la 9e Symphonie de Beethoven, devenu l'hymne officiel de l'Union européenne2.Ce poème célèbre l'idéal de l'unité et de la fraternité humaines (« Millions dêtres, soyez tous embrassés dune commune étreinte ! ). Son titre original est An die Freude, mais il est souvent appelé Ode an die Freude.", "piano", "amazing-grace.mid");
Partition fais_dodo_colas = new Partition("Fais dodo", "Inconnu", "Facile", "Fais dodo est une berceuse enfantine en langue française dont l'auteur est inconnu et est dans le domaine public. La mélodie, très connue, date du XVIIIe siècle et se chante dans toutes les régions de France et également au Québec. Il y a quelques variantes, où les ingrédients du texte changent : nougat au lieu de chocolat, d'autres fois des bateaux : « Papa est en haut qui fait des bateaux pour le p'tit Pierrot qui fait son dodo... » ", "piano", "fais-dodo-colas-mon-petit-frere.mid");
Partition Frere_Jacques = new Partition("Frère Jacques", "Jean-Philippe Rameau", "Moyen", "Frère Jacques est une chanson enfantine française du XVIIIe siècle, connue dans le monde entier et traduite dans de nombreuses langues. Longtemps considérée comme anonyme, elle a vraisemblablement pour auteur Jean-Philippe Rameau. Selon l'historienne et musicologue Sylvie Bouissou, l'auteur de la chanson n'est autre que Jean-Philippe Rameau1,2. En effet, dans un exemplaire de son ouvrage Diapason général de tous les instruments à vent (1772), Louis-Joseph Francœur, violoniste de l'Opéra de Paris dans les années où Rameau y était actif, a inséré les manuscrits de quatre canons qu'il attribue à Rameau, parmi lesquels on trouve donc Frère Jacques, mais surtout deux autres déjà connus comme étant de Rameau;", "piano", "frere-jacques.mid");
amazing_grace.ajouterImage("amazing.png");
amazing_grace.ajouterImage("au_clair.png");
au_clair_de_la_lune.ajouterImage("au_clair.png");
aura_lee_love_me.ajouterImage("aura_lee_love_me.png");
ode_a_la_joie.ajouterImage("ode_a_la.png");
fais_dodo_colas.ajouterImage("fais_dodo_colas.png");
Frere_Jacques.ajouterImage("frere_jacques.png");
partitions.Add(amazing_grace);
partitions.Add(au_clair_de_la_lune);
partitions.Add(aura_lee_love_me);
partitions.Add(ode_a_la_joie);
partitions.Add(fais_dodo_colas);
partitions.Add(Frere_Jacques);
return (partitions, favoris);
}
public void sauvegardeDonnees(List<Partition> p, List<Partition> f)
{
}
public void sauvegardeFavoriAdd(Partition fav)
{
}
public void sauvegardeFavoriRemove(Partition fav)
{
}
}
}

@ -0,0 +1,81 @@
<?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="MusiLib.Views.Accueil"
xmlns:model="clr-namespace:MusiLib.Model"
Title="Accueil"
BackgroundColor="White">
<ScrollView>
<Grid x:Name="grille">
<Grid.RowDefinitions >
<RowDefinition Height="85"/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Rectangle Grid.Row="0" Grid.Column="0"
BackgroundColor="#64C1FF"
WidthRequest="650"
HeightRequest="65"
VerticalOptions="Start"
HorizontalOptions="Start"
/>
<Image Grid.Row="0" Grid.Column="0"
Source="logo.png"
WidthRequest="60"
HeightRequest="60"
VerticalOptions="Start"
HorizontalOptions="Start"
/>
<SearchBar Grid.Row="0" Grid.Column="1"
WidthRequest="175"
MaximumWidthRequest="175"
VerticalOptions="Start"
HorizontalOptions="Center"
Margin="25,5,0,0"
TextColor="White"
CancelButtonColor="White"
Placeholder="Rechercher ..."
PlaceholderColor="White"
VerticalTextAlignment="Center"
HorizontalTextAlignment="Start"
TextChanged="SearchBar_TextChanged"
/>
<ImageButton Grid.Row="0" Grid.Column="2"
Source="tri.png"
WidthRequest="60"
HeightRequest="60"
VerticalOptions="Start"
HorizontalOptions="Center"
Margin="100,3,0,0"
Clicked="TriButton_Clicked"
/>
<ImageButton Grid.Row="0" Grid.Column="3"
Source="etoile.png"
WidthRequest="50"
HeightRequest="50"
Margin="0,5,0,0"
VerticalOptions="Start"
HorizontalOptions="End"
Clicked="GoToFavorisButton"
/>
</Grid>
</ScrollView>
</ContentPage>

@ -0,0 +1,200 @@
using Plugin.Maui.Audio;
using MusiLib.Model;
namespace MusiLib.Views
{
public partial class Accueil : ContentPage, IAllowClick
{
public Manager MyManager => (App.Current as App).MyManager;
private List<Partition> partitionsInitiales;
private List<Partition> partitionsFiltrees;
private Trier trieur;
public Accueil()
{
InitializeComponent();
partitionsInitiales = MyManager.partitions.ToList();
partitionsFiltrees = new List<Partition>(partitionsInitiales);
trieur = new Trier(MyManager.partitions.ToList());
BindingContext = MyManager;
chargerPartitions();
}
/*Nous redirige vers la page des favoris*/
private void GoToFavorisButton(object sender, EventArgs e)
{
if (!IAllowClick.AllowTap) return;
else IAllowClick.AllowTap = false;
Navigation.PushAsync(new Favoris());
IAllowClick.ResumeTap();
}
/*Nous redirige vers la partition sur laquelle on a cliqué*/
private void GoToPartitionButton(object sender, EventArgs e)
{
if (!IAllowClick.AllowTap) return;
else IAllowClick.AllowTap = false;
var button = (ImageButton)sender;
var idAutomation = button.AutomationId;
if (int.TryParse(idAutomation, out int id))
{
Navigation.PushAsync(new PartitionView(id));
}
IAllowClick.ResumeTap();
}
/*Charge automatiquement toutes les partitions en ImageButton et les affiche à l'écran*/
private void chargerPartitions()
{
/*Supprime les partitions présentes (on les différencie des autres ImageButton grâce à l'automationId*/
var imageButtonsToRemove = grille.Children.OfType<ImageButton>().Where(btn => !string.IsNullOrEmpty(btn.AutomationId)).ToList();
foreach (var button in imageButtonsToRemove)
{
grille.Children.Remove(button);
}
int imagesParLigne = 3;
int indice = 0;
/*Crée les ImageButton des partitions*/
foreach (Partition partition in partitionsFiltrees)
{
int indicePartition = MyManager.partitions.IndexOf(partition);
ImageButton imageButton = new ImageButton
{
Source = partition.Image[0],
WidthRequest = 175,
HeightRequest = 175,
AutomationId = indicePartition.ToString(),
};
imageButton.Clicked += GoToPartitionButton;
int ligne = 1 + (indice / imagesParLigne);
int colonne = indice % imagesParLigne;
imageButton.Margin = GetImageButtonMargin(colonne);
Grid.SetRow(imageButton, ligne);
Grid.SetColumn(imageButton, colonne);
grille.Children.Add(imageButton);
indice++;
}
}
/*Récupère des valeurs prédéfinies pour les margin de chargerFavoris afin d'avoir un affichage aligné*/
private Thickness GetImageButtonMargin(int colonne)
{
if (colonne == 0)
{
return new Thickness(30, 0, 0, 0);
}
else if (colonne == 1)
{
return new Thickness(90, 0, 0, 0);
}
else
{
return new Thickness(150, 0, 0, 0);
}
}
/*Permet de modifier l'affichage des partitions en fonction de ce qu'on recherche*/
private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
{
string texteRecherche = e.NewTextValue;
partitionsFiltrees.Clear();
foreach (Partition partition in partitionsInitiales)
{
if (partition.Nom.ToLower().Contains(texteRecherche.ToLower()))
{
partitionsFiltrees.Add(partition);
}
}
chargerPartitions();
}
/*Lance un popup de plusieurs choix quand on clic sur le bouton de tri*/
private async void TriButton_Clicked(object sender, EventArgs e)
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Type", "Difficulté", "Ordre alphabétique", "Réinitialiser");
switch (action)
{
case "Type":
await TrierParTypeButton();
break;
case "Difficulté":
await TrierParDifficulteButton();
break;
case "Ordre alphabétique":
await TrierParOrdreAlphabetiqueButton();
break;
case "Réinitialiser":
ReinitialiserButton();
break;
}
}
/*Lance un popup de plusieurs choix quand on clic sur Type dans le popup TriButton_Clicked*/
private async Task TrierParTypeButton()
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Batterie", "Guitare", "Piano");
if (action == "Annuler")
return;
var partitionsTriees = trieur.TrierParInstrument(action);
partitionsFiltrees = new List<Partition>(partitionsTriees);
chargerPartitions();
}
/*Lance un popup de plusieurs choix quand on clic sur Difficulté dans le popup TriButton_Clicked*/
private async Task TrierParDifficulteButton()
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Facile", "Moyen", "Difficile");
if (action == "Annuler")
return;
var partitionsTriees = trieur.TrierParComplexite(action);
partitionsFiltrees = new List<Partition>(partitionsTriees);
chargerPartitions();
}
/*Lance un popup de plusieurs choix quand on clic sur Ordre Alphabétique dans le popup TriButton_Clicked*/
private async Task TrierParOrdreAlphabetiqueButton()
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Croissant", "Décroissant");
if (action == "Annuler")
return;
var partitionsTriees = trieur.TrierParOrdreAlphabetique(action);
partitionsFiltrees = new List<Partition>(partitionsTriees);
chargerPartitions();
}
/*Réinitialise les partitions pour annuler le tri*/
private void ReinitialiserButton()
{
partitionsFiltrees.Clear();
partitionsFiltrees.AddRange(partitionsInitiales);
chargerPartitions();
}
}
}

@ -0,0 +1,81 @@
<?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="MusiLib.Views.Favoris"
xmlns:model="clr-namespace:MusiLib.Model"
Title="Favoris"
BackgroundColor="White">
<ScrollView>
<Grid x:Name="grille">
<Grid.RowDefinitions >
<RowDefinition Height="85"/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Rectangle Grid.Row="0" Grid.Column="0"
BackgroundColor="#64C1FF"
WidthRequest="650"
HeightRequest="65"
VerticalOptions="Start"
HorizontalOptions="Start"
/>
<ImageButton Grid.Row="0" Grid.Column="0"
Source="logo.png"
WidthRequest="60"
HeightRequest="60"
VerticalOptions="Start"
HorizontalOptions="Start"
Clicked="GoToAccueilByLogoButton"
/>
<SearchBar Grid.Row="0" Grid.Column="1"
WidthRequest="175"
MaximumWidthRequest="175"
VerticalOptions="Start"
HorizontalOptions="Center"
Margin="25,5,0,0"
TextColor="White"
CancelButtonColor="White"
Placeholder="Rechercher ..."
PlaceholderColor="White"
VerticalTextAlignment="Center"
HorizontalTextAlignment="Start"
TextChanged="SearchBar_TextChanged"
/>
<ImageButton Grid.Row="0" Grid.Column="2"
Source="tri.png"
WidthRequest="60"
HeightRequest="60"
VerticalOptions="Start"
HorizontalOptions="Center"
Margin="100,3,0,0"
Clicked="TriButton_Clicked"
/>
<ImageButton Grid.Row="0" Grid.Column="3"
Source="etoile.png"
WidthRequest="50"
HeightRequest="50"
Margin="0,5,0,0"
VerticalOptions="Start"
HorizontalOptions="End"
/>
</Grid>
</ScrollView>
</ContentPage>

@ -0,0 +1,209 @@
using MusiLib.Model;
using System.Diagnostics;
namespace MusiLib.Views;
public partial class Favoris : ContentPage, IAllowClick
{
public Manager MyManager => (App.Current as App).MyManager;
private List<Partition> partitionsInitiales;
private List<Partition> partitionsFiltrees;
private Trier trieur;
public Favoris()
{
InitializeComponent();
partitionsInitiales = MyManager.favoris.ToList();
partitionsFiltrees = new List<Partition>(partitionsInitiales);
trieur = new Trier(MyManager.favoris.ToList());
chargerFavoris();
}
/*Nous redirige vers l'accueil avec le logo de l'appli*/
private void GoToAccueilByLogoButton(object sender, EventArgs e)
{
if (!IAllowClick.AllowTap) return;
else IAllowClick.AllowTap = false;
Navigation.PopAsync();
IAllowClick.ResumeTap();
}
/*Nous redirige vers la partition sur laquelle on a cliqué*/
private void GoToPartitionButton(object sender, EventArgs e)
{
if (!IAllowClick.AllowTap) return;
else IAllowClick.AllowTap = false;
var button = (ImageButton)sender;
var idAutomation = button.AutomationId;
if (int.TryParse(idAutomation, out int id))
{
Navigation.PushAsync(new PartitionView(id));
}
IAllowClick.ResumeTap();
}
/*Permet de charger automatiquement tout les favoris qu'on a et les afficher à l'écran*/
private void chargerFavoris()
{
/*Supprime les partitions présentes (on les différencie des autres ImageButton grâce à l'automationId*/
var imageButtonsToRemove = grille.Children.OfType<ImageButton>().Where(btn => !string.IsNullOrEmpty(btn.AutomationId)).ToList();
foreach (var button in imageButtonsToRemove)
{
grille.Children.Remove(button);
}
int imagesParLigne = 3;
int indice = 0;
/*Crée les ImageButton des partitions*/
foreach (Partition favoris in partitionsFiltrees)
{
string nomFavori = favoris.Nom;
int indicePartition = MyManager.partitions.FindIndex(partition => partition.Nom == nomFavori);
ImageButton imageButton = new ImageButton
{
Source = favoris.Image[0],
WidthRequest = 175,
HeightRequest = 175,
AutomationId = indicePartition.ToString(),
};
imageButton.Clicked += GoToPartitionButton;
int ligne = 1 + (indice / imagesParLigne);
int colonne = indice % imagesParLigne;
imageButton.Margin = GetImageButtonMargin(colonne);
Grid.SetRow(imageButton, ligne);
Grid.SetColumn(imageButton, colonne);
grille.Children.Add(imageButton);
indice++;
}
}
/*Récupère des valeurs prédéfinies pour les margin de chargerFavoris afin d'avoir un affichage aligné*/
private Thickness GetImageButtonMargin(int colonne)
{
if (colonne == 0)
{
return new Thickness(30, 0, 0, 0);
}
else if (colonne == 1)
{
return new Thickness(90, 0, 0, 0);
}
else
{
return new Thickness(150, 0, 0, 0);
}
}
/*Permet de modifier l'affichage des partitions en fonction de ce qu'on recherche*/
private void SearchBar_TextChanged(object sender, TextChangedEventArgs e)
{
string texteRecherche = e.NewTextValue;
partitionsFiltrees.Clear();
foreach (Partition partition in partitionsInitiales)
{
if (partition.Nom.ToLower().Contains(texteRecherche.ToLower()))
{
partitionsFiltrees.Add(partition);
}
}
chargerFavoris();
}
/*Lance un popup de plusieurs choix quand on clic sur le bouton de tri*/
private async void TriButton_Clicked(object sender, EventArgs e)
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Type", "Difficulté", "Ordre alphabétique", "Réinitialiser");
switch (action)
{
case "Type":
await TrierParTypeButton();
break;
case "Difficulté":
await TrierParDifficulteButton();
break;
case "Ordre alphabétique":
await TrierParOrdreAlphabetiqueButton();
break;
case "Réinitialiser":
ReinitialiserButton();
break;
}
}
/*Lance un popup de plusieurs choix quand on clic sur Type dans le popup TriButton_Clicked*/
private async Task TrierParTypeButton()
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Batterie", "Guitare", "Piano");
if (action == "Annuler")
return;
var partitionsTriees = trieur.TrierParInstrument(action);
partitionsFiltrees = new List<Partition>(partitionsTriees);
chargerFavoris();
}
/*Lance un popup de plusieurs choix quand on clic sur Difficulté dans le popup TriButton_Clicked*/
private async Task TrierParDifficulteButton()
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Facile", "Moyen", "Difficile");
if (action == "Annuler")
return;
var partitionsTriees = trieur.TrierParComplexite(action);
partitionsFiltrees = new List<Partition>(partitionsTriees);
chargerFavoris();
}
/*Lance un popup de plusieurs choix quand on clic sur Ordre Alphabétique dans le popup TriButton_Clicked*/
private async Task TrierParOrdreAlphabetiqueButton()
{
var action = await DisplayActionSheet("Trier par", "Annuler", null, "Croissant", "Décroissant");
if (action == "Annuler")
return;
var partitionsTriees = trieur.TrierParOrdreAlphabetique(action);
partitionsFiltrees = new List<Partition>(partitionsTriees);
chargerFavoris();
}
/*Réinitialise les partitions pour annuler le tri*/
private void ReinitialiserButton()
{
partitionsFiltrees.Clear();
partitionsFiltrees.AddRange(partitionsInitiales);
chargerFavoris();
}
/*Charge à chaque réapparition de la page (quand on revient d'une partition par exemple) les partitions afin de remettre les partitions si jamais une est supprimé des favoris*/
protected override void OnAppearing()
{
base.OnAppearing();
partitionsInitiales = MyManager.favoris.ToList();
partitionsFiltrees = new List<Partition>(partitionsInitiales);
chargerFavoris();
}
}

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MusiLib.Views
{
/*Permet de mettre un délai entre chaque clic pour éviter les problèmes de multi-pages sur Android*/
/*Est utilisé sur chaque bouton sous la forme :
if (!IAllowClick.AllowTap) return;
else IAllowClick.AllowTap = false;
......
IAllowClick.ResumeTap();
*/
public interface IAllowClick
{
public static bool AllowTap = true;
public static async void ResumeTap()
{
await Task.Delay(500);
AllowTap = true;
}
}
}

@ -0,0 +1,120 @@
<?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="MusiLib.Views.PartitionView"
xmlns:model="clr-namespace:MusiLib.Model"
xmlns:local="clr-namespace:MusiLib.Views"
Title="{Binding NomPartitionTitle}">
<ScrollView Orientation="Both">
<VerticalStackLayout >
<HorizontalStackLayout x:Name="Part">
<CarouselView ItemsSource="{Binding Image}" ItemsLayout="VerticalList" PeekAreaInsets="0">
<CarouselView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding .}" HeightRequest="600" WidthRequest="400" Aspect="AspectFill"/>
</DataTemplate>
</CarouselView.ItemTemplate>
</CarouselView>
<VerticalStackLayout Margin="15" WidthRequest="375">
<Label Text="{Binding Description}" />
<Grid Margin="15">
<Grid.RowDefinitions>
<RowDefinition Height="35"/>
<RowDefinition Height="70"/>
<RowDefinition Height="25"/>
<RowDefinition Height="70"/>
<RowDefinition Height="25"/>
<RowDefinition Height="70"/>
<RowDefinition Height="25"/>
<RowDefinition Height="70"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="130"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Row="1" Grid.Column="0"
Text="Jouer"
WidthRequest="75"
HeightRequest="75"
HorizontalOptions="Start"
Clicked="Play_Music"
x:Name="play_music_button"
/>
<Button Grid.Row="1" Grid.Column="1"
Text="Arrêter"
WidthRequest="75"
HeightRequest="75"
HorizontalOptions="Start"
Clicked="Stop_Music"
/>
<Border Grid.Row="1" Grid.Column="1" WidthRequest="75"
HeightRequest="75" HorizontalOptions="End" Stroke="#6600FF" BackgroundColor="#6600FF">
<ImageButton Grid.Row="3" Grid.Column="1" x:Name="favoriButton"
WidthRequest="75"
HeightRequest="75"
HorizontalOptions="End"
Clicked="AddFavoriButton"
/>
</Border>
<Border Grid.Row="2" Grid.Column="0" WidthRequest="200"
HeightRequest="50" HorizontalOptions="Start" Stroke="#6600FF" BackgroundColor="#6600FF"
Margin="0,60,0,0">
<Slider Grid.Row="2" Grid.Column="0"
x:Name="tempo_slider"
Minimum="0"
Maximum="6"
Value="1"
ValueChanged="TempoSlider" />
</Border>
<Label Grid.Row="3" Grid.Column="1" Text="Vitesse musique" WidthRequest="130" HeightRequest="55" HorizontalOptions="End"/>
<Label Grid.Row="0" Grid.Column="0" Text="Paramètres du son " HorizontalOptions="End"/>
<Label Grid.Row="0" Grid.Column="1" Text="de la partition :"/>
<Label Grid.Row="4" Grid.Column="0" Text="Paramètres du" HorizontalOptions="Center" />
<Label Grid.Row="4" Grid.Column="1" Text="métronome :" HorizontalOptions="Start"/>
<Label Grid.Row="7" Grid.Column="1" Text="Vitesse Métronome" WidthRequest="130" HeightRequest="55" HorizontalOptions="End" />
<Button Grid.Row="5" Grid.Column="0"
Text="Jouer"
WidthRequest="75"
HeightRequest="75"
HorizontalOptions="Start"
Clicked="Play_Metronome"
x:Name="play_metronome_button"
/>
<Button Grid.Row="5" Grid.Column="1"
Text="Arrêter"
WidthRequest="75"
HeightRequest="75"
HorizontalOptions="Start"
Clicked="Stop_Metronome"
/>
<Border Grid.Row="7" Grid.Column="0" WidthRequest="200" HeightRequest="50" HorizontalOptions="Start" Stroke="#6600FF" BackgroundColor="#6600FF">
<Slider Grid.Row="7" Grid.Column="0"
x:Name="BPM_slider"
Minimum="0"
Maximum="6"
Value="1"
ValueChanged="BPMSlider"/>
</Border>
</Grid>
</VerticalStackLayout>
</HorizontalStackLayout>
<Border Stroke="#000080" >
<StackLayout x:Name="PartitionsSimilairesStackLayout"
Orientation="Horizontal"
VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand">
</StackLayout>
</Border>
</VerticalStackLayout>
</ScrollView>
</ContentPage>

@ -0,0 +1,239 @@
using Microsoft.Maui.Controls.PlatformConfiguration;
using MusiLib.Model;
using System.Collections.Concurrent;
using System.Diagnostics;
namespace MusiLib.Views;
public partial class PartitionView : ContentPage
{
public Manager MyManager => (App.Current as App).MyManager;
public Metronome music = new Metronome();
public Metronome metronome = new Metronome();
public string NomPartitionTitle { get; set; }
public int IdTab { get; set; }
public PartitionView()
{
InitializeComponent();
BindingContext = MyManager;
}
public PartitionView(int id)
{
InitializeComponent();
IdTab = id;
BindingContext = this;
NomPartitionTitle = MyManager.partitions[IdTab].Nom;
Part.BindingContext = MyManager.partitions[IdTab];
InitializeButton();
ChargerPartitionsSimilaires();
}
/*Permet de lancer la musique de la partition en cours*/
private void Play_Music(object sender, EventArgs e)
{
Button button = (Button)sender;
if (!music.isMusicBeginning)
{
_ = music.Lancer(MyManager.partitions[IdTab].Son);
Slider sliderMusic = (Slider)FindByName("tempo_slider");
music.ReglerTempo((float)sliderMusic.Value);
button.Text = "Pause";
}
else if(!music.isMusicPlaying)
{
music.PlayMusic();
button.Text = "Pause";
}
else
{
music.PauseMusic();
button.Text = "Jouer";
}
}
/*Permet de lancer le métronome*/
private void Play_Metronome(object sender, EventArgs e)
{
Button button = (Button)sender;
if (!metronome.isMusicBeginning)
{
_ = metronome.Lancer("40_BPM_Metronome.mp3");
Slider sliderMetro = (Slider)FindByName("BPM_slider");
metronome.ReglerTempo((float) sliderMetro.Value);
button.Text = "Pause";
}
else if (!metronome.isMusicPlaying)
{
metronome.PlayMusic();
button.Text = "Pause";
}
else
{
metronome.PauseMusic();
button.Text = "Jouer";
}
}
/*Permet d'arrêter la musique*/
private void Stop_Music(object sender, EventArgs e)
{
music.StopMusic();
Slider sliderMusic = (Slider)FindByName("tempo_slider");
Slider sliderMetro = (Slider)FindByName("BPM_slider");
Button button = (Button)FindByName("play_music_button");
button.Text = "Jouer";
sliderMusic.Value = 1;
sliderMetro.Value = 1;
}
/*Permet d'arrêter le métronome*/
private void Stop_Metronome(object sender, EventArgs e)
{
metronome.StopMusic();
Button button = (Button)FindByName("play_metronome_button");
button.Text = "Jouer";
}
/*Coupe la musique et le métronome quand on revient en arrière avec le bouton retour du téléphone*/
protected override bool OnBackButtonPressed()
{
metronome.StopMusic();
music.StopMusic();
return base.OnBackButtonPressed();
}
/*Coupe la musique et le métronome quand on revient en arrière*/
protected override void OnDisappearing()
{
base.OnDisappearing();
metronome.StopMusic();
music.StopMusic();
}
/*Initialise le Shell_Navigating au chargement de la page*/
protected override void OnAppearing()
{
base.OnAppearing();
Shell.Current.Navigating += Shell_Navigating;
}
/*Coupe la musique et le métronome quand on revient en arrière avec le bouton retour de l'appli | Fonctionne avec OnDisappearing*/
private void Shell_Navigating(object sender, ShellNavigatingEventArgs e)
{
if (e.Source == ShellNavigationSource.ShellItemChanged)
{
metronome.StopMusic();
music.StopMusic();
}
}
/*Permet de mettre la bonne image suivant si la partition est en favori ou pas au chargement*/
private void InitializeButton()
{
if (MyManager.favoris.Any(favori => favori.Nom == MyManager.partitions[IdTab].Nom))
{
favoriButton.Source = "etoile.png";
}
else
{
favoriButton.Source = "etoile_vide.png";
}
}
/*Initialise et crée des ImageButton des partitions du même auteur et même instrument pour les afficher automatiquement*/
private void ChargerPartitionsSimilaires()
{
string auteur = MyManager.partitions[IdTab].Auteur;
string instrument = MyManager.partitions[IdTab].Instrument;
var partitionsSimilaires = MyManager.partitions.Where(p => p.Auteur.ToLower() == auteur.ToLower() ||
p.Instrument.ToLower() == instrument.ToLower()).ToList();
uint i = 1;
foreach (var partition in partitionsSimilaires)
{
++i;
if(i>9)
{
return;
}
int indicePartition = MyManager.partitions.IndexOf(partition);
var imageButton = new ImageButton
{
Source = partition.Image[0],
HeightRequest = 80,
WidthRequest = 80,
AutomationId = indicePartition.ToString()
};
imageButton.Clicked += GoToPartitionButton;
PartitionsSimilairesStackLayout.Children.Add(imageButton);
}
}
/*Nous redirige vers la partition sur laquelle on a cliqué*/
private void GoToPartitionButton(object sender, EventArgs e)
{
if (!IAllowClick.AllowTap) return;
else IAllowClick.AllowTap = false;
var button = (ImageButton)sender;
var idAutomation = button.AutomationId;
if (int.TryParse(idAutomation, out int id))
{
Navigation.PushAsync(new PartitionView(id));
}
IAllowClick.ResumeTap();
}
/*Permet d'ajouter une partition aux favoris, sauvegarde sur le téléphone et change l'image du bouton*/
private void AddFavoriButton(object sender, EventArgs e)
{
ImageButton button = (ImageButton)sender;
if (!MyManager.favoris.Any(favori => favori.Nom == MyManager.partitions[IdTab].Nom))
{
MyManager.favoris.Add(MyManager.partitions[IdTab]);
MyManager.sauvegardeFavoriAdd(MyManager.partitions[IdTab]);
button.Source = "etoile.png";
}
else
{
MyManager.favoris.RemoveAll(f => f.Nom == MyManager.partitions[IdTab].Nom);
MyManager.sauvegardeFavoriRemove(MyManager.partitions[IdTab]);
button.Source = "etoile_vide.png";
}
}
/*Permet d'envoyer la valeur du slider pour modifier le tempo de la musique*/
private void TempoSlider(object sender, ValueChangedEventArgs e)
{
float selectedValue = (float)e.NewValue;
music.ReglerTempo(selectedValue);
}
/*Permet d'envoyer la valeur du slider pour modifier le tempo du métronome*/
private void BPMSlider(object sender, ValueChangedEventArgs e)
{
float selectedValue = (float)e.NewValue;
metronome.ReglerTempo(selectedValue);
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save