ReferenceLayerViewModel.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using System.Collections.Immutable;
  2. using System.Linq;
  3. using Avalonia;
  4. using Avalonia.Media.Imaging;
  5. using ChunkyImageLib;
  6. using ChunkyImageLib.DataHolders;
  7. using ChunkyImageLib.Operations;
  8. using CommunityToolkit.Mvvm.ComponentModel;
  9. using PixiEditor.Helpers;
  10. using PixiEditor.ChangeableDocument.Actions.Generated;
  11. using Drawie.Backend.Core;
  12. using Drawie.Backend.Core.Numerics;
  13. using Drawie.Backend.Core.Surfaces.ImageData;
  14. using PixiEditor.Models.DocumentModels;
  15. using PixiEditor.Models.Handlers;
  16. using Drawie.Numerics;
  17. using PixiEditor.ViewModels.Tools.Tools;
  18. namespace PixiEditor.ViewModels.Document;
  19. #nullable enable
  20. internal class ReferenceLayerViewModel : PixiObservableObject, IReferenceLayerHandler
  21. {
  22. private readonly DocumentViewModel doc;
  23. private readonly DocumentInternalParts internals;
  24. public const double TopMostOpacity = 0.6;
  25. public Texture? ReferenceTexture { get; private set; }
  26. private ShapeCorners referenceShape;
  27. public ShapeCorners ReferenceShapeBindable
  28. {
  29. get => referenceShape;
  30. set
  31. {
  32. if (!doc.BlockingUpdateableChangeActive)
  33. internals.ActionAccumulator.AddFinishedActions(new TransformReferenceLayer_Action(value));
  34. }
  35. }
  36. public Matrix3X3 ReferenceTransformMatrix
  37. {
  38. get
  39. {
  40. if (ReferenceTexture is null)
  41. return Matrix3X3.Identity;
  42. return OperationHelper.CreateMatrixFromPoints(ReferenceShapeBindable, new VecD(ReferenceTexture.Size.X, ReferenceTexture.Size.Y));
  43. }
  44. }
  45. private bool isVisible;
  46. public bool IsVisibleBindable
  47. {
  48. get => isVisible;
  49. set
  50. {
  51. if (!doc.BlockingUpdateableChangeActive)
  52. internals.ActionAccumulator.AddFinishedActions(new ReferenceLayerIsVisible_Action(value));
  53. }
  54. }
  55. private bool isTransforming;
  56. bool IReferenceLayerHandler.IsVisible => isVisible;
  57. public bool IsTransforming
  58. {
  59. get => isTransforming;
  60. set
  61. {
  62. isTransforming = value;
  63. OnPropertyChanged(nameof(IsTransforming));
  64. OnPropertyChanged(nameof(ShowHighest));
  65. }
  66. }
  67. private bool isTopMost;
  68. public bool IsTopMost
  69. {
  70. get => isTopMost;
  71. set
  72. {
  73. if (!doc.BlockingUpdateableChangeActive)
  74. internals.ActionAccumulator.AddFinishedActions(new ReferenceLayerTopMost_Action(value));
  75. }
  76. }
  77. public bool ShowHighest
  78. {
  79. get => (IsTopMost || IsTransforming) && !IsColorPickerSelected();
  80. }
  81. public ReferenceLayerViewModel(DocumentViewModel doc, DocumentInternalParts internals)
  82. {
  83. this.doc = doc;
  84. this.internals = internals;
  85. }
  86. private bool IsColorPickerSelected()
  87. {
  88. var viewModel = ViewModelMain.Current.ToolsSubViewModel;
  89. if (viewModel.ActiveTool is ColorPickerToolViewModel colorPicker)
  90. {
  91. return colorPicker.PickFromReferenceLayer && !colorPicker.PickFromCanvas;
  92. }
  93. return false;
  94. }
  95. #region Internal methods
  96. public void RaiseShowHighestChanged() => OnPropertyChanged(nameof(ShowHighest));
  97. public void SetReferenceLayer(ImmutableArray<byte> imageBgra8888Bytes, VecI imageSize, ShapeCorners shape)
  98. {
  99. ReferenceTexture = Texture.Load(imageBgra8888Bytes.ToArray(), ColorType.Bgra8888, imageSize);
  100. referenceShape = shape;
  101. isVisible = true;
  102. isTransforming = false;
  103. isTopMost = false;
  104. OnPropertyChanged(nameof(ReferenceTexture));
  105. OnPropertyChanged(nameof(ReferenceShapeBindable));
  106. OnPropertyChanged(nameof(ReferenceTransformMatrix));
  107. OnPropertyChanged(nameof(IsVisibleBindable));
  108. OnPropertyChanged(nameof(IsTransforming));
  109. OnPropertyChanged(nameof(ShowHighest));
  110. }
  111. public void DeleteReferenceLayer()
  112. {
  113. ReferenceTexture = null;
  114. isVisible = false;
  115. OnPropertyChanged(nameof(ReferenceTexture));
  116. OnPropertyChanged(nameof(ReferenceTransformMatrix));
  117. OnPropertyChanged(nameof(IsVisibleBindable));
  118. }
  119. public void TransformReferenceLayer(ShapeCorners shape)
  120. {
  121. referenceShape = shape;
  122. OnPropertyChanged(nameof(ReferenceShapeBindable));
  123. OnPropertyChanged(nameof(ReferenceTransformMatrix));
  124. }
  125. public void SetReferenceLayerIsVisible(bool isVisible)
  126. {
  127. this.isVisible = isVisible;
  128. OnPropertyChanged(nameof(IsVisibleBindable));
  129. }
  130. public void SetReferenceLayerTopMost(bool isTopMost)
  131. {
  132. this.isTopMost = isTopMost;
  133. OnPropertyChanged(nameof(IsTopMost));
  134. OnPropertyChanged(nameof(ShowHighest));
  135. }
  136. #endregion
  137. }