Browse Source

Added import document api

Krzysztof Krysiński 3 months ago
parent
commit
7cd2a728ca

+ 6 - 0
src/PixiEditor.Extensions.CommonApi/IO/IDocumentProvider.cs

@@ -0,0 +1,6 @@
+namespace PixiEditor.Extensions.CommonApi.IO;
+
+public interface IDocumentProvider
+{
+   public void ImportFile(string path, bool associatePath = true);
+}

+ 12 - 0
src/PixiEditor.Extensions.Sdk/Api/IO/DocumentProvider.cs

@@ -0,0 +1,12 @@
+using PixiEditor.Extensions.CommonApi.IO;
+using PixiEditor.Extensions.Sdk.Bridge;
+
+namespace PixiEditor.Extensions.Sdk.Api.IO;
+
+public class DocumentProvider : IDocumentProvider
+{
+    public void ImportFile(string path, bool associatePath = true)
+    {
+        Native.import_file(path, associatePath);
+    }
+}

+ 9 - 0
src/PixiEditor.Extensions.Sdk/Bridge/Native.Document.cs

@@ -0,0 +1,9 @@
+using System.Runtime.CompilerServices;
+
+namespace PixiEditor.Extensions.Sdk.Bridge;
+
+internal partial class Native
+{
+    [MethodImpl(MethodImplOptions.InternalCall)]
+    internal static extern void import_file(string path, bool associatePath);
+}

+ 3 - 0
src/PixiEditor.Extensions.Sdk/PixiEditorApi.cs

@@ -1,6 +1,7 @@
 using PixiEditor.Extensions.CommonApi.Windowing;
 using PixiEditor.Extensions.Sdk.Api;
 using PixiEditor.Extensions.Sdk.Api.Commands;
+using PixiEditor.Extensions.Sdk.Api.IO;
 using PixiEditor.Extensions.Sdk.Api.Logging;
 using PixiEditor.Extensions.Sdk.Api.Palettes;
 using PixiEditor.Extensions.Sdk.Api.UserPreferences;
@@ -15,6 +16,7 @@ public class PixiEditorApi
     public Preferences Preferences { get; }
     public PalettesProvider Palettes { get; }
     public CommandProvider Commands { get; }
+    public DocumentProvider Documents { get; }
 
     public PixiEditorApi()
     {
@@ -23,5 +25,6 @@ public class PixiEditorApi
         Preferences = new Preferences();
         Palettes = new PalettesProvider();
         Commands = new CommandProvider();
+        Documents = new DocumentProvider();
     }
 }

+ 22 - 0
src/PixiEditor.Extensions.WasmRuntime/Api/DocumentsApi.cs

@@ -0,0 +1,22 @@
+using PixiEditor.Extensions.Metadata;
+using PixiEditor.Extensions.WasmRuntime.Utilities;
+
+namespace PixiEditor.Extensions.WasmRuntime.Api;
+
+internal class DocumentsApi : ApiGroupHandler
+{
+    [ApiFunction("import_file")]
+    public void ImportFile(string path, bool associatePath = false)
+    {
+        PermissionUtility.ThrowIfLacksPermissions(Extension.Metadata, ExtensionPermissions.OpenDocuments, "ImportFile");
+
+        string fullPath = ResourcesUtility.ToResourcesFullPath(Extension, path);
+
+        if (!File.Exists(fullPath))
+        {
+            return;
+        }
+
+        Api.Documents.ImportFile(fullPath, associatePath);
+    }
+}

+ 4 - 13
src/PixiEditor.Extensions.WasmRuntime/Api/ResourcesApi.cs

@@ -1,22 +1,13 @@
-namespace PixiEditor.Extensions.WasmRuntime.Api;
+using PixiEditor.Extensions.WasmRuntime.Utilities;
+
+namespace PixiEditor.Extensions.WasmRuntime.Api;
 
 internal class ResourcesApi : ApiGroupHandler
 {
     [ApiFunction("to_resources_full_path")]
     public string ToResourcesFullPath(string path)
     {
-        string resourcesPath = Path.Combine(Path.GetDirectoryName(Extension.Location), "Resources");
-        string fullPath = path;
-
-        if (path.StartsWith("/") || path.StartsWith("/Resources/"))
-        {
-            fullPath = Path.Combine(resourcesPath, path[1..]);
-        }
-        else if (path.StartsWith("Resources/"))
-        {
-            fullPath = Path.Combine(resourcesPath, path[10..]);
-        }
-
+        string fullPath = ResourcesUtility.ToResourcesFullPath(Extension, path);
         return fullPath;
     }
 }

+ 21 - 0
src/PixiEditor.Extensions.WasmRuntime/Utilities/ResourcesUtility.cs

@@ -0,0 +1,21 @@
+namespace PixiEditor.Extensions.WasmRuntime.Utilities;
+
+public static class ResourcesUtility
+{
+    public static string ToResourcesFullPath(Extension extension, string path)
+    {
+        string resourcesPath = Path.Combine(Path.GetDirectoryName(extension.Location), "Resources");
+        string fullPath = path;
+
+        if (path.StartsWith("/") || path.StartsWith("/Resources/"))
+        {
+            fullPath = Path.Combine(resourcesPath, path[1..]);
+        }
+        else if (path.StartsWith("Resources/"))
+        {
+            fullPath = Path.Combine(resourcesPath, path[10..]);
+        }
+
+        return fullPath;
+    }
+}

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

@@ -1,4 +1,5 @@
 using Microsoft.Extensions.DependencyInjection;
+using PixiEditor.Extensions.CommonApi.IO;
 using PixiEditor.Extensions.CommonApi.Menu;
 using PixiEditor.Extensions.CommonApi.Palettes;
 using PixiEditor.Extensions.CommonApi.UserPreferences;
@@ -16,6 +17,7 @@ public class ExtensionServices
     public ICommandProvider? Commands => Services.GetService<ICommandProvider>();
     
     public IPalettesProvider? Palettes => Services.GetService<IPalettesProvider>();
+    public IDocumentProvider Documents => Services.GetService<IDocumentProvider>();
 
     public ExtensionServices(IServiceProvider services)
     {

+ 11 - 3
src/PixiEditor.Extensions/Metadata/ExtensionPermissions.cs

@@ -1,15 +1,23 @@
-namespace PixiEditor.Extensions.Metadata;
+using System.Runtime.CompilerServices;
+
+namespace PixiEditor.Extensions.Metadata;
 
 [Flags]
 [Newtonsoft.Json.JsonConverter(typeof(JsonEnumFlagConverter))]
 public enum ExtensionPermissions
 {
     None = 0,
-    
+
     /// <summary>
     ///     Allows extension to write to preferences that are not owned by the extension. Owned preferences are those that are
     ///    created by the extension itself (they are prefixed with the extension unique name, ex. PixiEditor.SomeExt:PopupShown).
     /// </summary>
     WriteNonOwnedPreferences = 1,
-    FullAccess = ~0
+
+    /// <summary>
+    ///     Allows extension to open documents. This permission is required for extensions that need to import files into
+    ///     the editor.
+    /// </summary>
+    OpenDocuments = 2,
+    FullAccess = ~0,
 }

+ 2 - 0
src/PixiEditor/Helpers/ServiceCollectionHelpers.cs

@@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.AnimationRenderer.Core;
 using PixiEditor.AnimationRenderer.FFmpeg;
 using PixiEditor.Extensions.Common.Localization;
+using PixiEditor.Extensions.CommonApi.IO;
 using PixiEditor.Extensions.CommonApi.Menu;
 using PixiEditor.Extensions.CommonApi.Palettes;
 using PixiEditor.Extensions.CommonApi.Palettes.Parsers;
@@ -123,6 +124,7 @@ internal static class ServiceCollectionHelpers
             .AddSingleton<IDocumentBuilder, FontDocumentBuilder>()
             .AddSingleton<IPalettesProvider, PaletteProvider>()
             .AddSingleton<CommandProvider>()
+            .AddSingleton<IDocumentProvider, DocumentProvider>()
             .AddSingleton<ICommandProvider, CommandProvider>(x => x.GetRequiredService<CommandProvider>())
             .AddSingleton<IIconLookupProvider, DynamicResourceIconLookupProvider>()
             // Palette Parsers

+ 21 - 0
src/PixiEditor/Models/ExtensionServices/DocumentProvider.cs

@@ -0,0 +1,21 @@
+using PixiEditor.Extensions.CommonApi.IO;
+using PixiEditor.Models.IO;
+using PixiEditor.ViewModels;
+using PixiEditor.ViewModels.SubViewModels;
+
+namespace PixiEditor.Models.ExtensionServices;
+
+internal class DocumentProvider : IDocumentProvider
+{
+    private FileViewModel fileViewModel;
+
+    public DocumentProvider(FileViewModel fileViewModel)
+    {
+        this.fileViewModel = fileViewModel;
+    }
+
+    public void ImportFile(string path, bool associatePath = true)
+    {
+        fileViewModel.OpenFromPath(path, associatePath);
+    }
+}