|
@@ -7,13 +7,15 @@ namespace PixiEditor.ChangeableDocument.Changes.Drawing
|
|
{
|
|
{
|
|
internal class DrawRectangle_UpdateableChange : UpdateableChange
|
|
internal class DrawRectangle_UpdateableChange : UpdateableChange
|
|
{
|
|
{
|
|
- private Guid layerGuid;
|
|
|
|
|
|
+ private readonly Guid memberGuid;
|
|
private ShapeData rect;
|
|
private ShapeData rect;
|
|
|
|
+ private readonly bool drawOnMask;
|
|
private CommittedChunkStorage? storedChunks;
|
|
private CommittedChunkStorage? storedChunks;
|
|
- public DrawRectangle_UpdateableChange(Guid layerGuid, ShapeData rectangle)
|
|
|
|
|
|
+ public DrawRectangle_UpdateableChange(Guid memberGuid, ShapeData rectangle, bool drawOnMask)
|
|
{
|
|
{
|
|
- this.layerGuid = layerGuid;
|
|
|
|
|
|
+ this.memberGuid = memberGuid;
|
|
this.rect = rectangle;
|
|
this.rect = rectangle;
|
|
|
|
+ this.drawOnMask = drawOnMask;
|
|
}
|
|
}
|
|
|
|
|
|
public override void Initialize(Document target) { }
|
|
public override void Initialize(Document target) { }
|
|
@@ -23,29 +25,63 @@ namespace PixiEditor.ChangeableDocument.Changes.Drawing
|
|
rect = updatedRectangle;
|
|
rect = updatedRectangle;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private ChunkyImage GetTargetImage(Document target)
|
|
|
|
+ {
|
|
|
|
+ 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)
|
|
|
|
+ {
|
|
|
|
+ throw new InvalidOperationException("Trying to draw on a folder");
|
|
|
|
+ }
|
|
|
|
+ return ((Layer)member).LayerImage;
|
|
|
|
+ }
|
|
|
|
+
|
|
public override IChangeInfo? ApplyTemporarily(Document target)
|
|
public override IChangeInfo? ApplyTemporarily(Document target)
|
|
{
|
|
{
|
|
- Layer layer = (Layer)target.FindMemberOrThrow(layerGuid);
|
|
|
|
- var oldChunks = layer.LayerImage.FindAffectedChunks();
|
|
|
|
- layer.LayerImage.CancelChanges();
|
|
|
|
|
|
+ ChunkyImage targetImage = GetTargetImage(target);
|
|
|
|
+
|
|
|
|
+ var oldChunks = targetImage.FindAffectedChunks();
|
|
|
|
+ targetImage.CancelChanges();
|
|
if (!target.Selection.IsEmptyAndInactive)
|
|
if (!target.Selection.IsEmptyAndInactive)
|
|
- layer.LayerImage.ApplyRasterClip(target.Selection.SelectionImage);
|
|
|
|
- layer.LayerImage.DrawRectangle(rect);
|
|
|
|
- var newChunks = layer.LayerImage.FindAffectedChunks();
|
|
|
|
|
|
+ targetImage.ApplyRasterClip(target.Selection.SelectionImage);
|
|
|
|
+ targetImage.DrawRectangle(rect);
|
|
|
|
+ var newChunks = targetImage.FindAffectedChunks();
|
|
newChunks.UnionWith(oldChunks);
|
|
newChunks.UnionWith(oldChunks);
|
|
- return new LayerImageChunks_ChangeInfo()
|
|
|
|
|
|
+
|
|
|
|
+ return drawOnMask switch
|
|
{
|
|
{
|
|
- Chunks = newChunks,
|
|
|
|
- LayerGuid = layerGuid
|
|
|
|
|
|
+ false => new LayerImageChunks_ChangeInfo()
|
|
|
|
+ {
|
|
|
|
+ Chunks = newChunks,
|
|
|
|
+ LayerGuid = memberGuid
|
|
|
|
+ },
|
|
|
|
+ true => new MaskChunks_ChangeInfo()
|
|
|
|
+ {
|
|
|
|
+ Chunks = newChunks,
|
|
|
|
+ MemberGuid = memberGuid
|
|
|
|
+ },
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
public override IChangeInfo? Apply(Document target, out bool ignoreInUndo)
|
|
public override IChangeInfo? Apply(Document target, out bool ignoreInUndo)
|
|
{
|
|
{
|
|
- Layer layer = (Layer)target.FindMemberOrThrow(layerGuid);
|
|
|
|
|
|
+ ChunkyImage targetImage = GetTargetImage(target);
|
|
var changes = ApplyTemporarily(target);
|
|
var changes = ApplyTemporarily(target);
|
|
- storedChunks = new CommittedChunkStorage(layer.LayerImage, ((LayerImageChunks_ChangeInfo)changes!).Chunks!);
|
|
|
|
- layer.LayerImage.CommitChanges();
|
|
|
|
|
|
+
|
|
|
|
+ var changedChunks = changes! switch
|
|
|
|
+ {
|
|
|
|
+ LayerImageChunks_ChangeInfo info => info.Chunks,
|
|
|
|
+ MaskChunks_ChangeInfo info => info.Chunks,
|
|
|
|
+ _ => throw new InvalidOperationException("Unknown chunk type"),
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ storedChunks = new CommittedChunkStorage(targetImage, changedChunks!);
|
|
|
|
+ targetImage.CommitChanges();
|
|
|
|
|
|
ignoreInUndo = false;
|
|
ignoreInUndo = false;
|
|
return changes;
|
|
return changes;
|
|
@@ -53,16 +89,24 @@ namespace PixiEditor.ChangeableDocument.Changes.Drawing
|
|
|
|
|
|
public override IChangeInfo? Revert(Document target)
|
|
public override IChangeInfo? Revert(Document target)
|
|
{
|
|
{
|
|
- Layer layer = (Layer)target.FindMemberOrThrow(layerGuid);
|
|
|
|
- storedChunks!.ApplyChunksToImage(layer.LayerImage);
|
|
|
|
|
|
+ ChunkyImage targetImage = GetTargetImage(target);
|
|
|
|
+ storedChunks!.ApplyChunksToImage(targetImage);
|
|
storedChunks.Dispose();
|
|
storedChunks.Dispose();
|
|
storedChunks = null;
|
|
storedChunks = null;
|
|
- var changes = new LayerImageChunks_ChangeInfo()
|
|
|
|
|
|
+ IChangeInfo changes = drawOnMask switch
|
|
{
|
|
{
|
|
- Chunks = layer.LayerImage.FindAffectedChunks(),
|
|
|
|
- LayerGuid = layerGuid,
|
|
|
|
|
|
+ false => new LayerImageChunks_ChangeInfo()
|
|
|
|
+ {
|
|
|
|
+ Chunks = targetImage.FindAffectedChunks(),
|
|
|
|
+ LayerGuid = memberGuid,
|
|
|
|
+ },
|
|
|
|
+ true => new MaskChunks_ChangeInfo()
|
|
|
|
+ {
|
|
|
|
+ Chunks = targetImage.FindAffectedChunks(),
|
|
|
|
+ MemberGuid = memberGuid,
|
|
|
|
+ },
|
|
};
|
|
};
|
|
- layer.LayerImage.CommitChanges();
|
|
|
|
|
|
+ targetImage.CommitChanges();
|
|
return changes;
|
|
return changes;
|
|
}
|
|
}
|
|
|
|
|