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