Bladeren bron

Center content on load and resize

Equbuxu 4 jaren geleden
bovenliggende
commit
c274041c8b

+ 13 - 0
PixiEditor/Helpers/ExecutionTrigger.cs

@@ -0,0 +1,13 @@
+using System;
+
+namespace PixiEditor.Helpers
+{
+    public class ExecutionTrigger<T>
+    {
+        public event EventHandler<T> Triggered;
+        public void Execute(object sender, T args)
+        {
+            Triggered?.Invoke(sender, args);
+        }
+    }
+}

+ 5 - 7
PixiEditor/Models/DataHolders/Document/Document.cs

@@ -20,11 +20,8 @@ namespace PixiEditor.Models.DataHolders
     [DebuggerDisplay("'{Name, nq}' {width}x{height} {Layers.Count} Layer(s)")]
     public partial class Document : NotifyableObject
     {
-        private int height;
-        private int width;
 
         private ViewModelMain xamlAccesibleViewModel = null;
-
         public ViewModelMain XamlAccesibleViewModel // Used to access ViewModelMain, without changing DataContext in XAML
         {
             get => xamlAccesibleViewModel;
@@ -41,6 +38,7 @@ namespace PixiEditor.Models.DataHolders
                 + (!ChangesSaved ? " *" : string.Empty);
         }
 
+        private int width;
         public int Width
         {
             get => width;
@@ -51,6 +49,7 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
+        private int height;
         public int Height
         {
             get => height;
@@ -74,9 +73,6 @@ namespace PixiEditor.Models.DataHolders
         }
 
         private double mouseXonCanvas;
-
-        private double mouseYonCanvas;
-
         public double MouseXOnCanvas // Mouse X coordinate relative to canvas
         {
             get => mouseXonCanvas;
@@ -87,6 +83,7 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
+        private double mouseYonCanvas;
         public double MouseYOnCanvas // Mouse Y coordinate relative to canvas
         {
             get => mouseYonCanvas;
@@ -97,8 +94,9 @@ namespace PixiEditor.Models.DataHolders
             }
         }
 
-        public UndoManager UndoManager { get; set; }
+        public ExecutionTrigger<EventArgs> CenterViewportTrigger { get; } = new();
 
+        public UndoManager UndoManager { get; set; }
 
         public ObservableCollection<Color> Swatches { get; set; } = new ObservableCollection<Color>();
 

+ 2 - 0
PixiEditor/ViewModels/ViewModelMain.cs

@@ -5,6 +5,7 @@ using System.Diagnostics;
 using System.Linq;
 using System.Windows;
 using System.Windows.Input;
+using System.Windows.Threading;
 using Microsoft.Extensions.DependencyInjection;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Controllers;
@@ -333,6 +334,7 @@ namespace PixiEditor.ViewModels
         {
             BitmapManager.ActiveDocument.ActiveSelection = new Selection(Array.Empty<Coordinates>());
             BitmapManager.ActiveDocument.ChangesSaved = false;
+            BitmapManager.ActiveDocument.CenterViewportTrigger.Execute(this, EventArgs.Empty);
         }
 
         private void MouseController_StoppedRecordingChanges(object sender, EventArgs e)

+ 1 - 0
PixiEditor/Views/MainWindow.xaml

@@ -230,6 +230,7 @@
                             <ui:DocumentsTemplateSelector.DocumentsViewTemplate>
                                 <DataTemplate DataType="{x:Type dataHolders:Document}">
                                     <usercontrols:DrawingViewPort
+                                        CenterViewportTrigger="{Binding CenterViewportTrigger}"
                                         GridLinesVisible="{Binding XamlAccesibleViewModel.ViewportSubViewModel.GridLinesEnabled}"
                                         Cursor="{Binding XamlAccesibleViewModel.ToolsSubViewModel.ToolCursor}"
                                         MiddleMouseClickedCommand="{Binding XamlAccesibleViewModel.ToolsSubViewModel.SelectToolCommand}"

+ 1 - 0
PixiEditor/Views/UserControls/DrawingViewPort.xaml

@@ -36,6 +36,7 @@
 
         <local:Zoombox.AdditionalContent>
             <Canvas Width="{Binding Width}"
+                                Loaded="OnCanvasLoaded"
                                 Height="{Binding Height}" VerticalAlignment="Center"
                                 HorizontalAlignment="Center">
                 <Image Source="/Images/transparentbg.png"

+ 38 - 0
PixiEditor/Views/UserControls/DrawingViewPort.xaml.cs

@@ -1,5 +1,6 @@
 using PixiEditor.Helpers;
 using PixiEditor.Models.Tools.Tools;
+using System;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Input;
@@ -35,6 +36,10 @@ namespace PixiEditor.Views.UserControls
         public static readonly DependencyProperty IsUsingMoveViewportToolProperty =
             DependencyProperty.Register(nameof(IsUsingMoveViewportTool), typeof(bool), typeof(DrawingViewPort), new PropertyMetadata(false, ToolChanged));
 
+        public static readonly DependencyProperty CenterViewportTriggerProperty =
+            DependencyProperty.Register(nameof(CenterViewportTrigger), typeof(ExecutionTrigger<EventArgs>), typeof(DrawingViewPort),
+                new PropertyMetadata(default(ExecutionTrigger<EventArgs>), CenterViewportTriggerChanged));
+
         public ICommand MiddleMouseClickedCommand
         {
             get => (ICommand)GetValue(MiddleMouseClickedCommandProperty);
@@ -70,17 +75,25 @@ namespace PixiEditor.Views.UserControls
             get => (bool)GetValue(GridLinesVisibleProperty);
             set => SetValue(GridLinesVisibleProperty, value);
         }
+
         public bool IsUsingZoomTool
         {
             get => (bool)GetValue(IsUsingZoomToolProperty);
             set => SetValue(IsUsingZoomToolProperty, value);
         }
+
         public bool IsUsingMoveViewportTool
         {
             get => (bool)GetValue(IsUsingMoveViewportToolProperty);
             set => SetValue(IsUsingMoveViewportToolProperty, value);
         }
 
+        public ExecutionTrigger<EventArgs> CenterViewportTrigger
+        {
+            get => (ExecutionTrigger<EventArgs>)GetValue(CenterViewportTriggerProperty);
+            set => SetValue(CenterViewportTriggerProperty, value);
+        }
+
         public RelayCommand PreviewMouseDownCommand { get; private set; }
         private static void ToolChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
         {
@@ -93,16 +106,41 @@ namespace PixiEditor.Views.UserControls
                 panel.zoombox.ZoomMode = Zoombox.Mode.Normal;
         }
 
+        private static void CenterViewportTriggerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
+        {
+            var viewport = (DrawingViewPort)sender;
+            if (args.OldValue != null)
+            {
+                ((ExecutionTrigger<EventArgs>)args.OldValue).Triggered -= viewport.CenterZoomboxContent;
+            }
+            ((ExecutionTrigger<EventArgs>)args.NewValue).Triggered += viewport.CenterZoomboxContent;
+        }
+
+        private bool loaded = false;
+
         public DrawingViewPort()
         {
             PreviewMouseDownCommand = new RelayCommand(ProcessMouseDown);
             InitializeComponent();
         }
 
+        private void CenterZoomboxContent(object sender, EventArgs args)
+        {
+            zoombox.CenterContent();
+        }
+
         private void ProcessMouseDown(object parameter)
         {
             if (Mouse.MiddleButton == MouseButtonState.Pressed && MiddleMouseClickedCommand.CanExecute(typeof(MoveViewportTool)))
                 MiddleMouseClickedCommand.Execute(typeof(MoveViewportTool));
         }
+
+        private void OnCanvasLoaded(object sender, EventArgs e)
+        {
+            if (loaded)
+                return;
+            zoombox.CenterContent();
+            loaded = true;
+        }
     }
 }

+ 20 - 1
PixiEditor/Views/UserControls/ZoomBox.xaml.cs

@@ -100,6 +100,8 @@ namespace PixiEditor.Views.UserControls
         public static readonly DependencyProperty ZoomModeProperty =
             DependencyProperty.Register(nameof(ZoomMode), typeof(Mode), typeof(Zoombox),
               new PropertyMetadata(Mode.Normal, ZoomModeChanged));
+
+        private const double zoomFactor = 1.1;
         public object AdditionalContent
         {
             get => GetValue(AdditionalContentProperty);
@@ -135,7 +137,8 @@ namespace PixiEditor.Views.UserControls
                 scaleTransform.ScaleY = mult;
             }
         }
-        private double Zoom => Math.Pow(1.1, zoomPower);
+
+        private double Zoom => Math.Pow(zoomFactor, zoomPower);
 
         private IDragOperation activeDragOperation = null;
         private MouseButtonEventArgs activeMouseDownEventArgs = null;
@@ -154,6 +157,22 @@ namespace PixiEditor.Views.UserControls
             InitializeComponent();
         }
 
+        public void CenterContent()
+        {
+            const double marginFactor = 1.1;
+            double scaleFactor = Math.Max(
+                mainGrid.ActualWidth * marginFactor / mainCanvas.ActualWidth,
+                mainGrid.ActualHeight * marginFactor / mainCanvas.ActualHeight);
+            ZoomPower = -Math.Log(scaleFactor, zoomFactor);
+            SpaceOriginPos = new Point(
+                mainCanvas.ActualWidth / 2 - mainGrid.ActualWidth * Zoom / 2,
+                mainCanvas.ActualHeight / 2 - mainGrid.ActualHeight * Zoom / 2);
+        }
+
+        public void ZoomIntoCenter(double delta)
+        {
+            ZoomInto(new Point(mainCanvas.ActualWidth / 2, mainCanvas.ActualHeight / 2), delta);
+        }
         public void ZoomInto(Point mousePos, double delta)
         {
             var oldZoomboxMousePos = ToZoomboxSpace(mousePos);