Ver Fonte

Refactor: migrate scroll, stretch, auto-fit, looping, and top-most properties to `GlobalSettingsViewModel`. Remove redundant properties from `MainViewModel`, update bindings across views, and streamline settings management logic.

Ruben há 3 meses atrás
pai
commit
f7e6ee8c00

+ 6 - 6
src/PicView.Avalonia.MacOS/Views/MacMainWindow.axaml

@@ -211,7 +211,7 @@
                         Command="{CompiledBinding ChangeAutoFitCommand}"
                         Header="{CompiledBinding Translation.AutoFitWindow.Value,
                                                  Mode=OneWay}"
-                        IsChecked="{CompiledBinding IsAutoFit}"
+                        IsChecked="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
                         ToggleType="CheckBox" />
                     <NativeMenuItem Command="{CompiledBinding ToggleUICommand}" Header="{CompiledBinding Translation.IsShowingUI.Value, Mode=OneWay}" />
                     <NativeMenuItem Command="{CompiledBinding Gallery.ToggleGalleryCommand}" Header="{CompiledBinding Translation.ShowImageGallery.Value, Mode=OneWay}" />
@@ -282,33 +282,33 @@
                         Command="{CompiledBinding ToggleLoopingCommand}"
                         Header="{CompiledBinding Translation.IsLooping.Value,
                                                  Mode=OneWay}"
-                        IsChecked="{CompiledBinding IsLooping}"
+                        IsChecked="{CompiledBinding GlobalSettings.IsLooping.Value}"
                         ToggleType="CheckBox" />
                     <NativeMenuItem
                         Command="{CompiledBinding StretchCommand}"
                         Header="{CompiledBinding Translation.Stretch.Value,
                                                  Mode=OneWay}"
-                        IsChecked="{CompiledBinding IsStretched}"
+                        IsChecked="{CompiledBinding GlobalSettings.IsStretched.Value}"
                         ToggleType="CheckBox" />
                     <NativeMenuItem
                         Command="{CompiledBinding ToggleScrollCommand}"
                         Header="{CompiledBinding Translation.ToggleScroll.Value,
                                                  Mode=OneWay}"
-                        IsChecked="{CompiledBinding IsScrollingEnabled}"
+                        IsChecked="{CompiledBinding GlobalSettings.IsScrollingEnabled.Value}"
                         ToggleType="CheckBox" />
                     <NativeMenuItemSeparator />
                     <NativeMenuItem
                         Command="{CompiledBinding ChangeTopMostCommand}"
                         Header="{CompiledBinding Translation.StayTopMost.Value,
                                                  Mode=OneWay}"
-                        IsChecked="{CompiledBinding IsTopMost}"
+                        IsChecked="{CompiledBinding GlobalSettings.IsTopMost.Value}"
                         ToggleType="CheckBox" />
                     <NativeMenuItemSeparator />
                     <NativeMenuItem
                         Command="{CompiledBinding ToggleSubdirectoriesCommand}"
                         Header="{CompiledBinding Translation.SearchSubdirectory.Value,
                                                  Mode=OneWay}"
-                        IsChecked="{CompiledBinding IsIncludingSubdirectories}"
+                        IsChecked="{CompiledBinding GlobalSettings.IsIncludingSubdirectories.Value}"
                         ToggleType="CheckBox" />
                     <NativeMenuItemSeparator />
                     <NativeMenuItem Command="{CompiledBinding ShowKeybindingsWindowCommand}" Header="{CompiledBinding Translation.ApplicationShortcuts.Value, Mode=OneWay}" />

+ 1 - 1
src/PicView.Avalonia.Win32/WindowImpl/Win32Window.cs

@@ -96,7 +96,7 @@ public static class Win32Window
         {
             vm.MainWindow.SizeToContent.Value = SizeToContent.WidthAndHeight;
             vm.MainWindow.CanResize.Value = false;
-            vm.IsAutoFit = true;
+            vm.GlobalSettings.IsAutoFit.Value = true;
             if (Settings.WindowProperties.KeepCentered)
             {
                 WindowFunctions.CenterWindowOnScreen();

+ 0 - 4
src/PicView.Avalonia/Functions/FunctionsMapper.cs

@@ -895,10 +895,6 @@ public static class FunctionsMapper
     public static async Task ShowRecentHistoryFile() =>
         await Task.Run(() => Vm?.PlatformService?.OpenWith(FileHistoryManager.CurrentFileHistoryFile)).ConfigureAwait(false);
     
-    /// <inheritdoc cref="SettingsUpdater.ToggleUsingTouchpad(MainViewModel)" />
-    public static async Task ToggleUsingTouchpad() =>
-        await SettingsUpdater.ToggleUsingTouchpad(Vm).ConfigureAwait(false);
-    
     public static async Task ToggleOpeningInSameWindow() =>
         await SettingsUpdater.ToggleOpeningInSameWindow(Vm).ConfigureAwait(false);
 

+ 2 - 2
src/PicView.Avalonia/ImageTransformations/Rotation/RotationNavigation.cs

@@ -154,7 +154,7 @@ public static class RotationNavigation
 
         await Dispatcher.UIThread.InvokeAsync(() =>
         {
-            if (vm.IsScrollingEnabled)
+            if (vm.GlobalSettings.IsScrollingEnabled.CurrentValue)
             {
                 vm.ImageViewer.ImageScrollViewer.LineUp();
             }
@@ -183,7 +183,7 @@ public static class RotationNavigation
 
         await Dispatcher.UIThread.InvokeAsync(() =>
         {
-            if (vm.IsScrollingEnabled)
+            if (vm.GlobalSettings.IsScrollingEnabled.CurrentValue)
             {
                 vm.ImageViewer.ImageScrollViewer.LineDown();
             }

+ 1 - 1
src/PicView.Avalonia/ImageTransformations/Zoom.cs

@@ -210,7 +210,7 @@ public class Zoom
             return;
         }
 
-        vm.GlobalSettings.RotationAngle.Value = zoomValue;
+        vm.GlobalSettings.ZoomValue.Value = zoomValue;
         if (!IsZoomed)
         {
             return;

+ 20 - 11
src/PicView.Avalonia/SettingsManagement/SettingsUpdater.cs

@@ -82,11 +82,6 @@ public static class SettingsUpdater
                                     Settings.UIProperties.ShowInterface;
         vm.IsShowingTaskbarProgress  = Settings.UIProperties.IsTaskbarProgressEnabled;
         vm.IsFullscreen  = Settings.WindowProperties.Fullscreen;
-        vm.IsTopMost  = Settings.WindowProperties.TopMost;
-        vm.IsIncludingSubdirectories = Settings.Sorting.IncludeSubDirectories;
-        vm.IsStretched = Settings.ImageScaling.StretchImage;
-        vm.IsLooping  = Settings.UIProperties.Looping;
-        vm.IsAutoFit  = Settings.WindowProperties.AutoFit;
         vm.IsAscending  = Settings.Sorting.Ascending;
         vm.MainWindow.BackgroundChoice.Value = Settings.UIProperties.BgColorChoice;
     }
@@ -200,10 +195,24 @@ public static class SettingsUpdater
         }
         await SaveSettingsAsync();
     }
+
+    public static async Task ToggleStretch(MainViewModel vm)
+    {
+        if (Settings.ImageScaling.StretchImage)
+        {
+            Settings.ImageScaling.StretchImage = false;
+        }
+        else
+        {
+            Settings.ImageScaling.StretchImage = true;
+        }
+        await WindowResizing.SetSizeAsync(vm).ConfigureAwait(false);
+        await SaveSettingsAsync();
+    }
     
     public static async Task TurnOffSubdirectories(MainViewModel vm)
     {
-        vm.IsIncludingSubdirectories = false;
+        vm.GlobalSettings.IsIncludingSubdirectories.Value = false;
         Settings.Sorting.IncludeSubDirectories = false;
 
         if (!NavigationManager.CanNavigate(vm))
@@ -217,7 +226,7 @@ public static class SettingsUpdater
     
     public static async Task TurnOnSubdirectories(MainViewModel vm)
     {
-        vm.IsIncludingSubdirectories = true;
+        vm.GlobalSettings.IsIncludingSubdirectories.Value = true;
         Settings.Sorting.IncludeSubDirectories = true;
         
         if (!NavigationManager.CanNavigate(vm))
@@ -394,7 +403,7 @@ public static class SettingsUpdater
     {
         vm.ToggleScrollBarVisibility = ScrollBarVisibility.Disabled;
         vm.Translation.IsScrolling.Value = TranslationManager.Translation.ScrollingDisabled;
-        vm.IsScrollingEnabled = false;
+        vm.GlobalSettings.IsScrollingEnabled.Value = false;
         Settings.Zoom.ScrollEnabled = false;
         vm.MainWindow.RightControlOffSetMargin.Value = new Thickness(0);
     }
@@ -403,7 +412,7 @@ public static class SettingsUpdater
     {
         vm.ToggleScrollBarVisibility = ScrollBarVisibility.Visible;
         vm.Translation.IsScrolling.Value = TranslationManager.Translation.ScrollingEnabled;
-        vm.IsScrollingEnabled = true;
+        vm.GlobalSettings.IsScrollingEnabled.Value = true;
         Settings.Zoom.ScrollEnabled = true;
         vm.MainWindow.RightControlOffSetMargin.Value = new Thickness(0,0,30,0);
     }
@@ -457,7 +466,7 @@ public static class SettingsUpdater
         vm.Translation.IsLooping.Value = value
             ? TranslationManager.Translation.LoopingEnabled
             : TranslationManager.Translation.LoopingDisabled;
-        vm.IsLooping = value;
+        vm.GlobalSettings.IsLooping.Value = value;
 
         var msg = value
             ? TranslationManager.Translation.LoopingEnabled
@@ -471,7 +480,7 @@ public static class SettingsUpdater
     {
         Settings.UIProperties.Looping = false;
         vm.Translation.IsLooping.Value = TranslationManager.Translation.LoopingDisabled;
-        vm.IsLooping = false;
+        vm.GlobalSettings.IsLooping.Value = false;
     }
     
     #endregion

+ 1 - 1
src/PicView.Avalonia/StartUp/QuickLoad.cs

@@ -171,7 +171,7 @@ public static class QuickLoad
         
         vm.PicViewer.ImageSource.Value = imageModel.Image;
         vm.PicViewer.ImageType.Value = imageModel.ImageType;
-        vm.GlobalSettings.RotationAngle.Value = 1;
+        vm.GlobalSettings.RotationAngle.Value = 0;
         vm.PicViewer.PixelWidth.Value = imageModel.PixelWidth;
         vm.PicViewer.PixelHeight.Value = imageModel.PixelHeight;
 

+ 9 - 5
src/PicView.Avalonia/StartUp/StartUpHelper.cs

@@ -127,7 +127,11 @@ public static class StartUpHelper
         HandleThemeUpdates(vm);
         
         UIHelper.SetControls(desktop);
-        SettingsUpdater.ValidateGallerySettings(vm, settingsExists);
+        Task.Run(() =>
+        {
+            HandleWindowControlSettings(vm, desktop);
+            SettingsUpdater.ValidateGallerySettings(vm, settingsExists);
+        });
         
         // Need to delay setting fullscreen or maximized until after the window is shown to select the correct monitor
         if (Settings.WindowProperties.Maximized && !Settings.WindowProperties.Fullscreen)
@@ -145,7 +149,7 @@ public static class StartUpHelper
             }, DispatcherPriority.Normal).Wait();
         }
         
-        HandleWindowControlSettings(vm, desktop);
+
         SetWindowEventHandlers(window);
         MenuManager.AddMenus();
         
@@ -188,7 +192,7 @@ public static class StartUpHelper
         else
         {
             vm.ToggleScrollBarVisibility = ScrollBarVisibility.Disabled;
-            vm.IsScrollingEnabled = false;
+            vm.GlobalSettings.IsScrollingEnabled.Value = false;
         }
 
         if (Settings.WindowProperties.TopMost)
@@ -256,7 +260,7 @@ public static class StartUpHelper
     private static void HandleNormalWindow(MainViewModel vm, Window window)
     {
         vm.MainWindow.CanResize.Value = true;
-        vm.IsAutoFit = false;
+        vm.GlobalSettings.IsAutoFit.Value = false;
         if (Settings.UIProperties.ShowInterface)
         {
             vm.IsTopToolbarShown = true;
@@ -269,7 +273,7 @@ public static class StartUpHelper
     {
         vm.MainWindow.SizeToContent.Value = SizeToContent.WidthAndHeight;
         vm.MainWindow.CanResize.Value = false;
-        vm.IsAutoFit = true;
+        vm.GlobalSettings.IsAutoFit.Value = true;
         if (Settings.UIProperties.ShowInterface)
         {
             vm.IsTopToolbarShown = true;

+ 0 - 44
src/PicView.Avalonia/ViewModels/MainViewModel.cs

@@ -163,8 +163,6 @@ public class MainViewModel : ReactiveObject
         ResetSettingsCommand = FunctionsHelper.CreateReactiveCommand(FunctionsMapper.ResetSettings);
 
         RestartCommand = FunctionsHelper.CreateReactiveCommand(FunctionsMapper.Restart);
-
-        ToggleUsingTouchpadCommand = FunctionsHelper.CreateReactiveCommand(FunctionsMapper.ToggleUsingTouchpad);
         
         ToggleOpeningInSameWindowCommand = FunctionsHelper.CreateReactiveCommand(FunctionsMapper.ToggleOpeningInSameWindow);
         
@@ -205,7 +203,6 @@ public class MainViewModel : ReactiveObject
     public ReactiveCommand<Unit, Unit>? ChangeAutoFitCommand { get; }
     public ReactiveCommand<Unit, Unit>? ChangeTopMostCommand { get; }
     public ReactiveCommand<Unit, Unit>? ChangeCtrlZoomCommand { get; }
-    public ReactiveCommand<Unit, Unit>? ToggleUsingTouchpadCommand { get; }
     public ReactiveCommand<Unit, Unit>? ToggleUICommand { get; }
     public ReactiveCommand<Unit, Unit>? ToggleOpeningInSameWindowCommand { get; }
     public ReactiveCommand<Unit, Unit>? ChangeBackgroundCommand { get; }
@@ -355,48 +352,7 @@ public class MainViewModel : ReactiveObject
         set => this.RaiseAndSetIfChanged(ref field, value);
     } = true;
 
-    public bool IsTopMost
-    {
-        get;
-        set => this.RaiseAndSetIfChanged(ref field, value);
-    }
-
-
-
-    public bool IsIncludingSubdirectories
-    {
-        get;
-        set => this.RaiseAndSetIfChanged(ref field, value);
-    }
-
-    public bool IsScrollingEnabled
-    {
-        get;
-        set => this.RaiseAndSetIfChanged(ref field, value);
-    }
-
-    public bool IsStretched
-    {
-        get;
-        set
-        {
-            this.RaiseAndSetIfChanged(ref field, value);
-            Settings.ImageScaling.StretchImage = value;
-            WindowResizing.SetSize(this);
-        }
-    }
 
-    public bool IsLooping
-    {
-        get;
-        set => this.RaiseAndSetIfChanged(ref field, value);
-    }
-
-    public bool IsAutoFit
-    {
-        get;
-        set => this.RaiseAndSetIfChanged(ref field, value);
-    }
 
 
 

+ 12 - 1
src/PicView.Avalonia/ViewModels/ToolsViewModel.cs

@@ -3,6 +3,7 @@ using PicView.Avalonia.FileSystem;
 using PicView.Avalonia.Functions;
 using PicView.Avalonia.ImageTransformations.Rotation;
 using PicView.Avalonia.Navigation;
+using PicView.Avalonia.SettingsManagement;
 using PicView.Avalonia.UI;
 using PicView.Avalonia.Wallpaper;
 using R3;
@@ -137,11 +138,21 @@ public class ToolsViewModel : IDisposable
     });
     
     
+    
+    public ReactiveCommand ToggleUsingTouchPadCommand { get; } = new(async (_, _) =>
+    {
+        await SettingsUpdater.ToggleUsingTouchpad(UIHelper.GetMainView.DataContext as MainViewModel);
+    });
+    
+    
     public async Task StartSlideShowTask(int milliseconds) =>
         await Slideshow.StartSlideshow(UIHelper.GetMainView.DataContext as MainViewModel, milliseconds);
     
     public async Task RotateTask(int angle) =>
         await RotationNavigation.RotateTo(UIHelper.GetMainView.DataContext as MainViewModel, angle);
+
+    public async Task StretchedCommand() =>
+        await SettingsUpdater.ToggleStretch(UIHelper.GetMainView.DataContext as MainViewModel);
     
     // Wallpaper
     public ReactiveCommand<string> SetAsWallpaperCommand { get; } = new(async (path, _) =>
@@ -173,7 +184,7 @@ public class ToolsViewModel : IDisposable
     {
         await WallpaperManager.SetAsWallpaper(path, WallpaperStyle.Fit, UIHelper.GetMainView.DataContext as MainViewModel).ConfigureAwait(false);
     });
-    
+
     public void Dispose()
     {
         Disposable.Dispose(SetAsWallpaperCommand,

+ 1 - 1
src/PicView.Avalonia/Views/GallerySettingsView.axaml

@@ -52,7 +52,7 @@
             BorderThickness="0"
             Classes="altHover changeColor"
             Command="{CompiledBinding ToggleBottomGalleryShownInHiddenUICommand}"
-            IsChecked="{CompiledBinding SettingsViewModel.IsBottomGalleryShownInHiddenUI}"
+            IsChecked="{CompiledBinding SettingsViewModel.IsBottomGalleryShownInHiddenUI.Value}"
             Margin="0,0,0,10"
             Width="300">
             <TextBlock

+ 1 - 1
src/PicView.Avalonia/Views/GeneralSettingsView.axaml

@@ -84,7 +84,7 @@
                 BorderThickness="0"
                 Classes="altHover changeColor"
                 Command="{CompiledBinding ToggleSubdirectoriesCommand}"
-                IsChecked="{CompiledBinding IsIncludingSubdirectories}"
+                IsChecked="{CompiledBinding GlobalSettings.IsIncludingSubdirectories.Value}"
                 Margin="0,0,0,10"
                 Width="300">
                 <TextBlock

+ 2 - 2
src/PicView.Avalonia/Views/ImageSettingsView.axaml

@@ -25,7 +25,7 @@
             Background="Transparent"
             BorderThickness="0"
             Classes="altHover changeColor"
-            IsChecked="{CompiledBinding IsStretched}"
+            IsChecked="{CompiledBinding GlobalSettings.IsStretched.Value}"
             Margin="0,0,0,10"
             ToolTip.Tip="{CompiledBinding Translation.Stretch.Value,
                                           Mode=OneWay}"
@@ -44,7 +44,7 @@
             BorderThickness="0"
             Classes="altHover changeColor"
             Command="{CompiledBinding ToggleScrollCommand}"
-            IsChecked="{CompiledBinding IsScrollingEnabled}"
+            IsChecked="{CompiledBinding GlobalSettings.IsScrollingEnabled.Value}"
             Margin="0,0,0,10"
             Width="300">
             <TextBlock

+ 1 - 1
src/PicView.Avalonia/Views/ImageViewer.axaml

@@ -1,5 +1,5 @@
 <UserControl
-    Background="{CompiledBinding MainWindow.ImageBackground,
+    Background="{CompiledBinding MainWindow.ImageBackground.Value,
                                  Mode=OneWay}"
     PointerPressed="InputElement_OnPointerPressed"
     mc:Ignorable="d"

+ 6 - 6
src/PicView.Avalonia/Views/MainView.axaml

@@ -343,7 +343,7 @@
                     Command="{CompiledBinding ToggleSubdirectoriesCommand}"
                     Header="{CompiledBinding Translation.SearchSubdirectory.Value,
                                              Mode=OneWay}"
-                    IsChecked="{Binding IsIncludingSubdirectories}"
+                    IsChecked="{Binding GlobalSettings.IsIncludingSubdirectories.Value}"
                     ToggleType="CheckBox" />
 
                 <Separator />
@@ -352,7 +352,7 @@
                 <MenuItem
                     Header="{CompiledBinding Translation.IsLooping.Value,
                                              Mode=OneWay}"
-                    IsChecked="{Binding IsLooping}"
+                    IsChecked="{Binding GlobalSettings.IsLooping.Value}"
                     ToggleType="CheckBox" />
 
                 <Separator />
@@ -361,7 +361,7 @@
                 <MenuItem
                     Header="{CompiledBinding Translation.IsScrolling.Value,
                                              Mode=OneWay}"
-                    IsChecked="{CompiledBinding IsScrollingEnabled}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsScrollingEnabled.Value}"
                     ToggleType="CheckBox" />
 
                 <!--  Toggle stretching  -->
@@ -369,7 +369,7 @@
                     Command="{CompiledBinding StretchCommand}"
                     Header="{CompiledBinding Translation.Stretch.Value,
                                              Mode=OneWay}"
-                    IsChecked="{CompiledBinding IsStretched}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsStretched.Value}"
                     ToggleType="CheckBox" />
 
                 <!--  Toggle side-by-side  -->
@@ -387,7 +387,7 @@
                     Command="{CompiledBinding ChangeTopMostCommand}"
                     Header="{CompiledBinding Translation.StayTopMost.Value,
                                              Mode=OneWay}"
-                    IsChecked="{CompiledBinding IsTopMost}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsTopMost.Value}"
                     ToggleType="CheckBox" />
 
                 <!--  Toggle auto fit  -->
@@ -395,7 +395,7 @@
                     Command="{CompiledBinding ChangeAutoFitCommand}"
                     Header="{CompiledBinding Translation.AutoFitWindow.Value,
                                              Mode=OneWay}"
-                    IsChecked="{CompiledBinding IsAutoFit}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
                     ToggleType="CheckBox" />
 
                 <Separator />

+ 1 - 1
src/PicView.Avalonia/Views/MouseView.axaml

@@ -82,7 +82,7 @@
             Background="Transparent"
             BorderThickness="0"
             Classes="altHover"
-            Command="{CompiledBinding ToggleUsingTouchpadCommand}"
+            Command="{CompiledBinding Tools.ToggleUsingTouchPadCommand}"
             Margin="0,0,0,10"
             Padding="0,10,0,10"
             Width="300">

+ 2 - 2
src/PicView.Avalonia/Views/NavigationView.axaml

@@ -27,7 +27,7 @@
             BorderThickness="0"
             Classes="altHover changeColor"
             Command="{CompiledBinding ToggleSubdirectoriesCommand}"
-            IsChecked="{CompiledBinding IsIncludingSubdirectories}"
+            IsChecked="{CompiledBinding GlobalSettings.IsIncludingSubdirectories.Value}"
             Margin="0,0,0,10"
             Width="300">
             <TextBlock
@@ -44,7 +44,7 @@
             BorderThickness="0"
             Classes="altHover changeColor"
             Command="{CompiledBinding ToggleLoopingCommand}"
-            IsChecked="{CompiledBinding IsLooping}"
+            IsChecked="{CompiledBinding GlobalSettings.IsLooping.Value}"
             Margin="0,0,0,10"
             ToolTip.Tip="{CompiledBinding Translation.ToggleLooping.Value,
                                           Mode=OneWay}"

+ 10 - 13
src/PicView.Avalonia/Views/SettingsView.axaml.cs

@@ -72,31 +72,28 @@ public partial class SettingsView : UserControl
             return;
         }
 
+        var settingsVm = vm.SettingsViewModel;
         Task.Run(() =>
         {
-            var settingsVm = vm.SettingsViewModel;
             settingsVm.InitializeNavigation(GoBack, GoForward);
-            settingsVm.WindowMargin.Value = Settings.WindowProperties.Margin;
-
-            SubscribeToMarginChanges(vm, settingsVm);
-
             settingsVm.SubscriptionSettingsUpdate();
         });
+        SubscribeToChanges(vm, settingsVm);
     }
 
-    private static void SubscribeToMarginChanges(MainViewModel vm, SettingsViewModel settingsVm)
+    private static void SubscribeToChanges(MainViewModel vm, SettingsViewModel settingsVm)
     {
         _marginSubscription = new CompositeDisposable();
-        Observable.EveryValueChanged(settingsVm.WindowMargin, x => x.Value)
-            .SubscribeAwait(async (x, _) =>
+        Observable.EveryValueChanged(settingsVm.WindowMargin, x => x.CurrentValue, UIHelper.GetFrameProvider)
+            .Skip(1)
+            .Subscribe(x => 
             {
                 Settings.WindowProperties.Margin = x;
-                if (Settings.WindowProperties.AutoFit)
-                {
-                    await WindowResizing.SetSizeAsync(vm);
-                    WindowFunctions.CenterWindowOnScreen();
-                }
+                WindowResizing.SetSize(vm.PicViewer.PixelWidth.CurrentValue, vm.PicViewer.PixelHeight.CurrentValue, 0,
+                    0, vm.GlobalSettings.RotationAngle.CurrentValue, vm);
+                WindowFunctions.CenterWindowOnScreen();
             }).AddTo(_marginSubscription);
+        
     }
 
     private void LoadInitialSettings()

+ 8 - 6
src/PicView.Avalonia/Views/UC/Menus/SettingsMenu.axaml

@@ -129,7 +129,7 @@
                     Command="{CompiledBinding ToggleScrollCommand}"
                     Foreground="{DynamicResource MainTextColor}"
                     Height="46"
-                    IsChecked="{CompiledBinding IsScrollingEnabled}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsScrollingEnabled.Value}"
                     ToolTip.Tip="{CompiledBinding Translation.ToggleScroll.Value,
                                                   Mode=OneWay}"
                     Width="169">
@@ -141,9 +141,11 @@
                     Canvas.Left="182"
                     Canvas.Top="53"
                     Classes="ButtonBorder altHover"
+                    Command="{CompiledBinding Tools.StretchedCommand}"
                     Foreground="{DynamicResource MainTextColor}"
                     Height="46"
-                    IsChecked="{CompiledBinding IsStretched}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsStretched.Value,
+                                                Mode=TwoWay}"
                     ToolTip.Tip="{CompiledBinding Translation.Stretch.Value,
                                                   Mode=OneWay}"
                     Width="169">
@@ -158,7 +160,7 @@
                     Command="{CompiledBinding ToggleLoopingCommand}"
                     Foreground="{DynamicResource MainTextColor}"
                     Height="46"
-                    IsChecked="{CompiledBinding IsLooping}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsLooping.Value}"
                     ToolTip.Tip="{CompiledBinding Translation.ToggleLooping.Value,
                                                   Mode=OneWay}"
                     Width="169">
@@ -173,7 +175,7 @@
                     Command="{CompiledBinding ChangeAutoFitCommand}"
                     Foreground="{DynamicResource MainTextColor}"
                     Height="46"
-                    IsChecked="{CompiledBinding IsAutoFit}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
                     ToolTip.Tip="{CompiledBinding Translation.AutoFitWindow.Value,
                                                   Mode=OneWay}"
                     Width="169">
@@ -188,7 +190,7 @@
                     Command="{Binding ChangeTopMostCommand}"
                     Foreground="{DynamicResource MainTextColor}"
                     Height="46"
-                    IsChecked="{CompiledBinding IsTopMost}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsTopMost.Value}"
                     ToolTip.Tip="{CompiledBinding Translation.StayTopMost.Value,
                                                   Mode=OneWay}"
                     Width="169">
@@ -203,7 +205,7 @@
                     Command="{CompiledBinding ToggleSubdirectoriesCommand}"
                     Foreground="{DynamicResource MainTextColor}"
                     Height="46"
-                    IsChecked="{CompiledBinding IsIncludingSubdirectories}"
+                    IsChecked="{CompiledBinding GlobalSettings.IsIncludingSubdirectories.Value}"
                     ToolTip.Tip="{CompiledBinding Translation.SearchSubdirectory.Value,
                                                   Mode=OneWay}"
                     Width="169">

+ 7 - 7
src/PicView.Avalonia/Views/WindowSettingsView.axaml

@@ -29,7 +29,7 @@
             BorderThickness="0"
             Classes="altHover changeColor"
             Command="{CompiledBinding ChangeAutoFitCommand}"
-            IsChecked="{CompiledBinding IsAutoFit}"
+            IsChecked="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
             Margin="0,0,0,10"
             Width="300">
             <TextBlock
@@ -46,7 +46,7 @@
             Classes="txt"
             FontFamily="/Assets/Fonts/Roboto-Bold.ttf#Roboto"
             FontSize="12"
-            IsEnabled="{CompiledBinding IsAutoFit}"
+            IsEnabled="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
             Margin="0,10,0,10"
             MaxWidth="300"
             Text="{CompiledBinding Translation.WindowMargin.Value,
@@ -54,7 +54,7 @@
         <customControls:CustomSlider
             Height="30"
             HorizontalAlignment="Center"
-            IsEnabled="{CompiledBinding IsAutoFit}"
+            IsEnabled="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
             IsSnapToTickEnabled="True"
             Margin="0,1,0,1"
             Maximum="100"
@@ -67,7 +67,7 @@
             Classes="txt"
             FontFamily="/Assets/Fonts/Roboto-Bold.ttf#Roboto"
             Foreground="{StaticResource MainTextColorFaded}"
-            IsEnabled="{CompiledBinding IsAutoFit}"
+            IsEnabled="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
             Margin="0,0,0,15"
             Text="{CompiledBinding SettingsViewModel.WindowMargin.Value,
                                    Mode=OneWay}" />
@@ -86,7 +86,7 @@
             BorderThickness="0"
             Classes="altHover alt changeColor"
             Command="{CompiledBinding ChangeTopMostCommand}"
-            IsChecked="{CompiledBinding IsTopMost}"
+            IsChecked="{CompiledBinding GlobalSettings.IsTopMost.Value}"
             Margin="0,0,0,10"
             Width="300">
             <TextBlock
@@ -104,13 +104,13 @@
             BorderThickness="0"
             Classes="altHover changeColor"
             IsChecked="{CompiledBinding SettingsViewModel.IsStayingCentered.Value}"
-            IsEnabled="{CompiledBinding IsAutoFit}"
+            IsEnabled="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
             Margin="0,0,0,10"
             Width="300">
             <TextBlock
                 Classes="txt"
                 Foreground="{StaticResource SecondaryTextColor}"
-                IsEnabled="{CompiledBinding IsAutoFit}"
+                IsEnabled="{CompiledBinding GlobalSettings.IsAutoFit.Value}"
                 Margin="0"
                 MaxWidth="240"
                 Padding="0,1,5,0"

+ 10 - 10
src/PicView.Avalonia/WindowBehavior/WindowFunctions.cs

@@ -149,13 +149,13 @@ public static class WindowFunctions
 
         if (Settings.WindowProperties.TopMost)
         {
-            vm.IsTopMost = false;
+            vm.GlobalSettings.IsTopMost.Value = false;
             desktop.MainWindow.Topmost = false;
             Settings.WindowProperties.TopMost = false;
         }
         else
         {
-            vm.IsTopMost = true;
+            vm.GlobalSettings.IsTopMost.Value = true;
             desktop.MainWindow.Topmost = true;
             Settings.WindowProperties.TopMost = true;
         }
@@ -170,14 +170,14 @@ public static class WindowFunctions
             vm.MainWindow.SizeToContent.Value = SizeToContent.Manual;
             vm.MainWindow.CanResize.Value = true;
             Settings.WindowProperties.AutoFit = false;
-            vm.IsAutoFit = false;
+            vm.GlobalSettings.IsAutoFit.Value = false;
         }
         else
         {
             vm.MainWindow.SizeToContent.Value = SizeToContent.WidthAndHeight;
             vm.MainWindow.CanResize.Value = false;
             Settings.WindowProperties.AutoFit = true;
-            vm.IsAutoFit = true;
+            vm.GlobalSettings.IsAutoFit.Value = true;
         }
         await ResizeAndFixRenderingError(vm);
         await SaveSettingsAsync().ConfigureAwait(false);
@@ -191,8 +191,8 @@ public static class WindowFunctions
             vm.MainWindow.CanResize.Value = true;
             Settings.WindowProperties.AutoFit = false;
             Settings.ImageScaling.StretchImage = false;
-            vm.IsStretched = false;
-            vm.IsAutoFit = false;
+            vm.GlobalSettings.IsStretched.Value = false;
+            vm.GlobalSettings.IsAutoFit.Value = false;
         }
         else
         {
@@ -200,8 +200,8 @@ public static class WindowFunctions
             vm.MainWindow.CanResize.Value = false;
             Settings.WindowProperties.AutoFit = true;
             Settings.ImageScaling.StretchImage = true;
-            vm.IsAutoFit = true;
-            vm.IsStretched = true;
+            vm.GlobalSettings.IsAutoFit.Value = true;
+            vm.GlobalSettings.IsStretched.Value = true;
         }
 
         await ResizeAndFixRenderingError(vm);
@@ -224,7 +224,7 @@ public static class WindowFunctions
         vm.MainWindow.CanResize.Value = true;
         Settings.WindowProperties.AutoFit = false;
         Settings.ImageScaling.StretchImage = true;
-        vm.IsStretched = true;
+        vm.GlobalSettings.IsStretched.Value = true;
         await WindowResizing.SetSizeAsync(vm);
         vm.ImageViewer.MainImage.InvalidateVisual();
         await SaveSettingsAsync().ConfigureAwait(false);
@@ -233,7 +233,7 @@ public static class WindowFunctions
     public static async Task Stretch(MainViewModel vm)
     {
         Settings.ImageScaling.StretchImage = true;
-        vm.IsStretched = true;
+        vm.GlobalSettings.IsStretched.Value = true;
         await WindowResizing.SetSizeAsync(vm);
         vm.ImageViewer.MainImage.InvalidateVisual();
         await SaveSettingsAsync().ConfigureAwait(false);

+ 14 - 6
src/PicView.Core/ViewModels/GlobalSettingsViewModel.cs

@@ -2,14 +2,22 @@
 
 namespace PicView.Core.ViewModels;
 
-public class GlobalSettingsViewModel : IDisposable
+public class GlobalSettingsViewModel
 {
+    public BindableReactiveProperty<bool> IsTopMost { get; } = new(Settings.WindowProperties.TopMost);
 
-    public BindableReactiveProperty<double> RotationAngle { get; } = new();
+    public BindableReactiveProperty<bool> IsIncludingSubdirectories { get; } =
+        new(Settings.Sorting.IncludeSubDirectories);
+
+    public BindableReactiveProperty<bool> IsScrollingEnabled { get; } = new();
+
+    public BindableReactiveProperty<bool> IsStretched { get; } = new(Settings.ImageScaling.StretchImage);
+
+    public BindableReactiveProperty<bool> IsLooping { get; } = new(Settings.UIProperties.Looping);
+
+    public BindableReactiveProperty<bool> IsAutoFit { get; } = new(Settings.WindowProperties.AutoFit);
+
+    public BindableReactiveProperty<double> RotationAngle { get; } = new(0);
 
     public BindableReactiveProperty<double> ZoomValue { get; } = new();
-    public void Dispose()
-    {
-        Disposable.Dispose();
-    }
 }

+ 4 - 2
src/PicView.Core/ViewModels/SettingsViewModel.cs

@@ -7,7 +7,6 @@ namespace PicView.Core.ViewModels;
 public class SettingsViewModel : IDisposable
 {
     private readonly CompositeDisposable _disposables = new();
-
     public BindableReactiveProperty<bool> IsShowingRecycleDialog { get; } =
         new(Settings.UIProperties.ShowRecycleConfirmation);
 
@@ -31,7 +30,7 @@ public class SettingsViewModel : IDisposable
 
     public BindableReactiveProperty<bool> IsAvoidingZoomingOut { get; } = new(Settings.Zoom.AvoidZoomingOut);
 
-    public BindableReactiveProperty<double> WindowMargin { get; } = new();
+    public BindableReactiveProperty<double> WindowMargin { get; } = new(Settings.WindowProperties.Margin);
 
     public BindableReactiveProperty<double> NavSpeed { get; } = new(Settings.UIProperties.NavSpeed);
     public BindableReactiveProperty<double> GetNavSpeed { get; } = new();
@@ -109,6 +108,9 @@ public class SettingsViewModel : IDisposable
 
         Observable.EveryValueChanged(this, x => x.IsOpeningInSameWindow.CurrentValue)
             .Subscribe(x => Settings.UIProperties.OpenInSameWindow = x).AddTo(_disposables);
+        
+        Observable.EveryValueChanged(this, x => x.WindowMargin.CurrentValue)
+            .Subscribe(x => Settings.WindowProperties.Margin = x).AddTo(_disposables);
     }
 
     #region Tab history navigation