Browse Source

Added copy visible and changed shortcut for copy color

flabbet 7 months ago
parent
commit
d918d0bcd1

+ 3 - 1
src/PixiEditor/Data/Localization/Languages/en.json

@@ -789,5 +789,7 @@
   "FILL_TYPE_INVERSE_WINDING": "Inverse Winding",
   "FILL_TYPE_INVERSE_EVEN_ODD": "Inverse Even Odd",
   "STROKE_CAP": "Stroke Cap",
-  "STROKE_JOIN": "Stroke Join"
+  "STROKE_JOIN": "Stroke Join",
+  "COPY_VISIBLE": "Copy visible",
+    "COPY_VISIBLE_DESCRIPTIVE": "Copy visible pixels"
 }

+ 34 - 0
src/PixiEditor/Models/Controllers/ClipboardController.cs

@@ -18,6 +18,7 @@ using Drawie.Backend.Core;
 using Drawie.Backend.Core.Numerics;
 using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.ImageData;
+using Drawie.Backend.Core.Surfaces.PaintImpl;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers.Constants;
@@ -125,6 +126,39 @@ internal static class ClipboardController
 
         await Clipboard.SetDataObjectAsync(data);
     }
+    
+    public static async Task CopyVisibleToClipboard(DocumentViewModel document)
+    {
+        await Clipboard.ClearAsync();
+
+        DataObject data = new DataObject();
+
+        RectD copyArea = new RectD(VecD.Zero, document.SizeBindable);
+        
+        if (!document.SelectionPathBindable.IsEmpty)
+        {
+            copyArea = document.SelectionPathBindable.TightBounds;
+        }
+        else if (document.TransformViewModel.TransformActive)
+        {
+            copyArea = document.TransformViewModel.Corners.AABBBounds;
+        }
+
+        using Surface documentSurface = new Surface(document.SizeBindable);
+        
+        document.Renderer.RenderDocument(documentSurface.DrawingSurface, document.AnimationDataViewModel.ActiveFrameTime);
+        
+        Surface surfaceToCopy = new Surface((VecI)copyArea.Size.Ceiling());
+        using Paint paint = new Paint();
+        
+        surfaceToCopy.DrawingSurface.Canvas.DrawImage(
+        documentSurface.DrawingSurface.Snapshot(),
+        copyArea, new RectD(0, 0, copyArea.Size.X, copyArea.Size.Y), paint);
+
+        await AddImageToClipboard(surfaceToCopy, data);
+
+        await Clipboard.SetDataObjectAsync(data);
+    }
 
     private static async Task AddImageToClipboard(Surface actuallySurface, DataObject data)
     {

+ 13 - 1
src/PixiEditor/ViewModels/SubViewModels/ClipboardViewModel.cs

@@ -157,6 +157,18 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
         await ClipboardController.CopyToClipboard(doc);
     }
 
+    [Command.Basic("PixiEditor.Clipboard.CopyVisible", "COPY_VISIBLE", "COPY_VISIBLE_DESCRIPTIVE", CanExecute = "PixiEditor.Clipboard.CanCopy",
+        Key = Key.C, Modifiers = KeyModifiers.Shift,
+        MenuItemPath = "EDIT/COPY_VISIBLE", MenuItemOrder = 3, Icon = PixiPerfectIcons.Copy, AnalyticsTrack = true)]
+    public async Task CopyVisible()
+    {
+        var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
+        if (doc is null)
+            return;
+
+        await ClipboardController.CopyVisibleToClipboard(doc);
+    }
+
     [Command.Basic("PixiEditor.Clipboard.CopyPrimaryColorAsHex", CopyColor.PrimaryHEX, "COPY_COLOR_HEX",
         "COPY_COLOR_HEX_DESCRIPTIVE", IconEvaluator = "PixiEditor.Clipboard.CopyColorIcon", AnalyticsTrack = true)]
     [Command.Basic("PixiEditor.Clipboard.CopyPrimaryColorAsRgb", CopyColor.PrimaryRGB, "COPY_COLOR_RGB",
@@ -168,7 +180,7 @@ internal class ClipboardViewModel : SubViewModel<ViewModelMain>
         "COPY_COLOR_SECONDARY_RGB_DESCRIPTIVE", IconEvaluator = "PixiEditor.Clipboard.CopyColorIcon",
         AnalyticsTrack = true)]
     [Command.Filter("PixiEditor.Clipboard.CopyColorToClipboard", "COPY_COLOR_TO_CLIPBOARD", "COPY_COLOR", Key = Key.C,
-        Modifiers = KeyModifiers.Shift, AnalyticsTrack = true)]
+        Modifiers = KeyModifiers.Shift | KeyModifiers.Alt, AnalyticsTrack = true)]
     public async Task CopyColorAsHex(CopyColor color)
     {
         var targetColor = color switch