Browse Source

Fix the app hanging while resizing windows (capture mouse prior to drag-n-drop and only do the drag-n-drop if the mouse is captured)

Equbuxu 2 years ago
parent
commit
7a5f937baf

+ 4 - 2
src/PixiEditor/Views/UserControls/Layers/LayersManager.xaml

@@ -143,13 +143,15 @@
                         <layerUserControls:FolderControl
                             Folder="{Binding}"
                             MouseDown="FolderControl_MouseDown"
-                            MouseMove="Folder_MouseMove"/>
+                            MouseMove="FolderControl_MouseMove"
+                            MouseUp="FolderControl_MouseUp"/>
                     </HierarchicalDataTemplate>
                     <DataTemplate DataType="{x:Type docVm:LayerViewModel}">
                         <layerUserControls:LayerControl
                             Layer="{Binding}"
                             MouseDown="LayerControl_MouseDown"
-                            MouseMove="LayerStructureItemContainer_MouseMove"/>
+                            MouseMove="LayerControl_MouseMove"
+                            MouseUp="LayerControl_MouseUp"/>
                     </DataTemplate>
                 </TreeView.Resources>
             </TreeView>

+ 59 - 40
src/PixiEditor/Views/UserControls/Layers/LayersManager.xaml.cs

@@ -2,6 +2,7 @@
 using System.Windows.Controls;
 using System.Windows.Input;
 using System.Windows.Media;
+using System.Windows.Threading;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Enums;
 using PixiEditor.ViewModels.SubViewModels.Document;
@@ -27,27 +28,79 @@ internal partial class LayersManager : UserControl
         highlightColor = (Brush?)App.Current.Resources["SoftSelectedLayerColor"];
     }
 
-    private void LayerStructureItemContainer_MouseMove(object? sender, System.Windows.Input.MouseEventArgs? e)
+    private void LayerControl_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
+    {
+        LayerControl control = (LayerControl)sender;
+        if (e.ChangedButton == MouseButton.Left)
+        {
+            HandleMouseDown(control.Layer);
+            control.CaptureMouse();
+        }
+        else
+        {
+            if (control.Layer is not null && control.Layer.Selection == StructureMemberSelectionType.None)
+            {
+                control.Layer.Document.Operations.SetSelectedMember(control.Layer.GuidValue);
+                control.Layer.Document.Operations.ClearSoftSelectedMembers();
+            }
+        }
+    }
+    
+    private void LayerControl_MouseMove(object? sender, System.Windows.Input.MouseEventArgs? e)
     {
         if (e is null)
             return;
-        if (sender is LayerControl container
-            && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed /*&& !container.Layer.IsRenaming*/)
+        if (sender is LayerControl container &&
+            e.LeftButton == System.Windows.Input.MouseButtonState.Pressed &&
+            container.IsMouseCaptured)
         {
             Dispatcher.InvokeAsync(() => DragDrop.DoDragDrop(container, container, DragDropEffects.Move));
         }
     }
 
-    private void Folder_MouseMove(object? sender, System.Windows.Input.MouseEventArgs? e)
+    private void LayerControl_MouseUp(object sender, MouseButtonEventArgs e)
+    {
+        if (sender is not LayerControl layerControl)
+            return;
+        layerControl.ReleaseMouseCapture();
+    }
+    
+    private void FolderControl_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
+    {
+        FolderControl control = (FolderControl)sender;
+        if (e.ChangedButton == MouseButton.Left)
+        {
+            HandleMouseDown(control.Folder);
+            control.CaptureMouse();
+        }
+        else
+        {
+            if (control.Folder is not null && control.Folder.Selection == StructureMemberSelectionType.None)
+            {
+                control.Folder.Document.Operations.SetSelectedMember(control.Folder.GuidValue);
+                control.Folder.Document.Operations.ClearSoftSelectedMembers();
+            }
+        }
+    }
+    
+    private void FolderControl_MouseMove(object? sender, System.Windows.Input.MouseEventArgs? e)
     {
         if (e is null)
             return;
-        if (sender is FolderControl container && e.LeftButton == System.Windows.Input.MouseButtonState.Pressed
-                                                  /*&& !container.GroupData.IsRenaming*/)
+        if (sender is FolderControl container && 
+            e.LeftButton == System.Windows.Input.MouseButtonState.Pressed &&
+            container.IsMouseCaptured)
         {
             Dispatcher.InvokeAsync(() => DragDrop.DoDragDrop(container, container, DragDropEffects.Move));
         }
     }
+    
+    private void FolderControl_MouseUp(object sender, MouseButtonEventArgs e)
+    {
+        if (sender is not FolderControl folderControl)
+            return;
+        folderControl.ReleaseMouseCapture();
+    }
 
     private void NumberInput_LostFocus(object? sender, RoutedEventArgs? e)
     {
@@ -138,38 +191,4 @@ internal partial class LayersManager : UserControl
             ActiveDocument.Operations.ClearSoftSelectedMembers();
         }
     }
-
-    private void FolderControl_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
-    {
-        FolderControl control = (FolderControl)sender;
-        if (e.ChangedButton == MouseButton.Left)
-        {
-            HandleMouseDown(control.Folder);
-        }
-        else
-        {
-            if (control.Folder is not null && control.Folder.Selection == StructureMemberSelectionType.None)
-            {
-                control.Folder.Document.Operations.SetSelectedMember(control.Folder.GuidValue);
-                control.Folder.Document.Operations.ClearSoftSelectedMembers();
-            }
-        }
-    }
-
-    private void LayerControl_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
-    {
-        LayerControl? control = (LayerControl)sender;
-        if (e.ChangedButton == MouseButton.Left)
-        {
-            HandleMouseDown(control.Layer);
-        }
-        else
-        {
-            if (control.Layer is not null && control.Layer.Selection == StructureMemberSelectionType.None)
-            {
-                control.Layer.Document.Operations.SetSelectedMember(control.Layer.GuidValue);
-                control.Layer.Document.Operations.ClearSoftSelectedMembers();
-            }
-        }
-    }
 }

+ 6 - 2
src/PixiEditor/Views/UserControls/Palettes/PaletteColor.xaml

@@ -6,8 +6,12 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
              xmlns:converters="clr-namespace:PixiEditor.Helpers.Converters"
              xmlns:palettes="clr-namespace:PixiEditor.Views.UserControls.Palettes"
-             mc:Ignorable="d" MouseDown="PaletteColor_OnMouseDown"
-             d:DesignHeight="45" d:DesignWidth="45" Name="uc" MouseMove="PaletteColor_OnMouseMove">
+             mc:Ignorable="d" 
+             d:DesignHeight="45" d:DesignWidth="45" 
+             x:Name="uc" 
+             MouseDown="PaletteColor_OnMouseDown"
+             MouseMove="PaletteColor_OnMouseMove"
+             MouseUp="PaletteColor_OnMouseUp">
     <UserControl.Resources>
         <converters:BackendColorToMediaColorConverter x:Key="BackendColorToMediaColorConverter" />
         <BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" />

+ 7 - 1
src/PixiEditor/Views/UserControls/Palettes/PaletteColor.xaml.cs

@@ -48,7 +48,7 @@ internal partial class PaletteColor : UserControl
     private void PaletteColor_OnMouseMove(object sender, MouseEventArgs e)
     {
         PaletteColor color = sender as PaletteColor;
-        if (color != null && e.LeftButton == MouseButtonState.Pressed)
+        if (color != null && e.LeftButton == MouseButtonState.Pressed && IsMouseCaptured)
         {
             var movedDistance = (clickPoint - e.GetPosition(this)).Length;
             if (movedDistance > 10)
@@ -66,6 +66,12 @@ internal partial class PaletteColor : UserControl
         if (e.ChangedButton == MouseButton.Left)
         {
             clickPoint = e.GetPosition(this);
+            CaptureMouse();
         }
     }
+
+    private void PaletteColor_OnMouseUp(object sender, MouseButtonEventArgs e)
+    {
+        ReleaseMouseCapture();
+    }
 }