PixelChangesController.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using PixiEditor.Models.DataHolders;
  5. namespace PixiEditor.Models.Controllers
  6. {
  7. public class PixelChangesController
  8. {
  9. private Dictionary<Guid, LayerChange> LastChanges { get; set; }
  10. private Dictionary<Guid, LayerChange> LastOldValues { get; set; }
  11. /// <summary>
  12. /// Adds layer changes to controller.
  13. /// </summary>
  14. /// <param name="changes">New changes.</param>
  15. /// <param name="oldValues">Old values of changes.</param>
  16. public void AddChanges(LayerChange changes, LayerChange oldValues)
  17. {
  18. if (changes.PixelChanges.ChangedPixels.Count > 0)
  19. {
  20. if (LastChanges == null)
  21. {
  22. LastChanges = new Dictionary<Guid, LayerChange> { { changes.LayerGuid, changes } };
  23. LastOldValues = new Dictionary<Guid, LayerChange> { { oldValues.LayerGuid, oldValues } };
  24. }
  25. else if (LastChanges.ContainsKey(changes.LayerGuid))
  26. {
  27. AddToExistingLayerChange(changes, oldValues);
  28. }
  29. else
  30. {
  31. AddNewLayerChange(changes, oldValues);
  32. }
  33. }
  34. }
  35. /// <summary>
  36. /// Returns all changes and deletes them from controller.
  37. /// </summary>
  38. /// <returns>Tuple array with new changes and old values.</returns>
  39. public Tuple<LayerChange, LayerChange>[] PopChanges()
  40. {
  41. // Maybe replace Tuple with custom data type
  42. if (LastChanges == null)
  43. {
  44. return null;
  45. }
  46. Tuple<LayerChange, LayerChange>[] result = new Tuple<LayerChange, LayerChange>[LastChanges.Count];
  47. int i = 0;
  48. foreach (KeyValuePair<Guid, LayerChange> change in LastChanges)
  49. {
  50. Dictionary<Position.Coordinates, System.Windows.Media.Color> pixelChanges =
  51. change.Value.PixelChanges.ChangedPixels.ToDictionary(entry => entry.Key, entry => entry.Value);
  52. Dictionary<Position.Coordinates, System.Windows.Media.Color> oldValues = LastOldValues[change.Key].PixelChanges.ChangedPixels
  53. .ToDictionary(entry => entry.Key, entry => entry.Value);
  54. LayerChange tmp = new LayerChange(new BitmapPixelChanges(pixelChanges), change.Key);
  55. LayerChange oldValuesTmp = new LayerChange(new BitmapPixelChanges(oldValues), change.Key);
  56. result[i] = new Tuple<LayerChange, LayerChange>(tmp, oldValuesTmp);
  57. i++;
  58. }
  59. LastChanges = null;
  60. LastOldValues = null;
  61. return result;
  62. }
  63. private void AddNewLayerChange(LayerChange changes, LayerChange oldValues)
  64. {
  65. LastChanges[changes.LayerGuid] = changes;
  66. LastOldValues[changes.LayerGuid] = oldValues;
  67. }
  68. private void AddToExistingLayerChange(LayerChange layerChange, LayerChange oldValues)
  69. {
  70. foreach (KeyValuePair<Position.Coordinates, System.Windows.Media.Color> change in layerChange.PixelChanges.ChangedPixels)
  71. {
  72. if (LastChanges[layerChange.LayerGuid].PixelChanges.ChangedPixels.ContainsKey(change.Key))
  73. {
  74. continue;
  75. }
  76. else
  77. {
  78. LastChanges[layerChange.LayerGuid].PixelChanges.ChangedPixels.Add(change.Key, change.Value);
  79. }
  80. }
  81. foreach (KeyValuePair<Position.Coordinates, System.Windows.Media.Color> change in oldValues.PixelChanges.ChangedPixels)
  82. {
  83. if (LastOldValues[layerChange.LayerGuid].PixelChanges.ChangedPixels.ContainsKey(change.Key))
  84. {
  85. continue;
  86. }
  87. else
  88. {
  89. LastOldValues[layerChange.LayerGuid].PixelChanges.ChangedPixels.Add(change.Key, change.Value);
  90. }
  91. }
  92. }
  93. }
  94. }