From ad934b1ec9784bc9779ff7e424d348835ad3efe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 11:16:05 +0200 Subject: [PATCH 01/13] Ajout des routes pour la navigation --- source/Trek-12/Trek-12/AppShell.xaml.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/source/Trek-12/Trek-12/AppShell.xaml.cs b/source/Trek-12/Trek-12/AppShell.xaml.cs index ad8d368..529cbe9 100644 --- a/source/Trek-12/Trek-12/AppShell.xaml.cs +++ b/source/Trek-12/Trek-12/AppShell.xaml.cs @@ -1,10 +1,21 @@ -namespace Trek_12 +using Trek_12.Views; + +namespace Trek_12 { + /// + /// Class for the route of the views and the navigation of the app. + /// public partial class AppShell : Shell { public AppShell() { InitializeComponent(); + + Routing.RegisterRoute(nameof(PageMenuPrincipal), typeof(PageMenuPrincipal)); + Routing.RegisterRoute(nameof(PageProfils), typeof(PageProfils)); + Routing.RegisterRoute(nameof(PageSelectMap), typeof(PageSelectMap)); + Routing.RegisterRoute(nameof(PageRegles), typeof(PageRegles)); + Routing.RegisterRoute(nameof(PageLeaderBoard), typeof(PageLeaderBoard)); } } } From 57b4eba7fe99c212882759ddf5f0c7f84d6072fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 11:16:05 +0200 Subject: [PATCH 02/13] Ajout des routes pour la navigation --- source/Trek-12/Trek-12/AppShell.xaml.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/source/Trek-12/Trek-12/AppShell.xaml.cs b/source/Trek-12/Trek-12/AppShell.xaml.cs index ad8d368..529cbe9 100644 --- a/source/Trek-12/Trek-12/AppShell.xaml.cs +++ b/source/Trek-12/Trek-12/AppShell.xaml.cs @@ -1,10 +1,21 @@ -namespace Trek_12 +using Trek_12.Views; + +namespace Trek_12 { + /// + /// Class for the route of the views and the navigation of the app. + /// public partial class AppShell : Shell { public AppShell() { InitializeComponent(); + + Routing.RegisterRoute(nameof(PageMenuPrincipal), typeof(PageMenuPrincipal)); + Routing.RegisterRoute(nameof(PageProfils), typeof(PageProfils)); + Routing.RegisterRoute(nameof(PageSelectMap), typeof(PageSelectMap)); + Routing.RegisterRoute(nameof(PageRegles), typeof(PageRegles)); + Routing.RegisterRoute(nameof(PageLeaderBoard), typeof(PageLeaderBoard)); } } } From ac794f5c168255b3d2f930881ec43d19fd844a60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 21:50:24 +0200 Subject: [PATCH 03/13] =?UTF-8?q?=E2=9D=97=20Passage=20en=20ObservableColl?= =?UTF-8?q?ection=20et=20changement=20du=20chemin=20d'acc=C3=A8s=20de=20la?= =?UTF-8?q?=20persistance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Trek-12/DataContractPersistence/DataContractJson.cs | 7 ++++--- source/Trek-12/DataContractPersistence/DataContractXml.cs | 7 ++++--- source/Trek-12/DataContractPersistence/DataToPersist.cs | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/source/Trek-12/DataContractPersistence/DataContractJson.cs b/source/Trek-12/DataContractPersistence/DataContractJson.cs index 83f745a..2307f82 100644 --- a/source/Trek-12/DataContractPersistence/DataContractJson.cs +++ b/source/Trek-12/DataContractPersistence/DataContractJson.cs @@ -26,13 +26,13 @@ namespace DataContractPersistence /// /// Path (relative to the project) /// - public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); + public string FilePath { get; set; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Trek_12"); /// /// Load all the data from JSON file /// /// A tuple with the lists of players, games, maps and best scores - public (List, List, List, List) LoadData() + public (ObservableCollection, ObservableCollection, ObservableCollection, ObservableCollection) LoadData() { var JsonSerializer = new DataContractJsonSerializer(typeof(DataToPersist)); DataToPersist? data = new DataToPersist(); @@ -52,8 +52,9 @@ namespace DataContractPersistence /// /// /// - public void SaveData(List players, List games, List maps, List bestScores) + public void SaveData(ObservableCollection players, ObservableCollection games, ObservableCollection maps, ObservableCollection bestScores) { + Debug.WriteLine("Saving data at " + Path.Combine(FilePath, FileName)); if (!Directory.Exists(FilePath)) { Debug.WriteLine("Directory created"); diff --git a/source/Trek-12/DataContractPersistence/DataContractXml.cs b/source/Trek-12/DataContractPersistence/DataContractXml.cs index e09489d..8255ecc 100644 --- a/source/Trek-12/DataContractPersistence/DataContractXml.cs +++ b/source/Trek-12/DataContractPersistence/DataContractXml.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; using System.Text; @@ -23,13 +24,13 @@ namespace DataContractPersistence /// /// Path (relative to the project) /// - public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); + public string FilePath { get; set; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Trek_12"); /// /// Load all the data from XML file /// /// A tuple with the lists of players, games, maps and best scores - public (List, List, List, List) LoadData() + public (ObservableCollection, ObservableCollection, ObservableCollection, ObservableCollection) LoadData() { var serializer = new DataContractSerializer(typeof(DataToPersist)); DataToPersist? data = new DataToPersist(); @@ -49,7 +50,7 @@ namespace DataContractPersistence /// /// /// - public void SaveData(List players, List games, List maps, List bestScores) + public void SaveData(ObservableCollection players, ObservableCollection games, ObservableCollection maps, ObservableCollection bestScores) { if(!Directory.Exists(FilePath)) { diff --git a/source/Trek-12/DataContractPersistence/DataToPersist.cs b/source/Trek-12/DataContractPersistence/DataToPersist.cs index 8aca714..b78b204 100644 --- a/source/Trek-12/DataContractPersistence/DataToPersist.cs +++ b/source/Trek-12/DataContractPersistence/DataToPersist.cs @@ -8,21 +8,21 @@ namespace DataContractPersistence /// /// List of players /// - public List Players { get; set; } + public ObservableCollection Players { get; set; } /// /// List of games (with all the data in it to be able to recreate the game) /// - public List Games { get; set; } + public ObservableCollection Games { get; set; } /// /// List of maps with their boards /// - public List Maps { get; set; } + public ObservableCollection Maps { get; set; } /// /// List of best scores /// - public List BestScores { get; set; } + public ObservableCollection BestScores { get; set; } } } \ No newline at end of file From b913214afc5cb0d0523ae79f444fe5db19757cea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 21:52:19 +0200 Subject: [PATCH 04/13] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20Ajout=20d'une=20m?= =?UTF-8?q?=C3=A9thode=20r=C3=A9cup=C3=A9ration=20de=20l'image=20depuis=20?= =?UTF-8?q?la=20chaine=20convertie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Models/Game/Base64Converter.cs | 12 ++++++++++++ source/Trek-12/Models/Interfaces/IImageConverter.cs | 11 ++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/source/Trek-12/Models/Game/Base64Converter.cs b/source/Trek-12/Models/Game/Base64Converter.cs index ea11bce..9d535d9 100644 --- a/source/Trek-12/Models/Game/Base64Converter.cs +++ b/source/Trek-12/Models/Game/Base64Converter.cs @@ -1,4 +1,5 @@ using System; +using Microsoft.Maui.Controls; using Models.Interfaces; namespace Models.Game @@ -25,5 +26,16 @@ namespace Models.Game byte[] imageBytes = File.ReadAllBytes(imagePath); return Convert.ToBase64String(imageBytes); } + + /// + /// Retrieve an image from a string encoded in base64 + /// + /// + /// + public ImageSource RetrieveImage(string imageString) + { + byte[] imageBytes = Convert.FromBase64String(imageString); + return ImageSource.FromStream(() => new MemoryStream(imageBytes)); + } } } diff --git a/source/Trek-12/Models/Interfaces/IImageConverter.cs b/source/Trek-12/Models/Interfaces/IImageConverter.cs index ec5f783..8d02931 100644 --- a/source/Trek-12/Models/Interfaces/IImageConverter.cs +++ b/source/Trek-12/Models/Interfaces/IImageConverter.cs @@ -1,4 +1,6 @@ -namespace Models.Interfaces +using Microsoft.Maui.Controls; + +namespace Models.Interfaces { /// /// Interface for image converters @@ -11,5 +13,12 @@ /// /// string ConvertImage(string imagePath); + + /// + /// Retrieve an image from a string encoded + /// + /// + /// + ImageSource RetrieveImage(string imageString); } } From b84558e54e54beba72f34070ee7b2fc499d0006b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 21:53:09 +0200 Subject: [PATCH 05/13] =?UTF-8?q?Modification=20de=20l'interface=20en=20co?= =?UTF-8?q?ns=C3=A9quence=20du=20passage=20en=20ObservableCollection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Models/Interfaces/IPersistence.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/Trek-12/Models/Interfaces/IPersistence.cs b/source/Trek-12/Models/Interfaces/IPersistence.cs index aada33b..fa0a645 100644 --- a/source/Trek-12/Models/Interfaces/IPersistence.cs +++ b/source/Trek-12/Models/Interfaces/IPersistence.cs @@ -1,11 +1,12 @@ using Models.Game; +using System.Collections.ObjectModel; namespace Models.Interfaces { public interface IPersistence { - (List, List, List, List) LoadData(); + (ObservableCollection, ObservableCollection, ObservableCollection, ObservableCollection) LoadData(); - void SaveData(List players, List games, List maps, List bestScores); + void SaveData(ObservableCollection players, ObservableCollection games, ObservableCollection maps, ObservableCollection bestScores); } } \ No newline at end of file From b06f729ffd9056abe99eb86dd8b10c44a2e4837c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 21:55:01 +0200 Subject: [PATCH 06/13] =?UTF-8?q?=E2=9D=97=20Impl=C3=A9mentation=20de=20l'?= =?UTF-8?q?interface=20INotifyPropertyChanged=20et=20des=20ObservableColle?= =?UTF-8?q?ction=20pour=20l'actualisation=20des=20vues=20et=20l'encapsulat?= =?UTF-8?q?ion.=20Ajout=20d'une=20m=C3=A9thode=20de=20recherche=20et=20sup?= =?UTF-8?q?pression=20d'un=20profil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Models/Game/Game.cs | 95 ++++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 11 deletions(-) diff --git a/source/Trek-12/Models/Game/Game.cs b/source/Trek-12/Models/Game/Game.cs index e80f6bc..9be37a2 100644 --- a/source/Trek-12/Models/Game/Game.cs +++ b/source/Trek-12/Models/Game/Game.cs @@ -1,7 +1,10 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; using System.Linq; +using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; @@ -16,16 +19,59 @@ namespace Models.Game /// The Game class represents a game session in the application. /// It contains all the necessary properties and methods to manage a game, including the game loop, dice rolling, and use of the game rules. /// - public class Game + public class Game : INotifyPropertyChanged { /* Persistence */ public IPersistence PersistenceManager { get; set; } /* List for the game and persistence */ - public List Players { get; set; } - public List Games { get; set; } - public List Maps { get; set; } - public List BestScores { get; set; } + private ObservableCollection _players; + + public ObservableCollection Players + { + get => _players; + set + { + _players = value; + OnPropertyChanged(nameof(Players)); + } + } + + private ObservableCollection _games; + + public ObservableCollection Games + { + get => _games; + set + { + _games = value; + OnPropertyChanged(nameof(Games)); + } + } + + private ObservableCollection _maps; + + public ObservableCollection Maps + { + get => _maps; + set + { + _maps = value; + OnPropertyChanged(nameof(Maps)); + } + } + + private ObservableCollection _bestScores; + + public ObservableCollection BestScores + { + get => _bestScores; + set + { + _bestScores = value; + OnPropertyChanged(nameof(BestScores)); + } + } private bool _isRunning; public bool IsRunning @@ -74,6 +120,17 @@ namespace Models.Game BestScores.Add(bestScore); } + public bool RemovePlayer(string playerName) + { + Player player = Players.FirstOrDefault(p => p.Pseudo == playerName); + if (player == null) + { + return false; + } + Players.Remove(player); + return true; + } + public void LoadData() { var data = PersistenceManager.LoadData(); @@ -101,10 +158,10 @@ namespace Models.Game { PersistenceManager = persistenceManager; - Players = new List(); - Games = new List(); - Maps = new List(); - BestScores = new List(); + Players = new ObservableCollection(); + Games = new ObservableCollection(); + Maps = new ObservableCollection(); + BestScores = new ObservableCollection(); GameRules = new Rules.Rules(); @@ -113,8 +170,10 @@ namespace Models.Game public Game() { - UsedMap = new Map("Map1"); - BestScores = new List(); + Players = new ObservableCollection(); + Games = new ObservableCollection(); + Maps = new ObservableCollection(); + BestScores = new ObservableCollection(); GameRules = new Rules.Rules(); @@ -351,5 +410,19 @@ namespace Models.Game return true; //BoardUpdated?.Invoke(this, EventArgs.Empty); } + + /// + /// Event raised when a property is changed to notify the view. + /// + public event PropertyChangedEventHandler? PropertyChanged; + + /// + /// Trigger the PropertyChanged event for a specific property. + /// + /// Name of the property that changed. + public virtual void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } } } From 6755dd03a1b325b352d377533014cc0d8f65a6c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 21:56:09 +0200 Subject: [PATCH 07/13] =?UTF-8?q?=E2=9E=96=20Retrait=20de=20la=20variable?= =?UTF-8?q?=20priv=C3=A9e=20et=20de=20l'interface=20INotifyPropertyChanged?= =?UTF-8?q?,=20inutile=20ici?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Models/Game/OperationCell.cs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/source/Trek-12/Models/Game/OperationCell.cs b/source/Trek-12/Models/Game/OperationCell.cs index 459f325..25ebbb1 100644 --- a/source/Trek-12/Models/Game/OperationCell.cs +++ b/source/Trek-12/Models/Game/OperationCell.cs @@ -7,20 +7,10 @@ namespace Models.Game /// public class OperationCell : Position { - - private bool isChecked; /// /// It tells if the operation is checked or not in the operation grid of the game. /// - public bool IsChecked - { - get => isChecked; - private set - { - isChecked = value; - OnPropertyChanged(nameof(IsChecked)); - } - } + public bool IsChecked { get; private set; } /// /// Constructor of the OperationCell class. From 312067c84f1957c68e2be5448668ce85de6fec57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 21:59:23 +0200 Subject: [PATCH 08/13] =?UTF-8?q?=E2=9E=95=20Ajout=20des=20balises=20de=20?= =?UTF-8?q?contrat=20de=20donn=C3=A9es,=20et=20initialisation=20de=20la=20?= =?UTF-8?q?date=20de=20cr=C3=A9ation=20du=20profil=20dans=20les=20construc?= =?UTF-8?q?teurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Models/Game/Player.cs | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/source/Trek-12/Models/Game/Player.cs b/source/Trek-12/Models/Game/Player.cs index 97940d4..791a056 100644 --- a/source/Trek-12/Models/Game/Player.cs +++ b/source/Trek-12/Models/Game/Player.cs @@ -1,5 +1,6 @@ using System.ComponentModel; using System.Runtime.CompilerServices; +using System.Runtime.Serialization; namespace Models.Game { @@ -7,19 +8,14 @@ namespace Models.Game /// /// Represents a player in the game. /// - public class Player : INotifyPropertyChanged + [DataContract] + public class Player { - - public event PropertyChangedEventHandler? PropertyChanged; - - void OnPropertyChanged([CallerMemberName] string propertyName = null) - => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - - /// /// It is he pseudo of the player. /// private string _pseudo; + [DataMember] public string Pseudo { get => _pseudo; @@ -28,24 +24,25 @@ namespace Models.Game if (_pseudo == value) return; _pseudo = value; - OnPropertyChanged(); } } - private int hairCount; /// /// It is the profile picture of the player. /// + [DataMember] public string ProfilePicture { get; private set; } /// /// It is the creation date of the player. /// + [DataMember] public string? CreationDate { get; private set; } /// /// It tells when was the last time the player played. /// + [DataMember] public string? LastPlayed { get; private set; } /// @@ -54,7 +51,8 @@ namespace Models.Game public Player() { Pseudo = "Player"; - ProfilePicture = "DefaultProfilePicture"; + ProfilePicture = "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"; + CreationDate = DateTime.Now.ToString("dd/MM/yyyy"); } /// @@ -62,10 +60,11 @@ namespace Models.Game /// /// The pseudo of the player. /// The profile picture of the player. - public Player(string pseudo, string profilePicture = "DefaultProfilePicture") + public Player(string pseudo, string profilePicture = "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") { Pseudo = pseudo; ProfilePicture = profilePicture; + CreationDate = DateTime.Now.ToString("dd/MM/yyyy"); } From a71a65ed1b5c6523e6c6f869528b92d7a575be11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 22:01:37 +0200 Subject: [PATCH 09/13] =?UTF-8?q?Retrait=20de=20l'impl=C3=A9mentation=20de?= =?UTF-8?q?=20l'interface=20de=20changement=20de=20propri=C3=A9t=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Models/Game/Position.cs | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/source/Trek-12/Models/Game/Position.cs b/source/Trek-12/Models/Game/Position.cs index d34ece5..980e80c 100644 --- a/source/Trek-12/Models/Game/Position.cs +++ b/source/Trek-12/Models/Game/Position.cs @@ -7,7 +7,7 @@ namespace Models.Game /// /// The Position (x,y) of a cell in the game. /// - public class Position : INotifyPropertyChanged + public class Position { /// /// The X coordinate. @@ -29,19 +29,5 @@ namespace Models.Game X = x; Y = y; } - - /// - /// Event raised when a property is changed to notify the view. - /// - public event PropertyChangedEventHandler PropertyChanged; - - /// - /// Trigger the PropertyChanged event for a specific property. - /// - /// Name of the property that changed. - protected virtual void OnPropertyChanged(string propertyName) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } } } \ No newline at end of file From c4cbcf282f1d7fba2a5a6c34f34961e5437a630a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 22:03:54 +0200 Subject: [PATCH 10/13] =?UTF-8?q?L=C3=A9g=C3=A8re=20modification=20(ajout?= =?UTF-8?q?=20d'oublies=20dans=20la=20g=C3=A9n=C3=A9ration=20auto)=20des?= =?UTF-8?q?=20inclusions=20dans=20le=20.csproj?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Models/Models.csproj | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/source/Trek-12/Models/Models.csproj b/source/Trek-12/Models/Models.csproj index 072e39c..cb4e0e3 100644 --- a/source/Trek-12/Models/Models.csproj +++ b/source/Trek-12/Models/Models.csproj @@ -8,6 +8,13 @@ + + + + + + + From 39fb86e8817d6da993e2062ad3d6ca44b6b696b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 22:05:44 +0200 Subject: [PATCH 11/13] =?UTF-8?q?=E2=80=BC=EF=B8=8F=20Ajout=20du=20n=C3=A9?= =?UTF-8?q?cessaire=20pour=20impl=C3=A9menter=20la=20persistance=20et=20so?= =?UTF-8?q?n=20management=20au=20sein=20de=20toute=20les=20autres=20vues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Trek-12/App.xaml.cs | 48 ++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/source/Trek-12/Trek-12/App.xaml.cs b/source/Trek-12/Trek-12/App.xaml.cs index 35a7a0c..2265b67 100644 --- a/source/Trek-12/Trek-12/App.xaml.cs +++ b/source/Trek-12/Trek-12/App.xaml.cs @@ -1,28 +1,58 @@ -using DataContractPersistence; +using System.Diagnostics; +using System.Runtime.Serialization.DataContracts; +using DataContractPersistence; using Models.Game; +using Models.Interfaces; namespace Trek_12 { public partial class App : Application { public string FileName { get; set; } = "data.json"; - - public string FilePath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory); + + public string FilePath { get; set; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Trek_12"); public Game Manager { get; private set; } - + public App() { InitializeComponent(); - - if(File.Exists(Path.Combine(FilePath, FileName))) + + Manager = new Game(new DataContractJson()); + + if (!Directory.Exists(FilePath)) + { + Directory.CreateDirectory(FilePath); + } + + //File.Delete(Path.Combine(FilePath, FileName)); + + string fullPath = Path.Combine(FilePath, FileName); + if (File.Exists(fullPath)) { - Manager = new Game(new DataContractJson()); + Debug.WriteLine("Data loaded from " + fullPath); + Manager.LoadData(); } - - Manager.LoadData(); + MainPage = new AppShell(); + + // If the MainPage is closed, we save the data + MainPage.Disappearing += (sender, e) => + { + Debug.WriteLine("Saving data..."); + Manager.SaveData(); + }; + + } + + /// + /// Save the data when the app is in background + /// + protected override void OnSleep() + { + Debug.WriteLine("Zzz Secure save..."); + Manager.SaveData(); } } } From 1bffc98af636887834081b776c1d57ec7af71ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20LAVERGNE?= Date: Mon, 3 Jun 2024 22:07:48 +0200 Subject: [PATCH 12/13] =?UTF-8?q?=E2=9D=97Impl=C3=A9mentation=20du=20Manag?= =?UTF-8?q?er=20Game=20de=20l'application=20dans=20la=20page,=20et=20refon?= =?UTF-8?q?te=20de=20l'ajout/suppression=20de=20Profils=20avec=20l'actuali?= =?UTF-8?q?sation=20et=20v=C3=A9rification=20automatique.=20BindingContext?= =?UTF-8?q?=20->=20Manager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/Trek-12/Trek-12/Views/pageProfils.xaml | 9 +++- .../Trek-12/Trek-12/Views/pageProfils.xaml.cs | 54 +++++++++++++------ 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/source/Trek-12/Trek-12/Views/pageProfils.xaml b/source/Trek-12/Trek-12/Views/pageProfils.xaml index ac1720c..6f33a7e 100644 --- a/source/Trek-12/Trek-12/Views/pageProfils.xaml +++ b/source/Trek-12/Trek-12/Views/pageProfils.xaml @@ -3,8 +3,15 @@ xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Trek_12.Views.PageProfils" xmlns:views="clr-namespace:Trek_12.Views.Components" + xmlns:game="clr-namespace:Models.Game;assembly=Models" Title="pageProfils"> + + + + + + @@ -14,7 +21,7 @@