BitmapOperationsUtility.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using PixiEditor.Helpers;
  2. using PixiEditor.Models.Controllers;
  3. using PixiEditor.Models.Enums;
  4. using PixiEditor.Models.Layers;
  5. using PixiEditor.Models.Position;
  6. using PixiEditor.Models.Tools;
  7. using System;
  8. using System.Collections.ObjectModel;
  9. using System.Diagnostics;
  10. using System.Linq;
  11. using System.Windows.Input;
  12. using System.Windows.Media;
  13. using System.Windows.Media.Imaging;
  14. namespace PixiEditor.Models.Controllers
  15. {
  16. public class BitmapOperationsUtility : NotifyableObject
  17. {
  18. public MouseMovementController MouseController { get; set; }
  19. public Tool SelectedTool { get; set; }
  20. private ObservableCollection<Layer> _layers = new ObservableCollection<Layer>();
  21. public ObservableCollection<Layer> Layers
  22. {
  23. get => _layers;
  24. set { if (_layers != value) { _layers = value; } }
  25. }
  26. private int _activeLayerIndex;
  27. public int ActiveLayerIndex
  28. {
  29. get => _activeLayerIndex;
  30. set
  31. {
  32. _activeLayerIndex = value;
  33. RaisePropertyChanged("ActiveLayerIndex");
  34. RaisePropertyChanged("ActiveLayer");
  35. }
  36. }
  37. public Layer ActiveLayer => Layers.Count > 0 ? Layers[ActiveLayerIndex] : null;
  38. public Color PrimaryColor { get; set; }
  39. public int ToolSize { get; set; }
  40. public event EventHandler<BitmapChangedEventArgs> BitmapChanged;
  41. public event EventHandler<LayersChangedEventArgs> LayersChanged;
  42. public BitmapOperationsUtility()
  43. {
  44. MouseController = new MouseMovementController();
  45. MouseController.MousePositionChanged += Controller_MousePositionChanged;
  46. }
  47. private void Controller_MousePositionChanged(object sender, MouseMovementEventArgs e)
  48. {
  49. if(SelectedTool != null && Mouse.LeftButton == MouseButtonState.Pressed)
  50. {
  51. var pixels = MouseController.LastMouseMoveCoordinates;
  52. pixels.Reverse();
  53. var changedPixels = SelectedTool.Use(Layers[ActiveLayerIndex], pixels.ToArray(), PrimaryColor, ToolSize);
  54. ActiveLayer.ApplyPixels(changedPixels);
  55. BitmapChanged?.Invoke(this, new BitmapChangedEventArgs(changedPixels, ActiveLayerIndex));
  56. }
  57. }
  58. public void AddNewLayer(string name, int height, int width, bool setAsActive = true)
  59. {
  60. Layers.Add(new Layer(name, width, height));
  61. if (setAsActive)
  62. {
  63. ActiveLayerIndex = Layers.Count - 1;
  64. }
  65. LayersChanged?.Invoke(this, new LayersChangedEventArgs(0, LayerAction.Add));
  66. }
  67. public void SetActiveLayer(int index)
  68. {
  69. ActiveLayerIndex = index;
  70. LayersChanged?.Invoke(this, new LayersChangedEventArgs(index, LayerAction.SetActive));
  71. }
  72. }
  73. }
  74. public class BitmapChangedEventArgs : EventArgs
  75. {
  76. public BitmapPixelChanges PixelsChanged { get; set; }
  77. public int ChangedLayerIndex { get; set; }
  78. public BitmapChangedEventArgs(BitmapPixelChanges pixelsChanged, int changedLayerIndex)
  79. {
  80. PixelsChanged = pixelsChanged;
  81. ChangedLayerIndex = changedLayerIndex;
  82. }
  83. }
  84. public class LayersChangedEventArgs : EventArgs
  85. {
  86. public int LayerAffected { get; set; }
  87. public LayerAction LayerChangeType { get; set; }
  88. public LayersChangedEventArgs(int layerAffected, LayerAction layerChangeType)
  89. {
  90. LayerAffected = layerAffected;
  91. LayerChangeType = layerChangeType;
  92. }
  93. }