M src/PacketLogger/Models/Filters/FilterProfile.cs => src/PacketLogger/Models/Filters/FilterProfile.cs +2 -2
@@ 41,10 41,10 @@ public class FilterProfile : ObservableObject
/// <summary>
/// Gets or sets the receive filter entry.
/// </summary>
- public FilterProfileEntry RecvFilterEntry { get; }
+ public FilterProfileEntry RecvFilterEntry { get; set; }
/// <summary>
/// Gets or sets the send filter entry.
/// </summary>
- public FilterProfileEntry SendFilterEntry { get; }
+ public FilterProfileEntry SendFilterEntry { get; set; }
}=
\ No newline at end of file
M src/PacketLogger/Models/Filters/FilterProfileEntry.cs => src/PacketLogger/Models/Filters/FilterProfileEntry.cs +1 -1
@@ 36,5 36,5 @@ public class FilterProfileEntry : ObservableObject
/// <summary>
/// Gets or sets the filters list.
/// </summary>
- public ObservableCollection<FilterCreator.FilterData> Filters { get; }
+ public ObservableCollection<FilterCreator.FilterData> Filters { get; set; }
}=
\ No newline at end of file
M src/PacketLogger/Models/Filters/FilterProfiles.cs => src/PacketLogger/Models/Filters/FilterProfiles.cs +27 -9
@@ 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;
/// </summary>
public class FilterProfiles
{
+ private ObservableCollection<FilterProfile> _allProfiles;
private bool _defaultFilterEnabled;
/// <summary>
@@ 26,15 28,18 @@ public class FilterProfiles
Name = "Default"
};
- AllProfiles = new ObservableCollection<FilterProfile>();
+ _allProfiles = new ObservableCollection<FilterProfile>();
SelectableProfiles = new ObservableCollection<FilterProfile>();
- SelectableProfiles.Add(NoProfile = new FilterProfile(false)
- {
- Name = "No profile"
- });
+ SelectableProfiles.Add
+ (
+ NoProfile = new FilterProfile(false)
+ {
+ Name = "No profile"
+ }
+ );
- AllProfiles.Add(DefaultProfile);
+ _allProfiles.Add(DefaultProfile);
}
/// <summary>
@@ 61,7 66,7 @@ public class FilterProfiles
/// <summary>
/// Gets or sets the default filter.
/// </summary>
- public FilterProfile DefaultProfile { get; }
+ public FilterProfile DefaultProfile { get; private set; }
/// <summary>
/// Gets or sets the collection of profiles.
@@ 71,12 76,25 @@ public class FilterProfiles
/// <summary>
/// Gets or sets the collection of profiles.
/// </summary>
- public ObservableCollection<FilterProfile> AllProfiles { get; }
+ public ObservableCollection<FilterProfile> AllProfiles
+ {
+ get => _allProfiles;
+ set
+ {
+ if (value.Count < 1)
+ {
+ return;
+ }
+
+ DefaultProfile = value.First();
+ _allProfiles = value;
+ }
+ }
/// <summary>
/// Gets or sets the profile used as no profile.
/// </summary>
- public FilterProfile NoProfile { get; set; }
+ public FilterProfile NoProfile { get; private set; }
/// <summary>
/// Add the given profile.
M src/PacketLogger/PacketLogger.csproj => src/PacketLogger/PacketLogger.csproj +1 -0
@@ 42,6 42,7 @@
<PrivateAssets>All</PrivateAssets>
</PackageReference>
<PackageReference Include="Remora.Results" Version="7.2.3" />
+ <PackageReference Include="System.Text.Json" Version="7.0.1" />
<PackageReference Include="XamlNameReferenceGenerator" Version="1.5.1" />
</ItemGroup>
M src/PacketLogger/ViewModels/MainWindowViewModel.cs => src/PacketLogger/ViewModels/MainWindowViewModel.cs +28 -1
@@ 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
/// </summary>
public MainWindowViewModel()
{
+ var filterProfiles = new FilterProfiles();
+ if (Path.Exists("settings.json"))
+ {
+ using var file = File.OpenRead("settings.json");
+ var deserialized = JsonSerializer.Deserialize<FilterProfiles>(file);
+
+ if (deserialized is not null)
+ {
+ filterProfiles = deserialized;
+ }
+ }
+
var services = new ServiceCollection()
.AddLogging(b => b.ClearProviders().AddConsole())
- .AddSingleton<FilterProfiles>()
+ .AddSingleton<FilterProfiles>(_ => filterProfiles)
.AddSingleton<DockFactory>()
.AddSingleton<NostaleProcesses>()
.AddSingleton<ObservableCollection<IPacketProvider>>(_ => 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.
/// </summary>
public ReactiveCommand<Unit, Unit> OpenSettings { get; }
+
+ /// <summary>
+ /// Gets the command used for saving settings.
+ /// </summary>
+ public ReactiveCommand<Unit, Unit> SaveSettings { get; }
}=
\ No newline at end of file
M src/PacketLogger/Views/MainWindow.axaml => src/PacketLogger/Views/MainWindow.axaml +1 -0
@@ 41,6 41,7 @@
<MenuItem Header="Save All As..." Command="{Binding SaveAll}" />
<Separator />
<MenuItem Header="Open Settings" Command="{Binding OpenSettings}" />
+ <MenuItem Header="Save Settings" Command="{Binding SaveSettings}" />
<MenuItem Header="Exit" Command="{Binding QuitApplication}" />
</MenuItem>
<MenuItem Header="_Tools">