Bläddra i källkod

Resize Image/Canvas, Viewport tweaks

Equbuxu 3 år sedan
förälder
incheckning
2dea37eb65

+ 1 - 1
src/PixiEditor.Zoombox/Zoombox.xaml.cs

@@ -273,7 +273,7 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
         Angle = 0;
         FlipX = false;
         FlipY = false;
-        Scale = scaleFactor;
+        Scale = 1 / scaleFactor;
         Center = newSize / 2;
     }
 

+ 4 - 4
src/PixiEditor/Models/Dialogs/ResizeDocumentDialog.cs

@@ -1,5 +1,5 @@
-using PixiEditor.Models.Enums;
-using PixiEditor.Views;
+using PixiEditor.ChangeableDocument.Enums;
+using PixiEditor.Models.Enums;
 using PixiEditor.Views.Dialogs;
 
 namespace PixiEditor.Models.Dialogs;
@@ -18,7 +18,7 @@ internal class ResizeDocumentDialog : CustomDialog
 
     public bool OpenResizeCanvas { get; set; }
 
-    public AnchorPoint ResizeAnchor { get; set; }
+    public ResizeAnchor ResizeAnchor { get; set; }
 
     public int Width
     {
@@ -54,7 +54,7 @@ internal class ResizeDocumentDialog : CustomDialog
     bool ShowDialog<T>()
         where T : ResizeablePopup, new()
     {
-        var popup = new T()
+        T popup = new T()
         {
             NewAbsoluteHeight = Height,
             NewAbsoluteWidth = Width,

+ 30 - 21
src/PixiEditor/Models/DocumentModels/DocumentUpdater.cs

@@ -10,7 +10,6 @@ using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.Models.DocumentPassthroughActions;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels.SubViewModels.Document;
-using SkiaSharp;
 
 namespace PixiEditor.Models.DocumentModels;
 #nullable enable
@@ -103,7 +102,7 @@ internal class DocumentUpdater
 
     private void ProcessClearSoftSelectedMembers(ClearSoftSelectedMembers_PassthroughAction info)
     {
-        foreach (var oldMember in doc.SoftSelectedStructureMembers)
+        foreach (StructureMemberViewModel? oldMember in doc.SoftSelectedStructureMembers)
         {
             if (oldMember.Selection == StructureMemberSelectionType.Hard)
                 continue;
@@ -115,7 +114,7 @@ internal class DocumentUpdater
 
     private void ProcessAddSoftSelectedMember(AddSoftSelectedMember_PassthroughAction info)
     {
-        var member = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? member = helper.StructureHelper.FindOrThrow(info.GuidValue);
         if (member.Selection == StructureMemberSelectionType.Hard)
             return;
         member.Selection = StructureMemberSelectionType.Soft;
@@ -130,7 +129,7 @@ internal class DocumentUpdater
             oldMember.Selection = StructureMemberSelectionType.None;
             oldMember.RaisePropertyChanged(nameof(oldMember.Selection));
         }
-        var member = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? member = helper.StructureHelper.FindOrThrow(info.GuidValue);
         member.Selection = StructureMemberSelectionType.Hard;
         member.RaisePropertyChanged(nameof(member.Selection));
         doc.InternalSetSelectedMember(member);
@@ -147,13 +146,13 @@ internal class DocumentUpdater
 
     private void ProcessMaskIsVisible(StructureMemberMaskIsVisible_ChangeInfo info)
     {
-        var member = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? member = helper.StructureHelper.FindOrThrow(info.GuidValue);
         member.SetMaskIsVisible(info.IsVisible);
     }
 
     private void ProcessClipToMemberBelow(StructureMemberClipToMemberBelow_ChangeInfo info)
     {
-        var member = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? member = helper.StructureHelper.FindOrThrow(info.GuidValue);
         member.SetClipToMemberBelowEnabled(info.ClipToMemberBelow);
     }
 
@@ -180,26 +179,26 @@ internal class DocumentUpdater
 
     private void ProcessLayerLockTransparency(LayerLockTransparency_ChangeInfo info)
     {
-        var layer = (LayerViewModel)helper.StructureHelper.FindOrThrow(info.GuidValue);
+        LayerViewModel? layer = (LayerViewModel)helper.StructureHelper.FindOrThrow(info.GuidValue);
         layer.SetLockTransparency(info.LockTransparency);
     }
 
     private void ProcessStructureMemberBlendMode(StructureMemberBlendMode_ChangeInfo info)
     {
-        var memberVm = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVm = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVm.SetBlendMode(info.BlendMode);
     }
 
     private void ProcessStructureMemberMask(StructureMemberMask_ChangeInfo info)
     {
-        var memberVm = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVm = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVm.MaskPreviewSurface?.Dispose();
         memberVm.MaskPreviewSurface = null;
         memberVm.MaskPreviewBitmap = null;
 
         if (info.HasMask)
         {
-            var size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
+            VecI size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
             memberVm.MaskPreviewBitmap = CreateBitmap(size);
             memberVm.MaskPreviewSurface = CreateSKSurface(memberVm.MaskPreviewBitmap);
         }
@@ -219,7 +218,7 @@ internal class DocumentUpdater
 
     private void UpdateMemberBitmapsRecursively(FolderViewModel folder, VecI newSize)
     {
-        foreach (var member in folder.Children)
+        foreach (StructureMemberViewModel? member in folder.Children)
         {
             member.PreviewSurface.Dispose();
             member.PreviewBitmap = CreateBitmap(newSize);
@@ -246,7 +245,7 @@ internal class DocumentUpdater
     private void ProcessSize(Size_ChangeInfo info)
     {
         Dictionary<ChunkResolution, WriteableBitmap> newBitmaps = new();
-        foreach (var (res, surf) in doc.Surfaces)
+        foreach ((ChunkResolution res, SKSurface surf) in doc.Surfaces)
         {
             surf.Dispose();
             newBitmaps[res] = CreateBitmap((VecI)(info.Size * res.Multiplier()));
@@ -259,7 +258,7 @@ internal class DocumentUpdater
         doc.InternalSetVerticalSymmetryAxisX(info.VerticalSymmetryAxisX);
         doc.InternalSetHorizontalSymmetryAxisY(info.HorizontalSymmetryAxisY);
 
-        var previewSize = StructureMemberViewModel.CalculatePreviewSize(info.Size);
+        VecI previewSize = StructureMemberViewModel.CalculatePreviewSize(info.Size);
         doc.PreviewSurface.Dispose();
         doc.PreviewBitmap = CreateBitmap(previewSize);
         doc.PreviewSurface = CreateSKSurface(doc.PreviewBitmap);
@@ -268,6 +267,8 @@ internal class DocumentUpdater
         doc.RaisePropertyChanged(nameof(doc.PreviewBitmap));
 
         UpdateMemberBitmapsRecursively(doc.StructureRoot, previewSize);
+
+        doc.CenterViewportTrigger.Execute(doc, doc.SizeBindable);
     }
 
     private WriteableBitmap CreateBitmap(VecI size)
@@ -285,7 +286,7 @@ internal class DocumentUpdater
 
     private void ProcessCreateStructureMember(CreateStructureMember_ChangeInfo info)
     {
-        var parentFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentGuid);
+        FolderViewModel? parentFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentGuid);
 
         StructureMemberViewModel memberVM;
         if (info is CreateLayer_ChangeInfo layerInfo)
@@ -311,7 +312,7 @@ internal class DocumentUpdater
 
         if (info.HasMask)
         {
-            var size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
+            VecI size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
             memberVM.MaskPreviewBitmap = CreateBitmap(size);
             memberVM.MaskPreviewSurface = CreateSKSurface(memberVM.MaskPreviewBitmap);
         }
@@ -325,11 +326,19 @@ internal class DocumentUpdater
                 ProcessCreateStructureMember(childInfo);
             }
         }
+
+        if (doc.SelectedStructureMember is null)
+        {
+            doc.InternalSetSelectedMember(memberVM);
+            memberVM.Selection = StructureMemberSelectionType.Hard;
+            doc.RaisePropertyChanged(nameof(doc.SelectedStructureMember));
+            doc.RaisePropertyChanged(nameof(memberVM.Selection));
+        }
     }
 
     private void ProcessDeleteStructureMember(DeleteStructureMember_ChangeInfo info)
     {
-        var (memberVM, folderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
+        (StructureMemberViewModel memberVM, FolderViewModel folderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
         folderVM.Children.Remove(memberVM);
         if (doc.SelectedStructureMember == memberVM)
             doc.InternalSetSelectedMember(null);
@@ -338,27 +347,27 @@ internal class DocumentUpdater
 
     private void ProcessUpdateStructureMemberIsVisible(StructureMemberIsVisible_ChangeInfo info)
     {
-        var memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVM.SetIsVisible(info.IsVisible);
     }
 
     private void ProcessUpdateStructureMemberName(StructureMemberName_ChangeInfo info)
     {
-        var memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVM.SetName(info.Name);
     }
 
     private void ProcessUpdateStructureMemberOpacity(StructureMemberOpacity_ChangeInfo info)
     {
-        var memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVM.SetOpacity(info.Opacity);
     }
 
     private void ProcessMoveStructureMember(MoveStructureMember_ChangeInfo info)
     {
-        var (memberVM, curFolderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
+        (StructureMemberViewModel memberVM, FolderViewModel curFolderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
 
-        var targetFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentToGuid);
+        FolderViewModel? targetFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentToGuid);
 
         curFolderVM.Children.Remove(memberVM);
         targetFolderVM.Children.Insert(info.NewIndex, memberVM);

+ 7 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/EllipseToolExecutor.cs

@@ -1,5 +1,6 @@
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.ViewModels.SubViewModels.Document;
 using PixiEditor.ViewModels.SubViewModels.Tools.Tools;
 using PixiEditor.ViewModels.SubViewModels.Tools.ToolSettings.Toolbars;
 
@@ -26,13 +27,18 @@ internal class EllipseToolExecutor : UpdateableChangeExecutor
         ViewModels.SubViewModels.Document.StructureMemberViewModel? member = document?.SelectedStructureMember;
         if (colorsVM is null || toolbar is null || member is null || ellipseTool is null)
             return new Error();
+        drawOnMask = member.ShouldDrawOnMask;
+        if (drawOnMask && !member.HasMaskBindable)
+            return new Error();
+        if (!drawOnMask && member is not LayerViewModel)
+            return new Error();
+
 
         fillColor = toolbar.Fill ? toolbar.FillColor.ToSKColor() : SKColors.Transparent;
         startPos = controller!.LastPixelPosition;
         strokeColor = colorsVM.PrimaryColor;
         strokeWidth = toolbar.ToolSize;
         memberGuid = member.GuidValue;
-        drawOnMask = member.ShouldDrawOnMask;
 
         DrawEllipseOrCircle(startPos);
         return new Success();

+ 5 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/PenToolExecutor.cs

@@ -22,11 +22,15 @@ internal class PenToolExecutor : UpdateableChangeExecutor
         PenToolbar? toolbar = penTool?.Toolbar as PenToolbar;
         if (vm is null || penTool is null || member is null || toolbar is null)
             return new Error();
+        drawOnMask = member.ShouldDrawOnMask;
+        if (drawOnMask && !member.HasMaskBindable)
+            return new Error();
+        if (!drawOnMask && member is not LayerViewModel)
+            return new Error();
 
         guidValue = member.GuidValue;
         color = vm.ColorsSubViewModel.PrimaryColor;
         toolSize = toolbar.ToolSize;
-        drawOnMask = member.ShouldDrawOnMask;
         pixelPerfect = toolbar.PixelPerfectEnabled;
 
         IAction? action = pixelPerfect switch

+ 0 - 14
src/PixiEditor/Models/Enums/AnchorPoint.cs

@@ -1,14 +0,0 @@
-using System;
-
-namespace PixiEditor.Models.Enums;
-
-[Flags]
-public enum AnchorPoint
-{
-    Left = 1,
-    Center = 2,
-    Right = 4,
-    Top = 8,
-    Middle = 16,
-    Bottom = 32
-}

+ 11 - 9
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentManagerViewModel.cs

@@ -1,8 +1,9 @@
 using System.Collections.ObjectModel;
 using System.Windows.Input;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.Models.Commands.Attributes.Commands;
-using PixiEditor.Models.Commands.Attributes.Evaluators;
+using PixiEditor.Models.Dialogs;
 using PixiEditor.Models.Events;
 using PixiEditor.ViewModels.SubViewModels.Tools;
 
@@ -38,7 +39,7 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>
         {
             if (activeDocument == value)
                 return;
-            var prevDoc = activeDocument;
+            DocumentViewModel? prevDoc = activeDocument;
             activeDocument = value;
             RaisePropertyChanged(nameof(ActiveDocument));
             ActiveDocumentChanged?.Invoke(this, new(value, prevDoc));
@@ -220,24 +221,25 @@ internal class DocumentManagerViewModel : SubViewModel<ViewModelMain>
     [Command.Basic("PixiEditor.Document.ResizeCanvas", true, "Resize Canvas", "Resize Canvas", CanExecute = "PixiEditor.HasDocument", Key = Key.C, Modifiers = ModifierKeys.Control | ModifierKeys.Shift)]
     public void OpenResizePopup(bool canvas)
     {
-        /*
+        DocumentViewModel? doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
+        if (doc is null)
+            return;
+
         ResizeDocumentDialog dialog = new ResizeDocumentDialog(
-            Owner.BitmapManager.ActiveDocument.Width,
-            Owner.BitmapManager.ActiveDocument.Height,
+            doc.Width,
+            doc.Height,
             canvas);
         if (dialog.ShowDialog())
         {
             if (canvas)
             {
-                Owner.BitmapManager.ActiveDocument.ResizeCanvas(dialog.Width, dialog.Height, dialog.ResizeAnchor);
+                doc.ResizeCanvas(new(dialog.Width, dialog.Height), dialog.ResizeAnchor);
             }
             else
             {
-                Owner.BitmapManager.ActiveDocument.Resize(dialog.Width, dialog.Height);
+                doc.ResizeImage(new(dialog.Width, dialog.Height), ResamplingMethod.NearestNeighbor);
             }
         }
-        
-*/
     }
 
     [Command.Basic("PixiEditor.Document.CenterContent", "Center Content", "Center Content", CanExecute = "PixiEditor.HasDocument")]

+ 15 - 5
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentViewModel.cs

@@ -109,7 +109,7 @@ internal class DocumentViewModel : NotifyableObject
 
     private SKPath selectionPath = new SKPath();
 
-    public DocumentViewModel(string name)
+    public DocumentViewModel()
     {
         //Name = name;
         Helpers = new DocumentHelpers(this);
@@ -152,10 +152,6 @@ internal class DocumentViewModel : NotifyableObject
         VecI previewSize = StructureMemberViewModel.CalculatePreviewSize(SizeBindable);
         PreviewBitmap = new WriteableBitmap(previewSize.X, previewSize.Y, 96, 96, PixelFormats.Pbgra32, null);
         PreviewSurface = SKSurface.Create(new SKImageInfo(previewSize.X, previewSize.Y, SKColorType.Bgra8888), PreviewBitmap.BackBuffer, PreviewBitmap.BackBufferStride);
-
-        Guid testLayerGuid = Guid.NewGuid();
-        Helpers.ActionAccumulator.AddFinishedActions(new CreateStructureMember_Action(StructureRoot.GuidValue, testLayerGuid, 0, StructureMemberType.Layer));
-        SetSelectedMember(testLayerGuid);
     }
 
     #region Internal Methods
@@ -226,6 +222,20 @@ internal class DocumentViewModel : NotifyableObject
 
     public void CreateStructureMember(StructureMemberType type) => Helpers.StructureHelper.CreateNewStructureMember(type);
 
+    public void ResizeCanvas(VecI newSize, ResizeAnchor anchor)
+    {
+        if (Helpers.ChangeController.IsChangeActive || newSize.X > 9999 || newSize.Y > 9999 || newSize.X < 1 || newSize.Y < 1)
+            return;
+        Helpers.ActionAccumulator.AddFinishedActions(new ResizeCanvas_Action(newSize, anchor));
+    }
+
+    public void ResizeImage(VecI newSize, ResamplingMethod resampling)
+    {
+        if (Helpers.ChangeController.IsChangeActive || newSize.X > 9999 || newSize.Y > 9999 || newSize.X < 1 || newSize.Y < 1)
+            return;
+        Helpers.ActionAccumulator.AddFinishedActions(new ResizeImage_Action(newSize, resampling));
+    }
+
     public void SetSelectedMember(Guid memberGuid) => Helpers.ActionAccumulator.AddActions(new SetSelectedMember_PassthroughAction(memberGuid));
 
     public void AddSoftSelectedMember(Guid memberGuid) => Helpers.ActionAccumulator.AddActions(new AddSoftSelectedMember_PassthroughAction(memberGuid));

+ 10 - 10
src/PixiEditor/ViewModels/SubViewModels/Main/FileViewModel.cs

@@ -1,5 +1,7 @@
 using System.Windows.Input;
+using ChunkyImageLib.DataHolders;
 using Newtonsoft.Json.Linq;
+using PixiEditor.ChangeableDocument.Enums;
 using PixiEditor.Models.Commands.Attributes.Commands;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Dialogs;
@@ -58,7 +60,7 @@ internal class FileViewModel : SubViewModel<ViewModelMain>
         NewFileDialog newFile = new NewFileDialog();
         if (newFile.ShowDialog())
         {
-            NewDocument(newFile.Width, newFile.Height);
+            NewDocument(new VecI(newFile.Width, newFile.Height));
         }
     }
 
@@ -67,18 +69,16 @@ internal class FileViewModel : SubViewModel<ViewModelMain>
         new HelloTherePopup(this).Show();
     }
 
-    public void NewDocument(int width, int height, bool addBaseLayer = true)
+    public void NewDocument(VecI size, bool addBaseLayer = true)
     {
-        Owner.DocumentManagerSubViewModel.Documents.Add(new DocumentViewModel("Unnamed"));
+        DocumentViewModel doc = new DocumentViewModel();
+        Owner.DocumentManagerSubViewModel.Documents.Add(doc);
         Owner.DocumentManagerSubViewModel.ActiveDocument = Owner.DocumentManagerSubViewModel.Documents[^1];
-        /*
-        if (addBaseLayer)
-        {
-            Owner.BitmapManager.ActiveDocument.AddNewLayer("Base Layer");
-        }
 
-        Owner.ResetProgramStateValues();
-        */
+        if (doc.SizeBindable != size)
+            doc.ResizeCanvas(size, ResizeAnchor.TopLeft);
+        if (addBaseLayer)
+            doc.CreateStructureMember(StructureMemberType.Layer);
     }
 
     /// <summary>

+ 3 - 4
src/PixiEditor/ViewModels/ViewModelMain.cs

@@ -121,7 +121,7 @@ internal class ViewModelMain : ViewModelBase
 
         FileSubViewModel = services.GetService<FileViewModel>();
         ToolsSubViewModel = services.GetService<ToolsViewModel>();
-        ToolsSubViewModel.SelectedToolChanged += BitmapManager_SelectedToolChanged;
+        ToolsSubViewModel.SelectedToolChanged += ToolsSubViewModel_SelectedToolChanged;
 
         IoSubViewModel = services.GetService<IoViewModel>();
         LayersSubViewModel = services.GetService<LayersViewModel>();
@@ -154,8 +154,7 @@ internal class ViewModelMain : ViewModelBase
 
     public bool DocumentIsNotNull(object property)
     {
-        return false;
-        //return BitmapManager.ActiveDocument != null;
+        return DocumentManagerSubViewModel.ActiveDocument is not null;
     }
 
     public bool DocumentIsNotNull((SKColor oldColor, SKColor newColor) obj)
@@ -173,7 +172,7 @@ internal class ViewModelMain : ViewModelBase
         ((CancelEventArgs)property).Cancel = !RemoveDocumentsWithSaveConfirmation();
     }
 
-    private void BitmapManager_SelectedToolChanged(object sender, SelectedToolEventArgs e)
+    private void ToolsSubViewModel_SelectedToolChanged(object sender, SelectedToolEventArgs e)
     {
         if (e.OldTool != null)
             e.OldTool.PropertyChanged -= SelectedTool_PropertyChanged;

+ 5 - 5
src/PixiEditor/Views/Dialogs/ResizeCanvasPopup.xaml.cs

@@ -1,6 +1,6 @@
 using System.Windows;
 using System.Windows.Input;
-using PixiEditor.Models.Enums;
+using PixiEditor.ChangeableDocument.Enums;
 
 namespace PixiEditor.Views.Dialogs;
 
@@ -11,8 +11,8 @@ internal partial class ResizeCanvasPopup : ResizeablePopup
 {
 
     public static readonly DependencyProperty SelectedAnchorPointProperty =
-        DependencyProperty.Register(nameof(SelectedAnchorPoint), typeof(AnchorPoint), typeof(ResizeCanvasPopup),
-            new PropertyMetadata(AnchorPoint.Top | AnchorPoint.Left));
+        DependencyProperty.Register(nameof(SelectedAnchorPoint), typeof(ResizeAnchor), typeof(ResizeCanvasPopup),
+            new PropertyMetadata(ResizeAnchor.Top | ResizeAnchor.Left));
 
 
     public ResizeCanvasPopup()
@@ -22,9 +22,9 @@ internal partial class ResizeCanvasPopup : ResizeablePopup
         Loaded += (_, _) => sizePicker.FocusWidthPicker();
     }
 
-    public AnchorPoint SelectedAnchorPoint
+    public ResizeAnchor SelectedAnchorPoint
     {
-        get => (AnchorPoint)GetValue(SelectedAnchorPointProperty);
+        get => (ResizeAnchor)GetValue(SelectedAnchorPointProperty);
         set => SetValue(SelectedAnchorPointProperty, value);
     }
 

+ 19 - 5
src/PixiEditor/Views/UserControls/AnchorPointPicker.xaml.cs

@@ -1,7 +1,7 @@
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Controls.Primitives;
-using PixiEditor.Models.Enums;
+using PixiEditor.ChangeableDocument.Enums;
 
 namespace PixiEditor.Views.UserControls;
 
@@ -11,7 +11,7 @@ namespace PixiEditor.Views.UserControls;
 internal partial class AnchorPointPicker : UserControl
 {
     public static readonly DependencyProperty AnchorPointProperty =
-        DependencyProperty.Register(nameof(AnchorPoint), typeof(AnchorPoint), typeof(AnchorPointPicker),
+        DependencyProperty.Register(nameof(AnchorPoint), typeof(ResizeAnchor), typeof(AnchorPointPicker),
             new PropertyMetadata());
 
 
@@ -22,16 +22,30 @@ internal partial class AnchorPointPicker : UserControl
         InitializeComponent();
     }
 
-    public AnchorPoint AnchorPoint
+    public ResizeAnchor AnchorPoint
     {
-        get => (AnchorPoint)GetValue(AnchorPointProperty);
+        get => (ResizeAnchor)GetValue(AnchorPointProperty);
         set => SetValue(AnchorPointProperty, value);
     }
 
     private void ToggleButton_Checked(object sender, RoutedEventArgs e)
     {
         ToggleButton btn = (ToggleButton)sender;
-        AnchorPoint = (AnchorPoint)(1 << (Grid.GetRow(btn) + 3)) | (AnchorPoint)(1 << Grid.GetColumn(btn));
+        int row = Grid.GetRow(btn);
+        int column = Grid.GetColumn(btn);
+        AnchorPoint = (row, column) switch
+        {
+            (0, 0) => ResizeAnchor.TopLeft,
+            (1, 0) => ResizeAnchor.Top,
+            (2, 0) => ResizeAnchor.TopRight,
+            (0, 1) => ResizeAnchor.Left,
+            (1, 1) => ResizeAnchor.Center,
+            (2, 1) => ResizeAnchor.Right,
+            (0, 2) => ResizeAnchor.BottomLeft,
+            (1, 2) => ResizeAnchor.Bottom,
+            (2, 2) => ResizeAnchor.BottomRight,
+            _ => throw new NotImplementedException()
+        };
         if (_selectedToggleButton != null) _selectedToggleButton.IsChecked = false;
         _selectedToggleButton = btn;
     }

+ 11 - 0
src/PixiEditor/Views/UserControls/Viewport.xaml.cs

@@ -234,6 +234,7 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
         Binding binding = new Binding { Source = this, Path = new PropertyPath("Document.Bitmaps") };
         SetBinding(BitmapsProperty, binding);
 
+        GetImage().Loaded += OnImageLoaded;
         Loaded += OnLoad;
         Unloaded += OnUnload;
     }
@@ -333,6 +334,11 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
         zoombox.ZoomIntoCenter(delta);
     }
 
+    private void OnImageLoaded(object sender, EventArgs e)
+    {
+        zoombox.CenterContent();
+    }
+
     private static void CenterViewportTriggerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
     {
         Viewport? viewport = (Viewport)sender;
@@ -350,4 +356,9 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
         if (args.NewValue != null)
             ((ExecutionTrigger<double>)args.NewValue).Triggered += viewport.ZoomZoomboxContent;
     }
+
+    private void OnGridLoaded(object sender, RoutedEventArgs e)
+    {
+
+    }
 }

+ 14 - 14
src/PixiEditorPrototype/Models/DocumentUpdater.cs

@@ -103,7 +103,7 @@ internal class DocumentUpdater
 
     private void ProcessMaskIsVisible(StructureMemberMaskIsVisible_ChangeInfo info)
     {
-        var member = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? member = helper.StructureHelper.FindOrThrow(info.GuidValue);
         member.SetMaskIsVisible(info.IsVisible);
     }
 
@@ -148,14 +148,14 @@ internal class DocumentUpdater
 
     private void ProcessStructureMemberMask(StructureMemberMask_ChangeInfo info)
     {
-        var memberVm = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVm = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVm.MaskPreviewSurface?.Dispose();
         memberVm.MaskPreviewSurface = null;
         memberVm.MaskPreviewBitmap = null;
 
         if (info.HasMask)
         {
-            var size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
+            VecI size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
             memberVm.MaskPreviewBitmap = CreateBitmap(size);
             memberVm.MaskPreviewSurface = CreateSKSurface(memberVm.MaskPreviewBitmap);
         }
@@ -175,7 +175,7 @@ internal class DocumentUpdater
 
     private void UpdateMemberBitmapsRecursively(FolderViewModel folder, VecI newSize)
     {
-        foreach (var member in folder.Children)
+        foreach (StructureMemberViewModel? member in folder.Children)
         {
             member.PreviewSurface.Dispose();
             member.PreviewBitmap = CreateBitmap(newSize);
@@ -202,7 +202,7 @@ internal class DocumentUpdater
     private void ProcessSize(Size_ChangeInfo info)
     {
         Dictionary<ChunkResolution, WriteableBitmap> newBitmaps = new();
-        foreach (var (res, surf) in doc.Surfaces)
+        foreach ((ChunkResolution res, SKSurface surf) in doc.Surfaces)
         {
             surf.Dispose();
             newBitmaps[res] = CreateBitmap((VecI)(info.Size * res.Multiplier()));
@@ -215,7 +215,7 @@ internal class DocumentUpdater
         doc.SetVerticalSymmetryAxisX(info.VerticalSymmetryAxisX);
         doc.SetHorizontalSymmetryAxisY(info.HorizontalSymmetryAxisY);
 
-        var previewSize = StructureMemberViewModel.CalculatePreviewSize(info.Size);
+        VecI previewSize = StructureMemberViewModel.CalculatePreviewSize(info.Size);
         doc.PreviewSurface.Dispose();
         doc.PreviewBitmap = CreateBitmap(previewSize);
         doc.PreviewSurface = CreateSKSurface(doc.PreviewBitmap);
@@ -241,7 +241,7 @@ internal class DocumentUpdater
 
     private void ProcessCreateStructureMember(CreateStructureMember_ChangeInfo info)
     {
-        var parentFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentGuid);
+        FolderViewModel? parentFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentGuid);
 
         StructureMemberViewModel memberVM;
         if (info is CreateLayer_ChangeInfo layerInfo)
@@ -267,7 +267,7 @@ internal class DocumentUpdater
 
         if (info.HasMask)
         {
-            var size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
+            VecI size = StructureMemberViewModel.CalculatePreviewSize(doc.SizeBindable);
             memberVM.MaskPreviewBitmap = CreateBitmap(size);
             memberVM.MaskPreviewSurface = CreateSKSurface(memberVM.MaskPreviewBitmap);
         }
@@ -285,33 +285,33 @@ internal class DocumentUpdater
 
     private void ProcessDeleteStructureMember(DeleteStructureMember_ChangeInfo info)
     {
-        var (memberVM, folderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
+        (StructureMemberViewModel memberVM, FolderViewModel folderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
         folderVM.Children.Remove(memberVM);
     }
 
     private void ProcessUpdateStructureMemberIsVisible(StructureMemberIsVisible_ChangeInfo info)
     {
-        var memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVM.SetIsVisible(info.IsVisible);
     }
 
     private void ProcessUpdateStructureMemberName(StructureMemberName_ChangeInfo info)
     {
-        var memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVM.SetName(info.Name);
     }
 
     private void ProcessUpdateStructureMemberOpacity(StructureMemberOpacity_ChangeInfo info)
     {
-        var memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
+        StructureMemberViewModel? memberVM = helper.StructureHelper.FindOrThrow(info.GuidValue);
         memberVM.SetOpacity(info.Opacity);
     }
 
     private void ProcessMoveStructureMember(MoveStructureMember_ChangeInfo info)
     {
-        var (memberVM, curFolderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
+        (StructureMemberViewModel memberVM, FolderViewModel curFolderVM) = helper.StructureHelper.FindChildAndParentOrThrow(info.GuidValue);
 
-        var targetFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentToGuid);
+        FolderViewModel? targetFolderVM = (FolderViewModel)helper.StructureHelper.FindOrThrow(info.ParentToGuid);
 
         curFolderVM.Children.Remove(memberVM);
         targetFolderVM.Children.Insert(info.NewIndex, memberVM);