Browse Source

Merge pull request #955 from PixiEditor/fixes/26.05.2025

Added local appdata extensions
Krzysztof Krysiński 2 months ago
parent
commit
ef956448b7

+ 26 - 9
src/PixiEditor.Extensions.Runtime/ExtensionLoader.cs

@@ -15,14 +15,14 @@ public class ExtensionLoader
 
     public List<Extension> LoadedExtensions { get; } = new();
 
-    public string PackagesPath { get; }
+    public string[] PackagesPath { get; }
     public string UnpackedExtensionsPath { get; }
 
     private WasmRuntime.WasmRuntime _wasmRuntime = new WasmRuntime.WasmRuntime();
 
-    public ExtensionLoader(string packagesPath, string unpackedExtensionsPath)
+    public ExtensionLoader(string[] packagesPaths, string unpackedExtensionsPath)
     {
-        PackagesPath = packagesPath;
+        PackagesPath = packagesPaths;
         UnpackedExtensionsPath = unpackedExtensionsPath;
         ValidateExtensionFolder();
     }
@@ -34,7 +34,20 @@ public class ExtensionLoader
 
     public void LoadExtensions()
     {
-        foreach (var file in Directory.GetFiles(PackagesPath))
+        foreach (var packagesPath in PackagesPath)
+        {
+            LoadExtensionsFromPath(packagesPath);
+        }
+    }
+
+    private void LoadExtensionsFromPath(string path)
+    {
+        if (!Directory.Exists(path))
+        {
+            return;
+        }
+
+        foreach (var file in Directory.GetFiles(path))
         {
             if (file.EndsWith(".pixiext"))
             {
@@ -397,14 +410,18 @@ public class ExtensionLoader
 
     private void ValidateExtensionFolder()
     {
-        if (!Directory.Exists(PackagesPath))
+        try
         {
-            Directory.CreateDirectory(PackagesPath);
+            if (!Directory.Exists(UnpackedExtensionsPath))
+            {
+                Directory.CreateDirectory(UnpackedExtensionsPath);
+            }
         }
-
-        if (!Directory.Exists(UnpackedExtensionsPath))
+        catch (Exception ex)
         {
-            Directory.CreateDirectory(UnpackedExtensionsPath);
+#if DEBUG
+            throw;
+#endif
         }
     }
 

+ 1 - 1
src/PixiEditor/Initialization/ClassicDesktopEntry.cs

@@ -119,7 +119,7 @@ internal class ClassicDesktopEntry
 
         NumberInput.AttachGlobalBehaviors += AttachGlobalShortcutBehavior;
 
-        ExtensionLoader extensionLoader = new ExtensionLoader(Paths.ExtensionPackagesPath, Paths.UserExtensionsPath);
+        ExtensionLoader extensionLoader = new ExtensionLoader([Paths.InstallDirExtensionPackagesPath, Paths.LocalExtensionPackagesPath], Paths.UserExtensionsPath);
         //TODO: fetch from extension store
         extensionLoader.AddOfficialExtension("pixieditor.founderspack",
             new OfficialExtensionData("supporter-pack.snk", AdditionalContentProduct.SupporterPack));

+ 6 - 2
src/PixiEditor/Models/IO/Paths.cs

@@ -10,16 +10,20 @@ public static class Paths
     public static string DataFullPath { get; } =
         Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Data");
 
-    public static string ExtensionPackagesPath { get; } =
+    public static string InstallDirExtensionPackagesPath { get; } =
         Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Extensions");
 
+    public static string LocalExtensionPackagesPath { get; } = Path.Combine(
+        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
+        "PixiEditor", "Extensions", "Packages");
+
     public static string UserConfigPath { get; } = Path.Combine(
         Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
         "PixiEditor", "Configs");
 
     public static string UserExtensionsPath { get; } = Path.Combine(
         Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
-        "PixiEditor", "Extensions");
+        "PixiEditor", "Extensions", "Unpacked");
 
     public static string PathToPalettesFolder { get; } = Path.Join(
         Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),

+ 1 - 0
src/PixiEditor/ViewModels/Menu/MenuBarViewModel.cs

@@ -97,6 +97,7 @@ internal class MenuBarViewModel : PixiObservableObject
     private void RebuildMenu()
     {
         MenuEntries?.Clear();
+        NativeMenu?.Items?.Clear();
         nativeMenuItems?.Clear();
         menuItems.Clear();
 

+ 21 - 1
src/PixiEditor/Views/Main/MainTitleBar.axaml.cs

@@ -42,7 +42,27 @@ public partial class MainTitleBar : UserControl
         base.OnAttachedToVisualTree(e);
         if (IOperatingSystem.Current.IsMacOs && DataContext is MenuBarViewModel menuBarViewModel)
         {
-            NativeMenu.SetMenu(MainWindow.Current, menuBarViewModel.NativeMenu);
+            if (menuBarViewModel.NativeMenu != null)
+            {
+                NativeMenu.SetMenu(MainWindow.Current, menuBarViewModel.NativeMenu);
+            }
+            else
+            {
+                menuBarViewModel.PropertyChanged += (sender, args) =>
+                {
+                    if (args.PropertyName == nameof(MenuBarViewModel.NativeMenu))
+                    {
+                        if (menuBarViewModel.NativeMenu != null)
+                        {
+                            NativeMenu.SetMenu(MainWindow.Current, menuBarViewModel.NativeMenu);
+                        }
+                        else
+                        {
+                            NativeMenu.SetMenu(MainWindow.Current, null);
+                        }
+                    }
+                };
+            }
         }
     }
 }

+ 1 - 1
tests/PixiEditor.Tests/PixiEditorTest.cs

@@ -55,7 +55,7 @@ public class FullPixiEditorTest : PixiEditorTest
 {
     public FullPixiEditorTest()
     {
-        ExtensionLoader loader = new ExtensionLoader("TestExtensions", "TestExtensions/Unpacked");
+        ExtensionLoader loader = new ExtensionLoader(["TestExtensions"], "TestExtensions/Unpacked");
 
         if (IOperatingSystem.Current == null)
         {