Преглед изворни кода

Introduce `IWindowProperties` and refactor window size/position logic

- Added `IWindowProperties` interface for unified window property management.
- Updated `ImageInfoWindowProperties` and `SettingsWindowProperties` to implement `IWindowProperties`.
- Refactored window size and position handling into `WindowFunctions.InitializeWindowSizeAndPosition` for code reuse.
- Adjusted `ShowSettingsWindow` implementation to support asynchronous initialization and improved state handling.
- Removed redundant `UpdateWindowPosition` event handlers from `ImageInfoWindow` for simplicity.
Ruben пре 4 месеци
родитељ
комит
76ca023466

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

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

+ 1 - 1
src/PicView.Avalonia.MacOS/Views/ImageInfoWindow.axaml

@@ -22,7 +22,7 @@
     <Design.DataContext>
         <vm:MainViewModel />
     </Design.DataContext>
-    <DockPanel PointerPressed="MoveWindow" PointerReleased="UpdateWindowPosition">
+    <DockPanel PointerPressed="MoveWindow">
         <DockPanel
             Background="{DynamicResource SecondaryBackgroundColor}"
             DockPanel.Dock="Top"

+ 2 - 1
src/PicView.Avalonia.MacOS/Views/ImageInfoWindow.axaml.cs

@@ -35,6 +35,7 @@ public partial class ImageInfoWindow : Window, IDisposable
                     _config.WindowProperties.Height = size.NewValue.Value.Height;
                 })
                 .AddTo(_disposables);
+            PositionChanged += (_, __) => UpdateWindowPosition();
         };
         
         Closing += async delegate
@@ -59,7 +60,7 @@ public partial class ImageInfoWindow : Window, IDisposable
         hostWindow?.BeginMoveDrag(e);
     }
     
-    private void UpdateWindowPosition(object? sender, PointerReleasedEventArgs e)
+    private void UpdateWindowPosition()
     {
         if (VisualRoot is null)
         {

+ 33 - 47
src/PicView.Avalonia.MacOS/WindowImpl/WindowInitializer.cs

@@ -24,7 +24,10 @@ public class WindowInitializer : IPlatformSpecificUpdate
     private ImageInfoWindowConfig? _imageInfoWindowConfig;
     
     private KeybindingsWindow? _keybindingsWindow;
+    
     private SettingsWindow? _settingsWindow;
+    private SettingsWindowConfig? _settingsWindowConfig;
+    
     private SingleImageResizeWindow? _singleImageResizeWindow;
 
     public async Task HandlePlatofrmUpdate(UpdateInfo updateInfo, string tempPath)
@@ -132,28 +135,7 @@ public class WindowInitializer : IPlatformSpecificUpdate
 
         void Show()
         {
-            if (_imageInfoWindowConfig.WindowProperties.Maximized)
-            {
-                _imageInfoWindow.WindowState = WindowState.Maximized;
-            }
-            else
-            {
-                var left = _imageInfoWindowConfig.WindowProperties.Left;
-                var top = _imageInfoWindowConfig.WindowProperties.Top;
-                if (left.HasValue && top.HasValue)
-                {
-                    _imageInfoWindow.WindowStartupLocation  = WindowStartupLocation.Manual;
-                    _imageInfoWindow.Position = new PixelPoint(left.Value, top.Value);
-                }
-                else
-                {
-                    _imageInfoWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
-                }
-                var width = _imageInfoWindowConfig.WindowProperties.Width ?? 850;
-                var height = _imageInfoWindowConfig.WindowProperties.Height ?? 495;
-                _imageInfoWindow.Width = width < _imageInfoWindow.MinWidth ? _imageInfoWindow.MinWidth : width;
-                _imageInfoWindow.Height = height < _imageInfoWindow.MinHeight ? _imageInfoWindow.MinHeight : height;
-            }
+            WindowFunctions.InitializeWindowSizeAndPosition(_imageInfoWindow, _imageInfoWindowConfig.WindowProperties);
             _imageInfoWindow.Show(desktop.MainWindow);
         }
     }
@@ -204,40 +186,37 @@ public class WindowInitializer : IPlatformSpecificUpdate
         }
     }
 
-    public void ShowSettingsWindow(MainViewModel vm)
+    public async Task ShowSettingsWindow(MainViewModel vm)
     {
-        if (Dispatcher.UIThread.CheckAccess())
+        if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
         {
-            Set();
+            return;
         }
-        else
+        
+        if (_settingsWindowConfig?.WindowProperties is null )
         {
-            Dispatcher.UIThread.InvokeAsync(Set);
+            _settingsWindowConfig = new SettingsWindowConfig();
+            await _settingsWindowConfig.LoadAsync();
         }
-
-        return;
-
-        void Set()
+        if (_settingsWindow is null)
         {
-            if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
-            {
-                return;
-            }
-
-            if (_settingsWindow is null)
+            vm.AssociationsViewModel ??= new FileAssociationsViewModel();
+            vm.SettingsViewModel ??= new SettingsViewModel();
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
-                vm.AssociationsViewModel ??= new FileAssociationsViewModel();
-                vm.SettingsViewModel ??= new SettingsViewModel();
                 _settingsWindow = new SettingsWindow
                 {
                     DataContext = vm,
                     WindowStartupLocation = WindowStartupLocation.CenterOwner
                 };
 
-                _settingsWindow.Show(desktop.MainWindow);
-                _settingsWindow.Closing += (s, e) => _settingsWindow = null;
-            }
-            else
+                Show();
+                _settingsWindow.Closing += (_, _) => _settingsWindow = null;
+            });
+        }
+        else
+        {
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
                 if (_settingsWindow.WindowState == WindowState.Minimized)
                 {
@@ -245,11 +224,18 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 else
                 {
-                    _settingsWindow.Show();
+                    Show();
                 }
-            }
-
-            _ = FunctionsMapper.CloseMenus();
+            });
+        }
+        await FunctionsMapper.CloseMenus();
+        
+        return;
+        
+        void Show()
+        {
+            WindowFunctions.InitializeWindowSizeAndPosition(_settingsWindow, _settingsWindowConfig.WindowProperties);
+            _settingsWindow.Show(desktop.MainWindow);
         }
     }
 

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

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

+ 0 - 1
src/PicView.Avalonia.Win32/Views/ImageInfoWindow.axaml

@@ -22,7 +22,6 @@
         BorderBrush="{DynamicResource WindowBorderColor}"
         BorderThickness="1"
         PointerPressed="MoveWindow"
-        PointerReleased="UpdateWindowPosition"
         x:Name="ParentBorder">
         <DockPanel Background="Transparent">
             <DockPanel

+ 2 - 3
src/PicView.Avalonia.Win32/Views/ImageInfoWindow.axaml.cs

@@ -111,6 +111,7 @@ public partial class ImageInfoWindow : Window, IDisposable
                     _config.WindowProperties.Height = size.NewValue.Value.Height;
                 })
                 .AddTo(_disposables);
+            PositionChanged += (_, _) => UpdateWindowPosition();
         };
         
         Closing += async delegate
@@ -135,7 +136,7 @@ public partial class ImageInfoWindow : Window, IDisposable
         hostWindow?.BeginMoveDrag(e);
     }
     
-    private void UpdateWindowPosition(object? sender, PointerReleasedEventArgs e)
+    private void UpdateWindowPosition()
     {
         if (VisualRoot is null)
         {
@@ -146,8 +147,6 @@ public partial class ImageInfoWindow : Window, IDisposable
         _config.WindowProperties.Left = hostWindow.Position.X;
         _config.WindowProperties.Top = hostWindow.Position.Y;
     }
-    
-    
 
     private void Close(object? sender, RoutedEventArgs e) => Close();
 

+ 33 - 47
src/PicView.Avalonia.Win32/WindowImpl/WindowInitializer.cs

@@ -24,7 +24,10 @@ public class WindowInitializer : IPlatformSpecificUpdate
     private ImageInfoWindowConfig? _imageInfoWindowConfig;
     
     private KeybindingsWindow? _keybindingsWindow;
+    
     private SettingsWindow? _settingsWindow;
+    private SettingsWindowConfig? _settingsWindowConfig;
+    
     private SingleImageResizeWindow? _singleImageResizeWindow;
 
     public async Task HandlePlatofrmUpdate(UpdateInfo updateInfo, string tempPath)
@@ -132,28 +135,7 @@ public class WindowInitializer : IPlatformSpecificUpdate
 
         void Show()
         {
-            if (_imageInfoWindowConfig.WindowProperties.Maximized)
-            {
-                _imageInfoWindow.WindowState = WindowState.Maximized;
-            }
-            else
-            {
-                var left = _imageInfoWindowConfig.WindowProperties.Left;
-                var top = _imageInfoWindowConfig.WindowProperties.Top;
-                if (left.HasValue && top.HasValue)
-                {
-                    _imageInfoWindow.WindowStartupLocation  = WindowStartupLocation.Manual;
-                    _imageInfoWindow.Position = new PixelPoint(left.Value, top.Value);
-                }
-                else
-                {
-                    _imageInfoWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
-                }
-                var width = _imageInfoWindowConfig.WindowProperties.Width ?? 850;
-                var height = _imageInfoWindowConfig.WindowProperties.Height ?? 495;
-                _imageInfoWindow.Width = width < _imageInfoWindow.MinWidth ? _imageInfoWindow.MinWidth : width;
-                _imageInfoWindow.Height = height < _imageInfoWindow.MinHeight ? _imageInfoWindow.MinHeight : height;
-            }
+            WindowFunctions.InitializeWindowSizeAndPosition(_imageInfoWindow, _imageInfoWindowConfig.WindowProperties);
             _imageInfoWindow.Show(desktop.MainWindow);
         }
     }
@@ -204,40 +186,37 @@ public class WindowInitializer : IPlatformSpecificUpdate
         }
     }
 
-    public void ShowSettingsWindow(MainViewModel vm)
+    public async Task ShowSettingsWindow(MainViewModel vm)
     {
-        if (Dispatcher.UIThread.CheckAccess())
+        if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
         {
-            Set();
+            return;
         }
-        else
+        
+        if (_settingsWindowConfig?.WindowProperties is null )
         {
-            Dispatcher.UIThread.InvokeAsync(Set);
+            _settingsWindowConfig = new SettingsWindowConfig();
+            await _settingsWindowConfig.LoadAsync();
         }
-
-        return;
-
-        void Set()
+        if (_settingsWindow is null)
         {
-            if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
-            {
-                return;
-            }
-
-            if (_settingsWindow is null)
+            vm.AssociationsViewModel ??= new FileAssociationsViewModel();
+            vm.SettingsViewModel ??= new SettingsViewModel();
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
-                vm.AssociationsViewModel ??= new FileAssociationsViewModel();
-                vm.SettingsViewModel ??= new SettingsViewModel();
                 _settingsWindow = new SettingsWindow
                 {
                     DataContext = vm,
                     WindowStartupLocation = WindowStartupLocation.CenterOwner
                 };
 
-                _settingsWindow.Show(desktop.MainWindow);
-                _settingsWindow.Closing += (s, e) => _settingsWindow = null;
-            }
-            else
+                Show();
+                _settingsWindow.Closing += (_, _) => _settingsWindow = null;
+            });
+        }
+        else
+        {
+            await Dispatcher.UIThread.InvokeAsync(() =>
             {
                 if (_settingsWindow.WindowState == WindowState.Minimized)
                 {
@@ -245,11 +224,18 @@ public class WindowInitializer : IPlatformSpecificUpdate
                 }
                 else
                 {
-                    _settingsWindow.Show();
+                    Show();
                 }
-            }
-
-            _ = FunctionsMapper.CloseMenus();
+            });
+        }
+        await FunctionsMapper.CloseMenus();
+        
+        return;
+        
+        void Show()
+        {
+            WindowFunctions.InitializeWindowSizeAndPosition(_settingsWindow, _settingsWindowConfig.WindowProperties);
+            _settingsWindow.Show(desktop.MainWindow);
         }
     }
 

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

@@ -38,7 +38,7 @@ public interface IPlatformWindowService
 
     void ShowKeybindingsWindow();
 
-    void ShowSettingsWindow();
+    Task ShowSettingsWindow();
     
     void ShowEffectsWindow();
     

+ 41 - 0
src/PicView.Avalonia/WindowBehavior/WindowFunctions.cs

@@ -10,6 +10,7 @@ using PicView.Avalonia.Navigation;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.ViewModels;
 using PicView.Core.ArchiveHandling;
+using PicView.Core.Config;
 using PicView.Core.FileHandling;
 using PicView.Core.FileHistory;
 using PicView.Core.Sizing;
@@ -361,6 +362,46 @@ public static class WindowFunctions
             });
         }
     }
+    
+    public static void InitializeWindowSizeAndPosition(Window window, IWindowProperties properties)
+    {
+        if (Dispatcher.UIThread.CheckAccess())
+        {
+            Set();
+        }
+        else
+        {
+            Dispatcher.UIThread.InvokeAsync(Set);
+        }
+        
+        return;
+
+        void Set()
+        {
+            if (properties.Maximized)
+            {
+                window.WindowState = WindowState.Maximized;
+            }
+            else if (properties is { Left: not null, Top: not null })
+            {
+                window.WindowStartupLocation = WindowStartupLocation.Manual;
+                window.Position = new PixelPoint(properties.Left.GetValueOrDefault(),
+                    properties.Top.Value);
+            }
+            else
+            {
+                window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
+            }
+
+            if (properties is not { Width: not null, Height: not null })
+            {
+                return;
+            }
+
+            window.Width = properties.Width.Value;
+            window.Height = properties.Height.Value;
+        }
+    }
 
     #endregion
 

+ 10 - 0
src/PicView.Core/Config/IWindowProperties.cs

@@ -0,0 +1,10 @@
+namespace PicView.Core.Config;
+
+public interface IWindowProperties
+{
+    public int? Top { get; set; }
+    public int? Left { get; set; }
+    public double? Width { get; set; }
+    public double? Height { get; set; }
+    public bool Maximized { get; set; }
+}

+ 1 - 1
src/PicView.Core/Config/ImageInfoWindowConfig.cs

@@ -46,7 +46,7 @@ public class ImageInfoWindowConfig() : ConfigFile("ImageInfoWindow.json")
             CorrectPath, WindowProperties, typeof(ImageInfoWindowProperties), ImageInfoWindowGenerationContext.Default);
     }
     
-    public class ImageInfoWindowProperties
+    public class ImageInfoWindowProperties : IWindowProperties
     {
         public int? Top { get; set; }
         public int? Left { get; set; }

+ 1 - 1
src/PicView.Core/Config/SettingsWindowConfig.cs

@@ -46,7 +46,7 @@ public class SettingsWindowConfig() : ConfigFile("SettingsWindow.json")
             CorrectPath, WindowProperties, typeof(SettingsWindowProperties), SettingsWindowGenerationContext.Default);
     }
     
-    public class SettingsWindowProperties
+    public class SettingsWindowProperties : IWindowProperties
     {
         public int? Top { get; set; }
         public int? Left { get; set; }