Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 18 additions & 10 deletions WheelWizard/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,31 @@ public class Program
[STAThread]
public static void Main(string[] args)
{
Setup();

// Make sure this is the first action on startup!
SetupWorkingDirectory();
// Start the application
BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
}

private static ServiceProvider BuildServiceProvider()
{
var services = new ServiceCollection();
services.AddWheelWizardServices();

var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}

// Avalonia configuration, don't remove; also used by visual designer.
// ReSharper disable once MemberCanBePrivate.Global
public static AppBuilder BuildAvaloniaApp()
=> ConfigureAvaloniaApp(AppBuilder.Configure<App>()
.UsePlatformDetect()
.WithInterFont()
);
.WithInterFont());

private static AppBuilder ConfigureAvaloniaApp(AppBuilder builder)
{
var services = new ServiceCollection();
services.AddWheelWizardServices();

var serviceProvider = services.BuildServiceProvider();

var serviceProvider = BuildServiceProvider();
// Write startup message
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
LogPlatformInformation(logger);
Expand All @@ -51,6 +55,11 @@ private static AppBuilder ConfigureAvaloniaApp(AppBuilder builder)

// Set the service provider in the application instance
app.SetServiceProvider(serviceProvider);

// Make sure this comes AFTER setting the service provider
// of the `App` instance! Otherwise, things like logging will not work
// in `Setup`.
Setup();
Comment thread
matellush marked this conversation as resolved.
});

return builder;
Expand Down Expand Up @@ -89,7 +98,6 @@ private static void SetupWorkingDirectory()

private static void Setup()
{
SetupWorkingDirectory();
SettingsManager.Instance.LoadSettings();
UrlProtocolManager.SetWhWzScheme();
}
Expand Down
51 changes: 30 additions & 21 deletions WheelWizard/Services/Settings/WhWzSettingManager.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using Microsoft.Extensions.Logging;
using System.Text.Json;
using WheelWizard.Helpers;
using WheelWizard.Models.Settings;
using WheelWizard.Views;
using JsonElement = System.Text.Json.JsonElement;
using JsonSerializerOptions = System.Text.Json.JsonSerializerOptions;

Expand All @@ -10,55 +12,62 @@ public class WhWzSettingManager
{
private bool _loaded;
private readonly Dictionary<string, WhWzSetting> _settings = new();

public static WhWzSettingManager Instance { get; } = new();
private WhWzSettingManager() { }

public void RegisterSetting(WhWzSetting setting)
{
if (_loaded)
if (_loaded)
return;

_settings.Add(setting.Name, setting);
}

public void SaveSettings(WhWzSetting invokingSetting)
{
if (!_loaded)
if (!_loaded)
return;

var settingsToSave = new Dictionary<string, object?>();

foreach (var (name, setting) in _settings)
{
settingsToSave[name] = setting.Get();
}
var jsonString = JsonSerializer.Serialize(settingsToSave, new JsonSerializerOptions { WriteIndented = true });
FileHelper.WriteAllTextSafe(PathManager.WheelWizardConfigFilePath, jsonString);
}

public void LoadSettings()
{
if (_loaded)
if (_loaded)
return;

_loaded = true;
// even if it will now return early, that means its still done loading since then there is nothing to load
var jsonString = FileHelper.ReadAllTextSafe(PathManager.WheelWizardConfigFilePath);
if (jsonString == null)
return;
jsonString.Trim('\0');

var loadedSettings = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(jsonString);
if (loadedSettings == null)
return;

foreach (var kvp in loadedSettings)

try
{
var loadedSettings = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(jsonString);
if (loadedSettings == null)
return;

foreach (var kvp in loadedSettings)
{
if (!_settings.TryGetValue(kvp.Key, out var setting))
continue;

setting.SetFromJson(kvp.Value);
}
}
catch (JsonException e)
{
if (!_settings.TryGetValue(kvp.Key, out var setting))
continue;

setting.SetFromJson(kvp.Value);
App.Services.GetRequiredService<ILogger<WhWzSettingManager>>()
.LogError(e, "Failed to deserialize the JSON config");
}
}
}