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
7 changes: 6 additions & 1 deletion src/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ public override void Initialize()
AvaloniaXamlLoader.Load(this);

var pref = ViewModels.Preference.Instance;
pref.PropertyChanged += (_1, _2) =>
{
#pragma warning disable CS4014
pref.SaveAsync();
#pragma warning restore CS4014
};
SetLocale(pref.Locale);
SetTheme(pref.Theme, pref.ThemeOverrides);
SetFonts(pref.DefaultFontFamily, pref.MonospaceFontFamily, pref.OnlyUseMonoFontInEditor);
Expand Down Expand Up @@ -522,7 +528,6 @@ private void TryLaunchedAsNormal(IClassicDesktopStyleApplicationLifetime desktop
var pref = ViewModels.Preference.Instance;
if (pref.ShouldCheck4UpdateOnStartup())
{
pref.Save();
Check4Update();
}
}
Expand Down
41 changes: 40 additions & 1 deletion src/ViewModels/Preference.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;

using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;

namespace SourceGit.ViewModels
Expand Down Expand Up @@ -354,6 +356,9 @@ public void AddNode(RepositoryNode node, RepositoryNode to = null)

return string.Compare(l.Name, r.Name, StringComparison.Ordinal);
});
#pragma warning disable CS4014
SaveAsync();
#pragma warning restore CS4014
}

public RepositoryNode FindNode(string id)
Expand Down Expand Up @@ -398,6 +403,9 @@ public void MoveNode(RepositoryNode node, RepositoryNode to = null)
public void RemoveNode(RepositoryNode node)
{
RemoveNodeRecursive(node, RepositoryNodes);
#pragma warning disable CS4014
SaveAsync();
#pragma warning restore CS4014
}

public void SortByRenamedNode(RepositoryNode node)
Expand All @@ -410,14 +418,43 @@ public void SortByRenamedNode(RepositoryNode node)

return string.Compare(l.Name, r.Name, StringComparison.Ordinal);
});
#pragma warning disable CS4014
SaveAsync();
#pragma warning restore CS4014
}

public void Save()
{
lock (_saveCtsLock)
{
_saveCts.Cancel();
_saveCts = new CancellationTokenSource();
}
var data = JsonSerializer.Serialize(this, JsonCodeGen.Default.Preference);
File.WriteAllText(_savePath, data);
}

public async Task SaveAsync()
{
lock (_saveCtsLock)
{
_saveCts.Cancel();
_saveCts = new CancellationTokenSource();
}

try
{
await Task.Delay(3000, _saveCts.Token);
}
catch (TaskCanceledException)
{
return;
}

var data = JsonSerializer.Serialize(this, JsonCodeGen.Default.Preference);
await File.WriteAllTextAsync(_savePath, data);
}

private RepositoryNode FindNodeRecursive(string id, List<RepositoryNode> collection)
{
foreach (var node in collection)
Expand Down Expand Up @@ -468,6 +505,8 @@ private bool RemoveNodeRecursive(RepositoryNode node, List<RepositoryNode> colle
private static Preference _instance = null;
private static bool _isLoading = false;
private static readonly string _savePath = Path.Combine(Native.OS.DataDir, "preference.json");
private static CancellationTokenSource _saveCts = new();
private static readonly object _saveCtsLock = new();

private string _locale = "en_US";
private string _theme = "Default";
Expand Down
3 changes: 1 addition & 2 deletions src/Views/Preference.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ protected override void OnClosing(WindowClosingEventArgs e)

if (!GPGFormat.Value.Equals("ssh", StringComparison.Ordinal))
SetIfChanged(config, $"gpg.{GPGFormat.Value}.program", GPGExecutableFile);

base.OnClosing(e);
}

Expand Down Expand Up @@ -261,7 +261,6 @@ private void OnUseNativeWindowFrameChanged(object sender, RoutedEventArgs e)
if (sender is CheckBox box)
{
ViewModels.Preference.Instance.UseSystemWindowFrame = box.IsChecked == true;
ViewModels.Preference.Instance.Save();

var dialog = new ConfirmRestart();
App.OpenDialog(dialog);
Expand Down