BitmapOperationTool.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Documents;
  4. using System.Windows.Input;
  5. using System.Windows.Media;
  6. using PixiEditor.Models.DataHolders;
  7. using PixiEditor.Models.Layers;
  8. using PixiEditor.Models.Position;
  9. using PixiEditor.Models.Undo;
  10. using SkiaSharp;
  11. namespace PixiEditor.Models.Tools
  12. {
  13. public abstract class BitmapOperationTool : Tool
  14. {
  15. public bool RequiresPreviewLayer { get; set; }
  16. public bool ClearPreviewLayerOnEachIteration { get; set; } = true;
  17. public bool UseDefaultUndoMethod { get; set; } = true;
  18. public virtual bool UsesShift => true;
  19. private StorageBasedChange _change;
  20. public abstract void Use(Layer layer, List<Coordinates> mouseMove, SKColor color);
  21. /// <summary>
  22. /// Executes undo adding procedure.
  23. /// </summary>
  24. /// <param name="document">Active document</param>
  25. /// <remarks>When overriding, set UseDefaultUndoMethod to false.</remarks>
  26. public override void AddUndoProcess(Document document)
  27. {
  28. if (!UseDefaultUndoMethod) return;
  29. var args = new object[] { _change.Document };
  30. document.UndoManager.AddUndoChange(_change.ToChange(UndoProcess, args));
  31. _change = null;
  32. }
  33. public override void OnRecordingLeftMouseDown(MouseEventArgs e)
  34. {
  35. if (UseDefaultUndoMethod && e.LeftButton == MouseButtonState.Pressed)
  36. {
  37. Document doc = ViewModels.ViewModelMain.Current.BitmapManager.ActiveDocument;
  38. _change = new StorageBasedChange(doc, new[] { doc.ActiveLayer }, true);
  39. }
  40. }
  41. private void UndoProcess(Layer[] layers, UndoLayer[] data, object[] args)
  42. {
  43. if (args.Length > 0 && args[0] is Document document)
  44. {
  45. for (int i = 0; i < layers.Length; i++)
  46. {
  47. Layer layer = layers[i];
  48. document.Layers.RemoveAt(data[i].LayerIndex);
  49. document.Layers.Insert(data[i].LayerIndex, layer);
  50. if (data[i].IsActive)
  51. {
  52. document.SetMainActiveLayer(data[i].LayerIndex);
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }