소스 검색

Viewport polish

Equbuxu 3 년 전
부모
커밋
cc05891469

+ 2 - 4
src/PixiEditor.ChangeableDocument/Changeables/Interfaces/IReadOnlyReferenceLayer.cs

@@ -1,10 +1,8 @@
-using SkiaSharp;
-
-namespace PixiEditor.ChangeableDocument.Changeables.Interfaces;
+namespace PixiEditor.ChangeableDocument.Changeables.Interfaces;
 
 public interface IReadOnlyReferenceLayer
 {
     public Surface Image { get; }
-    
+
     public ShapeCorners Shape { get; }
 }

+ 50 - 11
src/PixiEditor.Zoombox/Zoombox.xaml.cs

@@ -28,7 +28,6 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
     public static readonly DependencyProperty UseTouchGesturesProperty =
         DependencyProperty.Register(nameof(UseTouchGestures), typeof(bool), typeof(Zoombox));
 
-
     public static readonly DependencyProperty ScaleProperty =
         DependencyProperty.Register(nameof(Scale), typeof(double), typeof(Zoombox), new(1.0, OnPropertyChange));
 
@@ -185,7 +184,7 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
     }
 
     private double[]? zoomValues;
-    
+
     public Zoombox()
     {
         CalculateZoomValues();
@@ -195,12 +194,50 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
 
     private void CalculateZoomValues()
     {
-        Span<double> roundZoomValues = stackalloc []{ .01, .02, .03, .04, .05, .06, .07, .08, .1, .13, .17, .2, .25, .33, .5, .67, 1, 1.5, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64 };
+        Span<double> roundZoomValues = stackalloc[]
+        {
+            .01,
+            .02,
+            .03,
+            .04,
+            .05,
+            .06,
+            .07,
+            .08,
+            .1,
+            .13,
+            .17,
+            .2,
+            .25,
+            .33,
+            .5,
+            .67,
+            1,
+            1.5,
+            2,
+            3,
+            4,
+            5,
+            6,
+            8,
+            10,
+            12,
+            14,
+            16,
+            20,
+            24,
+            28,
+            32,
+            40,
+            48,
+            56,
+            64
+        };
         List<double> interpolatedValues = new();
         for (int i = 0; i < roundZoomValues.Length - 1; i++)
         {
             double cur = roundZoomValues[i];
-            double next = roundZoomValues[i+1];
+            double next = roundZoomValues[i + 1];
             const int steps = 3;
             for (int j = 0; j < steps; j++)
             {
@@ -214,7 +251,7 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
 
     private void RaiseViewportEvent()
     {
-        var realDim = new VecD(mainCanvas.ActualWidth, mainCanvas.ActualHeight);
+        VecD realDim = new VecD(mainCanvas.ActualWidth, mainCanvas.ActualHeight);
         RealDimensions = realDim;
         RaiseEvent(new ViewportRoutedEventArgs(
             ViewportMovedEvent,
@@ -249,11 +286,11 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
     {
         if (delta == 0)
             return;
-        var oldZoomboxMousePos = ToZoomboxSpace(mousePos);
+        VecD oldZoomboxMousePos = ToZoomboxSpace(mousePos);
 
         int curIndex = GetClosestRoundZoomValueIndex(Scale);
         int nextIndex = curIndex;
-        if (!(curIndex == 0 && delta < 0 || curIndex == zoomValues!.Length - 1 && delta > 0))
+        if (!((curIndex == 0 && delta < 0) || (curIndex == zoomValues!.Length - 1 && delta > 0)))
             nextIndex = delta < 0 ? curIndex - 1 : curIndex + 1;
         double newScale = zoomValues![nextIndex];
 
@@ -261,8 +298,8 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
         newScale = Math.Clamp(newScale, MinScale, MaxScale);
         Scale = newScale;
 
-        var newZoomboxMousePos = ToZoomboxSpace(mousePos);
-        var deltaCenter = oldZoomboxMousePos - newZoomboxMousePos;
+        VecD newZoomboxMousePos = ToZoomboxSpace(mousePos);
+        VecD deltaCenter = oldZoomboxMousePos - newZoomboxMousePos;
         Center += deltaCenter;
     }
 
@@ -289,6 +326,8 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
         activeMouseDownEventArgs = e;
         activeMouseDownPos = ToVecD(e.GetPosition(mainCanvas));
         Keyboard.Focus(this);
+        if (ZoomMode != ZoomboxMode.Normal)
+            e.Handled = true;
     }
 
     private void InitiateDrag(MouseButtonEventArgs e)
@@ -331,7 +370,7 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
     {
         if (activeDragOperation is null && activeMouseDownEventArgs is not null)
         {
-            var cur = ToVecD(e.GetPosition(mainCanvas));
+            VecD cur = ToVecD(e.GetPosition(mainCanvas));
 
             if ((cur - activeMouseDownPos).TaxicabLength > 3)
                 InitiateDrag(activeMouseDownEventArgs);
@@ -377,7 +416,7 @@ public partial class Zoombox : ContentControl, INotifyPropertyChanged
 
     private static void OnPropertyChange(DependencyObject obj, DependencyPropertyChangedEventArgs args)
     {
-        var zoombox = (Zoombox)obj;
+        Zoombox? zoombox = (Zoombox)obj;
 
         VecD topLeft = zoombox.ToZoomboxSpace(VecD.Zero).Rotate(zoombox.Angle);
         VecD bottomRight = zoombox.ToZoomboxSpace(new(zoombox.mainCanvas.ActualWidth, zoombox.mainCanvas.ActualHeight)).Rotate(zoombox.Angle);

+ 3 - 0
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentViewModel.cs

@@ -90,6 +90,9 @@ internal class DocumentViewModel : NotifyableObject
     public SKPath SelectionPathBindable => selectionPath;
     public DocumentTransformViewModel TransformViewModel { get; }
 
+    public ExecutionTrigger<VecI> CenterViewportTrigger { get; } = new ExecutionTrigger<VecI>();
+    public ExecutionTrigger<double> ZoomViewportTrigger { get; } = new ExecutionTrigger<double>();
+
     private DocumentHelpers Helpers { get; }
 
     private int verticalSymmetryAxisX;

+ 2 - 7
src/PixiEditor/ViewModels/SubViewModels/Main/ViewportViewModel.cs

@@ -1,5 +1,4 @@
 using System.Windows.Input;
-using PixiEditor.Models.Commands.Attributes;
 using PixiEditor.Models.Commands.Attributes.Commands;
 
 namespace PixiEditor.ViewModels.SubViewModels.Main;
@@ -29,11 +28,7 @@ internal class ViewportViewModel : SubViewModel<ViewModelMain>
     [Command.Basic("PixiEditor.View.Zoomout", -1, "Zoom out", "Zoom out", CanExecute = "PixiEditor.HasDocument", Key = Key.OemMinus)]
     public void ZoomViewport(double zoom)
     {
-        /*
-        if (Owner.BitmapManager.ActiveDocument is not null)
-        {
-            Owner.BitmapManager.ActiveDocument.ZoomViewportTrigger.Execute(this, zoom);
-        }
-        */
+        Document.DocumentViewModel doc = Owner.DocumentManagerSubViewModel.ActiveDocument;
+        doc?.ZoomViewportTrigger.Execute(this, zoom);
     }
 }

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

@@ -7,9 +7,7 @@ using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.UserPreferences;
 using PixiEditor.ViewModels.SubViewModels.Document;
-using PixiEditor.ViewModels.SubViewModels.Main;
 using PixiEditor.ViewModels.SubViewModels.Tools;
-using SkiaSharp;
 
 namespace PixiEditor.ViewModels;
 
@@ -275,7 +273,10 @@ internal class ViewModelMain : ViewModelBase
     private void ActiveDocument_DocumentSizeChanged(object sender, DocumentSizeChangedEventArgs e)
     {
         //BitmapManager.ActiveDocument.ChangesSaved = false;
-        //BitmapManager.ActiveDocument.CenterViewportTrigger.Execute(this, new Size(BitmapManager.ActiveDocument.Width, BitmapManager.ActiveDocument.Height));
+        DocumentViewModel doc = DocumentManagerSubViewModel.ActiveDocument;
+        if (doc is null)
+            throw new InvalidOperationException();
+        doc.CenterViewportTrigger.Execute(this, doc.SizeBindable);
     }
 
     private void BitmapUtility_BitmapChanged(object sender, EventArgs e)

+ 2 - 0
src/PixiEditor/Views/MainWindow.xaml

@@ -503,6 +503,8 @@
                                 <ui:DocumentsTemplateSelector.DocumentsViewTemplate>
                                     <DataTemplate DataType="{x:Type doc:DocumentViewModel}">
                                         <usercontrols:Viewport
+                                            CenterViewportTrigger="{Binding CenterViewportTrigger}"
+                                            ZoomViewportTrigger="{Binding ZoomViewportTrigger}"
                                             MouseDownCommand="{Binding ElementName=mainWindow, Path=DataContext.IoSubViewModel.MouseDownCommand}"
                                             MouseMoveCommand="{Binding ElementName=mainWindow, Path=DataContext.IoSubViewModel.MouseMoveCommand}"
                                             MouseUpCommand="{Binding ElementName=mainWindow, Path=DataContext.IoSubViewModel.MouseUpCommand}"

+ 4 - 4
src/PixiEditor/Views/UserControls/Viewport.xaml

@@ -17,7 +17,10 @@
     x:Name="vpUc"
     d:DesignHeight="450"
     d:DesignWidth="800">
-    <Grid>
+    <Grid 
+        MouseDown="Image_MouseDown"
+        MouseMove="Image_MouseMove"
+        MouseUp="Image_MouseUp">
         <zoombox:Zoombox
             x:Name="zoombox"
             UseTouchGestures="True"
@@ -69,9 +72,6 @@
                         Width="{Binding Document.Width}"
                         Height="{Binding Document.Height}"
                         Source="{Binding TargetBitmap}"
-                        MouseDown="Image_MouseDown"
-                        MouseMove="Image_MouseMove"
-                        MouseUp="Image_MouseUp"
                         RenderOptions.BitmapScalingMode="{Binding Zoombox.Scale, Converter={converters:ScaleToBitmapScalingModeConverter}}"/>
                     <sym:SymmetryOverlay
                         ZoomboxScale="{Binding Zoombox.Scale}"

+ 49 - 2
src/PixiEditor/Views/UserControls/Viewport.xaml.cs

@@ -5,6 +5,7 @@ using System.Windows.Data;
 using System.Windows.Input;
 using System.Windows.Media.Imaging;
 using ChunkyImageLib.DataHolders;
+using PixiEditor.Helpers;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Position;
 using PixiEditor.ViewModels.SubViewModels.Document;
@@ -50,6 +51,24 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
     public static readonly DependencyProperty ZoomOutOnClickProperty =
         DependencyProperty.Register(nameof(ZoomOutOnClick), typeof(bool), typeof(Viewport), new(false));
 
+    public static readonly DependencyProperty ZoomViewportTriggerProperty =
+        DependencyProperty.Register(nameof(ZoomViewportTrigger), typeof(ExecutionTrigger<double>), typeof(Viewport), new(null, ZoomViewportTriggerChanged));
+
+    public static readonly DependencyProperty CenterViewportTriggerProperty =
+        DependencyProperty.Register(nameof(CenterViewportTrigger), typeof(ExecutionTrigger<VecI>), typeof(Viewport), new(null, CenterViewportTriggerChanged));
+
+    public ExecutionTrigger<VecI>? CenterViewportTrigger
+    {
+        get => (ExecutionTrigger<VecI>)GetValue(CenterViewportTriggerProperty);
+        set => SetValue(CenterViewportTriggerProperty, value);
+    }
+
+    public ExecutionTrigger<double>? ZoomViewportTrigger
+    {
+        get => (ExecutionTrigger<double>)GetValue(ZoomViewportTriggerProperty);
+        set => SetValue(ZoomViewportTriggerProperty, value);
+    }
+
     public bool ZoomOutOnClick
     {
         get => (bool)GetValue(ZoomOutOnClickProperty);
@@ -277,7 +296,7 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
     {
         if (MouseDownCommand is null)
             return;
-        Point pos = e.GetPosition((IInputElement)sender);
+        Point pos = e.GetPosition(GetImage());
         VecD conv = new VecD(pos.X, pos.Y);
         MouseOnCanvasEventArgs? parameter = new MouseOnCanvasEventArgs(e.ChangedButton, conv);
 
@@ -289,7 +308,7 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
     {
         if (MouseMoveCommand is null)
             return;
-        Point pos = e.GetPosition((IInputElement)sender);
+        Point pos = e.GetPosition(GetImage());
         VecD conv = new VecD(pos.X, pos.Y);
 
         if (MouseMoveCommand.CanExecute(conv))
@@ -303,4 +322,32 @@ internal partial class Viewport : UserControl, INotifyPropertyChanged
         if (MouseUpCommand.CanExecute(e.ChangedButton))
             MouseUpCommand.Execute(e.ChangedButton);
     }
+
+    private void CenterZoomboxContent(object? sender, VecI args)
+    {
+        zoombox.CenterContent(args);
+    }
+
+    private void ZoomZoomboxContent(object? sender, double delta)
+    {
+        zoombox.ZoomIntoCenter(delta);
+    }
+
+    private static void CenterViewportTriggerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
+    {
+        Viewport? viewport = (Viewport)sender;
+        if (args.OldValue != null)
+            ((ExecutionTrigger<VecI>)args.OldValue).Triggered -= viewport.CenterZoomboxContent;
+        if (args.NewValue != null)
+            ((ExecutionTrigger<VecI>)args.NewValue).Triggered += viewport.CenterZoomboxContent;
+    }
+
+    private static void ZoomViewportTriggerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
+    {
+        Viewport? viewport = (Viewport)sender;
+        if (args.OldValue != null)
+            ((ExecutionTrigger<double>)args.OldValue).Triggered -= viewport.ZoomZoomboxContent;
+        if (args.NewValue != null)
+            ((ExecutionTrigger<double>)args.NewValue).Triggered += viewport.ZoomZoomboxContent;
+    }
 }