Browse Source

Preferences wip

flabbet 1 year ago
parent
commit
2f1159bd33
74 changed files with 388 additions and 82 deletions
  1. 3 4
      samples/LocalizationSample/LocalizationSampleExtension.cs
  2. 1 1
      samples/LocalizationSample/Program.cs
  3. 11 0
      samples/PixiEditorExtensionSamples.sln
  4. 35 0
      samples/Preferences/Preferences.csproj
  5. 23 0
      samples/Preferences/PreferencesSampleExtension.cs
  6. 14 0
      samples/Preferences/Program.cs
  7. 27 0
      samples/Preferences/extension.json
  8. 1 1
      src/PixiEditor.AvaloniaUI/Helpers/ServiceCollectionHelpers.cs
  9. 1 1
      src/PixiEditor.AvaloniaUI/Models/ExceptionHandling/CrashReport.cs
  10. 1 1
      src/PixiEditor.AvaloniaUI/Models/Palettes/LocalPalettesFetcher.cs
  11. 1 1
      src/PixiEditor.AvaloniaUI/Models/Preferences/PreferencesSettings.cs
  12. 1 1
      src/PixiEditor.AvaloniaUI/Models/Services/NewsFeed/NewsProvider.cs
  13. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DebugViewModel.cs
  14. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DiscordViewModel.cs
  15. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/FileViewModel.cs
  16. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/StylusViewModel.cs
  17. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ToolsViewModel.cs
  18. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/UpdateViewModel.cs
  19. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/Tools/Tools/PenToolViewModel.cs
  20. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/UserPreferences/Settings/FileSettings.cs
  21. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/UserPreferences/Settings/GeneralSettings.cs
  22. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/UserPreferences/SettingsGroup.cs
  23. 1 1
      src/PixiEditor.AvaloniaUI/ViewModels/ViewModelMain.cs
  24. 1 1
      src/PixiEditor.AvaloniaUI/Views/Dialogs/Debugging/Localization/LocalizationDataContext.cs
  25. 1 1
      src/PixiEditor.AvaloniaUI/Views/Dialogs/NewFileDialog.cs
  26. 1 1
      src/PixiEditor.AvaloniaUI/Views/MainWindow.axaml.cs
  27. 1 1
      src/PixiEditor.AvaloniaUI/Views/Windows/HelloTherePopup.axaml.cs
  28. 1 1
      src/PixiEditor.AvaloniaUI/Views/Windows/PalettesBrowser.axaml.cs
  29. 4 0
      src/PixiEditor.Extensions.CommonApi/PixiEditor.Extensions.CommonApi.csproj
  30. 1 1
      src/PixiEditor.Extensions.CommonApi/UserPreferences/IPreferences.cs
  31. 1 1
      src/PixiEditor.Extensions.CommonApi/UserPreferences/PreferencesConstants.cs
  32. 3 1
      src/PixiEditor.Extensions.Wasm/Api/Localization/LocalizedString.cs
  33. 1 0
      src/PixiEditor.Extensions.Wasm/Api/Logging/Logger.cs
  34. 70 0
      src/PixiEditor.Extensions.Wasm/Api/UserPreferences/Preferences.cs
  35. 1 0
      src/PixiEditor.Extensions.Wasm/Api/Window/PopupWindow.cs
  36. 1 0
      src/PixiEditor.Extensions.Wasm/Api/Window/WindowProvider.cs
  37. 28 0
      src/PixiEditor.Extensions.Wasm/Bridge/Interop.cs
  38. 1 1
      src/PixiEditor.Extensions.Wasm/Bridge/Native.Async.cs
  39. 1 1
      src/PixiEditor.Extensions.Wasm/Bridge/Native.Localization.cs
  40. 25 0
      src/PixiEditor.Extensions.Wasm/Bridge/Native.Preferences.cs
  41. 1 2
      src/PixiEditor.Extensions.Wasm/Bridge/Native.Windowing.cs
  42. 1 2
      src/PixiEditor.Extensions.Wasm/Bridge/Native.cs
  43. 4 0
      src/PixiEditor.Extensions.Wasm/PixiEditorApi.cs
  44. BIN
      src/PixiEditor.Extensions.Wasm/build/PixiEditor.Api.CGlueMSBuild.dll
  45. BIN
      src/PixiEditor.Extensions.Wasm/build/win-x64/PixiEditor.Extensions.MSPackageBuilder.dll
  46. 1 1
      src/PixiEditor.Extensions.Wasm/native/interop.c
  47. 40 0
      src/PixiEditor.Extensions.WasmRuntime/Api/PreferencesApi.cs
  48. 15 0
      src/PixiEditor.Extensions.WasmRuntime/WasmMemoryUtility.cs
  49. 2 0
      src/PixiEditor.Extensions/ExtensionServices.cs
  50. 17 1
      src/PixiEditor.WasmApi.Gen/ApiGenerator.cs
  51. 14 22
      src/PixiEditor.WasmApi.Gen/TypeConversionTable.cs
  52. 1 1
      src/PixiEditor/Helpers/Extensions/ServiceCollectionHelpers.cs
  53. 1 1
      src/PixiEditor/Models/DataHolders/CrashReport.cs
  54. 1 1
      src/PixiEditor/Models/DataProviders/LocalPalettesFetcher.cs
  55. 1 1
      src/PixiEditor/Models/Dialogs/NewFileDialog.cs
  56. 1 1
      src/PixiEditor/Models/Localization/LocalizationProvider.cs
  57. 1 1
      src/PixiEditor/Models/Preferences/PreferencesSettings.cs
  58. 1 1
      src/PixiEditor/Models/Services/NewsFeed/NewsProvider.cs
  59. 0 1
      src/PixiEditor/ViewModels/SettingsWindowViewModel.cs
  60. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Main/DebugViewModel.cs
  61. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Main/DiscordViewModel.cs
  62. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Main/FileViewModel.cs
  63. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Main/StylusViewModel.cs
  64. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Main/ToolsViewModel.cs
  65. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Main/UpdateViewModel.cs
  66. 1 1
      src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/PenToolViewModel.cs
  67. 1 1
      src/PixiEditor/ViewModels/SubViewModels/UserPreferences/Settings/FileSettings.cs
  68. 1 1
      src/PixiEditor/ViewModels/SubViewModels/UserPreferences/Settings/GeneralSettings.cs
  69. 1 1
      src/PixiEditor/ViewModels/SubViewModels/UserPreferences/SettingsGroup.cs
  70. 1 1
      src/PixiEditor/ViewModels/ViewModelMain.cs
  71. 0 1
      src/PixiEditor/Views/Dialogs/DebugDialogs/Localization/LocalizationDataContext.cs
  72. 1 1
      src/PixiEditor/Views/Dialogs/HelloTherePopup.xaml.cs
  73. 1 1
      src/PixiEditor/Views/Dialogs/PalettesBrowser.xaml.cs
  74. 1 1
      src/PixiEditor/Views/MainWindow.xaml.cs

+ 3 - 4
samples/LocalizationSample/LocalizationSampleExtension.cs

@@ -1,8 +1,7 @@
-using PixiEditor.Extensions.Wasm.Api.Localization;
+using PixiEditor.Extensions.Wasm;
+using PixiEditor.Extensions.Wasm.Api.Localization;
 
 
-namespace HelloWorld;
-
-using PixiEditor.Extensions.Wasm;
+namespace LocalizationSample;
 
 
 public class LocalizationSampleExtension : WasmExtension
 public class LocalizationSampleExtension : WasmExtension
 {
 {

+ 1 - 1
samples/LocalizationSample/Program.cs

@@ -1,4 +1,4 @@
-namespace HelloWorld;
+namespace LocalizationSample;
 
 
 public static class Program
 public static class Program
 {
 {

+ 11 - 0
samples/PixiEditorExtensionSamples.sln

@@ -9,6 +9,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorld", "HelloWorld\He
 EndProject
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalizationSample", "LocalizationSample\LocalizationSample.csproj", "{3201A287-5103-48F1-9005-E27B5025E6FA}"
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalizationSample", "LocalizationSample\LocalizationSample.csproj", "{3201A287-5103-48F1-9005-E27B5025E6FA}"
 EndProject
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Preferences", "Preferences\Preferences.csproj", "{EF6E6827-9827-4465-AD9B-5BE6BEE5747D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_References", "_References", "{7CC35BC4-829F-4EF4-8EB6-E1D46206E7DC}"
+EndProject
 Global
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
 		Debug|Any CPU = Debug|Any CPU
@@ -30,5 +34,12 @@ Global
 		{3201A287-5103-48F1-9005-E27B5025E6FA}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{3201A287-5103-48F1-9005-E27B5025E6FA}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{3201A287-5103-48F1-9005-E27B5025E6FA}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{3201A287-5103-48F1-9005-E27B5025E6FA}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{3201A287-5103-48F1-9005-E27B5025E6FA}.Release|Any CPU.Build.0 = Release|Any CPU
 		{3201A287-5103-48F1-9005-E27B5025E6FA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EF6E6827-9827-4465-AD9B-5BE6BEE5747D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EF6E6827-9827-4465-AD9B-5BE6BEE5747D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EF6E6827-9827-4465-AD9B-5BE6BEE5747D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EF6E6827-9827-4465-AD9B-5BE6BEE5747D}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{FD9B4C32-4D2E-410E-BC6B-787779BEB6E2} = {7CC35BC4-829F-4EF4-8EB6-E1D46206E7DC}
 	EndGlobalSection
 	EndGlobalSection
 EndGlobal
 EndGlobal

+ 35 - 0
samples/Preferences/Preferences.csproj

@@ -0,0 +1,35 @@
+<Project Sdk="Microsoft.NET.Sdk">
+    <PropertyGroup>
+        <TargetFramework>net8.0</TargetFramework>
+        <RuntimeIdentifier>wasi-wasm</RuntimeIdentifier>
+        <OutputType>Exe</OutputType>
+        <PublishTrimmed>true</PublishTrimmed>
+        <WasmSingleFileBundle>true</WasmSingleFileBundle>
+        <GenerateExtensionPackage>true</GenerateExtensionPackage>
+        <PixiExtOutputPath>..\..\src\PixiEditor.AvaloniaUI.Desktop\bin\Debug\net8.0\win-x64\Extensions</PixiExtOutputPath>
+        <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
+    </PropertyGroup>
+
+    <ItemGroup>
+        <None Remove="extension.json" />
+        <Content Include="extension.json">
+            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+        </Content>
+    </ItemGroup>
+
+    <ItemGroup>
+        <Content Include="Localization\*">
+            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+        </Content>
+    </ItemGroup>
+
+    <!--Below is not required if you use Nuget package, this sample references project directly, so it must be here-->
+    <ItemGroup>
+        <ProjectReference Include="..\..\src\PixiEditor.Extensions.Wasm\PixiEditor.Extensions.Wasm.csproj" />
+    </ItemGroup>
+
+    <!--Below is not required if you use Nuget package, this sample references project directly, so it must be here-->
+    <Import Project="..\..\src\PixiEditor.Extensions.Wasm\build\PixiEditor.Extensions.Wasm.props"/>
+    <Import Project="..\..\src\PixiEditor.Extensions.Wasm\build\PixiEditor.Extensions.Wasm.targets" />
+
+</Project>

+ 23 - 0
samples/Preferences/PreferencesSampleExtension.cs

@@ -0,0 +1,23 @@
+using PixiEditor.Extensions.Wasm;
+
+namespace Preferences;
+
+public class PreferencesSampleExtension : WasmExtension
+{
+    /// <summary>
+    ///     This method is called when extension is loaded.
+    ///  All extensions are first loaded and then initialized. This method is called before <see cref="OnInitialized"/>.
+    /// </summary>
+    public override void OnLoaded()
+    {
+    }
+
+    /// <summary>
+    ///     This method is called when extension is initialized. After this method is called, you can use Api property to access PixiEditor API.
+    /// </summary>
+    public override void OnInitialized()
+    {
+        Api.Preferences.UpdatePreference("SAM_PREF:SaidHello", true);
+        Api.Preferences.Save();
+    }
+}

+ 14 - 0
samples/Preferences/Program.cs

@@ -0,0 +1,14 @@
+namespace Preferences;
+
+public static class Program
+{
+    /// <summary>
+    ///     The entry point of the application. This will be executed when extension is loaded.
+    /// You can use this method, but there are special methods that are used for initialization. You won't be able to access PixiEditor Api at this point.
+    /// See <see cref="LocalizationSampleExtension"/> for more information.
+    /// </summary>
+    public static void Main()
+    {
+
+    }
+}

+ 27 - 0
samples/Preferences/extension.json

@@ -0,0 +1,27 @@
+{
+  "displayName": "Sample Extension - Preferences",
+  "uniqueName": "yourCompany.Samples.Preferences",
+  "description": "Sample localization extension for PixiEditor",
+  "version": "1.0.0",
+  "author": {
+    "name": "PixiEditor",
+    "email": "[email protected]",
+    "website": "https://pixieditor.net"
+  },
+  "publisher": {
+    "name": "PixiEditor",
+    "email": "[email protected]",
+    "website": "https://pixieditor.net"
+  },
+  "contributors": [
+    {
+      "name": "flabbet",
+      "email": "[email protected]",
+      "website": "https://github.com/flabbet"
+    }
+  ],
+  "license": "MIT",
+  "categories": [
+    "Extension"
+  ]
+}

+ 1 - 1
src/PixiEditor.AvaloniaUI/Helpers/ServiceCollectionHelpers.cs

@@ -19,7 +19,7 @@ using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels.AdditionalContent;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels.AdditionalContent;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.Tools;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.FlyUI;
 using PixiEditor.Extensions.FlyUI;
 using PixiEditor.Extensions.IO;
 using PixiEditor.Extensions.IO;

+ 1 - 1
src/PixiEditor.AvaloniaUI/Models/ExceptionHandling/CrashReport.cs

@@ -14,7 +14,7 @@ using PixiEditor.AvaloniaUI.ViewModels;
 using PixiEditor.AvaloniaUI.ViewModels.Document;
 using PixiEditor.AvaloniaUI.ViewModels.Document;
 using PixiEditor.AvaloniaUI.Views;
 using PixiEditor.AvaloniaUI.Views;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Parser;
 using PixiEditor.Parser;
 
 
 namespace PixiEditor.AvaloniaUI.Models.ExceptionHandling;
 namespace PixiEditor.AvaloniaUI.Models.ExceptionHandling;

+ 1 - 1
src/PixiEditor.AvaloniaUI/Models/Palettes/LocalPalettesFetcher.cs

@@ -5,7 +5,7 @@ using System.Threading.Tasks;
 using PixiEditor.AvaloniaUI.Helpers.Extensions;
 using PixiEditor.AvaloniaUI.Helpers.Extensions;
 using PixiEditor.AvaloniaUI.Models.IO;
 using PixiEditor.AvaloniaUI.Models.IO;
 using PixiEditor.AvaloniaUI.Models.IO.PaletteParsers.JascPalFile;
 using PixiEditor.AvaloniaUI.Models.IO.PaletteParsers.JascPalFile;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes.Parsers;
 using PixiEditor.Extensions.Palettes.Parsers;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/Models/Preferences/PreferencesSettings.cs

@@ -3,7 +3,7 @@ using System.Diagnostics;
 using System.IO;
 using System.IO;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using Newtonsoft.Json.Linq;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.Models.Preferences;
 namespace PixiEditor.AvaloniaUI.Models.Preferences;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/Models/Services/NewsFeed/NewsProvider.cs

@@ -4,7 +4,7 @@ using System.Net;
 using System.Net.Http;
 using System.Net.Http;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Platform;
 using PixiEditor.Platform;
 
 
 namespace PixiEditor.AvaloniaUI.Models.Services.NewsFeed;
 namespace PixiEditor.AvaloniaUI.Models.Services.NewsFeed;

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DebugViewModel.cs

@@ -17,7 +17,7 @@ using PixiEditor.AvaloniaUI.Views;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging.Localization;
 using PixiEditor.AvaloniaUI.Views.Dialogs.Debugging.Localization;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.OperatingSystem;
 using PixiEditor.OperatingSystem;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DiscordViewModel.cs

@@ -3,7 +3,7 @@ using DiscordRPC;
 using PixiEditor.AvaloniaUI.Helpers;
 using PixiEditor.AvaloniaUI.Helpers;
 using PixiEditor.AvaloniaUI.Models.Controllers;
 using PixiEditor.AvaloniaUI.Models.Controllers;
 using PixiEditor.AvaloniaUI.ViewModels.Document;
 using PixiEditor.AvaloniaUI.ViewModels.Document;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/FileViewModel.cs

@@ -21,7 +21,7 @@ using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.AvaloniaUI.Views.Windows;
 using PixiEditor.AvaloniaUI.Views.Windows;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.Exceptions;
 using PixiEditor.Extensions.Exceptions;
 using PixiEditor.Numerics;
 using PixiEditor.Numerics;
 using PixiEditor.OperatingSystem;
 using PixiEditor.OperatingSystem;

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/StylusViewModel.cs

@@ -1,7 +1,7 @@
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.ViewModels.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.Tools;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -14,7 +14,7 @@ using PixiEditor.AvaloniaUI.ViewModels.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.Tools;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Numerics;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Numerics;
 using PixiEditor.Numerics;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/UpdateViewModel.cs

@@ -11,7 +11,7 @@ using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Dialogs;
 using PixiEditor.AvaloniaUI.Models.Dialogs;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Platform;
 using PixiEditor.Platform;
 using PixiEditor.UpdateModule;
 using PixiEditor.UpdateModule;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/Tools/Tools/PenToolViewModel.cs

@@ -8,7 +8,7 @@ using PixiEditor.AvaloniaUI.ViewModels.Tools.ToolSettings.Toolbars;
 using PixiEditor.AvaloniaUI.Views.Overlays.BrushShapeOverlay;
 using PixiEditor.AvaloniaUI.Views.Overlays.BrushShapeOverlay;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Numerics;
 using PixiEditor.Numerics;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.Tools.Tools
 namespace PixiEditor.AvaloniaUI.ViewModels.Tools.Tools

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/UserPreferences/Settings/FileSettings.cs

@@ -1,5 +1,5 @@
 using PixiEditor.AvaloniaUI.Models;
 using PixiEditor.AvaloniaUI.Models;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.UserPreferences.Settings;
 namespace PixiEditor.AvaloniaUI.ViewModels.UserPreferences.Settings;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/UserPreferences/Settings/GeneralSettings.cs

@@ -2,7 +2,7 @@
 using System.Globalization;
 using System.Globalization;
 using System.Linq;
 using System.Linq;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.UserPreferences.Settings;
 namespace PixiEditor.AvaloniaUI.ViewModels.UserPreferences.Settings;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/UserPreferences/SettingsGroup.cs

@@ -1,6 +1,6 @@
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
 using CommunityToolkit.Mvvm.ComponentModel;
 using CommunityToolkit.Mvvm.ComponentModel;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels.UserPreferences;
 namespace PixiEditor.AvaloniaUI.ViewModels.UserPreferences;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/ViewModels/ViewModelMain.cs

@@ -17,7 +17,7 @@ using PixiEditor.AvaloniaUI.ViewModels.Tools;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.ViewModels;
 namespace PixiEditor.AvaloniaUI.ViewModels;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Dialogs/Debugging/Localization/LocalizationDataContext.cs

@@ -16,7 +16,7 @@ using PixiEditor.AvaloniaUI.Models.Dialogs;
 using PixiEditor.AvaloniaUI.ViewModels;
 using PixiEditor.AvaloniaUI.ViewModels;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.OperatingSystem;
 using PixiEditor.OperatingSystem;
 
 
 namespace PixiEditor.AvaloniaUI.Views.Dialogs.Debugging.Localization;
 namespace PixiEditor.AvaloniaUI.Views.Dialogs.Debugging.Localization;

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Dialogs/NewFileDialog.cs

@@ -2,7 +2,7 @@
 using Avalonia.Controls;
 using Avalonia.Controls;
 using PixiEditor.AvaloniaUI.Models;
 using PixiEditor.AvaloniaUI.Models;
 using PixiEditor.AvaloniaUI.Models.Dialogs;
 using PixiEditor.AvaloniaUI.Models.Dialogs;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.AvaloniaUI.Views.Dialogs;
 namespace PixiEditor.AvaloniaUI.Views.Dialogs;
 
 

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/MainWindow.axaml.cs

@@ -13,7 +13,7 @@ using PixiEditor.AvaloniaUI.Models.IO;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.DrawingApi.Core.Bridge;
 using PixiEditor.DrawingApi.Core.Bridge;
 using PixiEditor.DrawingApi.Skia;
 using PixiEditor.DrawingApi.Skia;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.Runtime;
 using PixiEditor.Extensions.Runtime;
 using PixiEditor.Platform;
 using PixiEditor.Platform;
 using ViewModelMain = PixiEditor.AvaloniaUI.ViewModels.ViewModelMain;
 using ViewModelMain = PixiEditor.AvaloniaUI.ViewModels.ViewModelMain;

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Windows/HelloTherePopup.axaml.cs

@@ -12,7 +12,7 @@ using PixiEditor.AvaloniaUI.Models.Structures;
 using PixiEditor.AvaloniaUI.Models.UserData;
 using PixiEditor.AvaloniaUI.Models.UserData;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.AvaloniaUI.Views.Dialogs;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.OperatingSystem;
 using PixiEditor.OperatingSystem;
 
 
 namespace PixiEditor.AvaloniaUI.Views.Windows;
 namespace PixiEditor.AvaloniaUI.Views.Windows;

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Windows/PalettesBrowser.axaml.cs

@@ -23,7 +23,7 @@ using PixiEditor.AvaloniaUI.Views.Dialogs;
 using PixiEditor.AvaloniaUI.Views.Input;
 using PixiEditor.AvaloniaUI.Views.Input;
 using PixiEditor.AvaloniaUI.Views.Palettes;
 using PixiEditor.AvaloniaUI.Views.Palettes;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes.Parsers;
 using PixiEditor.Extensions.Palettes.Parsers;

+ 4 - 0
src/PixiEditor.Extensions.CommonApi/PixiEditor.Extensions.CommonApi.csproj

@@ -6,4 +6,8 @@
         <Nullable>disable</Nullable>
         <Nullable>disable</Nullable>
     </PropertyGroup>
     </PropertyGroup>
 
 
+    <ItemGroup>
+      <Folder Include="Preferences\" />
+    </ItemGroup>
+
 </Project>
 </Project>

+ 1 - 1
src/PixiEditor.Extensions/Common/UserPreferences/IPreferences.cs → src/PixiEditor.Extensions.CommonApi/UserPreferences/IPreferences.cs

@@ -1,4 +1,4 @@
-namespace PixiEditor.Extensions.Common.UserPreferences;
+namespace PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 public interface IPreferences
 public interface IPreferences
 {
 {

+ 1 - 1
src/PixiEditor.Extensions/Common/UserPreferences/PreferencesConstants.cs → src/PixiEditor.Extensions.CommonApi/UserPreferences/PreferencesConstants.cs

@@ -1,4 +1,4 @@
-namespace PixiEditor.Extensions.Common.UserPreferences;
+namespace PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 public static class PreferencesConstants
 public static class PreferencesConstants
 {
 {

+ 3 - 1
src/PixiEditor.Extensions.Wasm/Api/Localization/LocalizedString.cs

@@ -1,4 +1,6 @@
-namespace PixiEditor.Extensions.Wasm.Api.Localization;
+using PixiEditor.Extensions.Wasm.Bridge;
+
+namespace PixiEditor.Extensions.Wasm.Api.Localization;
 
 
 public struct LocalizedString
 public struct LocalizedString
 {
 {

+ 1 - 0
src/PixiEditor.Extensions.Wasm/Api/Logging/Logger.cs

@@ -1,4 +1,5 @@
 using PixiEditor.Extensions.CommonApi.Logging;
 using PixiEditor.Extensions.CommonApi.Logging;
+using PixiEditor.Extensions.Wasm.Bridge;
 
 
 namespace PixiEditor.Extensions.Wasm.Api.Logging;
 namespace PixiEditor.Extensions.Wasm.Api.Logging;
 
 

+ 70 - 0
src/PixiEditor.Extensions.Wasm/Api/UserPreferences/Preferences.cs

@@ -0,0 +1,70 @@
+using PixiEditor.Extensions.CommonApi.UserPreferences;
+using PixiEditor.Extensions.Wasm.Bridge;
+
+namespace PixiEditor.Extensions.Wasm.Api.UserPreferences;
+
+/// <summary>
+///     Add, remove and update user preferences.
+/// </summary>
+public class Preferences : IPreferences
+{
+    public void Save()
+    {
+        Native.save_preferences();
+    }
+    
+    public void UpdatePreference<T>(string name, T value)
+    {
+        Interop.UpdateUserPreference(name, value);
+    }
+
+    public void UpdateLocalPreference<T>(string name, T value)
+    {
+        throw new NotImplementedException();
+    }
+
+    public T GetPreference<T>(string name)
+    {
+        throw new NotImplementedException();
+    }
+
+    public T GetPreference<T>(string name, T fallbackValue)
+    {
+        throw new NotImplementedException();
+    }
+
+    public T GetLocalPreference<T>(string name)
+    {
+        throw new NotImplementedException();
+    }
+
+    public T GetLocalPreference<T>(string name, T fallbackValue)
+    {
+        throw new NotImplementedException();
+    }
+
+
+    public void AddCallback(string name, Action<object> action)
+    {
+        
+    }
+
+    public void AddCallback<T>(string name, Action<T> action)
+    {
+        throw new NotImplementedException();
+    }
+
+    public void RemoveCallback(string name, Action<object> action)
+    {
+        throw new NotImplementedException();
+    }
+
+    public void RemoveCallback<T>(string name, Action<T> action)
+    {
+        throw new NotImplementedException();
+    }
+
+    void IPreferences.Init() { }
+
+    void IPreferences.Init(string path, string localPath) { }
+}

+ 1 - 0
src/PixiEditor.Extensions.Wasm/Api/Window/PopupWindow.cs

@@ -1,5 +1,6 @@
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.Wasm.Async;
 using PixiEditor.Extensions.Wasm.Async;
+using PixiEditor.Extensions.Wasm.Bridge;
 
 
 namespace PixiEditor.Extensions.Wasm.Api.Window;
 namespace PixiEditor.Extensions.Wasm.Api.Window;
 
 

+ 1 - 0
src/PixiEditor.Extensions.Wasm/Api/Window/WindowProvider.cs

@@ -1,6 +1,7 @@
 using System.Runtime.InteropServices;
 using System.Runtime.InteropServices;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.Wasm.Api.FlyUI;
 using PixiEditor.Extensions.Wasm.Api.FlyUI;
+using PixiEditor.Extensions.Wasm.Bridge;
 
 
 namespace PixiEditor.Extensions.Wasm.Api.Window;
 namespace PixiEditor.Extensions.Wasm.Api.Window;
 
 

+ 28 - 0
src/PixiEditor.Extensions.Wasm/Bridge/Interop.cs

@@ -0,0 +1,28 @@
+namespace PixiEditor.Extensions.Wasm.Bridge;
+
+internal static class Interop
+{
+    public static void UpdateUserPreference<T>(string name, T value)
+    {
+        switch (value)
+        {
+            case int intValue:
+                Native.update_preference_int(name, intValue);
+                break;
+            case bool boolValue:
+                Native.update_preference_bool(name, boolValue);
+                break;
+            case string stringValue:
+                Native.update_preference_string(name, stringValue);
+                break;
+            case float floatValue:
+                Native.update_preference_float(name, floatValue);
+                break;
+            case double doubleValue:
+                Native.update_preference_double(name, doubleValue);
+                break;
+            default:
+                throw new ArgumentException($"Unsupported type {value.GetType().Name}");
+        }
+    }
+}

+ 1 - 1
src/PixiEditor.Extensions.Wasm/Native.Async.cs → src/PixiEditor.Extensions.Wasm/Bridge/Native.Async.cs

@@ -1,6 +1,6 @@
 using PixiEditor.Extensions.Wasm.Async;
 using PixiEditor.Extensions.Wasm.Async;
 
 
-namespace PixiEditor.Extensions.Wasm;
+namespace PixiEditor.Extensions.Wasm.Bridge;
 
 
 internal partial class Native
 internal partial class Native
 {
 {

+ 1 - 1
src/PixiEditor.Extensions.Wasm/Native.Localization.cs → src/PixiEditor.Extensions.Wasm/Bridge/Native.Localization.cs

@@ -1,6 +1,6 @@
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
 
 
-namespace PixiEditor.Extensions.Wasm;
+namespace PixiEditor.Extensions.Wasm.Bridge;
 
 
 internal static partial class Native
 internal static partial class Native
 {
 {

+ 25 - 0
src/PixiEditor.Extensions.Wasm/Bridge/Native.Preferences.cs

@@ -0,0 +1,25 @@
+using System.Runtime.CompilerServices;
+
+namespace PixiEditor.Extensions.Wasm.Bridge;
+
+internal static partial class Native
+{
+    
+    [MethodImpl(MethodImplOptions.InternalCall)]
+    internal static extern void save_preferences();
+
+    [MethodImpl(MethodImplOptions.InternalCall)]
+    public static extern void update_preference_int(string name, int value);
+    
+    [MethodImpl(MethodImplOptions.InternalCall)]
+    public static extern void update_preference_bool(string name, bool value);
+    
+    [MethodImpl(MethodImplOptions.InternalCall)]
+    public static extern void update_preference_string(string name, string value);
+    
+    [MethodImpl(MethodImplOptions.InternalCall)]
+    public static extern void update_preference_float(string name, float value);
+    
+    [MethodImpl(MethodImplOptions.InternalCall)]
+    public static extern void update_preference_double(string name, double value);
+}

+ 1 - 2
src/PixiEditor.Extensions.Wasm/Native.Windowing.cs → src/PixiEditor.Extensions.Wasm/Bridge/Native.Windowing.cs

@@ -1,7 +1,6 @@
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
 
 
-namespace PixiEditor.Extensions.Wasm;
+namespace PixiEditor.Extensions.Wasm.Bridge;
 
 
 internal static partial class Native
 internal static partial class Native
 {
 {

+ 1 - 2
src/PixiEditor.Extensions.Wasm/Native.cs → src/PixiEditor.Extensions.Wasm/Bridge/Native.cs

@@ -2,12 +2,11 @@
 using System.Diagnostics.CodeAnalysis;
 using System.Diagnostics.CodeAnalysis;
 using System.Reflection;
 using System.Reflection;
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
 using PixiEditor.Extensions.CommonApi.FlyUI;
 using PixiEditor.Extensions.CommonApi.FlyUI;
 using PixiEditor.Extensions.CommonApi.FlyUI.Events;
 using PixiEditor.Extensions.CommonApi.FlyUI.Events;
 using PixiEditor.Extensions.Wasm.Api.FlyUI;
 using PixiEditor.Extensions.Wasm.Api.FlyUI;
 
 
-namespace PixiEditor.Extensions.Wasm;
+namespace PixiEditor.Extensions.Wasm.Bridge;
 
 
 internal static class Program { internal static void Main() { } } // Required for compilation
 internal static class Program { internal static void Main() { } } // Required for compilation
 
 

+ 4 - 0
src/PixiEditor.Extensions.Wasm/PixiEditorApi.cs

@@ -1,6 +1,7 @@
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.Wasm.Api;
 using PixiEditor.Extensions.Wasm.Api;
 using PixiEditor.Extensions.Wasm.Api.Logging;
 using PixiEditor.Extensions.Wasm.Api.Logging;
+using PixiEditor.Extensions.Wasm.Api.UserPreferences;
 using PixiEditor.Extensions.Wasm.Api.Window;
 using PixiEditor.Extensions.Wasm.Api.Window;
 
 
 namespace PixiEditor.Extensions.Wasm;
 namespace PixiEditor.Extensions.Wasm;
@@ -9,10 +10,13 @@ public class PixiEditorApi
 {
 {
     public Logger Logger { get; }
     public Logger Logger { get; }
     public WindowProvider WindowProvider { get; }
     public WindowProvider WindowProvider { get; }
+    
+    public Preferences Preferences { get; }
 
 
     public PixiEditorApi()
     public PixiEditorApi()
     {
     {
         Logger = new Logger();
         Logger = new Logger();
         WindowProvider = new WindowProvider();
         WindowProvider = new WindowProvider();
+        Preferences = new Preferences();
     }
     }
 }
 }

BIN
src/PixiEditor.Extensions.Wasm/build/PixiEditor.Api.CGlueMSBuild.dll


BIN
src/PixiEditor.Extensions.Wasm/build/win-x64/PixiEditor.Extensions.MSPackageBuilder.dll


+ 1 - 1
src/PixiEditor.Extensions.Wasm/native/interop.c

@@ -11,7 +11,7 @@ extern void _start(void);
 MonoMethod* lookup_interop_method(const char* method_name)
 MonoMethod* lookup_interop_method(const char* method_name)
 {
 {
     MonoMethod* method = NULL;
     MonoMethod* method = NULL;
-    method = lookup_dotnet_method("PixiEditor.Extensions.Wasm.dll", "PixiEditor.Extensions.Wasm", "Native", method_name, -1);
+    method = lookup_dotnet_method("PixiEditor.Extensions.Wasm.dll", "PixiEditor.Extensions.Wasm.Bridge", "Native", method_name, -1);
     assert(method);
     assert(method);
 
 
     return method;
     return method;

+ 40 - 0
src/PixiEditor.Extensions.WasmRuntime/Api/PreferencesApi.cs

@@ -0,0 +1,40 @@
+namespace PixiEditor.Extensions.WasmRuntime.Api;
+
+internal class PreferencesApi : ApiGroupHandler
+{
+    [ApiFunction("save_preferences")]
+    public void SavePreferences()
+    {
+        Api.Preferences.Save();
+    }
+    
+    [ApiFunction("update_preference_int")]
+    public void UpdatePreference(string name, int value)
+    {
+        Api.Preferences.UpdatePreference(name, value);
+    }
+    
+    [ApiFunction("update_preference_bool")]
+    public void UpdatePreference(string name, bool value)
+    {
+        Api.Preferences.UpdatePreference(name, value);
+    }
+    
+    [ApiFunction("update_preference_string")]
+    public void UpdatePreference(string name, string value)
+    {
+        Api.Preferences.UpdatePreference(name, value);
+    }
+    
+    [ApiFunction("update_preference_float")]
+    public void UpdatePreference(string name, float value)
+    {
+        Api.Preferences.UpdatePreference(name, value);
+    }
+    
+    [ApiFunction("update_preference_double")]
+    public void UpdatePreference(string name, double value)
+    {
+        Api.Preferences.UpdatePreference(name, value);
+    }
+}

+ 15 - 0
src/PixiEditor.Extensions.WasmRuntime/WasmMemoryUtility.cs

@@ -85,6 +85,11 @@ public class WasmMemoryUtility
         return memory.ReadDouble(offset);
         return memory.ReadDouble(offset);
     }
     }
     
     
+    public float GetSingle(int offset)
+    {
+        return memory.ReadSingle(offset);
+    }
+    
     public int WriteBoolean(bool value)
     public int WriteBoolean(bool value)
     {
     {
         const int length = 1;
         const int length = 1;
@@ -98,6 +103,16 @@ public class WasmMemoryUtility
         return memory.Read<bool>(offset);
         return memory.Read<bool>(offset);
     }
     }
 
 
+    public bool ConvertBoolean(int rawValue)
+    {
+        return Convert.ToBoolean(rawValue);
+    }
+
+    public int ConvertBoolean(bool rawValue)
+    {
+        return Convert.ToInt32(rawValue);
+    }
+
     public void Free(int address)
     public void Free(int address)
     {
     {
         free.Invoke(address);
         free.Invoke(address);

+ 2 - 0
src/PixiEditor.Extensions/ExtensionServices.cs

@@ -1,4 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.IO;
 using PixiEditor.Extensions.IO;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes;
@@ -11,6 +12,7 @@ public class ExtensionServices
     public IWindowProvider? Windowing => Services.GetService<IWindowProvider>();
     public IWindowProvider? Windowing => Services.GetService<IWindowProvider>();
     public IPaletteProvider? PaletteProvider => Services.GetService<IPaletteProvider>();
     public IPaletteProvider? PaletteProvider => Services.GetService<IPaletteProvider>();
     public IFileSystemProvider? FileSystem => Services.GetService<IFileSystemProvider>();
     public IFileSystemProvider? FileSystem => Services.GetService<IFileSystemProvider>();
+    public IPreferences? Preferences => Services.GetService<IPreferences>();
 
 
     public ExtensionServices(IServiceProvider services)
     public ExtensionServices(IServiceProvider services)
     {
     {

+ 17 - 1
src/PixiEditor.WasmApi.Gen/ApiGenerator.cs

@@ -105,6 +105,16 @@ public class ApiGenerator : IIncrementalGenerator
                     : $"{argSymbol.Name}Pointer";
                     : $"{argSymbol.Name}Pointer";
                 syntaxes = syntaxes.Add(SyntaxFactory.ParseStatement(
                 syntaxes = syntaxes.Add(SyntaxFactory.ParseStatement(
                     $"{argSymbol.Type.ToDisplayString()} {argSymbol.Name} = WasmMemoryUtility.Get{lowerType}({paramsString});"));
                     $"{argSymbol.Type.ToDisplayString()} {argSymbol.Name} = WasmMemoryUtility.Get{lowerType}({paramsString});"));
+                continue;
+            }
+
+            if (TypeConversionTable.RequiresConversion(argSymbol.Type))
+            {
+                string lowerType = argSymbol.Type.Name;
+                string paramsString = $"{argSymbol.Name}Raw";
+                
+                syntaxes = syntaxes.Add(SyntaxFactory.ParseStatement(
+                    $"{argSymbol.Type.ToDisplayString()} {argSymbol.Name} = WasmMemoryUtility.Convert{lowerType}({paramsString});"));
             }
             }
         }
         }
 
 
@@ -136,9 +146,15 @@ public class ApiGenerator : IIncrementalGenerator
                     string statementString =
                     string statementString =
                         $"return WasmMemoryUtility.Write{returnType}({returnStatementSyntax.Expression.ToFullString()});";
                         $"return WasmMemoryUtility.Write{returnType}({returnStatementSyntax.Expression.ToFullString()});";
 
 
-                    if (TypeConversionTable.IsValuePassableReturnType(method.methodSymbol.ReturnType, out _))
+                    if (TypeConversionTable.IsValuePassableType(method.methodSymbol.ReturnType, out _))
                     {
                     {
                         statementString = $"return {returnStatementSyntax.Expression.ToFullString()};";
                         statementString = $"return {returnStatementSyntax.Expression.ToFullString()};";
+
+                        if (TypeConversionTable.RequiresConversion(method.methodSymbol.ReturnType))
+                        {
+                            statementString =
+                                $"return WasmMemoryUtility.Convert{returnType}({returnStatementSyntax.Expression.ToFullString()});";
+                        }
                     }
                     }
 
 
                     syntaxes = syntaxes.Add(SyntaxFactory.ParseStatement(statementString));
                     syntaxes = syntaxes.Add(SyntaxFactory.ParseStatement(statementString));

+ 14 - 22
src/PixiEditor.WasmApi.Gen/TypeConversionTable.cs

@@ -8,6 +8,11 @@ public static class TypeConversionTable
     {
     {
         if(IsValuePassableType(symbol.Type, out string? typeName))
         if(IsValuePassableType(symbol.Type, out string? typeName))
         {
         {
+            if(RequiresConversion(symbol.Type))
+            {
+                return [$"{typeName} {symbol.Name}Raw"];
+            }
+            
             return [$"{typeName} {symbol.Name}"];
             return [$"{typeName} {symbol.Name}"];
         }
         }
 
 
@@ -40,37 +45,24 @@ public static class TypeConversionTable
             return true;
             return true;
         }
         }
 
 
-        typeName = null;
-        return false;
-    }
-    
-    public static bool IsValuePassableReturnType(ITypeSymbol argSymbol, out string? typeName)
-    {
-        if (argSymbol.Name.Equals("int32", StringComparison.OrdinalIgnoreCase))
+        if (argSymbol.Name.Equals("single", StringComparison.OrdinalIgnoreCase))
         {
         {
-            typeName = "int";
+            typeName = "float";
             return true;
             return true;
         }
         }
 
 
-        if (argSymbol.Name.Equals("double", StringComparison.OrdinalIgnoreCase))
-        {
-            typeName = "double";
-            return true;
-        }
-        
-        /*if (argSymbol.Name.Equals("float", StringComparison.OrdinalIgnoreCase))
+        if (argSymbol.Name.Equals("boolean", StringComparison.OrdinalIgnoreCase))
         {
         {
-            typeName = "float";
+            typeName = "int"; // bool is passed as int
             return true;
             return true;
         }
         }
-        
-        if (argSymbol.Name.Equals("string", StringComparison.OrdinalIgnoreCase))
-        {
-            typeName = "string";
-            return true;
-        }*/
 
 
         typeName = null;
         typeName = null;
         return false;
         return false;
     }
     }
+
+    public static bool RequiresConversion(ITypeSymbol argSymbolType)
+    {
+        return argSymbolType.Name.Equals("boolean", StringComparison.OrdinalIgnoreCase);
+    }
 }
 }

+ 1 - 1
src/PixiEditor/Helpers/Extensions/ServiceCollectionHelpers.cs

@@ -1,6 +1,6 @@
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes.Parsers;
 using PixiEditor.Extensions.Palettes.Parsers;
 using PixiEditor.Models.AppExtensions;
 using PixiEditor.Models.AppExtensions;

+ 1 - 1
src/PixiEditor/Models/DataHolders/CrashReport.cs

@@ -7,7 +7,7 @@ using System.Text;
 using System.Windows.Input;
 using System.Windows.Input;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Commands;
 using PixiEditor.Models.Commands;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Enums;

+ 1 - 1
src/PixiEditor/Models/DataProviders/LocalPalettesFetcher.cs

@@ -1,7 +1,7 @@
 using System.IO;
 using System.IO;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes.Parsers;
 using PixiEditor.Extensions.Palettes.Parsers;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;

+ 1 - 1
src/PixiEditor/Models/Dialogs/NewFileDialog.cs

@@ -1,4 +1,4 @@
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Views;
 using PixiEditor.Views;
 using PixiEditor.Views.Dialogs;
 using PixiEditor.Views.Dialogs;
 
 

+ 1 - 1
src/PixiEditor/Models/Localization/LocalizationProvider.cs

@@ -3,7 +3,7 @@ using System.IO;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using PixiEditor.Extensions;
 using PixiEditor.Extensions;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Models.AppExtensions;
 using PixiEditor.Models.AppExtensions;
 using PixiEditor.Models.IO;
 using PixiEditor.Models.IO;
 
 

+ 1 - 1
src/PixiEditor/Models/Preferences/PreferencesSettings.cs

@@ -2,7 +2,7 @@
 using System.IO;
 using System.IO;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using Newtonsoft.Json.Linq;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 
 
 namespace PixiEditor.Models.Preferences;
 namespace PixiEditor.Models.Preferences;
 
 

+ 1 - 1
src/PixiEditor/Models/Services/NewsFeed/NewsProvider.cs

@@ -1,7 +1,7 @@
 using System.Net;
 using System.Net;
 using System.Net.Http;
 using System.Net.Http;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Platform;
 using PixiEditor.Platform;
 using PixiEditor.UpdateModule;
 using PixiEditor.UpdateModule;
 
 

+ 0 - 1
src/PixiEditor/ViewModels/SettingsWindowViewModel.cs

@@ -12,7 +12,6 @@ using PixiEditor.Models.Commands.Templates;
 using PixiEditor.Views.Dialogs;
 using PixiEditor.Views.Dialogs;
 using PixiEditor.Exceptions;
 using PixiEditor.Exceptions;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
 using PixiEditor.Models.Localization;
 using PixiEditor.Models.Localization;
 using PixiEditor.Models.Preferences;
 using PixiEditor.Models.Preferences;
 
 

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Main/DebugViewModel.cs

@@ -6,7 +6,7 @@ using System.Windows.Input;
 using Microsoft.Win32;
 using Microsoft.Win32;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Commands.Templates.Parsers;
 using PixiEditor.Models.Commands.Templates.Parsers;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Main/DiscordViewModel.cs

@@ -1,6 +1,6 @@
 using System.ComponentModel;
 using System.ComponentModel;
 using DiscordRPC;
 using DiscordRPC;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Events;
 using PixiEditor.ViewModels.SubViewModels.Document;
 using PixiEditor.ViewModels.SubViewModels.Document;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Main/FileViewModel.cs

@@ -11,7 +11,7 @@ using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Exceptions;
 using PixiEditor.Exceptions;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Controllers;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Main/StylusViewModel.cs

@@ -1,5 +1,5 @@
 using System.Windows.Input;
 using System.Windows.Input;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Models.Commands.Attributes;
 using PixiEditor.Models.Commands.Attributes;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.ViewModels.SubViewModels.Tools;
 using PixiEditor.ViewModels.SubViewModels.Tools;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Main/ToolsViewModel.cs

@@ -2,7 +2,7 @@
 using ChunkyImageLib.DataHolders;
 using ChunkyImageLib.DataHolders;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Numerics;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Enums;
 using PixiEditor.Models.Enums;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Main/UpdateViewModel.cs

@@ -6,7 +6,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Commands.Attributes;
 using PixiEditor.Models.Commands.Attributes;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Commands.Attributes.Commands;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/Tools/Tools/PenToolViewModel.cs

@@ -3,7 +3,7 @@ using System.Windows.Media;
 using ChunkyImageLib.DataHolders;
 using ChunkyImageLib.DataHolders;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.DrawingApi.Core.Numerics;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Localization;
 using PixiEditor.Models.Localization;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/UserPreferences/Settings/FileSettings.cs

@@ -1,4 +1,4 @@
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Models;
 using PixiEditor.Models;
 
 
 namespace PixiEditor.ViewModels.SubViewModels.UserPreferences.Settings;
 namespace PixiEditor.ViewModels.SubViewModels.UserPreferences.Settings;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/UserPreferences/Settings/GeneralSettings.cs

@@ -1,6 +1,6 @@
 using System.Globalization;
 using System.Globalization;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Models.Localization;
 using PixiEditor.Models.Localization;
 
 
 namespace PixiEditor.ViewModels.SubViewModels.UserPreferences.Settings;
 namespace PixiEditor.ViewModels.SubViewModels.UserPreferences.Settings;

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/UserPreferences/SettingsGroup.cs

@@ -1,5 +1,5 @@
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 
 
 namespace PixiEditor.ViewModels.SubViewModels.UserPreferences;
 namespace PixiEditor.ViewModels.SubViewModels.UserPreferences;

+ 1 - 1
src/PixiEditor/ViewModels/ViewModelMain.cs

@@ -4,7 +4,7 @@ using System.Windows;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
 using PixiEditor.DrawingApi.Core.ColorsImpl;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers.Collections;
 using PixiEditor.Helpers.Collections;
 using PixiEditor.Models.Commands;
 using PixiEditor.Models.Commands;

+ 0 - 1
src/PixiEditor/Views/Dialogs/DebugDialogs/Localization/LocalizationDataContext.cs

@@ -11,7 +11,6 @@ using System.Windows.Threading;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using Newtonsoft.Json.Linq;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Dialogs;
 using PixiEditor.Models.Dialogs;
 using PixiEditor.Models.Localization;
 using PixiEditor.Models.Localization;

+ 1 - 1
src/PixiEditor/Views/Dialogs/HelloTherePopup.xaml.cs

@@ -4,7 +4,7 @@ using System.IO;
 using System.Windows;
 using System.Windows;
 using System.Windows.Input;
 using System.Windows.Input;
 using PixiEditor.Exceptions;
 using PixiEditor.Exceptions;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Commands;
 using PixiEditor.Models.Commands;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.DataHolders;

+ 1 - 1
src/PixiEditor/Views/Dialogs/PalettesBrowser.xaml.cs

@@ -8,7 +8,7 @@ using System.Windows.Navigation;
 using Microsoft.Win32;
 using Microsoft.Win32;
 using PixiEditor.Extensions;
 using PixiEditor.Extensions;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes;
 using PixiEditor.Extensions.Palettes.Parsers;
 using PixiEditor.Extensions.Palettes.Parsers;

+ 1 - 1
src/PixiEditor/Views/MainWindow.xaml.cs

@@ -11,7 +11,7 @@ using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.DrawingApi.Core.Bridge;
 using PixiEditor.DrawingApi.Core.Bridge;
 using PixiEditor.DrawingApi.Skia;
 using PixiEditor.DrawingApi.Skia;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.Localization;
-using PixiEditor.Extensions.Common.UserPreferences;
+using PixiEditor.Extensions.CommonApi.UserPreferences;
 using PixiEditor.Extensions.UI;
 using PixiEditor.Extensions.UI;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.AppExtensions;
 using PixiEditor.Models.AppExtensions;