Skip to content

Commit

Permalink
Magic wand multi-layer support
Browse files Browse the repository at this point in the history
  • Loading branch information
flabbet committed Apr 8, 2023
1 parent 8672ca5 commit fa4e58f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,16 @@ internal class MagicWand_Change : Change
private VectorPath? originalPath;
private VectorPath path = new() { FillType = PathFillType.EvenOdd };
private VecI point;
private readonly Guid memberGuid;
private readonly bool referenceAll;
private readonly List<Guid> memberGuids;
private readonly bool drawOnMask;
private readonly SelectionMode mode;

[GenerateMakeChangeAction]
public MagicWand_Change(Guid memberGuid, VecI point, SelectionMode mode, bool referenceAll, bool drawOnMask)
public MagicWand_Change(List<Guid> memberGuids, VecI point, SelectionMode mode, bool drawOnMask)
{
path.MoveTo(point);
this.mode = mode;
this.memberGuid = memberGuid;
this.referenceAll = referenceAll;
this.memberGuids = memberGuids;
this.drawOnMask = drawOnMask;
this.point = point;
}
Expand All @@ -34,13 +32,14 @@ public override bool InitializeAndValidate(Document target)

public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
{
var image = DrawingChangeHelper.GetTargetImageOrThrow(target, memberGuid, drawOnMask);

HashSet<Guid> membersToReference = new();
if (referenceAll)
target.ForEveryReadonlyMember(member => membersToReference.Add(member.GuidValue));
else
membersToReference.Add(memberGuid);

target.ForEveryReadonlyMember(member =>
{
if (memberGuids.Contains(member.GuidValue))
membersToReference.Add(member.GuidValue);
});

path = MagicWandHelper.DoMagicWandFloodFill(point, membersToReference, target);

ignoreInUndo = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,25 @@ internal class MagicWandToolExecutor : UpdateableChangeExecutor
{
private bool considerAllLayers;
private bool drawOnMask;
private Guid memberGuid;
private List<Guid> memberGuids;
private SelectionMode mode;

public override ExecutionState Start()
{
var magicWand = ViewModelMain.Current?.ToolsSubViewModel.GetTool<MagicWandToolViewModel>();
var member = document!.SelectedStructureMember;
var members = document!.ExtractSelectedLayers(true);

if (magicWand is null || member is null)
return ExecutionState.Error;
drawOnMask = member is not LayerViewModel layer || layer.ShouldDrawOnMask;
if (drawOnMask && !member.HasMaskBindable)
return ExecutionState.Error;
if (!drawOnMask && member is not LayerViewModel)
if (magicWand is null || members.Count == 0)
return ExecutionState.Error;

mode = magicWand.SelectMode;
memberGuid = member.GuidValue;
memberGuids = members;
considerAllLayers = magicWand.DocumentScope == DocumentScope.AllLayers;
if (considerAllLayers)
memberGuids = document!.StructureHelper.GetAllLayers().Select(x => x.GuidValue).ToList();
var pos = controller!.LastPixelPosition;

internals!.ActionAccumulator.AddActions(new MagicWand_Action(memberGuid, pos, mode, considerAllLayers, drawOnMask));
internals!.ActionAccumulator.AddActions(new MagicWand_Action(memberGuids, pos, mode, considerAllLayers));

return ExecutionState.Success;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -520,8 +520,54 @@ public void InternalSetSelectedMember(StructureMemberViewModel? member)
/// </summary>
public List<Guid> GetSelectedMembers()
{
List<Guid> layerGuids = new List<Guid>() { SelectedStructureMember.GuidValue };
layerGuids.AddRange( SoftSelectedStructureMembers.Select(x => x.GuidValue));
List<Guid> layerGuids = new List<Guid>();
if (SelectedStructureMember is not null)
layerGuids.Add(SelectedStructureMember.GuidValue);

layerGuids.AddRange(SoftSelectedStructureMembers.Select(x => x.GuidValue));
return layerGuids;
}

public List<Guid> ExtractSelectedLayers(bool includeFoldersWithMask = false)
{
var result = new List<Guid>();
List<Guid> selectedMembers = GetSelectedMembers();
foreach (var member in selectedMembers)
{
var foundMember = StructureHelper.Find(member);
if (foundMember != null)
{
if (foundMember is LayerViewModel layer && selectedMembers.Contains(foundMember.GuidValue) && !result.Contains(layer.GuidValue))
{
result.Add(layer.GuidValue);
}
else if (foundMember is FolderViewModel folder && selectedMembers.Contains(foundMember.GuidValue))
{
if (includeFoldersWithMask && folder.HasMaskBindable && !result.Contains(folder.GuidValue))
result.Add(folder.GuidValue);
ExtractSelectedLayers(folder, result, includeFoldersWithMask);
}
}
}
return result;
}

private void ExtractSelectedLayers(FolderViewModel folder, List<Guid> list,
bool includeFoldersWithMask)
{
foreach (var member in folder.Children)
{
if (member is LayerViewModel layer && !list.Contains(layer.GuidValue))
{
list.Add(layer.GuidValue);
}
else if (member is FolderViewModel childFolder)
{
if (includeFoldersWithMask && childFolder.HasMaskBindable && !list.Contains(childFolder.GuidValue))
list.Add(childFolder.GuidValue);

ExtractSelectedLayers(childFolder, list, includeFoldersWithMask);
}
}
}
}

0 comments on commit fa4e58f

Please sign in to comment.