diff --git a/Directory.Packages.props b/Directory.Packages.props
index a52f98e..72e848e 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -19,6 +19,8 @@
+
+
diff --git a/Progrart.Browser/Program.cs b/Progrart.Browser/Program.cs
index d3e9bc1..959fcf0 100644
--- a/Progrart.Browser/Program.cs
+++ b/Progrart.Browser/Program.cs
@@ -1,15 +1,19 @@
-using System.Runtime.Versioning;
-using System.Threading.Tasks;
-using Avalonia;
+using Avalonia;
using Avalonia.Browser;
using Progrart;
+using Progrart.Browser.Settings;
+using System.Threading.Tasks;
internal sealed partial class Program
{
- private static Task Main(string[] args) => BuildAvaloniaApp()
- .WithInterFont()
- .StartBrowserAppAsync("out");
+ private static Task Main(string[] args)
+ {
+ App.SettingsProvider=new BrowserSettingsProvider();
+ return BuildAvaloniaApp()
+ .WithInterFont()
+ .StartBrowserAppAsync("out");
+ }
- public static AppBuilder BuildAvaloniaApp()
+ public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure();
}
\ No newline at end of file
diff --git a/Progrart.Browser/Settings/BrowserSettingsProvider.cs b/Progrart.Browser/Settings/BrowserSettingsProvider.cs
new file mode 100644
index 0000000..df0c837
--- /dev/null
+++ b/Progrart.Browser/Settings/BrowserSettingsProvider.cs
@@ -0,0 +1,29 @@
+using Progrart.Core.Settings;
+using System.Runtime.InteropServices.JavaScript;
+using System.Text.Json;
+
+namespace Progrart.Browser.Settings
+{
+ public partial class BrowserSettingsProvider : ISettingsProvider
+ {
+ private SerializeContext context=new SerializeContext();
+ [JSImport("globalThis.localStorage.setItem")]
+ private static partial void SetItem(string key, string value);
+
+ [JSImport("globalThis.localStorage.getItem")]
+ private static partial string GetItem(string key);
+ public AppConfig LoadSettings()
+ {
+ var json = GetItem("progrart.settings");
+ return json != null
+ ? JsonSerializer.Deserialize(json,context.AppConfig)??new AppConfig()
+ : new AppConfig();
+ }
+
+ public void SaveSettings(AppConfig config)
+ {
+ var json = JsonSerializer.Serialize(config,context.AppConfig)??"";
+ SetItem("progrart.settings", json);
+ }
+ }
+}
diff --git a/Progrart/App.axaml.cs b/Progrart/App.axaml.cs
index 0e6ed25..f2bfb1d 100644
--- a/Progrart/App.axaml.cs
+++ b/Progrart/App.axaml.cs
@@ -2,14 +2,16 @@ using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Data.Core;
using Avalonia.Data.Core.Plugins;
-using System.Linq;
using Avalonia.Markup.Xaml;
-using Progrart.Views;
+using Avalonia.Platform.Storage;
+using Microsoft.Extensions.Configuration;
+using Progrart.Core.ProjectSystem;
+using Progrart.Core.Settings;
using Progrart.Icons;
using Progrart.Pages;
-using Avalonia.Platform.Storage;
+using Progrart.Views;
using System;
-using Progrart.Core.ProjectSystem;
+using System.Linq;
namespace Progrart;
@@ -19,6 +21,7 @@ public partial class App : Application
public static IStorageFolder? CurrentOpenFolder = null;
public static Project? LoadedProject = null;
internal static Action? ProjectLoadHandler = null;
+ public static ISettingsProvider? SettingsProvider = null;
public static void ProjectLoad()
{
ProjectLoadHandler?.Invoke();
@@ -27,7 +30,6 @@ public partial class App : Application
{
AvaloniaXamlLoader.Load(this);
}
-
public override void OnFrameworkInitializationCompleted()
{
IconProvider.Register(new DefaultIconProvider());
@@ -53,6 +55,10 @@ public partial class App : Application
EditorProvider.BindFileType("jpg", "image");
EditorProvider.BindFileType("progrart-project", "project");
EditorProvider.BindFileType("wd", "console");
+ if (!OperatingSystem.IsBrowser())
+ {
+ App.SettingsProvider = new ClassicSettingsProvider();
+ }
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
// Avoid duplicate validations from both Avalonia and the CommunityToolkit.
diff --git a/Progrart/Core/Settings/ClassicSettingsProvider.cs b/Progrart/Core/Settings/ClassicSettingsProvider.cs
new file mode 100644
index 0000000..401fa20
--- /dev/null
+++ b/Progrart/Core/Settings/ClassicSettingsProvider.cs
@@ -0,0 +1,33 @@
+using System;
+using System.IO;
+using System.Text.Json;
+
+namespace Progrart.Core.Settings
+{
+ public class ClassicSettingsProvider : ISettingsProvider
+ {
+ private readonly string _filePath;
+ private SerializeContext context = new SerializeContext();
+ public ClassicSettingsProvider()
+ {
+ var folder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
+ var appFolder = Path.Combine(folder, "Progrart");
+ Directory.CreateDirectory(appFolder);
+ _filePath = Path.Combine(appFolder, "settings.json");
+ }
+
+ public void SaveSettings(AppConfig settings)
+ {
+ var json = JsonSerializer.Serialize(settings, context.AppConfig);
+ File.WriteAllText(_filePath, json);
+ }
+
+ public AppConfig LoadSettings()
+ {
+ if (!File.Exists(_filePath)) return new AppConfig();
+
+ var json = File.ReadAllText(_filePath);
+ return JsonSerializer.Deserialize(json, context.AppConfig) ?? new AppConfig();
+ }
+ }
+}
diff --git a/Progrart/Core/Settings/ISettingsProvider.cs b/Progrart/Core/Settings/ISettingsProvider.cs
new file mode 100644
index 0000000..802f7df
--- /dev/null
+++ b/Progrart/Core/Settings/ISettingsProvider.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Text.Json.Serialization;
+
+namespace Progrart.Core.Settings
+{
+ public interface ISettingsProvider
+ {
+ void SaveSettings(AppConfig config);
+ AppConfig LoadSettings();
+ }
+ [Serializable]
+ public class AppConfig
+ {
+ public bool useParallelBuild { get; set; }
+ public int JobCount { get; set; }
+ }
+ [JsonSerializable(typeof(AppConfig))]
+ public partial class SerializeContext : JsonSerializerContext
+ {
+
+ }
+}
diff --git a/Progrart/Pages/SettingsPage.axaml b/Progrart/Pages/SettingsPage.axaml
new file mode 100644
index 0000000..806b9d2
--- /dev/null
+++ b/Progrart/Pages/SettingsPage.axaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use Parallel Building
+
+
+
+
+
+
+
+
+
diff --git a/Progrart/Pages/SettingsPage.axaml.cs b/Progrart/Pages/SettingsPage.axaml.cs
new file mode 100644
index 0000000..bc6637a
--- /dev/null
+++ b/Progrart/Pages/SettingsPage.axaml.cs
@@ -0,0 +1,51 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Microsoft.Extensions.Configuration;
+using Progrart.Controls.TabSystem;
+using Progrart.Core.Settings;
+
+namespace Progrart.Pages;
+
+public partial class SettingsPage : UserControl, ITabPage
+{
+ public SettingsPage()
+ {
+ InitializeComponent();
+ if ((App.SettingsProvider) != null)
+ {
+ var settings = App.SettingsProvider.LoadSettings();
+ {
+ useParallelBuilding.IsChecked = settings.useParallelBuild;
+ JobCont.Value = settings.JobCount;
+ }
+ }
+ }
+
+ public void BindButton(TabButton button)
+ {
+ button.Title = "Settings";
+ }
+
+ public bool IsModified()
+ {
+ return false;
+ }
+
+ public void SetHost(TabHost host)
+ {
+ }
+
+
+ private void SaveSettings_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
+ {
+ if (App.SettingsProvider is null) return;
+
+ AppConfig config = new AppConfig()
+ {
+ useParallelBuild = useParallelBuilding.IsChecked ?? false,
+ JobCount = (int)(JobCont.Value ?? -1)
+ };
+ App.SettingsProvider.SaveSettings(config);
+ }
+}
\ No newline at end of file
diff --git a/Progrart/Progrart.csproj b/Progrart/Progrart.csproj
index e70eee8..3c1a6bc 100644
--- a/Progrart/Progrart.csproj
+++ b/Progrart/Progrart.csproj
@@ -28,6 +28,8 @@
+
+
diff --git a/Progrart/Views/MainView.axaml b/Progrart/Views/MainView.axaml
index e59f25c..9dbe4a5 100644
--- a/Progrart/Views/MainView.axaml
+++ b/Progrart/Views/MainView.axaml
@@ -50,7 +50,7 @@
diff --git a/Progrart/Views/MainView.axaml.cs b/Progrart/Views/MainView.axaml.cs
index 4c4c4a0..bbaa7d3 100644
--- a/Progrart/Views/MainView.axaml.cs
+++ b/Progrart/Views/MainView.axaml.cs
@@ -2,12 +2,14 @@ using Acornima.Ast;
using Avalonia.Controls;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
+using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using Progrart.Commands;
using Progrart.Controls;
using Progrart.Core;
using Progrart.Core.JSExecution;
using Progrart.Core.ProjectSystem;
+using Progrart.Core.Settings;
using Progrart.Core.Storage;
using Progrart.Pages;
using System;
@@ -248,7 +250,7 @@ public partial class MainView : UserControl
int max = config.Items.Count;
ProgressGrid.IsVisible = true;
MainProgress.Value = sum;
- MainProgress.Maximum= max;
+ MainProgress.Maximum = max;
builder.OnProgressUpdate = (a, b) =>
{
Interlocked.Increment(ref sum);
@@ -257,14 +259,22 @@ public partial class MainView : UserControl
MainProgress.Value = sum;
});
};
- builder.OnCompleted= () =>
+ builder.OnCompleted = () =>
{
Dispatcher.UIThread.Invoke(() =>
{
ProgressGrid.IsVisible = false;
});
};
- Task.Run(async () => await builder.Build(name, -1));
+ AppConfig app_config = new AppConfig();
+ if (App.SettingsProvider != null)
+ app_config = App.SettingsProvider.LoadSettings();
+ Task.Run(async () => await builder.Build(name, app_config.useParallelBuild == false ? 1 : app_config.JobCount));
}
}
+
+ private void SettingsMenuItem_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
+ {
+ MainTabHost.AddPage(new SettingsPage());
+ }
}
\ No newline at end of file