|
@@ -1,12 +1,12 @@
|
|
|
using System.Windows;
|
|
|
using System.Windows.Input;
|
|
|
-using ChunkyImageLib.DataHolders;
|
|
|
using PixiEditor.DrawingApi.Core.Numerics;
|
|
|
using PixiEditor.Helpers;
|
|
|
using PixiEditor.Models.Commands;
|
|
|
using PixiEditor.Models.Commands.Commands;
|
|
|
using PixiEditor.Models.Controllers;
|
|
|
using PixiEditor.Models.DataHolders;
|
|
|
+using PixiEditor.Models.Enums;
|
|
|
using PixiEditor.Models.Events;
|
|
|
using PixiEditor.ViewModels.SubViewModels.Document;
|
|
|
using PixiEditor.ViewModels.SubViewModels.Tools;
|
|
@@ -17,6 +17,11 @@ namespace PixiEditor.ViewModels.SubViewModels.Main;
|
|
|
#nullable enable
|
|
|
internal class IoViewModel : SubViewModel<ViewModelMain>
|
|
|
{
|
|
|
+ private bool hadSwapped;
|
|
|
+ private int? previousEraseSize;
|
|
|
+ private bool hadSharedToolbar;
|
|
|
+ private bool? drawingWithRight;
|
|
|
+
|
|
|
public RelayCommand MouseMoveCommand { get; set; }
|
|
|
public RelayCommand MouseDownCommand { get; set; }
|
|
|
public RelayCommand PreviewMouseMiddleButtonCommand { get; set; }
|
|
@@ -150,16 +155,56 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
|
|
|
|
|
|
private void OnMouseDown(object? sender, MouseOnCanvasEventArgs args)
|
|
|
{
|
|
|
- if (args.Button == MouseButton.Left)
|
|
|
+ if (drawingWithRight != null || args.Button is not (MouseButton.Left or MouseButton.Right))
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (args.Button == MouseButton.Right && !HandleRightMouseDown())
|
|
|
+ return;
|
|
|
+
|
|
|
+ var docManager = Owner.DocumentManagerSubViewModel;
|
|
|
+ var activeDocument = docManager.ActiveDocument;
|
|
|
+ if (activeDocument == null)
|
|
|
+ return;
|
|
|
+
|
|
|
+ drawingWithRight = args.Button == MouseButton.Right;
|
|
|
+ Owner.ToolsSubViewModel.LeftMouseButtonDownInlet(args.PositionOnCanvas);
|
|
|
+ activeDocument.EventInlet.OnCanvasLeftMouseButtonDown(args.PositionOnCanvas);
|
|
|
+ }
|
|
|
+
|
|
|
+ private bool HandleRightMouseDown()
|
|
|
+ {
|
|
|
+ var tools = Owner.ToolsSubViewModel;
|
|
|
+
|
|
|
+ if (tools.ActiveTool is not ShapeTool || tools.RightClickMode == RightClickMode.ContextMenu)
|
|
|
{
|
|
|
- DocumentManagerViewModel docManager = Owner.DocumentManagerSubViewModel;
|
|
|
- DocumentViewModel? activeDocument = docManager.ActiveDocument;
|
|
|
- if (activeDocument == null)
|
|
|
- return;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
- Owner.ToolsSubViewModel.LeftMouseButtonDownInlet(args.PositionOnCanvas);
|
|
|
- activeDocument.EventInlet.OnCanvasLeftMouseButtonDown(args.PositionOnCanvas);
|
|
|
+ if (tools.RightClickMode == RightClickMode.Erase)
|
|
|
+ {
|
|
|
+ var currentToolSize = tools.ActiveTool.Toolbar.Settings.FirstOrDefault(x => x.Name == "ToolSize");
|
|
|
+ hadSharedToolbar = tools.EnableSharedToolbar;
|
|
|
+ if (currentToolSize != null)
|
|
|
+ {
|
|
|
+ tools.EnableSharedToolbar = false;
|
|
|
+ var toolSize = tools.GetTool<EraserToolViewModel>().Toolbar.Settings.First(x => x.Name == "ToolSize");
|
|
|
+ previousEraseSize = (int)toolSize.Value;
|
|
|
+ toolSize.Value = tools.ActiveTool is PenToolViewModel { PixelPerfectEnabled: true } ? 1 : currentToolSize.Value;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ previousEraseSize = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ tools.SetActiveTool<EraserToolViewModel>(true);
|
|
|
}
|
|
|
+ else if (tools.RightClickMode == RightClickMode.SecondaryColor)
|
|
|
+ {
|
|
|
+ Owner.ColorsSubViewModel.SwapColors(null);
|
|
|
+ hadSwapped = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
private void OnPreviewMiddleMouseButton(object sender)
|
|
@@ -177,15 +222,39 @@ internal class IoViewModel : SubViewModel<ViewModelMain>
|
|
|
|
|
|
private void OnMouseUp(object? sender, MouseButton button)
|
|
|
{
|
|
|
+ if (drawingWithRight == null || (button == MouseButton.Left && drawingWithRight.Value) ||
|
|
|
+ (button == MouseButton.Right && !drawingWithRight.Value))
|
|
|
+ return;
|
|
|
+
|
|
|
if (Owner.DocumentManagerSubViewModel.ActiveDocument is null)
|
|
|
return;
|
|
|
- if (button == MouseButton.Left)
|
|
|
+ var tools = Owner.ToolsSubViewModel;
|
|
|
+
|
|
|
+ var rightCanUp = (button == MouseButton.Right && tools.RightClickMode == RightClickMode.Erase || tools.RightClickMode == RightClickMode.SecondaryColor);
|
|
|
+
|
|
|
+ if (button == MouseButton.Left || rightCanUp)
|
|
|
{
|
|
|
Owner.DocumentManagerSubViewModel.ActiveDocument.EventInlet.OnCanvasLeftMouseButtonUp();
|
|
|
}
|
|
|
- else if (button == MouseButton.Middle)
|
|
|
+
|
|
|
+ drawingWithRight = null;
|
|
|
+
|
|
|
+ switch (button)
|
|
|
{
|
|
|
- Owner.ToolsSubViewModel.RestorePreviousTool();
|
|
|
+ case MouseButton.Middle:
|
|
|
+ case MouseButton.Right when tools.RightClickMode == RightClickMode.Erase:
|
|
|
+ tools.EnableSharedToolbar = hadSharedToolbar;
|
|
|
+ if (previousEraseSize != null)
|
|
|
+ {
|
|
|
+ tools.GetTool<EraserToolViewModel>().Toolbar.Settings.First(x => x.Name == "ToolSize").Value = previousEraseSize.Value;
|
|
|
+ }
|
|
|
+ tools.RestorePreviousTool();
|
|
|
+ break;
|
|
|
+ case MouseButton.Right when hadSwapped && tools.RightClickMode == RightClickMode.SecondaryColor:
|
|
|
+ Owner.ColorsSubViewModel.SwapColors(null);
|
|
|
+ break;
|
|
|
}
|
|
|
+
|
|
|
+ hadSwapped = false;
|
|
|
}
|
|
|
}
|