Browse Source

Merge pull request #36 from PixiEditor/zoom-tool

Zoom tool
Krzysztof Krysiński 5 years ago
parent
commit
e77d80f93f

BIN
PixiEditor/Images/ZoomImage.png


+ 19 - 12
PixiEditor/Models/Controllers/BitmapManager.cs

@@ -132,10 +132,10 @@ namespace PixiEditor.Models.Controllers
 
         private void Controller_MousePositionChanged(object sender, MouseMovementEventArgs e)
         {
-            if (Mouse.LeftButton == MouseButtonState.Pressed && !IsDraggingViewport()
-                                                             && MouseController.ClickedOnCanvas && ActiveDocument != null)
+            SelectedTool.OnMouseMove(new MouseEventArgs(Mouse.PrimaryDevice, (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds()));
+            if (Mouse.LeftButton == MouseButtonState.Pressed && !IsDraggingViewport() && ActiveDocument != null)
             {
-                ExecuteTool(e.NewPosition);   
+                ExecuteTool(e.NewPosition, MouseController.ClickedOnCanvas);   
             }
             else if (Mouse.LeftButton == MouseButtonState.Released)
             {
@@ -143,14 +143,21 @@ namespace PixiEditor.Models.Controllers
             }
         }
 
-        public void ExecuteTool(Coordinates newPosition)
+        public void ExecuteTool(Coordinates newPosition, bool clickedOnCanvas)
         {
-            if (IsOperationTool(SelectedTool))
-                BitmapOperations.ExecuteTool(newPosition,
-                    MouseController.LastMouseMoveCoordinates.ToList(), (BitmapOperationTool)SelectedTool);
-            else
-                ReadonlyToolUtility.ExecuteTool(MouseController.LastMouseMoveCoordinates.ToArray(),
-                    (ReadonlyTool)SelectedTool);
+            if (SelectedTool.CanStartOutsideCanvas || clickedOnCanvas)
+            {
+                if (IsOperationTool(SelectedTool))
+                {
+                    BitmapOperations.ExecuteTool(newPosition,
+                        MouseController.LastMouseMoveCoordinates.ToList(), (BitmapOperationTool)SelectedTool);
+                }
+                else
+                {
+                    ReadonlyToolUtility.ExecuteTool(MouseController.LastMouseMoveCoordinates.ToArray(),
+                        (ReadonlyTool)SelectedTool);
+                }
+            }
         }
 
         private bool IsDraggingViewport()
@@ -160,13 +167,13 @@ namespace PixiEditor.Models.Controllers
 
         private void MouseController_StartedRecordingChanges(object sender, EventArgs e)
         {
-            SelectedTool.OnMouseDown();
+            SelectedTool.OnMouseDown(new MouseEventArgs(Mouse.PrimaryDevice, (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds()));
             PreviewLayer = null;
         }
 
         private void MouseController_StoppedRecordingChanges(object sender, EventArgs e)
         {
-            SelectedTool.OnMouseUp();
+            SelectedTool.OnMouseUp(new MouseEventArgs(Mouse.PrimaryDevice, (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds()));
             if (IsOperationTool(SelectedTool) && ((BitmapOperationTool) SelectedTool).RequiresPreviewLayer)
                 BitmapOperations.StopAction();
         }

+ 2 - 2
PixiEditor/Models/Layers/Layer.cs

@@ -374,8 +374,8 @@ namespace PixiEditor.Models.Layers
 
         private void IncreaseSizeToTop(int newMinX, int newMinY)
         {
-            newMinX = Math.Clamp(Math.Min(newMinX, Width), -OffsetX, 0);
-            newMinY = Math.Clamp(Math.Min(newMinY, Height), -OffsetY, 0);
+            newMinX = Math.Clamp(Math.Min(newMinX, Width), Math.Min(-OffsetX, OffsetX), 0);
+            newMinY = Math.Clamp(Math.Min(newMinY, Height), Math.Min(-OffsetY, OffsetY), 0);
 
             Offset = new Thickness(Math.Clamp(OffsetX + newMinX, 0, MaxWidth),
                 Math.Clamp(OffsetY + newMinY, 0, MaxHeight), 0, 0);

+ 6 - 9
PixiEditor/Models/Tools/Tool.cs

@@ -27,17 +27,14 @@ namespace PixiEditor.Models.Tools
         public Toolbar Toolbar { get; set; } = new EmptyToolbar();
 
         private bool _isActive;
+        public bool CanStartOutsideCanvas { get; set; } = false;
 
-        public virtual void OnMouseDown()
-        {
-        }
+        public virtual void OnMouseDown(MouseEventArgs e) { }
 
-        public virtual void OnMouseUp()
-        {
-        }
+        public virtual void OnMouseUp(MouseEventArgs e) { }
 
-        public virtual void AfterAddedUndo()
-        {
-        }
+        public virtual void OnMouseMove(MouseEventArgs e) { }
+
+        public virtual void AfterAddedUndo() { }
     }
 }

+ 2 - 1
PixiEditor/Models/Tools/ToolType.cs

@@ -12,6 +12,7 @@
         Rectangle,
         Eraser,
         Brightness,
-        ColorPicker
+        ColorPicker,
+        Zoom
     }
 }

+ 1 - 2
PixiEditor/Models/Tools/Tools/BrightnessTool.cs

@@ -28,9 +28,8 @@ namespace PixiEditor.Models.Tools.Tools
             Toolbar = new BrightnessToolToolbar(CorrectionFactor);
         }
 
-        public override void OnMouseDown()
+        public override void OnMouseDown(MouseEventArgs e)
         {
-            base.OnMouseDown();
             _pixelsVisited.Clear();
         }
 

+ 1 - 1
PixiEditor/Models/Tools/Tools/MoveTool.cs

@@ -62,7 +62,7 @@ namespace PixiEditor.Models.Tools.Tools
             }
         }
 
-        public override void OnMouseUp() //This adds undo if there is no selection, reason why this isn't in AfterUndoAdded,
+        public override void OnMouseUp(MouseEventArgs e) //This adds undo if there is no selection, reason why this isn't in AfterUndoAdded,
         {   //is because it doesn't fire if no pixel changes were made.
             if (_currentSelection != null && _currentSelection.Length == 0)
             {

+ 3 - 2
PixiEditor/Models/Tools/Tools/SelectTool.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Windows.Controls;
+using System.Windows.Input;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.DataHolders;
 using PixiEditor.Models.Enums;
@@ -24,7 +25,7 @@ namespace PixiEditor.Models.Tools.Tools
             Toolbar = new SelectToolToolbar();
         }
 
-        public override void OnMouseDown()
+        public override void OnMouseDown(MouseEventArgs e)
         {
             Enum.TryParse((Toolbar.GetSetting("Mode").Value as ComboBoxItem)?.Content as string, out SelectionType);
 
@@ -34,7 +35,7 @@ namespace PixiEditor.Models.Tools.Tools
                 _oldSelection = ViewModelMain.Current.ActiveSelection;
         }
 
-        public override void OnMouseUp()
+        public override void OnMouseUp(MouseEventArgs e)
         {
             UndoManager.AddUndoChange(new Change("ActiveSelection", _oldSelection,
                 ViewModelMain.Current.ActiveSelection, "Select pixels"));

+ 71 - 0
PixiEditor/Models/Tools/Tools/ZoomTool.cs

@@ -0,0 +1,71 @@
+using PixiEditor.Models.Controllers;
+using PixiEditor.Models.Position;
+using PixiEditor.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows;
+using System.Windows.Input;
+
+namespace PixiEditor.Models.Tools.Tools
+{
+    public class ZoomTool : ReadonlyTool
+    {
+        public const float ZoomSensitivityMultiplier = 30f;
+        public override ToolType ToolType => ToolType.Zoom;
+        private double _startingX;
+        private double _workAreaWidth = SystemParameters.WorkArea.Width;
+        private double _pixelsPerZoomMultiplier;
+
+        public ZoomTool()
+        {
+            HideHighlight = true;
+            CanStartOutsideCanvas = true;
+            Tooltip = "Zooms viewport (Z). Click to zoom in, hold alt and click to zoom out.";
+            _pixelsPerZoomMultiplier = _workAreaWidth / ZoomSensitivityMultiplier;
+        }
+
+        public override void OnMouseDown(MouseEventArgs e)
+        {
+            _startingX = MousePositionConverter.GetCursorPosition().X;
+            ViewModelMain.Current.ZoomPercentage = 100; //This resest the value, so callback in MainDrawingPanel can fire again later
+        }
+
+        public override void OnMouseMove(MouseEventArgs e)
+        {
+            if (e.LeftButton == MouseButtonState.Pressed)
+            {
+                double xPos = MousePositionConverter.GetCursorPosition().X;
+
+                double rawPercentDifference = (xPos - _startingX) / _pixelsPerZoomMultiplier; //negative - zoom out, positive - zoom in, linear
+                double finalPercentDifference = Math.Pow(2, rawPercentDifference) * 100.0; //less than 100 - zoom out, greater than 100 - zoom in
+                Zoom(finalPercentDifference);
+            }
+        }
+
+        public override void OnMouseUp(MouseEventArgs e)
+        {
+            if (e.LeftButton == MouseButtonState.Released && e.RightButton == MouseButtonState.Released && 
+                _startingX == MousePositionConverter.GetCursorPosition().X)
+            {
+                if (Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
+                {
+                    Zoom(85);
+                }
+                else
+                {
+                    Zoom(115);
+                }
+            }
+        }
+
+        public void Zoom(double percentage)
+        {
+            ViewModelMain.Current.ZoomPercentage = percentage;
+        }
+
+        public override void Use(Coordinates[] pixels)
+        {
+        }
+    }
+}

+ 2 - 0
PixiEditor/PixiEditor.csproj

@@ -31,6 +31,7 @@
     <None Remove="Images\MoveImage.png" />
     <None Remove="Images\PixiEditorLogo.png" />
     <None Remove="Images\SelectImage.png" />
+    <None Remove="Images\ZoomImage.png" />
     <None Include="..\icon.ico">
       <Pack>True</Pack>
       <PackagePath></PackagePath>
@@ -69,6 +70,7 @@
     <Resource Include="Images\RectangleImage.png" />
     <Resource Include="Images\SelectImage.png" />
     <Resource Include="Images\transparentbg.png" />
+    <Resource Include="Images\ZoomImage.png" />
   </ItemGroup>
   <ItemGroup>
     <None Include="..\LICENSE">

+ 35 - 5
PixiEditor/ViewModels/ViewModelMain.cs

@@ -79,6 +79,8 @@ namespace PixiEditor.ViewModels
         public RelayCommand CloseWindowCommand { get; set; }
         public RelayCommand CenterContentCommand { get; set; }
         public RelayCommand OpenHyperlinkCommand { get; set; }
+        public RelayCommand ZoomCommand { get; set; }
+
 
         private double _mouseXonCanvas;
 
@@ -164,6 +166,19 @@ namespace PixiEditor.ViewModels
             }
         }
 
+        private double _zoomPercentage = 100;
+
+        public double ZoomPercentage
+        {
+            get { return _zoomPercentage; }
+            set 
+            {
+                _zoomPercentage = value;
+                RaisePropertyChanged(nameof(ZoomPercentage));
+            }
+        }
+
+
         public BitmapManager BitmapManager { get; set; }
         public PixelChangesController ChangesController { get; set; }
 
@@ -223,10 +238,12 @@ namespace PixiEditor.ViewModels
             CloseWindowCommand = new RelayCommand(CloseWindow);
             CenterContentCommand = new RelayCommand(CenterContent, DocumentIsNotNull);
             OpenHyperlinkCommand = new RelayCommand(OpenHyperlink);
+            ZoomCommand = new RelayCommand(ZoomViewport);
             ToolSet = new ObservableCollection<Tool>
             {
                 new MoveTool(), new PenTool(), new SelectTool(), new FloodFill(), new LineTool(),
-                new CircleTool(), new RectangleTool(), new EraserTool(), new ColorPickerTool(), new BrightnessTool()
+                new CircleTool(), new RectangleTool(), new EraserTool(), new ColorPickerTool(), new BrightnessTool(), 
+                new ZoomTool()
             };
             ShortcutController = new ShortcutController
             {
@@ -243,10 +260,13 @@ namespace PixiEditor.ViewModels
                     new Shortcut(Key.U, SelectToolCommand, ToolType.Brightness),
                     new Shortcut(Key.V, SelectToolCommand, ToolType.Move),
                     new Shortcut(Key.M, SelectToolCommand, ToolType.Select),
+                    new Shortcut(Key.Z, SelectToolCommand, ToolType.Zoom),
+                    new Shortcut(Key.OemPlus, ZoomCommand, 115),
+                    new Shortcut(Key.OemMinus, ZoomCommand, 85),
                     //Editor
                     new Shortcut(Key.X, SwapColorsCommand),
                     new Shortcut(Key.Y, RedoCommand, modifier: ModifierKeys.Control),
-                    new Shortcut(Key.Z, UndoCommand),
+                    new Shortcut(Key.Z, UndoCommand, modifier: ModifierKeys.Control),
                     new Shortcut(Key.D, DeselectCommand, modifier: ModifierKeys.Control),
                     new Shortcut(Key.A, SelectAllCommand, modifier: ModifierKeys.Control),
                     new Shortcut(Key.C, CopyCommand, modifier: ModifierKeys.Control),
@@ -272,6 +292,13 @@ namespace PixiEditor.ViewModels
             Current = this;
         }
 
+        private void ZoomViewport(object parameter)
+        {
+            double zoom = (int)parameter;
+            ZoomPercentage = zoom;
+            ZoomPercentage = 100;
+        }
+
         private void OpenHyperlink(object parameter)
         {
             if (parameter == null) return;
@@ -497,8 +524,8 @@ namespace PixiEditor.ViewModels
             {
                 _restoreToolOnKeyUp = false;
                 SetActiveTool(_lastActionTool);
+                ShortcutController.BlockShortcutExecution = false;
             }
-            ShortcutController.BlockShortcutExecution = false;
         }
 
         public void KeyDown(object parameter)
@@ -629,7 +656,9 @@ namespace PixiEditor.ViewModels
             {
                 if (!BitmapManager.MouseController.IsRecordingChanges)
                 {
-                    BitmapManager.MouseController.StartRecordingMouseMovementChanges(true);
+                    bool clickedOnCanvas = MouseXOnCanvas >= 0 && MouseXOnCanvas <= BitmapManager.ActiveDocument.Width &&
+                        MouseYOnCanvas >= 0 && MouseYOnCanvas <= BitmapManager.ActiveDocument.Height;
+                    BitmapManager.MouseController.StartRecordingMouseMovementChanges(clickedOnCanvas);
                     BitmapManager.MouseController.RecordMouseMovementChange(MousePositionConverter.CurrentCoordinates);
                 }
             }
@@ -646,8 +675,9 @@ namespace PixiEditor.ViewModels
 
 
             if (BitmapManager.MouseController.IsRecordingChanges && Mouse.LeftButton == MouseButtonState.Pressed)
+            {
                 BitmapManager.MouseController.RecordMouseMovementChange(cords);
-            else
+            }
                 BitmapManager.MouseController.MouseMoved(cords);
         }
 

+ 2 - 0
PixiEditor/Views/EditableTextBlock.xaml.cs

@@ -66,6 +66,8 @@ namespace PixiEditor.Views
             ShortcutController.BlockShortcutExecution = true;
             TextBlockVisibility = Visibility.Hidden;
             IsEditing = true;
+            textBox.Focus();
+            textBox.SelectAll();
         }
 
         private void DisableEditing()

+ 4 - 4
PixiEditor/Views/MainDrawingPanel.xaml

@@ -7,10 +7,10 @@
              xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
              xmlns:helpers="clr-namespace:PixiEditor.Helpers"
              xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
-             mc:Ignorable="d"
-             d:DesignHeight="450" d:DesignWidth="800" x:Name="mainDrawingPanel">
-    <xctk:Zoombox Cursor="{Binding Cursor}" IsAnimated="False" Name="Zoombox" KeepContentInBounds="True"
-                  Loaded="Zoombox_Loaded" DragModifiers="Shift" ZoomModifiers="None">
+             mc:Ignorable="d" PreviewMouseDown="mainDrawingPanel_MouseDown" PreviewMouseUp="mainDrawingPanel_PreviewMouseUp"
+             d:DesignHeight="450" d:DesignWidth="800" x:Name="mainDrawingPanel" PreviewMouseWheel="Zoombox_MouseWheel">
+    <xctk:Zoombox PreviewMouseDown="Zoombox_PreviewMouseDown" Cursor="{Binding Cursor}" Name="Zoombox" KeepContentInBounds="True"
+                  Loaded="Zoombox_Loaded" IsAnimated="False" CurrentViewChanged="Zoombox_CurrentViewChanged" DragModifiers="Shift" ZoomModifiers="None">
         <i:Interaction.Triggers>
             <i:EventTrigger EventName="MouseMove">
                 <i:InvokeCommandAction Command="{Binding MouseMoveCommand, ElementName=mainDrawingPanel, Mode=OneWay}" />

+ 91 - 4
PixiEditor/Views/MainDrawingPanel.xaml.cs

@@ -1,6 +1,11 @@
-using System.Windows;
+using PixiEditor.ViewModels;
+using System;
+using System.Windows;
+using System.Windows.Automation;
 using System.Windows.Controls;
 using System.Windows.Input;
+using PixiEditor.Models.Tools.Tools;
+using Xceed.Wpf.Toolkit.Core.Input;
 using Xceed.Wpf.Toolkit.Zoombox;
 
 namespace PixiEditor.Views
@@ -35,13 +40,23 @@ namespace PixiEditor.Views
 
         // Using a DependencyProperty as the backing store for Item.  This enables animation, styling, binding, etc...
         public static readonly DependencyProperty ItemProperty =
-            DependencyProperty.Register("Item", typeof(object), typeof(MainDrawingPanel), new PropertyMetadata(0));
+            DependencyProperty.Register("Item", typeof(object), typeof(MainDrawingPanel), new PropertyMetadata(default(FrameworkElement)));
 
-        public MainDrawingPanel()
+        // Using a DependencyProperty as the backing store for Item.  This enables animation, styling, binding, etc...
+        public static readonly DependencyProperty IsUsingZoomToolProperty =
+            DependencyProperty.Register("IsUsingZoomTool", typeof(bool), typeof(MainDrawingPanel), new PropertyMetadata(false));
+
+
+        public double ZoomPercentage
         {
-            InitializeComponent();
+            get { return (double)GetValue(ZoomPercentageProperty); }
+            set { SetValue(ZoomPercentageProperty, value); }
         }
 
+        // Using a DependencyProperty as the backing store for ZoomPercentage.  This enables animation, styling, binding, etc...
+        public static readonly DependencyProperty ZoomPercentageProperty =
+            DependencyProperty.Register("ZoomPercentage", typeof(double), typeof(MainDrawingPanel), new PropertyMetadata(0.0, ZoomPercentegeChanged));
+
 
         public bool Center
         {
@@ -82,6 +97,60 @@ namespace PixiEditor.Views
             set => SetValue(ItemProperty, value);
         }
 
+        public bool IsUsingZoomTool
+        {
+            get => (bool) GetValue(IsUsingZoomToolProperty);
+            set => SetValue(IsUsingZoomToolProperty, value);
+        }
+
+        private static void ZoomPercentegeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+        {
+            MainDrawingPanel panel = (MainDrawingPanel)d;
+            double percentage = (double)e.NewValue;
+            if(percentage == 100)
+            {
+                panel.SetClickValues();
+            }
+            panel.Zoombox.ZoomTo(panel.ClickScale * ((double)e.NewValue / 100.0));
+        }
+
+        public double ClickScale;
+
+        public MainDrawingPanel()
+        {
+            InitializeComponent();
+            Zoombox.ZoomToSelectionModifiers = new KeyModifierCollection() { KeyModifier.RightAlt };
+        }
+
+        private void Zoombox_CurrentViewChanged(object sender, ZoomboxViewChangedEventArgs e)
+        {
+            Zoombox.MinScale = 32 / ((FrameworkElement)Item).Width;
+            Zoombox.KeepContentInBounds = !(Zoombox.Scale > Zoombox.MinScale * 35.0);
+        }
+
+        private void Zoombox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
+        {
+            if (ZoomPercentage == 100)
+            {
+                SetClickValues();
+            }
+        }
+
+        private void SetClickValues()
+        {
+            if (!IsUsingZoomTool) return;
+            ClickScale = Zoombox.Scale;
+            SetZoomOrigin();
+        }
+
+        private void SetZoomOrigin()
+        {
+            var item = (FrameworkElement)Item;
+            if (item == null) return;
+            var mousePos = Mouse.GetPosition(item);
+            Zoombox.ZoomOrigin = new Point(Math.Clamp(mousePos.X / item.Width, 0, 1), Math.Clamp(mousePos.Y / item.Height, 0, 1));
+        }
+
         private static void OnCenterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
         {
             MainDrawingPanel panel = (MainDrawingPanel) d;
@@ -92,6 +161,24 @@ namespace PixiEditor.Views
         private void Zoombox_Loaded(object sender, RoutedEventArgs e)
         {
             if (CenterOnStart) ((Zoombox) sender).CenterContent();
+            ClickScale = Zoombox.Scale;
+        }
+
+        private void Zoombox_MouseWheel(object sender, MouseWheelEventArgs e)
+        {
+            SetZoomOrigin();
+        }
+
+        private void mainDrawingPanel_MouseDown(object sender, MouseButtonEventArgs e)
+        {
+            IsUsingZoomTool = ViewModelMain.Current.BitmapManager.SelectedTool is ZoomTool;
+            Mouse.Capture((IInputElement)sender, CaptureMode.SubTree);
+            SetClickValues();
+        }
+
+        private void mainDrawingPanel_PreviewMouseUp(object sender, MouseButtonEventArgs e)
+        {
+            ((IInputElement)sender).ReleaseMouseCapture();
         }
     }
 }

+ 4 - 6
PixiEditor/Views/MainWindow.xaml

@@ -160,7 +160,7 @@
         </StackPanel>
         <Grid Grid.Column="1" Grid.Row="2" Background="#303030" Margin="0,7,5,0">
             <Grid>
-                <vws:MainDrawingPanel Center="{Binding RecenterZoombox, Mode=TwoWay}" x:Name="DrawingPanel"
+                <vws:MainDrawingPanel ZoomPercentage="{Binding ZoomPercentage, Mode=TwoWay}" Center="{Binding RecenterZoombox, Mode=TwoWay}" x:Name="DrawingPanel"
                                       CenterOnStart="True" Cursor="{Binding ToolCursor}">
                     <i:Interaction.Triggers>
                         <i:EventTrigger EventName="MouseMove">
@@ -169,6 +169,9 @@
                         <i:EventTrigger EventName="MouseUp">
                             <i:InvokeCommandAction Command="{Binding MouseUpCommand}" />
                         </i:EventTrigger>
+                        <i:EventTrigger EventName="MouseDown">
+                            <i:InvokeCommandAction Command="{Binding MouseDownCommand}"/>
+                        </i:EventTrigger>
                     </i:Interaction.Triggers>
                     <i:Interaction.Behaviors>
                         <behaviors:MouseBehaviour RelativeTo="{Binding ElementName=DrawingPanel, Path=Item}"
@@ -179,11 +182,6 @@
                         <Canvas Width="{Binding BitmapManager.ActiveDocument.Width}"
                                 Height="{Binding BitmapManager.ActiveDocument.Height}" VerticalAlignment="Center"
                                 HorizontalAlignment="Center">
-                            <i:Interaction.Triggers>
-                                <i:EventTrigger EventName="MouseDown">
-                                    <i:InvokeCommandAction Command="{Binding MouseDownCommand}" />
-                                </i:EventTrigger>
-                            </i:Interaction.Triggers>
                             <Image Source="/Images/transparentbg.png"
                                    Height="{Binding BitmapManager.ActiveDocument.Height}"
                                    Width="{Binding BitmapManager.ActiveDocument.Width}" Opacity="0.9"

+ 1 - 1
PixiEditorTests/ModelsTests/ControllersTests/BitmapManagerTests.cs

@@ -92,7 +92,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
             bitmapManager.MouseController.RecordMouseMovementChange(new Coordinates(1, 1));
             bitmapManager.MouseController.StopRecordingMouseMovementChanges();
 
-            bitmapManager.ExecuteTool(new Coordinates(1, 1));
+            bitmapManager.ExecuteTool(new Coordinates(1, 1), true);
 
             Assert.Equal(Colors.Green, bitmapManager.ActiveLayer.GetPixelWithOffset(1, 1));
         }

+ 16 - 11
PixiEditorTests/ModelsTests/ControllersTests/UndoManagerTests.cs

@@ -10,10 +10,15 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         public int ExampleProperty { get; set; } = 1;
         public TestPropertyClass TestPropClass { get; set; } = new TestPropertyClass();
 
+        public UndoManagerTests()
+        {
+            PrepareUndoManagerForTest();
+        }
+
         [Fact]
         public void TestSetRoot()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             UndoManager.SetMainRoot(null);
             UndoManager.SetMainRoot(this);
             Assert.Equal(this, UndoManager.MainRoot);
@@ -22,7 +27,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestAddToUndoStack()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             UndoManager.AddUndoChange(new Change("ExampleProperty", ExampleProperty, ExampleProperty));
             Assert.True(UndoManager.UndoStack.Count == 1);
             Assert.True((int)UndoManager.UndoStack.Peek().OldValue == ExampleProperty);
@@ -31,7 +36,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestThatUndoAddsToRedoStack()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             UndoManager.AddUndoChange(new Change("ExampleProperty", ExampleProperty, ExampleProperty));
             UndoManager.Undo();
             Assert.True(UndoManager.RedoStack.Count == 1);
@@ -40,7 +45,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestUndo()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             UndoManager.AddUndoChange(new Change("ExampleProperty", ExampleProperty, 55));
             ExampleProperty = 55;
             UndoManager.Undo();
@@ -51,7 +56,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestThatRedoAddsToUndoStack()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             UndoManager.AddUndoChange(new Change("ExampleProperty", ExampleProperty, ExampleProperty));
             UndoManager.Undo();
             UndoManager.Redo();
@@ -61,7 +66,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestRedo()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             ExampleProperty = 55;
             UndoManager.AddUndoChange(new Change("ExampleProperty", 1, ExampleProperty));
             UndoManager.Undo();
@@ -72,7 +77,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestThatUndoManagerUndoAndRedoWithCustomRootCorrectly()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             TestPropertyClass testProp = new TestPropertyClass();
             int newVal = 5;
             testProp.IntProperty = newVal;
@@ -91,7 +96,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestThatMixedProcessOfUndoAndRedoWorks()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
 
 
             int newVal = 5;
@@ -119,7 +124,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestThatProcessBasedUndoAndRedoWorks()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             int newVal = 5;
             UndoManager.AddUndoChange(new Change(ReverseProcess, new object[]{ExampleProperty}, ReverseProcess, 
                 new object[]{newVal}));
@@ -140,7 +145,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
         [Fact]
         public void TestThatNestedPropertyUndoWorks()
         {
-            PrepareUnoManagerForTest();
+            PrepareUndoManagerForTest();
             int newVal = 5;
 
             UndoManager.AddUndoChange(new Change("TestPropClass.IntProperty", TestPropClass.IntProperty, 
@@ -164,7 +169,7 @@ namespace PixiEditorTests.ModelsTests.ControllersTests
             ExampleProperty = (int)args[0];
         }
 
-        private void PrepareUnoManagerForTest()
+        private void PrepareUndoManagerForTest()
         {
             UndoManager.SetMainRoot(this);
             UndoManager.UndoStack.Clear();

+ 24 - 0
PixiEditorTests/ModelsTests/ToolsTests/ZoomToolTests.cs

@@ -0,0 +1,24 @@
+using PixiEditor.Models.Tools.Tools;
+using PixiEditor.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Xunit;
+
+namespace PixiEditorTests.ModelsTests.ToolsTests
+{
+    [Collection("Application collection")]
+    public class ZoomToolTests
+    {
+        [StaFact]
+        public void TestThatZoomSetsViewModelsZoomPercentage()
+        {
+            ViewModelMain vm = new ViewModelMain();
+            ZoomTool zoomTool = new ZoomTool();
+            double zoom = 110;
+            zoomTool.Zoom(zoom);
+            Assert.Equal(zoom, vm.ZoomPercentage);
+        }
+
+    }
+}