Browse Source

Added top most to undo

CPKreuz 2 years ago
parent
commit
63d68c84dc

+ 3 - 0
src/PixiEditor.ChangeableDocument/ChangeInfos/Root/ReferenceLayerChangeInfos/ReferenceLayerTopMost_ChangeInfo.cs

@@ -0,0 +1,3 @@
+namespace PixiEditor.ChangeableDocument.ChangeInfos.Root.ReferenceLayerChangeInfos;
+
+public record ReferenceLayerTopMost_ChangeInfo(bool IsTopMost) : IChangeInfo;

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changeables/Interfaces/IReadOnlyReferenceLayer.cs

@@ -8,4 +8,5 @@ public interface IReadOnlyReferenceLayer
     public VecI ImageSize { get; }
     public VecI ImageSize { get; }
     public ShapeCorners Shape { get; }
     public ShapeCorners Shape { get; }
     public bool IsVisible { get; }
     public bool IsVisible { get; }
+    public bool IsTopMost { get; }
 }
 }

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changeables/ReferenceLayer.cs

@@ -10,6 +10,7 @@ public class ReferenceLayer : IReadOnlyReferenceLayer
     public VecI ImageSize { get; }
     public VecI ImageSize { get; }
     public ShapeCorners Shape { get; set; }
     public ShapeCorners Shape { get; set; }
     public bool IsVisible { get; set; } = true;
     public bool IsVisible { get; set; } = true;
+    public bool IsTopMost { get; set; }
     
     
     public ReferenceLayer(ImmutableArray<byte> imagePbgra32Bytes, VecI imageSize, ShapeCorners shape)
     public ReferenceLayer(ImmutableArray<byte> imagePbgra32Bytes, VecI imageSize, ShapeCorners shape)
     {
     {

+ 29 - 0
src/PixiEditor.ChangeableDocument/Changes/Root/ReferenceLayerChanges/ReferenceLayerTopMost_Change.cs

@@ -0,0 +1,29 @@
+using PixiEditor.ChangeableDocument.ChangeInfos.Root.ReferenceLayerChangeInfos;
+
+namespace PixiEditor.ChangeableDocument.Changes.Root.ReferenceLayerChanges;
+
+internal class ReferenceLayerTopMost_Change : Change
+{
+    private bool isTopMost;
+
+    [GenerateMakeChangeAction]
+    public ReferenceLayerTopMost_Change(bool isTopMost)
+    {
+        this.isTopMost = isTopMost;
+    }
+
+    public override bool InitializeAndValidate(Document target) => true;
+
+    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
+    {
+        target.ReferenceLayer!.IsTopMost = isTopMost;
+        ignoreInUndo = false;
+        return new ReferenceLayerTopMost_ChangeInfo(isTopMost);
+    }
+
+    public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
+    {
+        target.ReferenceLayer!.IsTopMost = !isTopMost;
+        return new ReferenceLayerTopMost_ChangeInfo(!isTopMost);
+    }
+}

+ 9 - 0
src/PixiEditor/Models/DocumentModels/DocumentUpdater.cs

@@ -110,6 +110,9 @@ internal class DocumentUpdater
             case ReferenceLayerIsVisible_ChangeInfo info:
             case ReferenceLayerIsVisible_ChangeInfo info:
                 ProcessReferenceLayerIsVisible(info);
                 ProcessReferenceLayerIsVisible(info);
                 break;
                 break;
+            case ReferenceLayerTopMost_ChangeInfo info:
+                ProcessReferenceLayerTopMost(info);
+                break;
             case SetSelectedMember_PassthroughAction info:
             case SetSelectedMember_PassthroughAction info:
                 ProcessSetSelectedMember(info);
                 ProcessSetSelectedMember(info);
                 break;
                 break;
@@ -122,6 +125,7 @@ internal class DocumentUpdater
             case ClearSoftSelectedMembers_PassthroughAction info:
             case ClearSoftSelectedMembers_PassthroughAction info:
                 ProcessClearSoftSelectedMembers(info);
                 ProcessClearSoftSelectedMembers(info);
                 break;
                 break;
+                
         }
         }
     }
     }
 
 
@@ -145,6 +149,11 @@ internal class DocumentUpdater
         doc.ReferenceLayerViewModel.InternalSetReferenceLayer(info.ImagePbgra32Bytes, info.ImageSize, info.Shape);
         doc.ReferenceLayerViewModel.InternalSetReferenceLayer(info.ImagePbgra32Bytes, info.ImageSize, info.Shape);
     }
     }
     
     
+    private void ProcessReferenceLayerTopMost(ReferenceLayerTopMost_ChangeInfo info)
+    {
+        doc.ReferenceLayerViewModel.InternalSetReferenceLayerTopMost(info.IsTopMost);
+    }
+
     private void ProcessRemoveSoftSelectedMember(RemoveSoftSelectedMember_PassthroughAction info)
     private void ProcessRemoveSoftSelectedMember(RemoveSoftSelectedMember_PassthroughAction info)
     {
     {
         StructureMemberViewModel? member = doc.StructureHelper.Find(info.GuidValue);
         StructureMemberViewModel? member = doc.StructureHelper.Find(info.GuidValue);

+ 13 - 3
src/PixiEditor/ViewModels/SubViewModels/Document/ReferenceLayerViewModel.cs

@@ -71,9 +71,8 @@ internal class ReferenceLayerViewModel : INotifyPropertyChanged
         get => isTopMost;
         get => isTopMost;
         set
         set
         {
         {
-            isTopMost = value;
-            RaisePropertyChanged(nameof(IsTopMost));
-            RaisePropertyChanged(nameof(ShowHighest));
+            if (!doc.UpdateableChangeActive)
+                internals.ActionAccumulator.AddFinishedActions(new ReferenceLayerTopMost_Action(value));
         }
         }
     }
     }
     
     
@@ -100,10 +99,14 @@ internal class ReferenceLayerViewModel : INotifyPropertyChanged
         ReferenceBitmap = WriteableBitmapHelpers.FromPbgra32Array(imagePbgra32Bytes.ToArray(), imageSize);
         ReferenceBitmap = WriteableBitmapHelpers.FromPbgra32Array(imagePbgra32Bytes.ToArray(), imageSize);
         referenceShape = shape;
         referenceShape = shape;
         isVisible = true;
         isVisible = true;
+        isTransforming = false;
+        isTopMost = false;
         RaisePropertyChanged(nameof(ReferenceBitmap));
         RaisePropertyChanged(nameof(ReferenceBitmap));
         RaisePropertyChanged(nameof(ReferenceShapeBindable));
         RaisePropertyChanged(nameof(ReferenceShapeBindable));
         RaisePropertyChanged(nameof(ReferenceTransformMatrix));
         RaisePropertyChanged(nameof(ReferenceTransformMatrix));
         RaisePropertyChanged(nameof(IsVisibleBindable));
         RaisePropertyChanged(nameof(IsVisibleBindable));
+        RaisePropertyChanged(nameof(IsTransforming));
+        RaisePropertyChanged(nameof(ShowHighest));
     }
     }
 
 
     public void InternalDeleteReferenceLayer()
     public void InternalDeleteReferenceLayer()
@@ -128,5 +131,12 @@ internal class ReferenceLayerViewModel : INotifyPropertyChanged
         RaisePropertyChanged(nameof(IsVisibleBindable));
         RaisePropertyChanged(nameof(IsVisibleBindable));
     }
     }
 
 
+    public void InternalSetReferenceLayerTopMost(bool isTopMost)
+    {
+        this.isTopMost = isTopMost;
+        RaisePropertyChanged(nameof(IsTopMost));
+        RaisePropertyChanged(nameof(ShowHighest));
+    }
+
     #endregion
     #endregion
 }
 }