diff --git a/Contexte/Contexte.docx b/Contexte/Contexte.docx deleted file mode 100644 index b101d2f..0000000 Binary files a/Contexte/Contexte.docx and /dev/null differ diff --git a/Contexte/Diagramme Cas Utilisation.drawio b/Contexte/Diagramme Cas Utilisation.drawio deleted file mode 100644 index 9eb3eb7..0000000 --- a/Contexte/Diagramme Cas Utilisation.drawio +++ /dev/null @@ -1 +0,0 @@ -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= \ No newline at end of file diff --git a/Contexte/Diagramme_Cas_Utilisations.png b/Contexte/Diagramme_Cas_Utilisations.png deleted file mode 100644 index 0953a8b..0000000 Binary files a/Contexte/Diagramme_Cas_Utilisations.png and /dev/null differ diff --git a/Contexte/Persona/Baptiste.png b/Contexte/Persona/Baptiste.png deleted file mode 100644 index 64b6b7d..0000000 Binary files a/Contexte/Persona/Baptiste.png and /dev/null differ diff --git a/Contexte/Persona/Corrine.png b/Contexte/Persona/Corrine.png deleted file mode 100644 index bcb42d0..0000000 Binary files a/Contexte/Persona/Corrine.png and /dev/null differ diff --git a/Contexte/Persona/Pierre.png b/Contexte/Persona/Pierre.png deleted file mode 100644 index 7f4ab66..0000000 Binary files a/Contexte/Persona/Pierre.png and /dev/null differ diff --git a/Contexte/Persona/User Story Baptiste.png b/Contexte/Persona/User Story Baptiste.png deleted file mode 100644 index 1441d51..0000000 Binary files a/Contexte/Persona/User Story Baptiste.png and /dev/null differ diff --git a/Contexte/Persona/User Story Corrine.png b/Contexte/Persona/User Story Corrine.png deleted file mode 100644 index 957efa3..0000000 Binary files a/Contexte/Persona/User Story Corrine.png and /dev/null differ diff --git a/Contexte/Persona/User Story Pierre.png b/Contexte/Persona/User Story Pierre.png deleted file mode 100644 index 96218dd..0000000 Binary files a/Contexte/Persona/User Story Pierre.png and /dev/null differ diff --git a/Contexte/Sketch/Details Partition.png b/Contexte/Sketch/Details Partition.png deleted file mode 100644 index 8199f15..0000000 Binary files a/Contexte/Sketch/Details Partition.png and /dev/null differ diff --git a/Contexte/Sketch/Favoris.png b/Contexte/Sketch/Favoris.png deleted file mode 100644 index 245f81d..0000000 Binary files a/Contexte/Sketch/Favoris.png and /dev/null differ diff --git a/Contexte/Sketch/Page_Accueil.png b/Contexte/Sketch/Page_Accueil.png deleted file mode 100644 index 59c2a67..0000000 Binary files a/Contexte/Sketch/Page_Accueil.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/Details Partition.png b/Contexte/StoryBoard/Image/Details Partition.png deleted file mode 100644 index 8199f15..0000000 Binary files a/Contexte/StoryBoard/Image/Details Partition.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/Favori.png b/Contexte/StoryBoard/Image/Favori.png deleted file mode 100644 index 325861d..0000000 Binary files a/Contexte/StoryBoard/Image/Favori.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/Favoris.png b/Contexte/StoryBoard/Image/Favoris.png deleted file mode 100644 index 245f81d..0000000 Binary files a/Contexte/StoryBoard/Image/Favoris.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/Page Acceuil.png b/Contexte/StoryBoard/Image/Page Acceuil.png deleted file mode 100644 index 158a50b..0000000 Binary files a/Contexte/StoryBoard/Image/Page Acceuil.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/bar-recherche.PNG b/Contexte/StoryBoard/Image/bar-recherche.PNG deleted file mode 100644 index d5a2245..0000000 Binary files a/Contexte/StoryBoard/Image/bar-recherche.PNG and /dev/null differ diff --git a/Contexte/StoryBoard/Image/bouton_lancer.PNG b/Contexte/StoryBoard/Image/bouton_lancer.PNG deleted file mode 100644 index 7b62af4..0000000 Binary files a/Contexte/StoryBoard/Image/bouton_lancer.PNG and /dev/null differ diff --git a/Contexte/StoryBoard/Image/bouton_tri.PNG b/Contexte/StoryBoard/Image/bouton_tri.PNG deleted file mode 100644 index f41f870..0000000 Binary files a/Contexte/StoryBoard/Image/bouton_tri.PNG and /dev/null differ diff --git a/Contexte/StoryBoard/Image/bouton_tri_par_difficulte.png b/Contexte/StoryBoard/Image/bouton_tri_par_difficulte.png deleted file mode 100644 index 8854282..0000000 Binary files a/Contexte/StoryBoard/Image/bouton_tri_par_difficulte.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/bouton_tri_par_instrument.png b/Contexte/StoryBoard/Image/bouton_tri_par_instrument.png deleted file mode 100644 index 91681e0..0000000 Binary files a/Contexte/StoryBoard/Image/bouton_tri_par_instrument.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/bouton_tri_par_ordre_alphabetique.png b/Contexte/StoryBoard/Image/bouton_tri_par_ordre_alphabetique.png deleted file mode 100644 index cc88e38..0000000 Binary files a/Contexte/StoryBoard/Image/bouton_tri_par_ordre_alphabetique.png and /dev/null differ diff --git a/Contexte/StoryBoard/Image/même_compo.PNG b/Contexte/StoryBoard/Image/même_compo.PNG deleted file mode 100644 index 3e165b2..0000000 Binary files a/Contexte/StoryBoard/Image/même_compo.PNG and /dev/null differ diff --git a/Contexte/StoryBoard/StoryBoard_Baptiste.docx b/Contexte/StoryBoard/StoryBoard_Baptiste.docx deleted file mode 100644 index eea94fb..0000000 Binary files a/Contexte/StoryBoard/StoryBoard_Baptiste.docx and /dev/null differ diff --git a/Contexte/StoryBoard/StoryBoard_Corinne.docx b/Contexte/StoryBoard/StoryBoard_Corinne.docx deleted file mode 100644 index b266e17..0000000 Binary files a/Contexte/StoryBoard/StoryBoard_Corinne.docx and /dev/null differ diff --git a/Contexte/StoryBoard/StoryBoard_pierre.docx b/Contexte/StoryBoard/StoryBoard_pierre.docx deleted file mode 100644 index 088dd70..0000000 Binary files a/Contexte/StoryBoard/StoryBoard_pierre.docx and /dev/null differ diff --git a/Contexte/edit.txt b/Contexte/edit.txt deleted file mode 100644 index 5a3a76b..0000000 --- a/Contexte/edit.txt +++ /dev/null @@ -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 diff --git a/MusiLib/MusiLib.sln b/MusiLib/MusiLib.sln new file mode 100644 index 0000000..eb5193b --- /dev/null +++ b/MusiLib/MusiLib.sln @@ -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 diff --git a/MusiLib/MusiLib/App.xaml b/MusiLib/MusiLib/App.xaml new file mode 100644 index 0000000..20b83a2 --- /dev/null +++ b/MusiLib/MusiLib/App.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/MusiLib/MusiLib/App.xaml.cs b/MusiLib/MusiLib/App.xaml.cs new file mode 100644 index 0000000..f389066 --- /dev/null +++ b/MusiLib/MusiLib/App.xaml.cs @@ -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(); + + } +} diff --git a/MusiLib/MusiLib/AppShell.xaml b/MusiLib/MusiLib/AppShell.xaml new file mode 100644 index 0000000..f271e48 --- /dev/null +++ b/MusiLib/MusiLib/AppShell.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/MusiLib/MusiLib/AppShell.xaml.cs b/MusiLib/MusiLib/AppShell.xaml.cs new file mode 100644 index 0000000..02ecd04 --- /dev/null +++ b/MusiLib/MusiLib/AppShell.xaml.cs @@ -0,0 +1,9 @@ +namespace MusiLib; + +public partial class AppShell : Shell +{ + public AppShell() + { + InitializeComponent(); + } +} diff --git a/MusiLib/MusiLib/DataContractPersistance/DataContractPers.cs b/MusiLib/MusiLib/DataContractPersistance/DataContractPers.cs new file mode 100644 index 0000000..383925a --- /dev/null +++ b/MusiLib/MusiLib/DataContractPersistance/DataContractPers.cs @@ -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, List) chargeDonnees() /*Méthode permettant de charger les données*/ + { + var partitionsSerializer = new DataContractSerializer(typeof(List)); + var favorisUtilisateursSerializer = new DataContractSerializer(typeof(DataToPersist)); + + List partitions = new List(); + List favoris = new List(); + + 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; /*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 p, List f) /*Méthode permettant de sauvegarder les données*/ + { + var partitionsSerializer = new DataContractSerializer(typeof(List)); + 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 favoris = new List(); + 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 favoris = new List(); + 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 !"); + } + + + } +} \ No newline at end of file diff --git a/MusiLib/MusiLib/DataContractPersistance/DataToPersist.cs b/MusiLib/MusiLib/DataContractPersistance/DataToPersist.cs new file mode 100644 index 0000000..66d9b1e --- /dev/null +++ b/MusiLib/MusiLib/DataContractPersistance/DataToPersist.cs @@ -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 partitions { get; set; } = new List(); + public List favoris { get; set; } = new List(); + } +} diff --git a/MusiLib/MusiLib/MauiProgram.cs b/MusiLib/MusiLib/MauiProgram.cs new file mode 100644 index 0000000..5399d33 --- /dev/null +++ b/MusiLib/MusiLib/MauiProgram.cs @@ -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() + .ConfigureFonts(fonts => + { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); + }); + + builder.Services.AddSingleton(AudioManager.Current); + + return builder.Build(); + } +} diff --git a/MusiLib/MusiLib/Model/IPersistanceManager.cs b/MusiLib/MusiLib/Model/IPersistanceManager.cs new file mode 100644 index 0000000..d3b94dc --- /dev/null +++ b/MusiLib/MusiLib/Model/IPersistanceManager.cs @@ -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, List) chargeDonnees(); + + /*déclaration de fonctions abstraites*/ + void sauvegardeDonnees(List p, List f); + + void sauvegardeFavoriAdd(Partition fav); + + void sauvegardeFavoriRemove(Partition fav); + } +} diff --git a/MusiLib/MusiLib/Model/Manager.cs b/MusiLib/MusiLib/Model/Manager.cs new file mode 100644 index 0000000..b424c29 --- /dev/null +++ b/MusiLib/MusiLib/Model/Manager.cs @@ -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 partitions { get; private set; } + public List favoris { get; private set; } + + public Manager() + { + partitions = new List(); + favoris = new List(); + } + + public Manager(IPersistanceManager persistance) + { + Persistance = persistance; + partitions = new List(); + favoris = new List(); + } + + 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); + } + + } +} + + diff --git a/MusiLib/MusiLib/Model/Metronome.cs b/MusiLib/MusiLib/Model/Metronome.cs new file mode 100644 index 0000000..1b53f84 --- /dev/null +++ b/MusiLib/MusiLib/Model/Metronome.cs @@ -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(); /* 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; + } + } + +} + diff --git a/MusiLib/MusiLib/Model/Partition.cs b/MusiLib/MusiLib/Model/Partition.cs new file mode 100644 index 0000000..538760d --- /dev/null +++ b/MusiLib/MusiLib/Model/Partition.cs @@ -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 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(); + Son = son; + } + public void ajouterImage(string image) + { + Image.Add(image); + } + public void supprimerImage(string image) + { + Image.Remove(image); + } + + } +} diff --git a/MusiLib/MusiLib/Model/Trier.cs b/MusiLib/MusiLib/Model/Trier.cs new file mode 100644 index 0000000..ba1fa31 --- /dev/null +++ b/MusiLib/MusiLib/Model/Trier.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using MusiLib.Model; + +namespace MusiLib.Model +{ + public class Trier + { + private List partitionsInitiales; + private List partitionsFiltrees; + + public Trier(List partitions) + { + partitionsInitiales = partitions; + partitionsFiltrees = new List(partitionsInitiales); + } + + public List 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 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 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; + } + } +} diff --git a/MusiLib/MusiLib/MusiLib.csproj b/MusiLib/MusiLib/MusiLib.csproj new file mode 100644 index 0000000..0261ade --- /dev/null +++ b/MusiLib/MusiLib/MusiLib.csproj @@ -0,0 +1,65 @@ + + + + net6.0-android;net6.0-ios;net6.0-maccatalyst + $(TargetFrameworks);net6.0-windows10.0.19041.0 + + + Exe + MusiLib + true + true + enable + + + MusiLib + + + fr.iut.musilib + c2deb312-b3f3-425c-8e4b-18b5328ffd7c + + + 1.0 + 1 + + 14.2 + 14.0 + 23.0 + 10.0.17763.0 + 10.0.17763.0 + 6.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PartitionView.xaml + + + + diff --git a/MusiLib/MusiLib/Platforms/Android/AndroidManifest.xml b/MusiLib/MusiLib/Platforms/Android/AndroidManifest.xml new file mode 100644 index 0000000..c612c62 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/MusiLib/MusiLib/Platforms/Android/MainActivity.cs b/MusiLib/MusiLib/Platforms/Android/MainActivity.cs new file mode 100644 index 0000000..1313faa --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Android/MainActivity.cs @@ -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 +{ +} diff --git a/MusiLib/MusiLib/Platforms/Android/MainApplication.cs b/MusiLib/MusiLib/Platforms/Android/MainApplication.cs new file mode 100644 index 0000000..869ce7e --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Android/MainApplication.cs @@ -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(); +} diff --git a/MusiLib/MusiLib/Platforms/Android/Resources/values/colors.xml b/MusiLib/MusiLib/Platforms/Android/Resources/values/colors.xml new file mode 100644 index 0000000..c04d749 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Android/Resources/values/colors.xml @@ -0,0 +1,6 @@ + + + #512BD4 + #2B0B98 + #2B0B98 + \ No newline at end of file diff --git a/MusiLib/MusiLib/Platforms/MacCatalyst/AppDelegate.cs b/MusiLib/MusiLib/Platforms/MacCatalyst/AppDelegate.cs new file mode 100644 index 0000000..2e894b0 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/MacCatalyst/AppDelegate.cs @@ -0,0 +1,9 @@ +using Foundation; + +namespace MusiLib; + +[Register("AppDelegate")] +public class AppDelegate : MauiUIApplicationDelegate +{ + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} diff --git a/MusiLib/MusiLib/Platforms/MacCatalyst/Info.plist b/MusiLib/MusiLib/Platforms/MacCatalyst/Info.plist new file mode 100644 index 0000000..c96dd0a --- /dev/null +++ b/MusiLib/MusiLib/Platforms/MacCatalyst/Info.plist @@ -0,0 +1,30 @@ + + + + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + + diff --git a/MusiLib/MusiLib/Platforms/MacCatalyst/Program.cs b/MusiLib/MusiLib/Platforms/MacCatalyst/Program.cs new file mode 100644 index 0000000..9dcf8b7 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/MacCatalyst/Program.cs @@ -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)); + } +} diff --git a/MusiLib/MusiLib/Platforms/Tizen/Main.cs b/MusiLib/MusiLib/Platforms/Tizen/Main.cs new file mode 100644 index 0000000..0f2afa1 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Tizen/Main.cs @@ -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); + } +} diff --git a/MusiLib/MusiLib/Platforms/Tizen/tizen-manifest.xml b/MusiLib/MusiLib/Platforms/Tizen/tizen-manifest.xml new file mode 100644 index 0000000..988df34 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Tizen/tizen-manifest.xml @@ -0,0 +1,15 @@ + + + + + + maui-appicon-placeholder + + + + + http://tizen.org/privilege/internet + + + + \ No newline at end of file diff --git a/MusiLib/MusiLib/Platforms/Windows/App.xaml b/MusiLib/MusiLib/Platforms/Windows/App.xaml new file mode 100644 index 0000000..107462c --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Windows/App.xaml @@ -0,0 +1,8 @@ + + + diff --git a/MusiLib/MusiLib/Platforms/Windows/App.xaml.cs b/MusiLib/MusiLib/Platforms/Windows/App.xaml.cs new file mode 100644 index 0000000..8ceeb23 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Windows/App.xaml.cs @@ -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; + +/// +/// Provides application-specific behavior to supplement the default Application class. +/// +public partial class App : MauiWinUIApplication +{ + /// + /// 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(). + /// + public App() + { + this.InitializeComponent(); + } + + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} + diff --git a/MusiLib/MusiLib/Platforms/Windows/Package.appxmanifest b/MusiLib/MusiLib/Platforms/Windows/Package.appxmanifest new file mode 100644 index 0000000..81fb4da --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Windows/Package.appxmanifest @@ -0,0 +1,46 @@ + + + + + + + + + $placeholder$ + User Name + $placeholder$.png + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusiLib/MusiLib/Platforms/Windows/app.manifest b/MusiLib/MusiLib/Platforms/Windows/app.manifest new file mode 100644 index 0000000..83d965a --- /dev/null +++ b/MusiLib/MusiLib/Platforms/Windows/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/MusiLib/MusiLib/Platforms/iOS/AppDelegate.cs b/MusiLib/MusiLib/Platforms/iOS/AppDelegate.cs new file mode 100644 index 0000000..2e894b0 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/iOS/AppDelegate.cs @@ -0,0 +1,9 @@ +using Foundation; + +namespace MusiLib; + +[Register("AppDelegate")] +public class AppDelegate : MauiUIApplicationDelegate +{ + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} diff --git a/MusiLib/MusiLib/Platforms/iOS/Info.plist b/MusiLib/MusiLib/Platforms/iOS/Info.plist new file mode 100644 index 0000000..0004a4f --- /dev/null +++ b/MusiLib/MusiLib/Platforms/iOS/Info.plist @@ -0,0 +1,32 @@ + + + + + LSRequiresIPhoneOS + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + + diff --git a/MusiLib/MusiLib/Platforms/iOS/Program.cs b/MusiLib/MusiLib/Platforms/iOS/Program.cs new file mode 100644 index 0000000..9dcf8b7 --- /dev/null +++ b/MusiLib/MusiLib/Platforms/iOS/Program.cs @@ -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)); + } +} diff --git a/MusiLib/MusiLib/Properties/launchSettings.json b/MusiLib/MusiLib/Properties/launchSettings.json new file mode 100644 index 0000000..edf8aad --- /dev/null +++ b/MusiLib/MusiLib/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Windows Machine": { + "commandName": "MsixPackage", + "nativeDebugging": false + } + } +} \ No newline at end of file diff --git a/MusiLib/MusiLib/Resources/AppIcon/appicon.png b/MusiLib/MusiLib/Resources/AppIcon/appicon.png new file mode 100644 index 0000000..4ecbc4a Binary files /dev/null and b/MusiLib/MusiLib/Resources/AppIcon/appicon.png differ diff --git a/MusiLib/MusiLib/Resources/AppIcon/appicon.svg b/MusiLib/MusiLib/Resources/AppIcon/appicon.svg new file mode 100644 index 0000000..9d63b65 --- /dev/null +++ b/MusiLib/MusiLib/Resources/AppIcon/appicon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/MusiLib/MusiLib/Resources/AppIcon/appiconfg.svg b/MusiLib/MusiLib/Resources/AppIcon/appiconfg.svg new file mode 100644 index 0000000..21dfb25 --- /dev/null +++ b/MusiLib/MusiLib/Resources/AppIcon/appiconfg.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/MusiLib/MusiLib/Resources/Fonts/OpenSans-Regular.ttf b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000..a49f11d Binary files /dev/null and b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Regular.ttf differ diff --git a/MusiLib/MusiLib/Resources/Fonts/OpenSans-Semibold.ttf b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Semibold.ttf new file mode 100644 index 0000000..23911e4 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Fonts/OpenSans-Semibold.ttf differ diff --git a/MusiLib/MusiLib/Resources/Images/amazing.png b/MusiLib/MusiLib/Resources/Images/amazing.png new file mode 100644 index 0000000..77e6321 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/amazing.png differ diff --git a/MusiLib/MusiLib/Resources/Images/au_clair.png b/MusiLib/MusiLib/Resources/Images/au_clair.png new file mode 100644 index 0000000..a1e753b Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/au_clair.png differ diff --git a/MusiLib/MusiLib/Resources/Images/aura_lee_love_me.png b/MusiLib/MusiLib/Resources/Images/aura_lee_love_me.png new file mode 100644 index 0000000..b6d290d Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/aura_lee_love_me.png differ diff --git a/MusiLib/MusiLib/Resources/Images/dotnet_bot.svg b/MusiLib/MusiLib/Resources/Images/dotnet_bot.svg new file mode 100644 index 0000000..abfaff2 --- /dev/null +++ b/MusiLib/MusiLib/Resources/Images/dotnet_bot.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusiLib/MusiLib/Resources/Images/etoile.png b/MusiLib/MusiLib/Resources/Images/etoile.png new file mode 100644 index 0000000..a4176e5 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/etoile.png differ diff --git a/MusiLib/MusiLib/Resources/Images/etoile_vide.png b/MusiLib/MusiLib/Resources/Images/etoile_vide.png new file mode 100644 index 0000000..d4b1fc4 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/etoile_vide.png differ diff --git a/MusiLib/MusiLib/Resources/Images/fais_dodo_colas.png b/MusiLib/MusiLib/Resources/Images/fais_dodo_colas.png new file mode 100644 index 0000000..6477793 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/fais_dodo_colas.png differ diff --git a/MusiLib/MusiLib/Resources/Images/frere_jacques.png b/MusiLib/MusiLib/Resources/Images/frere_jacques.png new file mode 100644 index 0000000..f118c49 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/frere_jacques.png differ diff --git a/MusiLib/MusiLib/Resources/Images/logo.png b/MusiLib/MusiLib/Resources/Images/logo.png new file mode 100644 index 0000000..4ecbc4a Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/logo.png differ diff --git a/MusiLib/MusiLib/Resources/Images/ode_a_la.png b/MusiLib/MusiLib/Resources/Images/ode_a_la.png new file mode 100644 index 0000000..f7e3bac Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/ode_a_la.png differ diff --git a/MusiLib/MusiLib/Resources/Images/partition.png b/MusiLib/MusiLib/Resources/Images/partition.png new file mode 100644 index 0000000..4bc0acf Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/partition.png differ diff --git a/MusiLib/MusiLib/Resources/Images/tri.png b/MusiLib/MusiLib/Resources/Images/tri.png new file mode 100644 index 0000000..ed3f8e1 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Images/tri.png differ diff --git a/MusiLib/MusiLib/Resources/Raw/40_BPM_Metronome.mp3 b/MusiLib/MusiLib/Resources/Raw/40_BPM_Metronome.mp3 new file mode 100644 index 0000000..f4ec766 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/40_BPM_Metronome.mp3 differ diff --git a/MusiLib/MusiLib/Resources/Raw/AboutAssets.txt b/MusiLib/MusiLib/Resources/Raw/AboutAssets.txt new file mode 100644 index 0000000..15d6244 --- /dev/null +++ b/MusiLib/MusiLib/Resources/Raw/AboutAssets.txt @@ -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`. + + + +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(); + } diff --git a/MusiLib/MusiLib/Resources/Raw/ah-vous-dirai-je-maman.mid b/MusiLib/MusiLib/Resources/Raw/ah-vous-dirai-je-maman.mid new file mode 100644 index 0000000..82bcd03 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/ah-vous-dirai-je-maman.mid differ diff --git a/MusiLib/MusiLib/Resources/Raw/amazing-grace.mid b/MusiLib/MusiLib/Resources/Raw/amazing-grace.mid new file mode 100644 index 0000000..4bcdce8 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/amazing-grace.mid differ diff --git a/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.mp3 b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.mp3 new file mode 100644 index 0000000..9551d00 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.mp3 differ diff --git a/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.wav b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.wav new file mode 100644 index 0000000..1cd6d0a Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/au_clair_de_la_lune.wav differ diff --git a/MusiLib/MusiLib/Resources/Raw/aura-lee-love-me-tender.mid b/MusiLib/MusiLib/Resources/Raw/aura-lee-love-me-tender.mid new file mode 100644 index 0000000..ce15d20 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/aura-lee-love-me-tender.mid differ diff --git a/MusiLib/MusiLib/Resources/Raw/fais-dodo-colas-mon-petit-frere.mid b/MusiLib/MusiLib/Resources/Raw/fais-dodo-colas-mon-petit-frere.mid new file mode 100644 index 0000000..de63a64 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/fais-dodo-colas-mon-petit-frere.mid differ diff --git a/MusiLib/MusiLib/Resources/Raw/frere-jacques.mid b/MusiLib/MusiLib/Resources/Raw/frere-jacques.mid new file mode 100644 index 0000000..a50803a Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/frere-jacques.mid differ diff --git a/MusiLib/MusiLib/Resources/Raw/la-mort-d-ase-tod-death.mid b/MusiLib/MusiLib/Resources/Raw/la-mort-d-ase-tod-death.mid new file mode 100644 index 0000000..bd53033 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/la-mort-d-ase-tod-death.mid differ diff --git a/MusiLib/MusiLib/Resources/Raw/lettre-a-elise.mid b/MusiLib/MusiLib/Resources/Raw/lettre-a-elise.mid new file mode 100644 index 0000000..829916a Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/lettre-a-elise.mid differ diff --git a/MusiLib/MusiLib/Resources/Raw/romance-en-mi-majeur.mid b/MusiLib/MusiLib/Resources/Raw/romance-en-mi-majeur.mid new file mode 100644 index 0000000..9840962 Binary files /dev/null and b/MusiLib/MusiLib/Resources/Raw/romance-en-mi-majeur.mid differ diff --git a/MusiLib/MusiLib/Resources/Splash/splash.png b/MusiLib/MusiLib/Resources/Splash/splash.png new file mode 100644 index 0000000..4ecbc4a Binary files /dev/null and b/MusiLib/MusiLib/Resources/Splash/splash.png differ diff --git a/MusiLib/MusiLib/Resources/Splash/splash.svg b/MusiLib/MusiLib/Resources/Splash/splash.svg new file mode 100644 index 0000000..21dfb25 --- /dev/null +++ b/MusiLib/MusiLib/Resources/Splash/splash.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/MusiLib/MusiLib/Resources/Styles/Colors.xaml b/MusiLib/MusiLib/Resources/Styles/Colors.xaml new file mode 100644 index 0000000..245758b --- /dev/null +++ b/MusiLib/MusiLib/Resources/Styles/Colors.xaml @@ -0,0 +1,44 @@ + + + + + #512BD4 + #DFD8F7 + #2B0B98 + White + Black + #E1E1E1 + #C8C8C8 + #ACACAC + #919191 + #6E6E6E + #404040 + #212121 + #141414 + + + + + + + + + + + + + + + #F7B548 + #FFD590 + #FFE5B9 + #28C2D1 + #7BDDEF + #C3F2F4 + #3E8EED + #72ACF1 + #A7CBF6 + + \ No newline at end of file diff --git a/MusiLib/MusiLib/Resources/Styles/Styles.xaml b/MusiLib/MusiLib/Resources/Styles/Styles.xaml new file mode 100644 index 0000000..1ec9d55 --- /dev/null +++ b/MusiLib/MusiLib/Resources/Styles/Styles.xaml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusiLib/MusiLib/Stub/Stub.cs b/MusiLib/MusiLib/Stub/Stub.cs new file mode 100644 index 0000000..62dc8eb --- /dev/null +++ b/MusiLib/MusiLib/Stub/Stub.cs @@ -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, List) chargeDonnees() + { + List partitions = new List(); + + List favoris = new List(); + + + /*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 d’une 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 p, List f) + { + + } + + public void sauvegardeFavoriAdd(Partition fav) + { + + } + + public void sauvegardeFavoriRemove(Partition fav) + { + + } + } +} diff --git a/MusiLib/MusiLib/Views/Accueil.xaml b/MusiLib/MusiLib/Views/Accueil.xaml new file mode 100644 index 0000000..3e552fa --- /dev/null +++ b/MusiLib/MusiLib/Views/Accueil.xaml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusiLib/MusiLib/Views/Accueil.xaml.cs b/MusiLib/MusiLib/Views/Accueil.xaml.cs new file mode 100644 index 0000000..cf52062 --- /dev/null +++ b/MusiLib/MusiLib/Views/Accueil.xaml.cs @@ -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 partitionsInitiales; + private List partitionsFiltrees; + private Trier trieur; + + public Accueil() + { + InitializeComponent(); + partitionsInitiales = MyManager.partitions.ToList(); + partitionsFiltrees = new List(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().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(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(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(partitionsTriees); + chargerPartitions(); + } + + /*Réinitialise les partitions pour annuler le tri*/ + private void ReinitialiserButton() + { + partitionsFiltrees.Clear(); + partitionsFiltrees.AddRange(partitionsInitiales); + chargerPartitions(); + } + + } +} diff --git a/MusiLib/MusiLib/Views/Favoris.xaml b/MusiLib/MusiLib/Views/Favoris.xaml new file mode 100644 index 0000000..bdb6a7e --- /dev/null +++ b/MusiLib/MusiLib/Views/Favoris.xaml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MusiLib/MusiLib/Views/Favoris.xaml.cs b/MusiLib/MusiLib/Views/Favoris.xaml.cs new file mode 100644 index 0000000..c69d223 --- /dev/null +++ b/MusiLib/MusiLib/Views/Favoris.xaml.cs @@ -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 partitionsInitiales; + private List partitionsFiltrees; + private Trier trieur; + + public Favoris() + { + InitializeComponent(); + partitionsInitiales = MyManager.favoris.ToList(); + partitionsFiltrees = new List(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().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(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(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(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(partitionsInitiales); + chargerFavoris(); + } + +} \ No newline at end of file diff --git a/MusiLib/MusiLib/Views/IAllowClick.cs b/MusiLib/MusiLib/Views/IAllowClick.cs new file mode 100644 index 0000000..3989d86 --- /dev/null +++ b/MusiLib/MusiLib/Views/IAllowClick.cs @@ -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; + } + } +} diff --git a/MusiLib/MusiLib/Views/PartitionView.xaml b/MusiLib/MusiLib/Views/PartitionView.xaml new file mode 100644 index 0000000..8cc0970 --- /dev/null +++ b/MusiLib/MusiLib/Views/PartitionView.xaml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + +