From 676e5bb566fd796d9d023b1ccbdc751d8e0bb5c2 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sun, 12 Feb 2023 10:20:35 +0100 Subject: [PATCH] feat: add possibility to save and load settings to json --- .../Models/Filters/FilterProfile.cs | 4 +-- .../Models/Filters/FilterProfileEntry.cs | 2 +- .../Models/Filters/FilterProfiles.cs | 36 ++++++++++++++----- src/PacketLogger/PacketLogger.csproj | 1 + .../ViewModels/MainWindowViewModel.cs | 29 ++++++++++++++- src/PacketLogger/Views/MainWindow.axaml | 1 + 6 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/PacketLogger/Models/Filters/FilterProfile.cs b/src/PacketLogger/Models/Filters/FilterProfile.cs index d31c7bf..9a78262 100644 --- a/src/PacketLogger/Models/Filters/FilterProfile.cs +++ b/src/PacketLogger/Models/Filters/FilterProfile.cs @@ -41,10 +41,10 @@ public class FilterProfile : ObservableObject /// /// Gets or sets the receive filter entry. /// - public FilterProfileEntry RecvFilterEntry { get; } + public FilterProfileEntry RecvFilterEntry { get; set; } /// /// Gets or sets the send filter entry. /// - public FilterProfileEntry SendFilterEntry { get; } + public FilterProfileEntry SendFilterEntry { get; set; } } \ No newline at end of file diff --git a/src/PacketLogger/Models/Filters/FilterProfileEntry.cs b/src/PacketLogger/Models/Filters/FilterProfileEntry.cs index 562d435..a64ceb5 100644 --- a/src/PacketLogger/Models/Filters/FilterProfileEntry.cs +++ b/src/PacketLogger/Models/Filters/FilterProfileEntry.cs @@ -36,5 +36,5 @@ public class FilterProfileEntry : ObservableObject /// /// Gets or sets the filters list. /// - public ObservableCollection Filters { get; } + public ObservableCollection Filters { get; set; } } \ No newline at end of file diff --git a/src/PacketLogger/Models/Filters/FilterProfiles.cs b/src/PacketLogger/Models/Filters/FilterProfiles.cs index 81d834c..f2c1ed4 100644 --- a/src/PacketLogger/Models/Filters/FilterProfiles.cs +++ b/src/PacketLogger/Models/Filters/FilterProfiles.cs @@ -5,6 +5,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System.Collections.ObjectModel; +using System.Linq; using System.Reactive.Linq; namespace PacketLogger.Models.Filters; @@ -14,6 +15,7 @@ namespace PacketLogger.Models.Filters; /// public class FilterProfiles { + private ObservableCollection _allProfiles; private bool _defaultFilterEnabled; /// @@ -26,15 +28,18 @@ public class FilterProfiles Name = "Default" }; - AllProfiles = new ObservableCollection(); + _allProfiles = new ObservableCollection(); SelectableProfiles = new ObservableCollection(); - SelectableProfiles.Add(NoProfile = new FilterProfile(false) - { - Name = "No profile" - }); + SelectableProfiles.Add + ( + NoProfile = new FilterProfile(false) + { + Name = "No profile" + } + ); - AllProfiles.Add(DefaultProfile); + _allProfiles.Add(DefaultProfile); } /// @@ -61,7 +66,7 @@ public class FilterProfiles /// /// Gets or sets the default filter. /// - public FilterProfile DefaultProfile { get; } + public FilterProfile DefaultProfile { get; private set; } /// /// Gets or sets the collection of profiles. @@ -71,12 +76,25 @@ public class FilterProfiles /// /// Gets or sets the collection of profiles. /// - public ObservableCollection AllProfiles { get; } + public ObservableCollection AllProfiles + { + get => _allProfiles; + set + { + if (value.Count < 1) + { + return; + } + + DefaultProfile = value.First(); + _allProfiles = value; + } + } /// /// Gets or sets the profile used as no profile. /// - public FilterProfile NoProfile { get; set; } + public FilterProfile NoProfile { get; private set; } /// /// Add the given profile. diff --git a/src/PacketLogger/PacketLogger.csproj b/src/PacketLogger/PacketLogger.csproj index 8a434a5..5eebf94 100644 --- a/src/PacketLogger/PacketLogger.csproj +++ b/src/PacketLogger/PacketLogger.csproj @@ -42,6 +42,7 @@ All + diff --git a/src/PacketLogger/ViewModels/MainWindowViewModel.cs b/src/PacketLogger/ViewModels/MainWindowViewModel.cs index fe85e6d..c06e270 100644 --- a/src/PacketLogger/ViewModels/MainWindowViewModel.cs +++ b/src/PacketLogger/ViewModels/MainWindowViewModel.cs @@ -14,6 +14,7 @@ using System.Reactive; using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Reflection; +using System.Text.Json; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; @@ -45,9 +46,21 @@ public class MainWindowViewModel : ViewModelBase /// public MainWindowViewModel() { + var filterProfiles = new FilterProfiles(); + if (Path.Exists("settings.json")) + { + using var file = File.OpenRead("settings.json"); + var deserialized = JsonSerializer.Deserialize(file); + + if (deserialized is not null) + { + filterProfiles = deserialized; + } + } + var services = new ServiceCollection() .AddLogging(b => b.ClearProviders().AddConsole()) - .AddSingleton() + .AddSingleton(_ => filterProfiles) .AddSingleton() .AddSingleton() .AddSingleton>(_ => Providers) @@ -165,6 +178,15 @@ public class MainWindowViewModel : ViewModelBase } ); + SaveSettings = ReactiveCommand.CreateFromTask + ( + async () => + { + using var file = File.Open("settings.json", FileMode.Create); + await JsonSerializer.SerializeAsync(file, filterProfiles); + } + ); + OpenFile = ReactiveCommand.Create (() => _factory.CreateLoadedDocument(doc => doc.OpenFile.Execute(Unit.Default))); @@ -246,4 +268,9 @@ public class MainWindowViewModel : ViewModelBase /// Gets the command used for opening settings. /// public ReactiveCommand OpenSettings { get; } + + /// + /// Gets the command used for saving settings. + /// + public ReactiveCommand SaveSettings { get; } } \ No newline at end of file diff --git a/src/PacketLogger/Views/MainWindow.axaml b/src/PacketLogger/Views/MainWindow.axaml index 868efa0..4a86436 100644 --- a/src/PacketLogger/Views/MainWindow.axaml +++ b/src/PacketLogger/Views/MainWindow.axaml @@ -41,6 +41,7 @@ + -- 2.48.1