Browse Source

Fixed right click color swapping for shape tools

flabbet 8 months ago
parent
commit
5c1855b04b

+ 14 - 3
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/DrawableShapeToolExecutor.cs

@@ -10,6 +10,7 @@ using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Tools;
 using PixiEditor.Models.Tools;
 using Drawie.Numerics;
 using Drawie.Numerics;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
+using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
 
 
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 
 
@@ -33,6 +34,7 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
     private bool noMovement = true;
     private bool noMovement = true;
     protected IBasicShapeToolbar toolbar;
     protected IBasicShapeToolbar toolbar;
     private IColorsHandler? colorsVM;
     private IColorsHandler? colorsVM;
+    private bool ignoreNextColorChange = false;
 
 
     public override bool CanUndo => document.TransformHandler.HasUndo;
     public override bool CanUndo => document.TransformHandler.HasUndo;
     public override bool CanRedo => document.TransformHandler.HasRedo;
     public override bool CanRedo => document.TransformHandler.HasRedo;
@@ -60,6 +62,7 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
             {
             {
                 toolbar.FillColor = colorsVM.PrimaryColor.ToColor();
                 toolbar.FillColor = colorsVM.PrimaryColor.ToColor();
                 toolbar.StrokeColor = colorsVM.PrimaryColor.ToColor();
                 toolbar.StrokeColor = colorsVM.PrimaryColor.ToColor();
+                ignoreNextColorChange = colorsVM.ColorsTempSwapped;
             }
             }
             
             
             lastRect = new RectD(startDrawingPos, VecD.Zero);
             lastRect = new RectD(startDrawingPos, VecD.Zero);
@@ -161,11 +164,19 @@ internal abstract class DrawableShapeToolExecutor<T> : SimpleShapeToolExecutor w
 
 
     public override void OnColorChanged(Color color, bool primary)
     public override void OnColorChanged(Color color, bool primary)
     {
     {
-        if (primary && toolbar.SyncWithPrimaryColor && ActiveMode == ShapeToolMode.Transform)
+        if (!primary || !toolbar.SyncWithPrimaryColor || ActiveMode == ShapeToolMode.Preview || ignoreNextColorChange)
         {
         {
-            toolbar.StrokeColor = color.ToColor();
-            toolbar.FillColor = color.ToColor();
+            if (primary)
+            {
+                ignoreNextColorChange = false;
+            }
+            return;
         }
         }
+        
+        ignoreNextColorChange = ActiveMode == ShapeToolMode.Drawing;
+
+        toolbar.StrokeColor = color.ToColor();
+        toolbar.FillColor = color.ToColor();
     }
     }
 
 
     public override void OnSelectedObjectNudged(VecI distance)
     public override void OnSelectedObjectNudged(VecI distance)

+ 6 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/Features/IDelayedColorSwapFeature.cs

@@ -0,0 +1,6 @@
+namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
+
+public interface IDelayedColorSwapFeature : IExecutorFeature
+{
+    
+}

+ 10 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/LineExecutor.cs

@@ -28,6 +28,7 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
     private T? toolViewModel;
     private T? toolViewModel;
     private IColorsHandler? colorsVM;
     private IColorsHandler? colorsVM;
     protected ILineToolbar? toolbar;
     protected ILineToolbar? toolbar;
+    private bool ignoreNextColorChange = false;
 
 
     public override bool CanUndo => document.LineToolOverlayHandler.HasUndo;
     public override bool CanUndo => document.LineToolOverlayHandler.HasUndo;
     public override bool CanRedo => document.LineToolOverlayHandler.HasRedo;
     public override bool CanRedo => document.LineToolOverlayHandler.HasRedo;
@@ -55,6 +56,7 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
             if (toolbar.SyncWithPrimaryColor)
             if (toolbar.SyncWithPrimaryColor)
             {
             {
                 toolbar.StrokeColor = colorsVM.PrimaryColor.ToColor();
                 toolbar.StrokeColor = colorsVM.PrimaryColor.ToColor();
+                ignoreNextColorChange = colorsVM.ColorsTempSwapped;
             }
             }
 
 
             document.LineToolOverlayHandler.Hide();
             document.LineToolOverlayHandler.Hide();
@@ -157,9 +159,16 @@ internal abstract class LineExecutor<T> : SimpleShapeToolExecutor where T : ILin
 
 
     public override void OnColorChanged(Color color, bool primary)
     public override void OnColorChanged(Color color, bool primary)
     {
     {
-        if (!primary || !toolbar!.SyncWithPrimaryColor || ActiveMode != ShapeToolMode.Transform)
+        if (!primary || !toolbar!.SyncWithPrimaryColor || ActiveMode == ShapeToolMode.Preview || ignoreNextColorChange)
+        {
+            if (primary)
+            {
+                ignoreNextColorChange = false;
+            }
             return;
             return;
+        }
 
 
+        ignoreNextColorChange = ActiveMode == ShapeToolMode.Drawing;
         toolbar!.StrokeColor = color.ToColor();
         toolbar!.StrokeColor = color.ToColor();
         var colorChangedAction = SettingsChange();
         var colorChangedAction = SettingsChange();
         internals!.ActionAccumulator.AddActions(colorChangedAction);
         internals!.ActionAccumulator.AddActions(colorChangedAction);

+ 6 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/SimpleShapeToolExecutor.cs

@@ -26,7 +26,7 @@ namespace PixiEditor.Models.DocumentModels.UpdateableChangeExecutors;
 ///         - Transform -> Drawing (when user clicks outside of shape transform bounds)
 ///         - Transform -> Drawing (when user clicks outside of shape transform bounds)
 /// </summary>
 /// </summary>
 internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor, 
 internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor, 
-    ITransformableExecutor, IMidChangeUndoableExecutor
+    ITransformableExecutor, IMidChangeUndoableExecutor, IDelayedColorSwapFeature
 {
 {
     private ShapeToolMode activeMode;
     private ShapeToolMode activeMode;
 
 
@@ -228,6 +228,11 @@ internal abstract class SimpleShapeToolExecutor : UpdateableChangeExecutor,
             return ActiveMode == ShapeToolMode.Transform;
             return ActiveMode == ShapeToolMode.Transform;
         }
         }
         
         
+        if (feature is IDelayedColorSwapFeature)
+        {
+            return true;
+        }
+        
         return false;
         return false;
     }
     }
 }
 }

+ 10 - 0
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorPathToolExecutor.cs

@@ -196,6 +196,16 @@ internal class VectorPathToolExecutor : UpdateableChangeExecutor, IPathExecutorF
 
 
     private PathVectorData ConstructShapeData()
     private PathVectorData ConstructShapeData()
     {
     {
+        if(startingPath == null)
+        {
+            return new PathVectorData(new VectorPath())
+            {
+                StrokeWidth = toolbar.ToolSize,
+                StrokeColor = toolbar.StrokeColor.ToColor(),
+                FillColor = toolbar.Fill ? toolbar.FillColor.ToColor() : Colors.Transparent,
+            };
+        }
+        
         return new PathVectorData(new VectorPath(startingPath))
         return new PathVectorData(new VectorPath(startingPath))
         {
         {
             StrokeWidth = toolbar.ToolSize,
             StrokeWidth = toolbar.ToolSize,

+ 4 - 0
src/PixiEditor/Models/ExceptionHandling/CrashReport.cs

@@ -341,7 +341,11 @@ internal class CrashReport : IDisposable
         Process process = new();
         Process process = new();
 
 
         //TODO: Handle different name for the executable, .Desktop.exe
         //TODO: Handle different name for the executable, .Desktop.exe
+#if DEBUG
+        string fileName = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location) + ".Desktop.exe";
+        #else
         string fileName = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location) + ".exe";
         string fileName = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location) + ".exe";
+#endif
 
 
         process.StartInfo = new()
         process.StartInfo = new()
         {
         {

+ 1 - 0
src/PixiEditor/Models/Handlers/IColorsHandler.cs

@@ -8,5 +8,6 @@ internal interface IColorsHandler : IHandler
     public static IColorsHandler? Instance { get; }
     public static IColorsHandler? Instance { get; }
     public Color PrimaryColor { get; set; }
     public Color PrimaryColor { get; set; }
     public Color SecondaryColor { get; set; }
     public Color SecondaryColor { get; set; }
+    public bool ColorsTempSwapped { get; }
     public void AddSwatch(PaletteColor paletteColor);
     public void AddSwatch(PaletteColor paletteColor);
 }
 }

+ 12 - 0
src/PixiEditor/ViewModels/SubViewModels/ColorsViewModel.cs

@@ -50,6 +50,8 @@ internal class ColorsViewModel : SubViewModel<ViewModelMain>, IColorsHandler
     public LocalPalettesFetcher LocalPaletteFetcher => _localPaletteFetcher ??=
     public LocalPalettesFetcher LocalPaletteFetcher => _localPaletteFetcher ??=
         (LocalPalettesFetcher)PaletteProvider.DataSources.FirstOrDefault(x => x is LocalPalettesFetcher)!;
         (LocalPalettesFetcher)PaletteProvider.DataSources.FirstOrDefault(x => x is LocalPalettesFetcher)!;
 
 
+    public bool ColorsTempSwapped { get; private set; }
+    
     private Color primaryColor = Colors.Black;
     private Color primaryColor = Colors.Black;
     private Color secondaryColor = Colors.White;
     private Color secondaryColor = Colors.White;
     private ColorState primaryColorState;
     private ColorState primaryColorState;
@@ -364,9 +366,19 @@ internal class ColorsViewModel : SubViewModel<ViewModelMain>, IColorsHandler
         Icon = PixiPerfectIcons.ColorsSwap, AnalyticsTrack = true)]
         Icon = PixiPerfectIcons.ColorsSwap, AnalyticsTrack = true)]
     public void SwapColors(object parameter)
     public void SwapColors(object parameter)
     {
     {
+        if (parameter is true)
+        {
+            ColorsTempSwapped = !ColorsTempSwapped;
+        }
+        else
+        {
+            ColorsTempSwapped = false;    
+        }
+        
         (PrimaryColor, SecondaryColor) = (SecondaryColor, PrimaryColor);
         (PrimaryColor, SecondaryColor) = (SecondaryColor, PrimaryColor);
     }
     }
 
 
+
     public void AddSwatch(PaletteColor color)
     public void AddSwatch(PaletteColor color)
     {
     {
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
         var doc = Owner.DocumentManagerSubViewModel.ActiveDocument;

+ 29 - 12
src/PixiEditor/ViewModels/SubViewModels/IoViewModel.cs

@@ -18,6 +18,7 @@ using PixiEditor.Models.Events;
 using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Input;
 using PixiEditor.Models.Input;
 using Drawie.Numerics;
 using Drawie.Numerics;
+using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
 using PixiEditor.ViewModels.Document;
 using PixiEditor.ViewModels.Document;
 using PixiEditor.ViewModels.Tools.Tools;
 using PixiEditor.ViewModels.Tools.Tools;
 using PixiEditor.Views;
 using PixiEditor.Views;
@@ -26,7 +27,6 @@ namespace PixiEditor.ViewModels.SubViewModels;
 #nullable enable
 #nullable enable
 internal class IoViewModel : SubViewModel<ViewModelMain>
 internal class IoViewModel : SubViewModel<ViewModelMain>
 {
 {
-    private bool hadSwapped;
     private int? previousEraseSize;
     private int? previousEraseSize;
     private bool hadSharedToolbar;
     private bool hadSharedToolbar;
     private bool? drawingWithRight;
     private bool? drawingWithRight;
@@ -196,6 +196,11 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
         activeDocument.EventInlet.OnCanvasLeftMouseButtonDown(args);
         activeDocument.EventInlet.OnCanvasLeftMouseButtonDown(args);
         Owner.ToolsSubViewModel.UseToolEventInlet(args.PositionOnCanvas, args.Button);
         Owner.ToolsSubViewModel.UseToolEventInlet(args.PositionOnCanvas, args.Button);
 
 
+        if (args.Button == MouseButton.Right)
+        {
+            HandleRightSwapColor();
+        }
+
         Analytics.SendUseTool(Owner.ToolsSubViewModel.ActiveTool, args.PositionOnCanvas, activeDocument.SizeBindable);
         Analytics.SendUseTool(Owner.ToolsSubViewModel.ActiveTool, args.PositionOnCanvas, activeDocument.SizeBindable);
     }
     }
 
 
@@ -208,17 +213,15 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
         switch (tools.RightClickMode)
         switch (tools.RightClickMode)
         {
         {
             case RightClickMode.SecondaryColor when tools.ActiveTool.UsesColor:
             case RightClickMode.SecondaryColor when tools.ActiveTool.UsesColor:
-            case RightClickMode.Erase when tools.ActiveTool is ColorPickerToolViewModel:
-                if (!Owner.DocumentManagerSubViewModel.ActiveDocument.BlockingUpdateableChangeActive)
+                if (Owner.DocumentManagerSubViewModel.ActiveDocument.IsChangeFeatureActive<IDelayedColorSwapFeature>())
                 {
                 {
-                    Owner.ColorsSubViewModel.SwapColors(null);
-                }
-                else
-                {
-                    Owner.DocumentManagerSubViewModel.ActiveDocument.ToolSessionFinished += ToolSessionFinished;
+                    return true;
                 }
                 }
 
 
-                hadSwapped = true;
+                Owner.ColorsSubViewModel.SwapColors(true);
+                return true;
+            case RightClickMode.Erase when tools.ActiveTool is ColorPickerToolViewModel:
+                Owner.ColorsSubViewModel.SwapColors(true);
                 return true;
                 return true;
             case RightClickMode.Erase when tools.ActiveTool.IsErasable:
             case RightClickMode.Erase when tools.ActiveTool.IsErasable:
             {
             {
@@ -233,6 +236,22 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
         }
         }
     }
     }
 
 
+    private void HandleRightSwapColor()
+    {
+        if (Owner.DocumentManagerSubViewModel.ActiveDocument is null)
+            return;
+        
+        if(Owner.ColorsSubViewModel.ColorsTempSwapped)
+            return;
+
+        var tools = Owner.ToolsSubViewModel;
+        
+        if (tools is { RightClickMode: RightClickMode.SecondaryColor, ActiveTool.UsesColor: true })
+        {
+            Owner.ColorsSubViewModel.SwapColors(true);
+        }
+    }
+    
     private void HandleRightMouseEraseDown(IToolsHandler tools)
     private void HandleRightMouseEraseDown(IToolsHandler tools)
     {
     {
         var currentToolSize = tools.ActiveTool.Toolbar.Settings.FirstOrDefault(x => x.Name == "ToolSize");
         var currentToolSize = tools.ActiveTool.Toolbar.Settings.FirstOrDefault(x => x.Name == "ToolSize");
@@ -295,8 +314,6 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
         drawingWithRight = null;
         drawingWithRight = null;
 
 
         HandleRightMouseUp(button, tools);
         HandleRightMouseUp(button, tools);
-
-        hadSwapped = false;
     }
     }
 
 
     private void HandleRightMouseUp(MouseButton button, IToolsHandler tools)
     private void HandleRightMouseUp(MouseButton button, IToolsHandler tools)
@@ -306,7 +323,7 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
             case MouseButton.Middle:
             case MouseButton.Middle:
                 tools.RestorePreviousTool();
                 tools.RestorePreviousTool();
                 break;
                 break;
-            case MouseButton.Right when hadSwapped &&
+            case MouseButton.Right when Owner.ColorsSubViewModel.ColorsTempSwapped &&
                                         (tools.RightClickMode == RightClickMode.SecondaryColor ||
                                         (tools.RightClickMode == RightClickMode.SecondaryColor ||
                                          tools is
                                          tools is
                                          {
                                          {