Browse Source

MoveTool base functionality works

flabbet 5 years ago
parent
commit
6a654d7b73

+ 5 - 0
PixiEditor/Models/Layers/Layer.cs

@@ -81,8 +81,13 @@ namespace PixiEditor.Models.Layers
             Height = (int)layerBitmap.Height;
         }
 
+        /// <summary>
+        /// Applies pixels to layer
+        /// </summary>
+        /// <param name="pixels"></param>
         public void ApplyPixels(BitmapPixelChanges pixels)
         {
+            if (pixels.ChangedPixels == null) return;
             LayerBitmap.Lock();
 
             foreach (var coords in pixels.ChangedPixels)

+ 13 - 2
PixiEditor/Models/Tools/BitmapPixelChanges.cs

@@ -10,14 +10,19 @@ namespace PixiEditor.Models.Tools
 {
     public struct BitmapPixelChanges
     {
+        public static BitmapPixelChanges Empty = new BitmapPixelChanges(new Dictionary<Coordinates, Color>());
         public Dictionary<Coordinates, Color> ChangedPixels { get; set; } 
 
-
         public BitmapPixelChanges(Dictionary<Coordinates, Color> changedPixels)
         {
             ChangedPixels = changedPixels;
         }
-
+        /// <summary>
+        /// Builds BitmapPixelChanges with only one color for specified coordinates
+        /// </summary>
+        /// <param name="coordinates"></param>
+        /// <param name="color"></param>
+        /// <returns>Single-colored BitmapPixelChanges</returns>
         public static BitmapPixelChanges FromSingleColoredArray(Coordinates[] coordinates, Color color)
         {
             Dictionary<Coordinates, Color> dict = new Dictionary<Coordinates, Color>();
@@ -28,6 +33,12 @@ namespace PixiEditor.Models.Tools
             return new BitmapPixelChanges(dict);
         }
 
+        /// <summary>
+        /// Builds BitmapPixelChanges using 2 same-length enumerables of coordinates and colors
+        /// </summary>
+        /// <param name="coordinates"></param>
+        /// <param name="color"></param>
+        /// <returns></returns>
         public static BitmapPixelChanges FromArrays(IEnumerable<Coordinates> coordinates, IEnumerable<Color> color)
         {
             var coordinateArray = coordinates.ToArray();

+ 34 - 12
PixiEditor/Models/Tools/Tools/MoveTool.cs

@@ -28,34 +28,56 @@ namespace PixiEditor.Models.Tools.Tools
         }
 
         public override BitmapPixelChanges Use(Layer layer, Coordinates[] mouseMove, Color color)
+        {
+            if (ViewModelMain.Current.ActiveSelection.SelectedPoints == null) return BitmapPixelChanges.Empty;
+            return MoveSelection(layer, mouseMove);
+        }
+
+        public BitmapPixelChanges MoveSelection(Layer layer, Coordinates[] mouseMove)
         {
             Coordinates start = mouseMove[^1];
             Coordinates end = mouseMove[0];
 
             if (_lastStartMousePos != start)
             {
-                _lastStartMousePos = start;
-                _startSelection = ViewModelMain.Current.ActiveSelection.SelectedPoints;
-                _startPixelColors = GetPixelsForSelection(layer, _startSelection);
-                _lastMouseMove = start;
-                _clearedPixels = false;
+                ResetSelectionValues(layer, start);
             }
 
+            Coordinates[] previousSelection = TranslateSelection(end);
+            ClearSelectedPixels(layer, previousSelection);
+
+
+            _lastMouseMove = end;
+            return BitmapPixelChanges.FromArrays(
+                        ViewModelMain.Current.ActiveSelection.SelectedPoints, _startPixelColors);
+        }
+
+        private void ResetSelectionValues(Layer layer, Coordinates start)
+        {
+            _lastStartMousePos = start;
+            _startSelection = ViewModelMain.Current.ActiveSelection.SelectedPoints;
+            _startPixelColors = GetPixelsForSelection(layer, _startSelection);
+            _lastMouseMove = start;
+            _clearedPixels = false;
+        }
+
+        private Coordinates[] TranslateSelection(Coordinates end)
+        {
             Coordinates translation = ImageManipulation.Transform.GetTranslation(_lastMouseMove, end);
             Coordinates[] previousSelection = ViewModelMain.Current.ActiveSelection.SelectedPoints.ToArray();
-                ViewModelMain.Current.ActiveSelection = 
-                    new Selection(ImageManipulation.Transform.Translate(previousSelection, translation));
+            ViewModelMain.Current.ActiveSelection =
+                new Selection(ImageManipulation.Transform.Translate(previousSelection, translation));
+            return previousSelection;
+        }
 
+        private void ClearSelectedPixels(Layer layer, Coordinates[] selection)
+        {
             if (_clearedPixels == false)
             {
-                layer.ApplyPixels(BitmapPixelChanges.FromSingleColoredArray(previousSelection, System.Windows.Media.Colors.Transparent));
+                layer.ApplyPixels(BitmapPixelChanges.FromSingleColoredArray(selection, System.Windows.Media.Colors.Transparent));
 
                 _clearedPixels = true;
             }
-                BitmapPixelChanges changes = BitmapPixelChanges.FromArrays(
-                        ViewModelMain.Current.ActiveSelection.SelectedPoints, _startPixelColors);
-            _lastMouseMove = end;
-            return changes;
         }
 
         private Color[] GetPixelsForSelection(Layer layer, Coordinates[] selection)

+ 2 - 2
PixiEditor/Views/MainWindow.xaml

@@ -134,9 +134,9 @@
                                     </DataTemplate>
                                 </ItemsControl.ItemTemplate>
                             </ItemsControl>
-                            <Rectangle Stroke="#7F67B8FF" Height="{Binding ActiveSelection.VisualHeight}" Width="{Binding ActiveSelection.VisualWidth}" 
+                            <Rectangle Stroke="#7F8ECAFF" Height="{Binding ActiveSelection.VisualHeight}" Width="{Binding ActiveSelection.VisualWidth}" 
                                        Canvas.Left="{Binding ActiveSelection.VisualCanvasLeft}" Canvas.Top="{Binding ActiveSelection.VisualCanvasTop}" Visibility="{Binding ActiveSelection.Visibility}" 
-                                       Fill="Transparent" StrokeThickness="1" SnapsToDevicePixels="True"/>
+                                       Fill="#7F8ECAFF" StrokeThickness="0.1" SnapsToDevicePixels="True"/>
                         </Canvas>
                     </vws:MainDrawingPanel.Item>
                 </vws:MainDrawingPanel>