Skip to content

Commit

Permalink
Layer tree caching wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Equbuxu committed Dec 17, 2021
1 parent 28ffc11 commit 603fc02
Show file tree
Hide file tree
Showing 26 changed files with 405 additions and 206 deletions.
19 changes: 19 additions & 0 deletions PixiEditor/Helpers/Converters/DebugConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;
using System.Globalization;

namespace PixiEditor.Helpers.Converters
{
public class DebugConverter
: SingleInstanceConverter<DebugConverter>
{
public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}

public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
using PixiEditor.Models.Layers;
using PixiEditor.Models.DataHolders;
using PixiEditor.Models.Layers;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using PixiEditor.Models.DataHolders;

namespace PixiEditor.Helpers.Converters
{
Expand Down Expand Up @@ -35,7 +33,7 @@ public override object Convert(object[] values, Type targetType, object paramete
{
cachedTree = new StructuredLayerTree(layers, structure);
lastLayers = layers;
lastLayerGuids = layers.Select(x => x.LayerGuid).ToList();
lastLayerGuids = layers.Select(x => x.GuidValue).ToList();
lastStructure = structure.CloneGroups();
}

Expand All @@ -52,7 +50,7 @@ public override object[] ConvertBack(object value, Type[] targetTypes, object pa

private bool LayerOrderIsDifferent(IList<Layer> layers)
{
var guids = layers.Select(x => x.LayerGuid).ToArray();
var guids = layers.Select(x => x.GuidValue).ToArray();
return !guids.SequenceEqual(lastLayerGuids);
}

Expand Down
8 changes: 4 additions & 4 deletions PixiEditor/Helpers/Extensions/ParserHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ public static GuidStructureItem ToGroup(this SerializableGroup sgroup, GuidStruc
Opacity = sgroup.Opacity,
IsVisible = sgroup.IsVisible,
Parent = parent,
StartLayerGuid = document.Layers[sgroup.StartLayer].LayerGuid,
EndLayerGuid = document.Layers[sgroup.EndLayer].LayerGuid
StartLayerGuid = document.Layers[sgroup.StartLayer].GuidValue,
EndLayerGuid = document.Layers[sgroup.EndLayer].GuidValue
};

group.Subgroups = new(sgroup.Subgroups.ToGroups(document, group));
Expand Down Expand Up @@ -127,12 +127,12 @@ public static SerializableGroup ToSerializable(this GuidStructureItem group, Doc

for (int i = 0; i < document.Layers.Count; i++)
{
if (group.StartLayerGuid == document.Layers[i].LayerGuid)
if (group.StartLayerGuid == document.Layers[i].GuidValue)
{
serializable.StartLayer = i;
}

if (group.EndLayerGuid == document.Layers[i].LayerGuid)
if (group.EndLayerGuid == document.Layers[i].GuidValue)
{
serializable.EndLayer = i;
}
Expand Down
2 changes: 1 addition & 1 deletion PixiEditor/Models/Controllers/BitmapOperationsUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public void DeletePixels(Layer[] layers, Coordinates[] pixels)
BitmapPixelChanges changes = BitmapPixelChanges.FromSingleColoredArray(pixels, SKColors.Empty);
for (int i = 0; i < layers.Length; i++)
{
Guid guid = layers[i].LayerGuid;
Guid guid = layers[i].GuidValue;
layers[i].SetPixels(changes);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ private void LayerStructure_LayerStructureChanged(object sender, LayerStructureC
RaisePropertyChanged(nameof(LayerStructure));
foreach (var layerGuid in e.AffectedLayerGuids)
{
Layer layer = Layers.First(x => x.LayerGuid == layerGuid);
Layer layer = Layers.First(x => x.GuidValue == layerGuid);
layer.RaisePropertyChange(nameof(layer.IsVisible));
layer.RaisePropertyChange(nameof(layer.Opacity));
}
Expand Down
72 changes: 36 additions & 36 deletions PixiEditor/Models/DataHolders/Document/Document.Layers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows;
Expand Down Expand Up @@ -78,7 +77,7 @@ public SingleLayerRenderer ReferenceLayerRenderer
get => referenceLayerRenderer;
}

public Layer ActiveLayer => Layers.Count > 0 ? Layers.FirstOrDefault(x => x.LayerGuid == ActiveLayerGuid) : null;
public Layer ActiveLayer => Layers.Count > 0 ? Layers.FirstOrDefault(x => x.GuidValue == ActiveLayerGuid) : null;

public Guid ActiveLayerGuid
{
Expand Down Expand Up @@ -111,7 +110,7 @@ public void SetMainActiveLayer(int index)
}
}

ActiveLayerGuid = Layers[index].LayerGuid;
ActiveLayerGuid = Layers[index].GuidValue;
ActiveLayer.IsActive = true;
LayersChanged?.Invoke(this, new LayersChangedEventArgs(ActiveLayerGuid, LayerAction.SetActive));
}
Expand All @@ -126,7 +125,7 @@ public void UpdateLayersColor()
{
foreach (var layer in Layers)
{
if (layer.LayerGuid == ActiveLayerGuid)
if (layer.GuidValue == ActiveLayerGuid)
{
layer.LayerHighlightColor = MainSelectedLayerColor;
}
Expand All @@ -141,7 +140,7 @@ public void MoveLayerInStructure(Guid layerGuid, Guid referenceLayer, bool above
{
var args = new object[] { layerGuid, referenceLayer, above };

Layer layer = Layers.First(x => x.LayerGuid == layerGuid);
Layer layer = Layers.First(x => x.GuidValue == layerGuid);

int oldIndex = Layers.IndexOf(layer);

Expand All @@ -167,21 +166,21 @@ public void MoveGroupInStructure(Guid groupGuid, Guid referenceLayer, bool above
{
var args = new object[] { groupGuid, referenceLayer, above };

var topLayer = Layers.First(x => x.LayerGuid == LayerStructure.GetGroupByGuid(groupGuid).EndLayerGuid);
var bottomLayer = Layers.First(x => x.LayerGuid == LayerStructure.GetGroupByGuid(groupGuid).StartLayerGuid);
var topLayer = Layers.First(x => x.GuidValue == LayerStructure.GetGroupByGuid(groupGuid).EndLayerGuid);
var bottomLayer = Layers.First(x => x.GuidValue == LayerStructure.GetGroupByGuid(groupGuid).StartLayerGuid);

int indexOfTopLayer = Layers.IndexOf(topLayer);
Guid oldReferenceLayerGuid;
bool oldAbove = false;

if (indexOfTopLayer + 1 < Layers.Count)
{
oldReferenceLayerGuid = topLayer.LayerGuid;
oldReferenceLayerGuid = topLayer.GuidValue;
}
else
{
int indexOfBottomLayer = Layers.IndexOf(bottomLayer);
oldReferenceLayerGuid = Layers[indexOfBottomLayer - 1].LayerGuid;
oldReferenceLayerGuid = Layers[indexOfBottomLayer - 1].GuidValue;
oldAbove = true;
}

Expand Down Expand Up @@ -241,12 +240,12 @@ public void AddNewLayer(string name, int width, int height, bool setAsActive = t
UndoManager.AddUndoChange(
storageChange.ToChange(
RemoveLayerProcess,
new object[] { Layers[^1].LayerGuid },
new object[] { Layers[^1].GuidValue },
RestoreLayersProcess,
"Add layer"));
}

LayersChanged?.Invoke(this, new LayersChangedEventArgs(Layers[^1].LayerGuid, LayerAction.Add));
LayersChanged?.Invoke(this, new LayersChangedEventArgs(Layers[^1].GuidValue, LayerAction.Add));
}

/// <summary>
Expand All @@ -267,7 +266,7 @@ public Layer DuplicateLayer(int index)
UndoManager.AddUndoChange(
storageChange.ToChange(
RemoveLayerProcess,
new object[] { duplicate.LayerGuid },
new object[] { duplicate.GuidValue },
RestoreLayersProcess,
"Duplicate Layer"));

Expand All @@ -294,9 +293,9 @@ public void SetNextSelectedLayerAsActive(Guid lastLayerGuid)
var selectedLayers = Layers.Where(x => x.IsActive);
foreach (var layer in selectedLayers)
{
if (layer.LayerGuid != lastLayerGuid)
if (layer.GuidValue != lastLayerGuid)
{
ActiveLayerGuid = layer.LayerGuid;
ActiveLayerGuid = layer.GuidValue;
LayersChanged?.Invoke(this, new LayersChangedEventArgs(ActiveLayerGuid, LayerAction.SetActive));
return;
}
Expand All @@ -313,9 +312,9 @@ public void ToggleLayer(int index)
return;
}

if (ActiveLayerGuid == layer.LayerGuid)
if (ActiveLayerGuid == layer.GuidValue)
{
SetNextSelectedLayerAsActive(layer.LayerGuid);
SetNextSelectedLayerAsActive(layer.GuidValue);
}

layer.IsActive = !layer.IsActive;
Expand Down Expand Up @@ -358,15 +357,15 @@ public void RemoveLayer(int layerIndex, bool addToUndo = true)
return;
}

LayerStructure.AssignParent(Layers[layerIndex].LayerGuid, null);
LayerStructure.AssignParent(Layers[layerIndex].GuidValue, null);

bool wasActive = Layers[layerIndex].IsActive;

if (addToUndo)
{
StorageBasedChange change = new(this, new[] { Layers[layerIndex] });
UndoManager.AddUndoChange(
change.ToChange(RestoreLayersProcess, RemoveLayerProcess, new object[] { Layers[layerIndex].LayerGuid }));
change.ToChange(RestoreLayersProcess, RemoveLayerProcess, new object[] { Layers[layerIndex].GuidValue }));
}

Layers.RemoveAt(layerIndex);
Expand All @@ -393,7 +392,7 @@ public void RemoveActiveLayers()
Layer[] layers = Layers.Where(x => x.IsActive).ToArray();
int firstIndex = Layers.IndexOf(layers[0]);

object[] guidArgs = new object[] { layers.Select(x => x.LayerGuid).ToArray() };
object[] guidArgs = new object[] { layers.Select(x => x.GuidValue).ToArray() };

StorageBasedChange change = new(this, layers);

Expand Down Expand Up @@ -440,11 +439,11 @@ public Layer MergeLayers(Layer[] layersToMerge, bool nameOfLast, int index)

Layer mergedLayer = layersToMerge[0];

var groupParent = LayerStructure.GetGroupByLayer(layersToMerge[^1].LayerGuid);
var groupParent = LayerStructure.GetGroupByLayer(layersToMerge[^1].GuidValue);

Layer placeholderLayer = new("_placeholder");
Layers.Insert(index, placeholderLayer);
LayerStructure.AssignParent(placeholderLayer.LayerGuid, groupParent?.GroupGuid);
LayerStructure.AssignParent(placeholderLayer.GuidValue, groupParent?.GroupGuid);

for (int i = 0; i < layersToMerge.Length - 1; i++)
{
Expand All @@ -455,7 +454,7 @@ public Layer MergeLayers(Layer[] layersToMerge, bool nameOfLast, int index)
}

Layers.Insert(index, mergedLayer);
LayerStructure.AssignParent(mergedLayer.LayerGuid, groupParent?.GroupGuid);
LayerStructure.AssignParent(mergedLayer.GuidValue, groupParent?.GroupGuid);

RemoveLayer(placeholderLayer, false);
RemoveLayer(layersToMerge[^1], false);
Expand Down Expand Up @@ -488,7 +487,7 @@ public Layer MergeLayers(Layer[] layersToMerge, bool nameIsLastLayers)
InsertLayersAtIndexesProcess,
new object[] { indexes[0] },
MergeLayersProcess,
new object[] { indexes, nameIsLastLayers, layer.LayerGuid }));
new object[] { indexes, nameIsLastLayers, layer.GuidValue }));

UndoManager.SquashUndoChanges(2, "Undo merge layers");

Expand Down Expand Up @@ -531,13 +530,13 @@ private void ReverseMoveLayerInStructureProcess(object[] props)
int indexTo = (int)props[0];
Guid layerGuid = (Guid)props[1];

Guid layerAtOldIndex = Layers[indexTo].LayerGuid;
Guid layerAtOldIndex = Layers[indexTo].GuidValue;

var startGroup = LayerStructure.GetGroupByLayer(layerGuid);

LayerStructure.PreMoveReassignBounds(new GroupData(startGroup?.GroupGuid), layerGuid);

Layers.Move(Layers.IndexOf(Layers.First(x => x.LayerGuid == layerGuid)), indexTo);
Layers.Move(Layers.IndexOf(Layers.First(x => x.GuidValue == layerGuid)), indexTo);

var newGroup = LayerStructure.GetGroupByLayer(layerAtOldIndex);

Expand Down Expand Up @@ -607,7 +606,7 @@ private void InsertLayersAtIndexesProcess(Layer[] layers, UndoLayer[] data, obje
Layers.Insert(data[i].LayerIndex, layer);
}

ActiveLayerGuid = layers.First(x => x.LayerHighlightColor == MainSelectedLayerColor).LayerGuid;
ActiveLayerGuid = layers.First(x => x.LayerHighlightColor == MainSelectedLayerColor).GuidValue;
// Identifying main layer by highlightColor is a bit hacky, but shhh
}
}
Expand Down Expand Up @@ -645,15 +644,15 @@ private void MoveGroupInStructureProcess(object[] parameter)
GuidStructureItem group = LayerStructure.GetGroupByGuid(groupGuid);
GuidStructureItem referenceLayerGroup = LayerStructure.GetGroupByLayer(referenceLayerGuid);

Layer referenceLayer = Layers.First(x => x.LayerGuid == referenceLayerGuid);
Layer referenceLayer = Layers.First(x => x.GuidValue == referenceLayerGuid);

int layerIndex = Layers.IndexOf(referenceLayer);
int folderTopIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == group?.EndLayerGuid));
int folderTopIndex = Layers.IndexOf(Layers.First(x => x.GuidValue == group?.EndLayerGuid));
int oldIndex = folderTopIndex;

if (layerIndex < folderTopIndex)
{
int folderBottomIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == group.StartLayerGuid));
int folderBottomIndex = Layers.IndexOf(Layers.First(x => x.GuidValue == group.StartLayerGuid));
oldIndex = folderBottomIndex;
}

Expand Down Expand Up @@ -690,8 +689,8 @@ private void MoveLayerInStructureProcess(object[] parameter)
Guid referenceLayer = (Guid)parameter[1];
bool above = (bool)parameter[2];

int layerIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == referenceLayer));
int oldIndex = Layers.IndexOf(Layers.First(x => x.LayerGuid == layer));
int layerIndex = Layers.IndexOf(Layers.First(x => x.GuidValue == referenceLayer));
int oldIndex = Layers.IndexOf(Layers.First(x => x.GuidValue == layer));
int newIndex = CalculateNewIndex(layerIndex, above, oldIndex);

var startGroup = LayerStructure.GetGroupByLayer(layer);
Expand All @@ -710,6 +709,7 @@ private void MoveLayerInStructureProcess(object[] parameter)
}

RaisePropertyChanged(nameof(LayerStructure));
Renderer.ForceRerender();
}

private void RestoreLayersProcess(Layer[] layers, UndoLayer[] layersData)
Expand All @@ -730,19 +730,19 @@ private void RemoveLayerProcess(object[] parameters)
{
if (parameters is { Length: > 0 } && parameters[0] is Guid layerGuid)
{
Layer layer = Layers.First(x => x.LayerGuid == layerGuid);
Layer layer = Layers.First(x => x.GuidValue == layerGuid);
int index = Layers.IndexOf(layer);
bool wasActive = layer.IsActive;

var layerGroup = LayerStructure.GetGroupByLayer(layer.LayerGuid);
var layerGroup = LayerStructure.GetGroupByLayer(layer.GuidValue);

LayerStructure.ExpandParentGroups(layerGroup);

if (layerGroup?.Parent != null && LayerStructure.GroupContainsOnlyLayer(layer.LayerGuid, layerGroup))
if (layerGroup?.Parent != null && LayerStructure.GroupContainsOnlyLayer(layer.GuidValue, layerGroup))
{
LayerStructure.PreMoveReassignBounds(new GroupData(layerGroup.Parent.GroupGuid), new GroupData(layerGroup.GroupGuid));
}
LayerStructure.AssignParent(Layers[index].LayerGuid, null);
LayerStructure.AssignParent(Layers[index].GuidValue, null);
RemoveGroupsIfEmpty(layer, layerGroup);

Layers.Remove(layer);
Expand All @@ -758,7 +758,7 @@ private void RemoveLayerProcess(object[] parameters)

private void RemoveGroupsIfEmpty(Layer layer, GuidStructureItem layerGroup)
{
if (LayerStructure.GroupContainsOnlyLayer(layer.LayerGuid, layerGroup))
if (LayerStructure.GroupContainsOnlyLayer(layer.GuidValue, layerGroup))
{
if (layerGroup.Parent != null)
{
Expand Down
2 changes: 1 addition & 1 deletion PixiEditor/Models/ImageManipulation/BitmapUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public static WriteableBitmap GeneratePreviewBitmap(IEnumerable<SerializableLaye
var cl = layer.GetPixel(position.X, position.Y);
pixels[j] = cl;
}
result[layer.LayerGuid] = pixels;
result[layer.GuidValue] = pixels;
}

return result;
Expand Down

0 comments on commit 603fc02

Please sign in to comment.