Browse Source

Added pixel highlight

flabbet 5 years ago
parent
commit
f366532a2d

+ 28 - 1
PixiEditor/Models/Controllers/BitmapOperationsUtility.cs

@@ -67,10 +67,19 @@ namespace PixiEditor.Models.Controllers
         public BitmapOperationsUtility()
         {
             MouseController = new MouseMovementController();
+            MouseController.StartedRecordingChanges += MouseController_StartedRecordingChanges;
             MouseController.MousePositionChanged += Controller_MousePositionChanged;
             MouseController.StoppedRecordingChanges += MouseController_StoppedRecordingChanges;
         }
 
+        private void MouseController_StartedRecordingChanges(object sender, EventArgs e)
+        {
+            if (PreviewLayer != null)
+            {
+                PreviewLayer.Clear();
+            }
+        }
+
         private void MouseController_StoppedRecordingChanges(object sender, EventArgs e)
         {
             if(SelectedTool.RequiresPreviewLayer)
@@ -86,13 +95,26 @@ namespace PixiEditor.Models.Controllers
         {
             if(SelectedTool != null && SelectedTool.ToolType != ToolType.None && Mouse.LeftButton == MouseButtonState.Pressed)
             {
+                if (Layers.Count == 0) return;
                 var mouseMove = MouseController.LastMouseMoveCoordinates.ToList();
                 mouseMove.Reverse();
                 UseTool(mouseMove);
                 
-
                 _lastMousePos = e.NewPosition;
             }
+            else if(Mouse.LeftButton == MouseButtonState.Released)
+            {
+                HighlightPixels(e.NewPosition);
+            }
+        }
+
+        private void HighlightPixels(Coordinates newPosition)
+        {
+            if (Layers.Count == 0) return;
+            GeneratePreviewLayer();
+            PreviewLayer.Clear();
+            Coordinates[] highlightArea = CoordinatesCalculator.RectangleToCoordinates(CoordinatesCalculator.CalculateThicknessCenter(newPosition, ToolSize));    
+            PreviewLayer.ApplyPixels(BitmapPixelChanges.FromSingleColoredArray(highlightArea, Color.FromArgb(77,0,0,0)));
         }
 
         private void UseTool(List<Coordinates> mouseMoveCords)
@@ -119,6 +141,11 @@ namespace PixiEditor.Models.Controllers
             return cords[0].X == cords[^1].X || cords[0].Y == cords[^1].Y;
         }
 
+        /// <summary>
+        /// Extracts square from rectangle mouse drag, used to draw symmetric shapes.
+        /// </summary>
+        /// <param name="mouseMoveCords"></param>
+        /// <returns></returns>
         private List<Coordinates> GetSquareCoordiantes(List<Coordinates> mouseMoveCords)
         {
             int xLength = mouseMoveCords[0].Y - mouseMoveCords[^1].Y;

+ 11 - 0
PixiEditor/Models/Controllers/MouseMovementController.cs

@@ -9,6 +9,7 @@ namespace PixiEditor.Models.Controllers
     public class MouseMovementController
     {
         public List<Coordinates> LastMouseMoveCoordinates { get; } = new List<Coordinates>();
+        public event EventHandler StartedRecordingChanges;
         public event EventHandler<MouseMovementEventArgs> MousePositionChanged;
         public event EventHandler StoppedRecordingChanges;
         public bool IsRecordingChanges { get; private set; } = false;
@@ -19,6 +20,7 @@ namespace PixiEditor.Models.Controllers
             {
                 LastMouseMoveCoordinates.Clear();
                 IsRecordingChanges = true;
+                StartedRecordingChanges?.Invoke(this, EventArgs.Empty);
             }
         }
         public void RecordMouseMovementChange(Coordinates mouseCoordinates)
@@ -33,6 +35,15 @@ namespace PixiEditor.Models.Controllers
             }
         }
 
+        /// <summary>
+        /// Plain mose move, does not affect mouse drag recordings
+        /// </summary>
+        /// <param name="mouseCoordinates"></param>
+        public void MouseMoved(Coordinates mouseCoordinates)
+        {
+            MousePositionChanged?.Invoke(this, new MouseMovementEventArgs(mouseCoordinates));
+        }
+
         public void StopRecordingMouseMovementChanges()
         {
             if (IsRecordingChanges)

+ 5 - 0
PixiEditor/Models/Position/CoordinatesCalculator.cs

@@ -56,5 +56,10 @@ namespace PixiEditor.Models.Position
             }
             return coordinates.ToArray();
         }
+
+        public static Coordinates[] RectangleToCoordinates(DoubleCords coordinates)
+        {
+            return RectangleToCoordinates(coordinates.Coords1.X, coordinates.Coords1.Y, coordinates.Coords2.X, coordinates.Coords2.Y);
+        }
     }
 }

+ 9 - 5
PixiEditor/ViewModels/ViewModelMain.cs

@@ -187,7 +187,7 @@ namespace PixiEditor.ViewModels
                     new Shortcut(Key.U, SelectToolCommand, ToolType.Brightness),
                     new Shortcut(Key.Y, RedoCommand, null, ModifierKeys.Control),
                     new Shortcut(Key.Z, UndoCommand),
-                    new Shortcut(Key.S, UndoCommand, null, ModifierKeys.Control),
+                    new Shortcut(Key.S, SaveFileCommand, null, ModifierKeys.Control),
                     new Shortcut(Key.N, GenerateDrawAreaCommand, null, ModifierKeys.Control),
                 }
             };
@@ -372,10 +372,14 @@ namespace PixiEditor.ViewModels
             Coordinates cords = new Coordinates((int)MouseXOnCanvas, (int)MouseYOnCanvas);
             MousePositionConverter.CurrentCoordinates = cords;
 
-                if (BitmapUtility.MouseController.IsRecordingChanges && Mouse.LeftButton == MouseButtonState.Pressed)
-                {
-                    BitmapUtility.MouseController.RecordMouseMovementChange(cords);
-                }
+            if (BitmapUtility.MouseController.IsRecordingChanges && Mouse.LeftButton == MouseButtonState.Pressed)
+            {
+                BitmapUtility.MouseController.RecordMouseMovementChange(cords);
+            }
+            else
+            {
+                BitmapUtility.MouseController.MouseMoved(cords);
+            }
         }