add appstate

This commit is contained in:
Matt Parker
2025-10-01 19:47:47 +10:00
parent 8a0dd9109e
commit 4651c8012c
6 changed files with 74 additions and 9 deletions

View File

@@ -0,0 +1,19 @@
namespace SharpIDE.Godot.Features.IdeSettings;
public class AppState
{
public string? LastOpenSolutionFilePath { get; set; }
public IdeSettings IdeSettings { get; set; } = new IdeSettings();
public List<PreviouslyOpenedSln> PreviouslyOpenedSolutions { get; set; } = [];
}
public class IdeSettings
{
public bool AutoOpenLastSolution { get; set; }
}
public class PreviouslyOpenedSln
{
public required string Name { get; set; }
public required string FilePath { get; set; }
}

View File

@@ -0,0 +1 @@
uid://ccsfv10f1lhxd

View File

@@ -0,0 +1,39 @@
using System.Text.Json;
using Ardalis.GuardClauses;
namespace SharpIDE.Godot.Features.IdeSettings;
public static class AppStateLoader
{
private static string GetConfigFilePath()
{
var folder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
var configFolder = Path.Combine(folder, "SharpIDE");
Directory.CreateDirectory(configFolder);
var configFilePath = Path.Combine(configFolder, "sharpIde.json");
return configFilePath;
}
public static AppState LoadAppStateFromConfigFile()
{
var configFilePath = GetConfigFilePath();
if (File.Exists(configFilePath) is false)
{
File.WriteAllText(configFilePath, "{}");
}
using var stream = File.OpenRead(configFilePath);
var deserializedAppState = JsonSerializer.Deserialize<AppState>(stream);
Guard.Against.Null(deserializedAppState, nameof(deserializedAppState));
return deserializedAppState;
}
public static void SaveAppStateToConfigFile(AppState appState)
{
var configFilePath = GetConfigFilePath();
using var stream = File.Create(configFilePath);
JsonSerializer.Serialize(stream, appState);
stream.Flush();
}
}

View File

@@ -0,0 +1 @@
uid://dnu6x5m37dapi

View File

@@ -2,6 +2,7 @@ using Godot;
using Microsoft.Build.Locator;
using Microsoft.Extensions.Hosting;
using SharpIDE.Application.Features.Events;
using SharpIDE.Godot.Features.IdeSettings;
using SharpIDE.Godot.Features.SlnPicker;
namespace SharpIDE.Godot;
@@ -25,19 +26,21 @@ public partial class IdeWindow : Control
ResourceLoader.LoadThreadedRequest(IdeRootScenePath);
MSBuildLocator.RegisterDefaults();
GodotServiceDefaults.AddServiceDefaults();
Singletons.AppState = AppStateLoader.LoadAppStateFromConfigFile();
//GetWindow().SetMinSize(new Vector2I(1152, 648));
Callable.From(() => PickSolution(true)).CallDeferred();
}
// public override void _ExitTree()
// {
// GodotGlobalEvents.Instance = null!;
// GlobalEvents.Instance = null!;
// GC.Collect();
// GC.WaitForPendingFinalizers();
// GC.Collect();
// PrintOrphanNodes();
// }
public override void _ExitTree()
{
AppStateLoader.SaveAppStateToConfigFile(Singletons.AppState);
// GodotGlobalEvents.Instance = null!;
// GlobalEvents.Instance = null!;
// GC.Collect();
// GC.WaitForPendingFinalizers();
// GC.Collect();
// PrintOrphanNodes();
}
public void PickSolution(bool fullscreen = false)
{

View File

@@ -1,5 +1,6 @@
using SharpIDE.Application.Features.Build;
using SharpIDE.Application.Features.Run;
using SharpIDE.Godot.Features.IdeSettings;
namespace SharpIDE.Godot;
@@ -7,4 +8,5 @@ public static class Singletons
{
public static RunService RunService { get; } = new RunService();
public static BuildService BuildService { get; } = new BuildService();
public static AppState AppState { get; set; } = null!;
}