Browse Source

Added documentation for Document.FindMember and added TryFindMember and HasMember methods

CPKreuz 3 years ago
parent
commit
5aad3407bd
17 changed files with 134 additions and 59 deletions
  1. 80 2
      src/PixiEditor.ChangeableDocument/Changeables/Document.cs
  2. 3 4
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ApplyLayerMask_Change.cs
  3. 6 6
      src/PixiEditor.ChangeableDocument/Changes/Drawing/CombineStructureMembersOnto_Change.cs
  4. 19 13
      src/PixiEditor.ChangeableDocument/Changes/Drawing/DrawingChangeHelper.cs
  5. 6 7
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ShiftLayer_UpdateableChange.cs
  6. 2 2
      src/PixiEditor.ChangeableDocument/Changes/Properties/CreateStructureMemberMask_Change.cs
  7. 2 2
      src/PixiEditor.ChangeableDocument/Changes/Properties/DeleteStructureMemberMask_Change.cs
  8. 4 4
      src/PixiEditor.ChangeableDocument/Changes/Properties/LayerLockTransparency_Change.cs
  9. 1 2
      src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberBlendMode_Change.cs
  10. 1 2
      src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberClipToMemberBelow_Change.cs
  11. 1 2
      src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberIsVisible_Change.cs
  12. 2 4
      src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberMaskIsVisible_Change.cs
  13. 1 2
      src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberName_Change.cs
  14. 1 2
      src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberOpacity_UpdateableChange.cs
  15. 3 3
      src/PixiEditor.ChangeableDocument/Changes/Structure/CreateStructureMember_Change.cs
  16. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Structure/DeleteStructureMember_Change.cs
  17. 1 1
      src/PixiEditor.ChangeableDocument/Changes/Structure/MoveStructureMember_Change.cs

+ 80 - 2
src/PixiEditor.ChangeableDocument/Changeables/Document.cs

@@ -1,4 +1,5 @@
-using PixiEditor.ChangeableDocument.Changeables.Interfaces;
+using System.Diagnostics.CodeAnalysis;
+using PixiEditor.ChangeableDocument.Changeables.Interfaces;
 
 namespace PixiEditor.ChangeableDocument.Changeables;
 
@@ -49,14 +50,91 @@ internal class Document : IChangeable, IReadOnlyDocument, IDisposable
         }
     }
 
-    public StructureMember FindMemberOrThrow(Guid guid) => FindMember(guid) ?? throw new ArgumentException("Could not find member with guid " + guid.ToString());
+    /// <summary>
+    /// Check's if a member with the <paramref name="guid"/> exists
+    /// </summary>
+    /// <param name="guid">The <see cref="StructureMember.GuidValue"/> of the member</param>
+    /// <returns>True if the member can be found, otherwise false</returns>
+    public bool HasMember(Guid guid)
+    {
+        var list = FindMemberPath(guid);
+        return list.Count > 0;
+    }
 
+    /// <summary>
+    /// Check's if a member with the <paramref name="guid"/> exists and is of type <typeparamref name="T"/>
+    /// </summary>
+    /// <param name="guid">The <see cref="StructureMember.GuidValue"/> of the member</param>
+    /// <returns>True if the member can be found and is of type <typeparamref name="T"/>, otherwise false</returns>
+    public bool HasMember<T>(Guid guid) where T : StructureMember
+    {
+        var list = FindMemberPath(guid);
+        return list.Count > 0 && list[0] is T;
+    }
+    
+    /// <summary>
+    /// Find's the member with the <paramref name="guid"/> or throws a ArgumentException if not found
+    /// </summary>
+    /// <param name="guid">The <see cref="StructureMember.GuidValue"/> of the member</param>
+    /// <exception cref="ArgumentException">Thrown if the member could not be found</exception>
+    public StructureMember FindMemberOrThrow(Guid guid) => FindMember(guid) ?? throw new ArgumentException($"Could not find member with guid '{guid}'");
+
+    /// <summary>
+    /// Find's the member of type <typeparamref name="T"/> with the <paramref name="guid"/> or throws an exception
+    /// </summary>
+    /// <param name="guid">The <see cref="StructureMember.GuidValue"/> of the member</param>
+    /// <exception cref="ArgumentException">Thrown if the member could not be found</exception>
+    /// <exception cref="InvalidCastException">Thrown if the member is not of type <typeparamref name="T"/></exception>
+    public T FindMemberOrThrow<T>(Guid guid) where T : StructureMember => (T)FindMember(guid)!;
+
+    /// <summary>
+    /// Find's the member with the <paramref name="guid"/> or returns null if not found
+    /// </summary>
+    /// <param name="guid">The <see cref="StructureMember.GuidValue"/> of the member</param>
     public StructureMember? FindMember(Guid guid)
     {
         var list = FindMemberPath(guid);
         return list.Count > 0 ? list[0] : null;
     }
 
+    /// <summary>
+    /// Tries finding the member with the <paramref name="guid"/> and returns if it was found
+    /// </summary>
+    /// <param name="guid">The <see cref="StructureMember.GuidValue"/> of the <paramref name="member"/></param>
+    /// <param name="member">The member</param>
+    /// <returns>True if the member could be found, otherwise false</returns>
+    public bool TryFindMember(Guid guid, [NotNullWhen(true)] out StructureMember? member)
+    {
+        var list = FindMemberPath(guid);
+        if (list.Count == 0)
+        {
+            member = null;
+            return false;
+        }
+
+        member = list[0];
+        return true;
+    }
+
+    /// <summary>
+    /// Tries finding the member with the <paramref name="guid"/> and returns if it was found
+    /// </summary>
+    /// <param name="guid">The <see cref="StructureMember.GuidValue"/> of the <paramref name="member"/></param>
+    /// <param name="member">The member</param>
+    /// <typeparam name="T">The type of the <see cref="StructureMember"/></typeparam>
+    /// <returns>True if the member could be found and is of type <typeparamref name="T"/>, otherwise false</returns>
+    public bool TryFindMember<T>(Guid guid, [NotNullWhen(true)] out T? member) where T : StructureMember
+    {
+        if (!TryFindMember(guid, out var structureMember) || structureMember is not T cast)
+        {
+            member = null;
+            return false;
+        }
+
+        member = cast;
+        return false;
+    }
+
     public (StructureMember, Folder) FindChildAndParentOrThrow(Guid childGuid)
     {
         var path = FindMemberPath(childGuid);

+ 3 - 4
src/PixiEditor.ChangeableDocument/Changes/Drawing/ApplyLayerMask_Change.cs

@@ -15,8 +15,7 @@ internal class ApplyLayerMask_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(layerGuid);
-        if (member is not Layer layer || layer.Mask is null)
+        if (!target.TryFindMember<Layer>(layerGuid, out var layer) || layer.Mask is null)
             return new Error();
 
         savedLayer = new CommittedChunkStorage(layer.LayerImage, layer.LayerImage.FindCommittedChunks());
@@ -26,7 +25,7 @@ internal class ApplyLayerMask_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
-        var layer = (Layer)target.FindMemberOrThrow(layerGuid);
+        var layer = target.FindMemberOrThrow<Layer>(layerGuid);
         if (layer.Mask is null)
             throw new InvalidOperationException("Cannot apply layer mask, no mask");
 
@@ -55,7 +54,7 @@ internal class ApplyLayerMask_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
-        var layer = (Layer)target.FindMemberOrThrow(layerGuid);
+        var layer = target.FindMemberOrThrow<Layer>(layerGuid);
         if (layer.Mask is not null)
             throw new InvalidOperationException("Cannot restore layer mask, it already has one");
         if (savedLayer is null || savedMask is null)

+ 6 - 6
src/PixiEditor.ChangeableDocument/Changes/Drawing/CombineStructureMembersOnto_Change.cs

@@ -20,13 +20,13 @@ internal class CombineStructureMembersOnto_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        if (target.FindMember(targetLayer) is null || membersToMerge.Count == 0)
+        if (!target.HasMember(targetLayer) || membersToMerge.Count == 0)
             return new Error();
         foreach (Guid guid in membersToMerge)
         {
-            var member = target.FindMember(guid);
-            if (member is null)
+            if (!target.TryFindMember(guid, out var member))
                 return new Error();
+            
             if (member is Layer layer)
                 layersToCombine.Add(layer.GuidValue);
             else if (member is Folder innerFolder)
@@ -48,12 +48,12 @@ internal class CombineStructureMembersOnto_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
-        Layer toDrawOn = (Layer)target.FindMemberOrThrow(targetLayer);
+        var toDrawOn = target.FindMemberOrThrow<Layer>(targetLayer);
 
         var chunksToCombine = new HashSet<VecI>();
         foreach (var guid in layersToCombine)
         {
-            var layer = (Layer)target.FindMemberOrThrow(guid);
+            var layer = target.FindMemberOrThrow<Layer>(guid);
             chunksToCombine.UnionWith(layer.LayerImage.FindAllChunks());
         }
 
@@ -77,7 +77,7 @@ internal class CombineStructureMembersOnto_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
-        Layer toDrawOn = (Layer)target.FindMemberOrThrow(targetLayer);
+        var toDrawOn = target.FindMemberOrThrow<Layer>(targetLayer);
         var affectedChunks = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(toDrawOn.LayerImage, ref originalChunks);
         return new LayerImageChunks_ChangeInfo(targetLayer, affectedChunks);
     }

+ 19 - 13
src/PixiEditor.ChangeableDocument/Changes/Drawing/DrawingChangeHelper.cs

@@ -22,16 +22,19 @@ internal static class DrawingChangeHelper
     public static ChunkyImage GetTargetImageOrThrow(Document target, Guid memberGuid, bool drawOnMask)
     {
         var member = target.FindMemberOrThrow(memberGuid);
+        
         if (drawOnMask)
         {
             if (member.Mask is null)
                 throw new InvalidOperationException("Trying to draw on a mask that doesn't exist");
             return member.Mask;
         }
-        else if (member is Folder)
+        
+        if (member is Folder)
         {
             throw new InvalidOperationException("Trying to draw on a folder");
         }
+        
         return ((Layer)member).LayerImage;
     }
 
@@ -41,7 +44,7 @@ internal static class DrawingChangeHelper
             targetImage.SetClippingPath(target.Selection.SelectionPath);
 
         var targetMember = target.FindMemberOrThrow(targetMemberGuid);
-        if (targetMember is Layer layer && layer.LockTransparency && !drawOnMask)
+        if (targetMember is Layer { LockTransparency: true } && !drawOnMask)
             targetImage.EnableLockTransparency();
 
         if (target.HorizontalSymmetryAxisEnabled)
@@ -52,22 +55,25 @@ internal static class DrawingChangeHelper
 
     public static bool IsValidForDrawing(Document target, Guid memberGuid, bool drawOnMask)
     {
-        var member = target.FindMember(memberGuid);
-        if (member is null)
-            return false;
-        if (drawOnMask && member.Mask is null)
-            return false;
-        if (!drawOnMask && member is Folder)
+        if (!target.TryFindMember(memberGuid, out var member))
+        {
             return false;
-        return true;
-    }
+        }
 
-    public static OneOf<None, IChangeInfo, List<IChangeInfo>> CreateChunkChangeInfo(Guid memberGuid, HashSet<VecI> affectedChunks, bool drawOnMask)
-    {
         return drawOnMask switch
+        {
+            // If it should draw on the mask, the mask can't be null
+            true when member.Mask is null => false,
+            // If it should not draw on the mask, the member can't be a folder
+            false when member is Folder => false,
+            _ => true
+        };
+    }
+
+    public static OneOf<None, IChangeInfo, List<IChangeInfo>> CreateChunkChangeInfo(Guid memberGuid, HashSet<VecI> affectedChunks, bool drawOnMask) =>
+        drawOnMask switch
         {
             false => new LayerImageChunks_ChangeInfo(memberGuid, affectedChunks),
             true => new MaskChunks_ChangeInfo(memberGuid, affectedChunks),
         };
-    }
 }

+ 6 - 7
src/PixiEditor.ChangeableDocument/Changes/Drawing/ShiftLayer_UpdateableChange.cs

@@ -14,10 +14,9 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(layerGuid);
-        if (member is not Layer)
-            return new Error();
-        return new Success();
+        if (target.HasMember(layerGuid))
+            return new Success();
+        return new Error();
     }
 
     [UpdateChangeMethod]
@@ -28,7 +27,7 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
 
     private HashSet<VecI> DrawShiftedLayer(Document target)
     {
-        var targetImage = ((Layer)target.FindMemberOrThrow(layerGuid)).LayerImage;
+        var targetImage = target.FindMemberOrThrow<Layer>(layerGuid).LayerImage;
         var prevChunks = targetImage.FindAffectedChunks();
         targetImage.CancelChanges();
         targetImage.EnqueueClear();
@@ -41,7 +40,7 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
         var chunks = DrawShiftedLayer(target);
-        var image = ((Layer)target.FindMemberOrThrow(layerGuid)).LayerImage;
+        var image = target.FindMemberOrThrow<Layer>(layerGuid).LayerImage;
 
         if (originalLayerChunks is not null)
             throw new InvalidOperationException("saved chunks is not null even though we are trying to save them again");
@@ -60,7 +59,7 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
-        var image = ((Layer)target.FindMemberOrThrow(layerGuid)).LayerImage;
+        var image = target.FindMemberOrThrow<Layer>(layerGuid).LayerImage;
         var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(image, ref originalLayerChunks);
         return new LayerImageChunks_ChangeInfo(layerGuid, affected);
     }

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/Properties/CreateStructureMemberMask_Change.cs

@@ -14,9 +14,9 @@ internal class CreateStructureMemberMask_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(targetMember);
-        if (member is null || member.Mask is not null)
+        if (!target.TryFindMember(targetMember, out var member) || member.Mask is not null)
             return new Error();
+        
         return new Success();
     }
 

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/Properties/DeleteStructureMemberMask_Change.cs

@@ -15,9 +15,9 @@ internal class DeleteStructureMemberMask_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(memberGuid);
-        if (member is null || member.Mask is null)
+        if (!target.TryFindMember(memberGuid, out var member) || member.Mask is null)
             return new Error();
+        
         storedMask = member.Mask.CloneFromCommitted();
         return new Success();
     }

+ 4 - 4
src/PixiEditor.ChangeableDocument/Changes/Properties/LayerLockTransparency_Change.cs

@@ -16,9 +16,9 @@ internal class LayerLockTransparency_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(layerGuid);
-        if (member is not Layer layer)
+        if (!target.TryFindMember<Layer>(layerGuid, out var layer))
             return new Error();
+
         originalValue = layer.LockTransparency;
         if (originalValue == newValue)
             return new Error();
@@ -27,14 +27,14 @@ internal class LayerLockTransparency_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
-        ((Layer)target.FindMemberOrThrow(layerGuid)).LockTransparency = newValue;
+        (target.FindMemberOrThrow<Layer>(layerGuid)).LockTransparency = newValue;
         ignoreInUndo = false;
         return new LayerLockTransparency_ChangeInfo(layerGuid, newValue);
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
-        ((Layer)target.FindMemberOrThrow(layerGuid)).LockTransparency = originalValue;
+        (target.FindMemberOrThrow<Layer>(layerGuid)).LockTransparency = originalValue;
         return new LayerLockTransparency_ChangeInfo(layerGuid, originalValue);
     }
 

+ 1 - 2
src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberBlendMode_Change.cs

@@ -17,8 +17,7 @@ internal class StructureMemberBlendMode_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(targetGuid);
-        if (member is null || member.BlendMode == newBlendMode)
+        if (!target.TryFindMember(targetGuid, out var member) || member.BlendMode == newBlendMode)
             return new Error();
         originalBlendMode = member.BlendMode;
         return new Success();

+ 1 - 2
src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberClipToMemberBelow_Change.cs

@@ -16,8 +16,7 @@ internal class StructureMemberClipToMemberBelow_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(memberGuid);
-        if (member is null || member.ClipToMemberBelow == newValue)
+        if (!target.TryFindMember(memberGuid, out var member) || member.ClipToMemberBelow == newValue)
             return new Error();
         originalValue = member.ClipToMemberBelow;
         return new Success();

+ 1 - 2
src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberIsVisible_Change.cs

@@ -16,8 +16,7 @@ internal class StructureMemberIsVisible_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(targetMember);
-        if (member is null || member.IsVisible == newIsVisible)
+        if (!target.TryFindMember(targetMember, out var member) || member.IsVisible == newIsVisible)
             return new Error();
         originalIsVisible = member.IsVisible;
         return new Success();

+ 2 - 4
src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberMaskIsVisible_Change.cs

@@ -16,11 +16,9 @@ internal class StructureMemberMaskIsVisible_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(memberGuid);
-        if (member is null)
-            return new Error();
-        if (member.MaskIsVisible == newMaskIsVisible)
+        if (!target.TryFindMember(memberGuid, out var member) || member.MaskIsVisible == newMaskIsVisible)
             return new Error();
+        
         originalMaskIsVisible = member.MaskIsVisible;
         return new Success();
     }

+ 1 - 2
src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberName_Change.cs

@@ -17,8 +17,7 @@ internal class StructureMemberName_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        var member = target.FindMember(targetMember);
-        if (member is null || member.Name == newName)
+        if (!target.TryFindMember(targetMember, out var member) || member.Name == newName)
             return new Error();
         originalName = member.Name;
         return new Success();

+ 1 - 2
src/PixiEditor.ChangeableDocument/Changes/Properties/StructureMemberOpacity_UpdateableChange.cs

@@ -24,8 +24,7 @@ internal class StructureMemberOpacity_UpdateableChange : UpdateableChange
 
     public override OneOf<Success, Error> InitializeAndValidate(Document document)
     {
-        var member = document.FindMember(memberGuid);
-        if (member is null)
+        if (!document.TryFindMember(memberGuid, out var member))
             return new Error();
         originalOpacity = member.Opacity;
         return new Success();

+ 3 - 3
src/PixiEditor.ChangeableDocument/Changes/Structure/CreateStructureMember_Change.cs

@@ -22,14 +22,14 @@ internal class CreateStructureMember_Change : Change
 
     public override OneOf<Success, Error> InitializeAndValidate(Document target)
     {
-        if (target.FindMember(parentFolderGuid) is null)
+        if (!target.HasMember(parentFolderGuid))
             return new Error();
         return new Success();
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document document, bool firstApply, out bool ignoreInUndo)
     {
-        var folder = (Folder)document.FindMemberOrThrow(parentFolderGuid);
+        var folder = document.FindMemberOrThrow<Folder>(parentFolderGuid);
 
         StructureMember member = type switch
         {
@@ -51,7 +51,7 @@ internal class CreateStructureMember_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document document)
     {
-        Folder folder = (Folder)document.FindMemberOrThrow(parentFolderGuid);
+        Folder folder = document.FindMemberOrThrow<Folder>(parentFolderGuid);
         StructureMember child = document.FindMemberOrThrow(newMemberGuid);
         child.Dispose();
         folder.Children = folder.Children.RemoveAt(folder.Children.FindIndex(member => member.GuidValue == newMemberGuid));

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Structure/DeleteStructureMember_Change.cs

@@ -38,7 +38,7 @@ internal class DeleteStructureMember_Change : Change
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document doc)
     {
-        var parent = (Folder)doc.FindMemberOrThrow(parentGuid);
+        var parent = doc.FindMemberOrThrow<Folder>(parentGuid);
 
         var copy = savedCopy!.Clone();
         parent.Children = parent.Children.Insert(originalIndex, copy);

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changes/Structure/MoveStructureMember_Change.cs

@@ -33,7 +33,7 @@ internal class MoveStructureMember_Change : Change
 
     private static void Move(Document document, Guid memberGuid, Guid targetFolderGuid, int targetIndex)
     {
-        var targetFolder = (Folder)document.FindMemberOrThrow(targetFolderGuid);
+        var targetFolder = document.FindMemberOrThrow<Folder>(targetFolderGuid);
         var (member, curFolder) = document.FindChildAndParentOrThrow(memberGuid);
 
         curFolder.Children = curFolder.Children.Remove(member);