Browse Source

Add option to change image aliasing

Ruben 9 months ago
parent
commit
c4c4e9163e

+ 14 - 0
src/PicView.Avalonia/ViewModels/ViewModelBase.cs

@@ -256,10 +256,24 @@ public class ViewModelBase : ReactiveObject
         WidthAndHeight = TranslationHelper.Translation.WidthAndHeight;
         CloseWindowPrompt = TranslationHelper.Translation.CloseWindowPrompt;
         ShowConfirmationOnEsc = TranslationHelper.Translation.ShowConfirmationOnEsc;
+        ImageAliasing = TranslationHelper.Translation.ImageAliasing;
+        HighQuality = TranslationHelper.Translation.HighQuality;
     }
 
     #region Strings
     
+    public string? HighQuality
+    {
+        get;
+        set => this.RaiseAndSetIfChanged(ref field, value);
+    }
+    
+    public string? ImageAliasing
+    {
+        get;
+        set => this.RaiseAndSetIfChanged(ref field, value);
+    }
+    
     public string? CloseWindowPrompt
     {
         get;

+ 0 - 4
src/PicView.Avalonia/Views/GeneralSettingsView.axaml.cs

@@ -10,8 +10,6 @@ public partial class GeneralSettingsView : UserControl
         InitializeComponent();
         Loaded += delegate
         {
-            
-            
             ApplicationStartupBox.SelectedIndex = SettingsHelper.Settings.StartUp.OpenLastFile ? 1 : 0;
             
             ApplicationStartupBox.SelectionChanged += async delegate
@@ -30,8 +28,6 @@ public partial class GeneralSettingsView : UserControl
                     ApplicationStartupBox.SelectedIndex = SettingsHelper.Settings.StartUp.OpenLastFile ? 0 : 1;
                 }
             };
-            
-
         };
     }
 }

+ 21 - 0
src/PicView.Avalonia/Views/ImageSettingsView.axaml

@@ -74,5 +74,26 @@
                                        Mode=OneWay}" />
         </ToggleButton>
 
+        <TextBlock
+            Classes="txt"
+            FontFamily="/Assets/Fonts/Roboto-Bold.ttf#Roboto"
+            FontSize="14"
+            Foreground="{StaticResource SecondaryTextColor}"
+            Margin="0,20,0,20"
+            Text="{CompiledBinding ImageAliasing,
+                                   Mode=OneWay}" />
+        <ComboBox
+            Background="{DynamicResource SecondaryBackgroundColor}"
+            BorderBrush="{DynamicResource MainBorderColor}"
+            BorderThickness="1"
+            FontFamily="/Assets/Fonts/Roboto-Medium.ttf#Roboto"
+            Margin="0,6,0,10"
+            Padding="5,7,0,7"
+            Width="300"
+            x:Name="ImageAliasingBox">
+            <ComboBoxItem Content="{CompiledBinding HighQuality, Mode=OneWay}" />
+            <ComboBoxItem Content="{CompiledBinding None, Mode=OneWay}" />
+        </ComboBox>
+
     </StackPanel>
 </UserControl>

+ 27 - 0
src/PicView.Avalonia/Views/ImageSettingsView.axaml.cs

@@ -1,4 +1,6 @@
 using Avalonia.Controls;
+using PicView.Avalonia.ViewModels;
+using PicView.Core.Config;
 
 namespace PicView.Avalonia.Views;
     public partial class ImageSettingsView : UserControl
@@ -6,5 +8,30 @@ namespace PicView.Avalonia.Views;
         public ImageSettingsView()
         {
             InitializeComponent();
+            Loaded += delegate
+            {
+                ImageAliasingBox.SelectedIndex = SettingsHelper.Settings.ImageScaling.IsScalingSetToNearestNeighbor ? 1 : 0;
+            
+                ImageAliasingBox.SelectionChanged += async delegate
+                {
+                    if (ImageAliasingBox.SelectedIndex == -1)
+                    {
+                        return;
+                    }
+                    SettingsHelper.Settings.ImageScaling.IsScalingSetToNearestNeighbor = ImageAliasingBox.SelectedIndex == 1;
+                    if (DataContext is MainViewModel vm)
+                    {
+                        vm.ImageViewer.TriggerScalingModeUpdate(true);
+                    }
+                    await SettingsHelper.SaveSettingsAsync();
+                };
+                ImageAliasingBox.DropDownOpened += delegate
+                {
+                    if (ImageAliasingBox.SelectedIndex == -1)
+                    {
+                        ImageAliasingBox.SelectedIndex = SettingsHelper.Settings.ImageScaling.IsScalingSetToNearestNeighbor ? 0 : 1;
+                    }
+                };
+            };
         }
     }

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

@@ -36,7 +36,6 @@
                     PointerMoved="MainImage_OnPointerMoved"
                     PointerPressed="MainImage_OnPointerPressed"
                     PointerReleased="MainImage_OnPointerReleased"
-                    RenderOptions.BitmapInterpolationMode="HighQuality"
                     SecondaryImageWidth="{CompiledBinding SecondaryImageWidth,
                                                           Mode=OneWay}"
                     SecondarySource="{CompiledBinding SecondaryImageSource,

+ 16 - 0
src/PicView.Avalonia/Views/ImageViewer.axaml.cs

@@ -5,6 +5,7 @@ using Avalonia.Controls.Primitives;
 using Avalonia.Input;
 using Avalonia.Interactivity;
 using Avalonia.Media;
+using Avalonia.Media.Imaging;
 using Avalonia.Threading;
 using PicView.Avalonia.Navigation;
 using PicView.Avalonia.UI;
@@ -33,6 +34,7 @@ public partial class ImageViewer : UserControl
     public ImageViewer()
     {
         InitializeComponent();
+        TriggerScalingModeUpdate(false);
         AddHandler(PointerWheelChangedEvent, PreviewOnPointerWheelChanged, RoutingStrategies.Tunnel);
         AddHandler(Gestures.PointerTouchPadGestureMagnifyEvent, TouchMagnifyEvent, RoutingStrategies.Bubble);
 
@@ -45,6 +47,19 @@ public partial class ImageViewer : UserControl
             };
         };
     }
+    
+    public void TriggerScalingModeUpdate(bool invalidate)
+    {
+        var scalingMode = SettingsHelper.Settings.ImageScaling.IsScalingSetToNearestNeighbor 
+            ? BitmapInterpolationMode.LowQuality 
+            : BitmapInterpolationMode.HighQuality;
+
+        RenderOptions.SetBitmapInterpolationMode(MainImage,scalingMode);
+        if (invalidate)
+        {
+            MainImage.InvalidateVisual();
+        }
+    }
 
     private void TouchMagnifyEvent(object? sender, PointerDeltaEventArgs e)
     {
@@ -256,6 +271,7 @@ public partial class ImageViewer : UserControl
 
         currentZoom += zoomSpeed;
         currentZoom = Math.Max(0.09, currentZoom); // Fix for zooming out too much
+        TriggerScalingModeUpdate(false);
         if (SettingsHelper.Settings.Zoom.AvoidZoomingOut && currentZoom < 1.0)
         {
             ResetZoom(true);