浏览代码

Save Batch Resize Window position #204

Make `ShowBatchResizeWindow` asynchronous and integrate `BatchResizeWindowConfig`
Ruben 4 月之前
父节点
当前提交
bd7d2c9b57

+ 2 - 2
src/PicView.Avalonia.MacOS/App.axaml.cs

@@ -259,8 +259,8 @@ public class App : Application, IPlatformSpecificService, IPlatformWindowService
     public void ShowSingleImageResizeWindow() =>
     public void ShowSingleImageResizeWindow() =>
         _windowInitializer?.ShowSingleImageResizeWindow(_vm);
         _windowInitializer?.ShowSingleImageResizeWindow(_vm);
 
 
-    public void ShowBatchResizeWindow() =>
-        _windowInitializer?.ShowBatchResizeWindow(_vm);
+    public async Task ShowBatchResizeWindow() =>
+        await _windowInitializer?.ShowBatchResizeWindow(_vm);
 
 
     public void ShowEffectsWindow() =>
     public void ShowEffectsWindow() =>
         _windowInitializer?.ShowEffectsWindow(_vm);
         _windowInitializer?.ShowEffectsWindow(_vm);

+ 16 - 1
src/PicView.Avalonia.MacOS/Views/BatchResizeWindow.axaml.cs

@@ -1,7 +1,9 @@
+using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls;
 using Avalonia.Input;
 using Avalonia.Input;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.WindowBehavior;
 using PicView.Avalonia.WindowBehavior;
+using PicView.Core.Config;
 using PicView.Core.Localization;
 using PicView.Core.Localization;
 using R3;
 using R3;
 
 
@@ -10,8 +12,10 @@ namespace PicView.Avalonia.MacOS.Views;
 public partial class BatchResizeWindow : Window, IDisposable
 public partial class BatchResizeWindow : Window, IDisposable
 {
 {
     private readonly CompositeDisposable _disposables = new();
     private readonly CompositeDisposable _disposables = new();
-    public BatchResizeWindow()
+    private readonly BatchResizeWindowConfig _config;
+    public BatchResizeWindow(BatchResizeWindowConfig config)
     {
     {
+        _config = config;
         InitializeComponent();
         InitializeComponent();
         GenericWindowHelper.GenericWindowInitialize(this, TranslationManager.Translation.BatchResize + " - PicView");
         GenericWindowHelper.GenericWindowInitialize(this, TranslationManager.Translation.BatchResize + " - PicView");
         Loaded += delegate
         Loaded += delegate
@@ -22,10 +26,21 @@ public partial class BatchResizeWindow : Window, IDisposable
                 {
                 {
                     Height = 500;
                     Height = 500;
                     WindowResizing.HandleWindowResize(this, size);
                     WindowResizing.HandleWindowResize(this, size);
+                    UpdateWindowSize(size);
                 })
                 })
                 .AddTo(_disposables);
                 .AddTo(_disposables);
+            PositionChanged += (_, _) => UpdateWindowPosition();
         };
         };
     }
     }
+    
+    private void UpdateWindowPosition()
+    {
+        _config.WindowProperties.Left = Position.X;
+        _config.WindowProperties.Top = Position.Y;
+    }
+
+    private void UpdateWindowSize(AvaloniaPropertyChangedEventArgs<Size> size)
+        => WindowFunctions.SetWindowSize(this, size, _config.WindowProperties);
 
 
     private void MoveWindow(object? sender, PointerPressedEventArgs e)
     private void MoveWindow(object? sender, PointerPressedEventArgs e)
     {
     {

+ 40 - 29
src/PicView.Avalonia.MacOS/WindowImpl/WindowInitializer.cs

@@ -44,7 +44,6 @@ public class WindowInitializer : IPlatformSpecificUpdate
 
 
         void Set()
         void Set()
         {
         {
-
             if (_aboutWindow is null)
             if (_aboutWindow is null)
             {
             {
                 _aboutWindow = new AboutWindow
                 _aboutWindow = new AboutWindow
@@ -75,7 +74,7 @@ public class WindowInitializer : IPlatformSpecificUpdate
     {
     {
         if (_imageInfoWindow is null)
         if (_imageInfoWindow is null)
         {
         {
-            if (vm.Window.ImageInfoWindowConfig?.WindowProperties is null )
+            if (vm.Window.ImageInfoWindowConfig?.WindowProperties is null)
             {
             {
                 vm.Window.ImageInfoWindowConfig = new ImageInfoWindowConfig();
                 vm.Window.ImageInfoWindowConfig = new ImageInfoWindowConfig();
                 await vm.Window.ImageInfoWindowConfig.LoadAsync();
                 await vm.Window.ImageInfoWindowConfig.LoadAsync();
@@ -87,9 +86,10 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 vm.InfoWindow = new ImageInfoWindowViewModel();
                 vm.InfoWindow = new ImageInfoWindowViewModel();
                 _imageInfoWindow = new ImageInfoWindow(vm.Window.ImageInfoWindowConfig)
                 _imageInfoWindow = new ImageInfoWindow(vm.Window.ImageInfoWindowConfig)
                 {
                 {
-                    DataContext = vm,
+                    DataContext = vm
                 };
                 };
-                WindowFunctions.InitializeWindowSizeAndPosition(_imageInfoWindow, vm.Window.ImageInfoWindowConfig.WindowProperties);
+                WindowFunctions.InitializeWindowSizeAndPosition(_imageInfoWindow,
+                    vm.Window.ImageInfoWindowConfig.WindowProperties);
                 _imageInfoWindow.Show();
                 _imageInfoWindow.Show();
                 _imageInfoWindow.Closing += (_, _) =>
                 _imageInfoWindow.Closing += (_, _) =>
                 {
                 {
@@ -111,10 +111,11 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 }
                 else
                 else
                 {
                 {
-                   _imageInfoWindow.Activate();
+                    _imageInfoWindow.Activate();
                 }
                 }
             });
             });
         }
         }
+
         await FunctionsMapper.CloseMenus();
         await FunctionsMapper.CloseMenus();
     }
     }
 
 
@@ -161,11 +162,12 @@ public class WindowInitializer : IPlatformSpecificUpdate
 
 
     public async Task ShowSettingsWindow(MainViewModel vm)
     public async Task ShowSettingsWindow(MainViewModel vm)
     {
     {
-        if (vm.Window.SettingsWindowConfig?.WindowProperties is null )
+        if (vm.Window.SettingsWindowConfig?.WindowProperties is null)
         {
         {
             vm.Window.SettingsWindowConfig = new SettingsWindowConfig();
             vm.Window.SettingsWindowConfig = new SettingsWindowConfig();
             await vm.Window.SettingsWindowConfig.LoadAsync();
             await vm.Window.SettingsWindowConfig.LoadAsync();
         }
         }
+
         if (_settingsWindow is null)
         if (_settingsWindow is null)
         {
         {
             vm.AssociationsViewModel ??= new FileAssociationsViewModel();
             vm.AssociationsViewModel ??= new FileAssociationsViewModel();
@@ -177,10 +179,12 @@ public class WindowInitializer : IPlatformSpecificUpdate
                     DataContext = vm
                     DataContext = vm
                 };
                 };
 
 
-                WindowFunctions.InitializeWindowPosition(_settingsWindow, vm.Window.SettingsWindowConfig.WindowProperties);
+                WindowFunctions.InitializeWindowPosition(_settingsWindow,
+                    vm.Window.SettingsWindowConfig.WindowProperties);
                 _settingsWindow.Show();
                 _settingsWindow.Show();
                 _settingsWindow.Closing += (_, _) =>
                 _settingsWindow.Closing += (_, _) =>
-                    _settingsWindow = null;;
+                    _settingsWindow = null;
+                ;
             });
             });
         }
         }
         else
         else
@@ -197,6 +201,7 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 }
             });
             });
         }
         }
+
         await FunctionsMapper.CloseMenus();
         await FunctionsMapper.CloseMenus();
     }
     }
 
 
@@ -241,32 +246,30 @@ public class WindowInitializer : IPlatformSpecificUpdate
         }
         }
     }
     }
 
 
-    public void ShowBatchResizeWindow(MainViewModel vm)
+    public async Task ShowBatchResizeWindow(MainViewModel vm)
     {
     {
-        if (Dispatcher.UIThread.CheckAccess())
-        {
-            Set();
-        }
-        else
+        if (_batchResizeWindow is null)
         {
         {
-            Dispatcher.UIThread.InvokeAsync(Set);
-        }
-
-        return;
+            if (vm.Window.BatchResizeWindowConfig?.WindowProperties is null)
+            {
+                vm.Window.BatchResizeWindowConfig = new BatchResizeWindowConfig();
+                await vm.Window.BatchResizeWindowConfig.LoadAsync();
+            }
 
 
-        void Set()
-        {
-            if (_batchResizeWindow is null)
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
             {
-                _batchResizeWindow = new BatchResizeWindow
+                _batchResizeWindow = new BatchResizeWindow(vm.Window.BatchResizeWindowConfig)
                 {
                 {
                     DataContext = vm,
                     DataContext = vm,
-                    WindowStartupLocation = WindowStartupLocation.CenterOwner
+                    WindowStartupLocation = WindowStartupLocation.CenterScreen
                 };
                 };
-                _batchResizeWindow.Show();
+                Show();
                 _batchResizeWindow.Closing += (_, _) => _batchResizeWindow = null;
                 _batchResizeWindow.Closing += (_, _) => _batchResizeWindow = null;
-            }
-            else
+            });
+        }
+        else
+        {
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
             {
                 if (_batchResizeWindow.WindowState == WindowState.Minimized)
                 if (_batchResizeWindow.WindowState == WindowState.Minimized)
                 {
                 {
@@ -274,11 +277,19 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 }
                 else
                 else
                 {
                 {
-                    _batchResizeWindow.Activate();
+                    Show();
                 }
                 }
-            }
+            });
+        }
 
 
-            _ = FunctionsMapper.CloseMenus();
+        await FunctionsMapper.CloseMenus();
+        
+        return;
+
+        void Show()
+        {
+            WindowFunctions.InitializeWindowSizeAndPosition(_batchResizeWindow, vm.Window.BatchResizeWindowConfig.WindowProperties);
+            _batchResizeWindow.Show();
         }
         }
     }
     }
 
 

+ 2 - 2
src/PicView.Avalonia.Win32/App.axaml.cs

@@ -250,8 +250,8 @@ public class App : Application, IPlatformSpecificService, IPlatformWindowService
     public void ShowSingleImageResizeWindow() =>
     public void ShowSingleImageResizeWindow() =>
         _windowInitializer?.ShowSingleImageResizeWindow(_vm);
         _windowInitializer?.ShowSingleImageResizeWindow(_vm);
 
 
-    public void ShowBatchResizeWindow() =>
-        _windowInitializer?.ShowBatchResizeWindow(_vm);
+    public async Task ShowBatchResizeWindow() =>
+       await _windowInitializer?.ShowBatchResizeWindow(_vm);
 
 
     public void ShowEffectsWindow() =>
     public void ShowEffectsWindow() =>
         _windowInitializer?.ShowEffectsWindow(_vm);
         _windowInitializer?.ShowEffectsWindow(_vm);

+ 19 - 2
src/PicView.Avalonia.Win32/Views/BatchResizeResizeWindow.axaml.cs

@@ -5,6 +5,7 @@ using Avalonia.Interactivity;
 using Avalonia.Media;
 using Avalonia.Media;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.WindowBehavior;
 using PicView.Avalonia.WindowBehavior;
+using PicView.Core.Config;
 using PicView.Core.Localization;
 using PicView.Core.Localization;
 using R3;
 using R3;
 
 
@@ -13,8 +14,10 @@ namespace PicView.Avalonia.Win32.Views;
 public partial class BatchResizeWindow : Window, IDisposable
 public partial class BatchResizeWindow : Window, IDisposable
 {
 {
     private readonly CompositeDisposable _disposables = new();
     private readonly CompositeDisposable _disposables = new();
-    public BatchResizeWindow()
+    private readonly BatchResizeWindowConfig _config;
+    public BatchResizeWindow(BatchResizeWindowConfig config)
     {
     {
+        _config = config;
         InitializeComponent();
         InitializeComponent();
         StartUp();
         StartUp();
     }
     }
@@ -67,8 +70,13 @@ public partial class BatchResizeWindow : Window, IDisposable
         {
         {
             ClientSizeProperty.Changed.ToObservable()
             ClientSizeProperty.Changed.ToObservable()
                 .ObserveOn(UIHelper.GetFrameProvider)
                 .ObserveOn(UIHelper.GetFrameProvider)
-                .Subscribe(size => { WindowResizing.HandleWindowResize(this, size); })
+                .Subscribe(size =>
+                {
+                    WindowResizing.HandleWindowResize(this, size);
+                    UpdateWindowSize(size);
+                })
                 .AddTo(_disposables);
                 .AddTo(_disposables);
+            PositionChanged += (_, _) => UpdateWindowPosition();
         };
         };
     }
     }
 
 
@@ -86,6 +94,15 @@ public partial class BatchResizeWindow : Window, IDisposable
     private void Close(object? sender, RoutedEventArgs e) => Close();
     private void Close(object? sender, RoutedEventArgs e) => Close();
 
 
     private void Minimize(object? sender, RoutedEventArgs e) => WindowState = WindowState.Minimized;
     private void Minimize(object? sender, RoutedEventArgs e) => WindowState = WindowState.Minimized;
+    
+    private void UpdateWindowSize(AvaloniaPropertyChangedEventArgs<Size> size)
+        => WindowFunctions.SetWindowSize(this, size, _config.WindowProperties);
+    
+    private void UpdateWindowPosition()
+    {
+        _config.WindowProperties.Left = Position.X;
+        _config.WindowProperties.Top = Position.Y;
+    }
 
 
     public void Dispose()
     public void Dispose()
     {
     {

+ 43 - 31
src/PicView.Avalonia.Win32/WindowImpl/WindowInitializer.cs

@@ -28,7 +28,7 @@ public class WindowInitializer : IPlatformSpecificUpdate
     {
     {
         await WinUpdateHelper.HandleWindowsUpdate(updateInfo, tempPath);
         await WinUpdateHelper.HandleWindowsUpdate(updateInfo, tempPath);
     }
     }
-    
+
     public void ShowAboutWindow(MainViewModel vm)
     public void ShowAboutWindow(MainViewModel vm)
     {
     {
         if (Dispatcher.UIThread.CheckAccess())
         if (Dispatcher.UIThread.CheckAccess())
@@ -84,7 +84,7 @@ public class WindowInitializer : IPlatformSpecificUpdate
 
 
         if (_imageInfoWindow is null)
         if (_imageInfoWindow is null)
         {
         {
-            if (vm.Window.ImageInfoWindowConfig?.WindowProperties is null )
+            if (vm.Window.ImageInfoWindowConfig?.WindowProperties is null)
             {
             {
                 vm.Window.ImageInfoWindowConfig = new ImageInfoWindowConfig();
                 vm.Window.ImageInfoWindowConfig = new ImageInfoWindowConfig();
                 await vm.Window.ImageInfoWindowConfig.LoadAsync();
                 await vm.Window.ImageInfoWindowConfig.LoadAsync();
@@ -96,7 +96,7 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 vm.InfoWindow = new ImageInfoWindowViewModel();
                 vm.InfoWindow = new ImageInfoWindowViewModel();
                 _imageInfoWindow = new ImageInfoWindow(vm.Window.ImageInfoWindowConfig)
                 _imageInfoWindow = new ImageInfoWindow(vm.Window.ImageInfoWindowConfig)
                 {
                 {
-                    DataContext = vm,
+                    DataContext = vm
                 };
                 };
                 Show();
                 Show();
                 _imageInfoWindow.Closing += (_, _) =>
                 _imageInfoWindow.Closing += (_, _) =>
@@ -123,13 +123,15 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 }
             });
             });
         }
         }
+
         await FunctionsMapper.CloseMenus();
         await FunctionsMapper.CloseMenus();
-        
+
         return;
         return;
 
 
         void Show()
         void Show()
         {
         {
-            WindowFunctions.InitializeWindowSizeAndPosition(_imageInfoWindow, vm.Window.ImageInfoWindowConfig.WindowProperties);
+            WindowFunctions.InitializeWindowSizeAndPosition(_imageInfoWindow,
+                vm.Window.ImageInfoWindowConfig.WindowProperties);
             _imageInfoWindow.Show(desktop.MainWindow);
             _imageInfoWindow.Show(desktop.MainWindow);
         }
         }
     }
     }
@@ -186,12 +188,13 @@ public class WindowInitializer : IPlatformSpecificUpdate
         {
         {
             return;
             return;
         }
         }
-        
-        if (vm.Window.SettingsWindowConfig?.WindowProperties is null )
+
+        if (vm.Window.SettingsWindowConfig?.WindowProperties is null)
         {
         {
             vm.Window.SettingsWindowConfig = new SettingsWindowConfig();
             vm.Window.SettingsWindowConfig = new SettingsWindowConfig();
             await vm.Window.SettingsWindowConfig.LoadAsync();
             await vm.Window.SettingsWindowConfig.LoadAsync();
         }
         }
+
         if (_settingsWindow is null)
         if (_settingsWindow is null)
         {
         {
             vm.AssociationsViewModel ??= new FileAssociationsViewModel();
             vm.AssociationsViewModel ??= new FileAssociationsViewModel();
@@ -222,13 +225,15 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 }
             });
             });
         }
         }
+
         await FunctionsMapper.CloseMenus();
         await FunctionsMapper.CloseMenus();
-        
+
         return;
         return;
-        
+
         void Show()
         void Show()
         {
         {
-            WindowFunctions.InitializeWindowSizeAndPosition(_settingsWindow, vm.Window.SettingsWindowConfig.WindowProperties);
+            WindowFunctions.InitializeWindowSizeAndPosition(_settingsWindow,
+                vm.Window.SettingsWindowConfig.WindowProperties);
             _settingsWindow.Show(desktop.MainWindow);
             _settingsWindow.Show(desktop.MainWindow);
         }
         }
     }
     }
@@ -279,37 +284,35 @@ public class WindowInitializer : IPlatformSpecificUpdate
         }
         }
     }
     }
 
 
-    public void ShowBatchResizeWindow(MainViewModel vm)
+    public async Task ShowBatchResizeWindow(MainViewModel vm)
     {
     {
-        if (Dispatcher.UIThread.CheckAccess())
-        {
-            Set();
-        }
-        else
+        if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
         {
         {
-            Dispatcher.UIThread.InvokeAsync(Set);
+            return;
         }
         }
 
 
-        return;
-
-        void Set()
+        if (_batchResizeWindow is null)
         {
         {
-            if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
+            if (vm.Window.BatchResizeWindowConfig?.WindowProperties is null)
             {
             {
-                return;
+                vm.Window.BatchResizeWindowConfig = new BatchResizeWindowConfig();
+                await vm.Window.BatchResizeWindowConfig.LoadAsync();
             }
             }
 
 
-            if (_batchResizeWindow is null)
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
             {
-                _batchResizeWindow = new BatchResizeWindow
+                _batchResizeWindow = new BatchResizeWindow(vm.Window.BatchResizeWindowConfig)
                 {
                 {
                     DataContext = vm,
                     DataContext = vm,
                     WindowStartupLocation = WindowStartupLocation.CenterOwner
                     WindowStartupLocation = WindowStartupLocation.CenterOwner
                 };
                 };
-                _batchResizeWindow.Show(desktop.MainWindow);
-                _batchResizeWindow.Closing += (s, e) => _batchResizeWindow = null;
-            }
-            else
+                Show();
+                _batchResizeWindow.Closing += (_, _) => _batchResizeWindow = null;
+            });
+        }
+        else
+        {
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
             {
                 if (_batchResizeWindow.WindowState == WindowState.Minimized)
                 if (_batchResizeWindow.WindowState == WindowState.Minimized)
                 {
                 {
@@ -317,11 +320,20 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 }
                 else
                 else
                 {
                 {
-                    _batchResizeWindow.Show();
+                    Show();
                 }
                 }
-            }
+            });
 
 
-            _ = FunctionsMapper.CloseMenus();
+        }
+
+        await FunctionsMapper.CloseMenus();
+        
+        return;
+
+        void Show()
+        {
+            WindowFunctions.InitializeWindowSizeAndPosition(_batchResizeWindow, vm.Window.BatchResizeWindowConfig.WindowProperties);
+            _batchResizeWindow.Show(desktop.MainWindow);
         }
         }
     }
     }
 
 

+ 1 - 1
src/PicView.Avalonia/Interfaces/IPlatformWindowService.cs

@@ -44,5 +44,5 @@ public interface IPlatformWindowService
     
     
     void ShowSingleImageResizeWindow();
     void ShowSingleImageResizeWindow();
     
     
-    void ShowBatchResizeWindow();
+    Task ShowBatchResizeWindow();
 }
 }

+ 2 - 0
src/PicView.Avalonia/ViewModels/WindowViewModel.cs

@@ -10,6 +10,8 @@ public class WindowViewModel
     public SettingsWindowConfig? SettingsWindowConfig { get; set; }
     public SettingsWindowConfig? SettingsWindowConfig { get; set; }
     public ImageInfoWindowConfig? ImageInfoWindowConfig { get; set; }
     public ImageInfoWindowConfig? ImageInfoWindowConfig { get; set; }
     
     
+    public BatchResizeWindowConfig? BatchResizeWindowConfig { get; set; }
+    
     public void NewWindow() => ProcessHelper.StartNewProcess();
     public void NewWindow() => ProcessHelper.StartNewProcess();
     
     
     public async Task ShowImageInfoWindow()
     public async Task ShowImageInfoWindow()

+ 3 - 0
src/PicView.Core/Config/BatchResizeWindowConfig.cs

@@ -54,6 +54,9 @@ public class BatchResizeWindowConfig() : ConfigFile("BatchResizeWindow.json")
         public double? Height { get; set; }
         public double? Height { get; set; }
         public bool Maximized { get; set; }
         public bool Maximized { get; set; }
         
         
+        
+        public bool IsQualityEnabled { get; set; }
+        
         public int ConvertToIndex { get; set; }
         public int ConvertToIndex { get; set; }
         public int CompressionIndex { get; set; }
         public int CompressionIndex { get; set; }
         public int ResizeIndex { get; set; }
         public int ResizeIndex { get; set; }