Browse Source

Update button click handling based on AutoFit setting and refactor cursor repositioning logic

Ruben 3 months ago
parent
commit
1898eabac1

+ 30 - 26
src/PicView.Avalonia.MacOS/Views/MacOSTitlebar.axaml.cs

@@ -5,6 +5,7 @@ using Avalonia.Media;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.ViewModels;
 using PicView.Avalonia.WindowBehavior;
+using PicView.Core.DebugTools;
 using R3;
 
 namespace PicView.Avalonia.MacOS.Views;
@@ -19,20 +20,21 @@ public partial class MacOSTitlebar : UserControl
             if (Settings.Theme.GlassTheme)
             {
                 TopWindowBorder.Background = Brushes.Transparent;
-            
+
                 EditableTitlebar.Background = Brushes.Transparent;
                 EditableTitlebar.BorderThickness = new Thickness(0);
-                
+
                 FlipButton.Background = Brushes.Transparent;
                 FlipButton.BorderThickness = new Thickness(0);
-                
+
                 GalleryButton.Background = Brushes.Transparent;
                 GalleryButton.BorderThickness = new Thickness(0);
-                
+
                 RotateRightButton.Background = Brushes.Transparent;
                 RotateRightButton.BorderThickness = new Thickness(0);
-                
-                if (!Application.Current.TryGetResource("SecondaryTextColor", Application.Current.RequestedThemeVariant, out var color))
+
+                if (!Application.Current.TryGetResource("SecondaryTextColor", Application.Current.RequestedThemeVariant,
+                        out var color))
                 {
                     return;
                 }
@@ -49,36 +51,35 @@ public partial class MacOSTitlebar : UserControl
                     GalleryButton.Foreground = new SolidColorBrush(secondaryTextColor);
                     RotateRightButton.Foreground = new SolidColorBrush(secondaryTextColor);
                 }
-                #if DEBUG
+#if DEBUG
                 catch (Exception e)
                 {
-                    Console.WriteLine(e);
-                    throw;
+                    DebugHelper.LogDebug(nameof(MacOSTitlebar), nameof(LoadedEvent), e);
                 }
-                #else
+#else
                 catch (Exception) { }
-                #endif
+#endif
             }
-            
+
             Observable.EveryValueChanged(this, x => x.RotationContextMenu.IsOpen, UIHelper.GetFrameProvider)
-                .Subscribe(_ =>
-                {
-                    UpdateRotation();
-                });
+                .Subscribe(_ => { UpdateRotation(); });
 
-            RotateRightButton.PointerPressed += (_, e) =>
+            RotateRightButton.PointerPressed += (_, e) => { OpenContextMenu(e); };
+            RotateRightButton.Click += (_, e) =>
             {
-                OpenContextMenu(e);
-            };
-            FlipButton.PointerPressed += (_, e) =>
-            {
-                OpenContextMenu(e);
+                if (DataContext is not MainViewModel vm)
+                {
+                    return;
+                }
+
+                vm.MainWindow.IsTopToolbarRotationClicked = Settings.WindowProperties.AutoFit;
             };
+            FlipButton.PointerPressed += (_, e) => { OpenContextMenu(e); };
         };
         PointerPressed += (_, e) => MoveWindow(e);
     }
-    
-    
+
+
     private void OpenContextMenu(PointerPressedEventArgs e)
     {
         if (!e.GetCurrentPoint(this).Properties.IsRightButtonPressed)
@@ -96,6 +97,7 @@ public partial class MacOSTitlebar : UserControl
         {
             return;
         }
+
         Rotation0Item.IsChecked = false;
         Rotation90Item.IsChecked = false;
         Rotation180Item.IsChecked = false;
@@ -114,13 +116,15 @@ public partial class MacOSTitlebar : UserControl
             case 270:
                 Rotation270Item.IsChecked = true;
                 break;
-                    
         }
     }
 
     private void MoveWindow(PointerPressedEventArgs e)
     {
-        if (VisualRoot is null || DataContext is not MainViewModel vm) { return; }
+        if (VisualRoot is null || DataContext is not MainViewModel vm)
+        {
+            return;
+        }
 
         var hostWindow = (Window)VisualRoot;
         WindowFunctions.WindowDragAndDoubleClickBehavior(hostWindow, e, vm.PlatformWindowService);

+ 4 - 1
src/PicView.Avalonia.Win32/Views/WinTitleBar.axaml.cs

@@ -97,7 +97,10 @@ public partial class WinTitleBar : UserControl
                 .Subscribe(_ => { UpdateRotation(); });
 
             RotateRightButton.PointerPressed += (_, e) => { OpenContextMenu(e); };
-            RotateRightButton.Click += (_, e) => { vm.MainWindow.IsTopToolbarRotationClicked = true; };
+            RotateRightButton.Click += (_, e) =>
+            {
+                vm.MainWindow.IsTopToolbarRotationClicked = Settings.WindowProperties.AutoFit;
+            };
             FlipButton.PointerPressed += (_, e) => { OpenContextMenu(e); };
         };
     }

+ 3 - 2
src/PicView.Avalonia/Views/UC/Menus/ImageMenu.axaml.cs

@@ -42,8 +42,9 @@ public partial class ImageMenu : AnimatedMenu
                 return;
             }
 
-            RotateLeftButton.Click += (_, _) => vm.MainWindow.IsRotateLeftClicked = true;
-            RotateRightButton.Click += (_, _) => vm.MainWindow.IsRotateRightClicked = true;
+            RotateLeftButton.Click += (_, _) => vm.MainWindow.IsRotateLeftClicked = Settings.WindowProperties.AutoFit;
+            RotateRightButton.Click += (_, _) => vm.MainWindow.IsRotateRightClicked = Settings.WindowProperties.AutoFit;
+
 
             if (Settings.Theme.GlassTheme)
             {

+ 61 - 78
src/PicView.Avalonia/WindowBehavior/WindowResizing.cs

@@ -21,104 +21,87 @@ public static class WindowResizing
 
     public static void HandleWindowResize(Window window, AvaloniaPropertyChangedEventArgs<Size> size)
     {
-        if (!Settings.WindowProperties.AutoFit)
+        if (!Settings.WindowProperties.AutoFit ||
+            !size.OldValue.HasValue || !size.NewValue.HasValue ||
+            size.Sender != window || size.OldValue.Value.Width == 0 || size.OldValue.Value.Height == 0 ||
+            size.NewValue.Value.Width == 0 || size.NewValue.Value.Height == 0 ||
+            window.DataContext is not MainViewModel vm)
         {
             return;
         }
 
-        if (!size.OldValue.HasValue || !size.NewValue.HasValue)
-        {
-            return;
-        }
 
-        if (size.OldValue.Value.Width == 0 || size.OldValue.Value.Height == 0 ||
-            size.NewValue.Value.Width == 0 || size.NewValue.Value.Height == 0)
-        {
-            return;
-        }
+        var oldSize = size.OldValue.Value;
+        var newSize = size.NewValue.Value;
 
-        if (size.Sender != window)
-        {
-            return;
-        }
-
-        var x = (size.OldValue.Value.Width - size.NewValue.Value.Width) / 2;
-        var y = (size.OldValue.Value.Height - size.NewValue.Value.Height) / 2;
+        var x = (oldSize.Width - newSize.Width) / 2;
+        var y = (oldSize.Height - newSize.Height) / 2;
 
         window.Position = new PixelPoint(window.Position.X + (int)x, window.Position.Y + (int)y);
-        if (window.DataContext is not MainViewModel vm)
-        {
-            return;
-        }
-
-        if (vm.MainWindow.IsNavigationButtonLeftClicked)
-        {
-            var leftButton = UIHelper.GetBottomBar.GetControl<Button>("PreviousButton");
-            var point = new Point(50, 10);
-            var p = leftButton.PointToScreen(point);
-            vm.PlatformService?.SetCursorPos(p.X, p.Y);
-            vm.MainWindow.IsNavigationButtonLeftClicked = false;
-        }
-
-        if (vm.MainWindow.IsNavigationButtonRightClicked)
-        {
-            var rightButton = UIHelper.GetBottomBar.GetControl<Button>("NextButton");
-            var point = new Point(50, 10);
-            var p = rightButton.PointToScreen(point);
-            vm.PlatformService?.SetCursorPos(p.X, p.Y);
-            vm.MainWindow.IsNavigationButtonRightClicked = false;
-        }
 
-        if (vm.MainWindow.IsClickArrowLeftClicked)
-        {
-            var clickArrowLeft = UIHelper.GetMainView.GetControl<UserControl>("ClickArrowLeft");
-            var point = new Point(15, 95);
-            var p = clickArrowLeft.PointToScreen(point);
-            vm.PlatformService?.SetCursorPos(p.X, p.Y);
-            vm.MainWindow.IsClickArrowLeftClicked = false;
-        }
-
-        if (vm.MainWindow.IsClickArrowRightClicked)
-        {
-            var clickArrowRight = UIHelper.GetMainView.GetControl<UserControl>("ClickArrowRight");
-            var point = new Point(65, 95);
-            var p = clickArrowRight.PointToScreen(point);
-            vm.PlatformService?.SetCursorPos(p.X, p.Y);
-            vm.MainWindow.IsClickArrowRightClicked = false;
-        }
+        RepositionCursorIfTriggered(vm, vm.MainWindow.IsNavigationButtonLeftClicked,
+            clicked => vm.MainWindow.IsNavigationButtonLeftClicked = clicked,
+            () => UIHelper.GetBottomBar.GetControl<Button>("PreviousButton"),
+            new Point(50, 10));
+
+        RepositionCursorIfTriggered(vm, vm.MainWindow.IsNavigationButtonRightClicked,
+            clicked => vm.MainWindow.IsNavigationButtonRightClicked = clicked,
+            () => UIHelper.GetBottomBar.GetControl<Button>("NextButton"),
+            new Point(50, 10));
+
+        RepositionCursorIfTriggered(vm, vm.MainWindow.IsClickArrowLeftClicked,
+            clicked => vm.MainWindow.IsClickArrowLeftClicked = clicked,
+            () => UIHelper.GetMainView.GetControl<UserControl>("ClickArrowLeft"),
+            new Point(15, 95));
+
+        RepositionCursorIfTriggered(vm, vm.MainWindow.IsClickArrowRightClicked,
+            clicked => vm.MainWindow.IsClickArrowRightClicked = clicked,
+            () => UIHelper.GetMainView.GetControl<UserControl>("ClickArrowRight"),
+            new Point(65, 95));
+
+        RepositionCursorIfTriggered(vm, vm.MainWindow.IsRotateLeftClicked,
+            clicked => vm.MainWindow.IsRotateLeftClicked = clicked,
+            () => UIHelper.GetMainView.MainGrid.Children.OfType<ImageMenu>().FirstOrDefault()
+                ?.GetControl<IconButton>("RotateLeftButton"),
+            new Point(20, 15));
+
+        RepositionCursorIfTriggered(vm, vm.MainWindow.IsRotateRightClicked,
+            clicked => vm.MainWindow.IsRotateRightClicked = clicked,
+            () => UIHelper.GetMainView.MainGrid.Children.OfType<ImageMenu>().FirstOrDefault()
+                ?.GetControl<IconButton>("RotateRightButton"),
+            new Point(20, 15));
+
+        RepositionCursorIfTriggered(vm, vm.MainWindow.IsTopToolbarRotationClicked,
+            clicked => vm.MainWindow.IsTopToolbarRotationClicked = clicked,
+            () => UIHelper.GetTitlebar.GetControl<IconButton>("RotateRightButton"),
+            new Point(11, 7));
+    }
 
-        if (vm.MainWindow.IsRotateLeftClicked)
+    private static void RepositionCursorIfTriggered(
+        MainViewModel vm,
+        bool isTriggered,
+        Action<bool> setTrigger,
+        Func<Control?> controlProvider,
+        Point offset)
+    {
+        if (!isTriggered)
         {
-            var imageMenu = UIHelper.GetMainView.MainGrid.Children.OfType<ImageMenu>().FirstOrDefault();
-            var leftRotationBtn = imageMenu.GetControl<IconButton>("RotateLeftButton");
-            var point = new Point(20, 15);
-            var p = leftRotationBtn.PointToScreen(point);
-            vm.PlatformService?.SetCursorPos(p.X, p.Y);
-            vm.MainWindow.IsRotateLeftClicked = false;
+            return;
         }
 
-        if (vm.MainWindow.IsRotateRightClicked)
+        var control = controlProvider();
+        if (control is not null)
         {
-            var imageMenu = UIHelper.GetMainView.MainGrid.Children.OfType<ImageMenu>().FirstOrDefault();
-            var rightRotationBtn = imageMenu.GetControl<IconButton>("RotateRightButton");
-            var point = new Point(20, 15);
-            var p = rightRotationBtn.PointToScreen(point);
-            vm.PlatformService?.SetCursorPos(p.X, p.Y);
-            vm.MainWindow.IsRotateRightClicked = false;
+            var screenPoint = control.PointToScreen(offset);
+            vm.PlatformService?.SetCursorPos(screenPoint.X, screenPoint.Y);
         }
 
-        if (vm.MainWindow.IsTopToolbarRotationClicked)
-        {
-            var rotationRightBtn = UIHelper.GetTitlebar.GetControl<IconButton>("RotateRightButton");
-            var point = new Point(11, 7);
-            var p = rotationRightBtn.PointToScreen(point);
-            vm.PlatformService?.SetCursorPos(p.X, p.Y);
-            vm.MainWindow.IsTopToolbarRotationClicked = false;
-        }
+        setTrigger(false);
     }
 
     #endregion
 
+
     #region Set Window Size
 
     public static void SetSize(MainViewModel vm)