Pārlūkot izejas kodu

Disable buttons when no image source or file source, or other conditions not making them usable.

Ruben 7 mēneši atpakaļ
vecāks
revīzija
5cb5aaf245

+ 6 - 1
src/PicView.Avalonia.MacOS/Views/MacOSTitlebar.axaml

@@ -31,6 +31,8 @@
             Foreground="{DynamicResource MainTextColor}"
             IconHeight="12"
             IconWidth="12"
+            IsEnabled="{CompiledBinding FileInfo,
+                                        Converter={x:Static ObjectConverters.IsNotNull}}"
             IsTabStop="False"
             Margin="0"
             ToolTip.Tip="{CompiledBinding GetIsFlippedTranslation,
@@ -53,6 +55,8 @@
             Icon="{StaticResource RefreshCcwDot}"
             IconHeight="13"
             IconWidth="13"
+            IsEnabled="{CompiledBinding FileInfo,
+                                        Converter={x:Static ObjectConverters.IsNotNull}}"
             IsTabStop="False"
             Margin="0"
             ToolTip.Tip="{CompiledBinding RotateRight}"
@@ -70,7 +74,8 @@
             Foreground="{DynamicResource MainTextColor}"
             IconHeight="17"
             IconWidth="17"
-            IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+            IsEnabled="{CompiledBinding FileInfo,
+                                        Converter={x:Static ObjectConverters.IsNotNull}}"
             IsTabStop="False"
             Name="GalleryButton"
             Width="30" />

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

@@ -45,7 +45,8 @@
                 Foreground="{DynamicResource MainTextColor}"
                 IconHeight="17"
                 IconWidth="17"
-                IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 Width="30"
                 x:Name="GalleryButton" />
 
@@ -58,6 +59,8 @@
                 Icon="{StaticResource RefreshCcwDot}"
                 IconHeight="16"
                 IconWidth="16"
+                IsEnabled="{CompiledBinding ImageSource,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 Margin="0"
                 Name="RotateRightButton"
                 ToolTip.Tip="{CompiledBinding RotateRight,
@@ -76,6 +79,8 @@
                 Foreground="{DynamicResource MainTextColor}"
                 IconHeight="16"
                 IconWidth="16"
+                IsEnabled="{CompiledBinding ImageSource,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 Margin="0"
                 ToolTip.Tip="{CompiledBinding GetIsFlippedTranslation,
                                               Mode=OneWay}"

+ 22 - 0
src/PicView.Avalonia/Converters/ConversionHelper.cs

@@ -1,4 +1,5 @@
 using ImageMagick;
+using PicView.Avalonia.ViewModels;
 using PicView.Core.FileHandling;
 using PicView.Core.ImageDecoding;
 
@@ -69,4 +70,25 @@ internal static class ConversionHelper
         FileDeletionHelper.DeleteFileWithErrorMsg(oldPath, false);
         return newPath;
     }
+    
+    public static void DetermineIfOptimizeImageShouldBeEnabled(MainViewModel vm)
+    {
+        if (vm.FileInfo is null)
+        {
+            vm.ShouldOptimizeImageBeEnabled = false;
+            return;
+        }
+
+        if (vm.FileInfo.Extension.Equals(".jpg", StringComparison.InvariantCultureIgnoreCase)
+            || vm.FileInfo.Extension.Equals(".jpeg", StringComparison.InvariantCultureIgnoreCase)
+            || vm.FileInfo.Extension.Equals(".png", StringComparison.InvariantCultureIgnoreCase)
+            || vm.FileInfo.Extension.Equals(".gif", StringComparison.InvariantCultureIgnoreCase))
+        {
+            vm.ShouldOptimizeImageBeEnabled = true;
+        }
+        else
+        {
+            vm.ShouldOptimizeImageBeEnabled = false;
+        }
+    }
 }

+ 10 - 1
src/PicView.Avalonia/Crop/CropFunctions.cs

@@ -86,11 +86,13 @@ public static class CropFunctions
         }
         if (vm?.ImageSource is not Bitmap)
         {
+            vm.ShouldCropBeEnabled = false;
             return false;
         }
 
         if (Settings.ImageScaling.ShowImageSideBySide)
         {
+            vm.ShouldCropBeEnabled = false;
             return false;
         }
 
@@ -103,7 +105,14 @@ public static class CropFunctions
         {
             return false;
         }
+
+        if (vm.RotationAngle is 0 && vm.ScaleX is 1)
+        {
+            vm.ShouldCropBeEnabled = true;
+            return true;
+        }
         
-        return vm is { ScaleX: 1, RotationAngle: 0 };
+        vm.ShouldCropBeEnabled = false;
+        return false;
     }
 }

+ 0 - 3
src/PicView.Avalonia/Navigation/NavigationManager.cs

@@ -441,8 +441,6 @@ public static class NavigationManager
                     {
                         vm.GalleryMode = GalleryMode.ClosedToBottom;
                     }
-
-                    vm.AreNavigationButtonsEnabled = true;
                 }
                 else
                 {
@@ -967,7 +965,6 @@ public static class NavigationManager
             UpdateImage.SetStats(vm, index, imageModel);
         }
 
-        vm.AreNavigationButtonsEnabled = true;
         vm.IsLoading = false;
         await CheckAndReloadGallery(fileInfo, vm);
     }

+ 0 - 1
src/PicView.Avalonia/Navigation/UpdateImage.cs

@@ -289,7 +289,6 @@ public static class UpdateImage
         vm.Title = singeImageWindowTitles.BaseTitle;
         vm.TitleTooltip = singeImageWindowTitles.BaseTitle;
 
-        vm.AreNavigationButtonsEnabled = false;
         vm.PlatformService.StopTaskbarProgress();
 
         vm.PixelWidth = width;

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

@@ -85,7 +85,6 @@ public static class QuickLoad
         vm.IsLoading = false;
         
         NavigationManager.InitializeImageIterator(vm);
-        vm.AreNavigationButtonsEnabled = true;
         
         if (Settings.ImageScaling.ShowImageSideBySide)
         {

+ 7 - 1
src/PicView.Avalonia/ViewModels/MainViewModel.cs

@@ -483,7 +483,13 @@ public class MainViewModel : ViewModelBase
 
     #region Booleans
     
-    public bool AreNavigationButtonsEnabled
+    public bool ShouldCropBeEnabled
+    {
+        get;
+        set => this.RaiseAndSetIfChanged(ref field, value);
+    }
+    
+    public bool ShouldOptimizeImageBeEnabled
     {
         get;
         set => this.RaiseAndSetIfChanged(ref field, value);

+ 39 - 14
src/PicView.Avalonia/Views/BottomBar.axaml

@@ -18,7 +18,8 @@
                 Command="{CompiledBinding NextCommand}"
                 Header="{CompiledBinding NextImage,
                                          Mode=OneWay}"
-                IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 StaysOpenOnClick="True">
                 <MenuItem.Icon>
                     <Image
@@ -33,7 +34,8 @@
                 Command="{CompiledBinding PreviousCommand}"
                 Header="{CompiledBinding PrevImage,
                                          Mode=OneWay}"
-                IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 StaysOpenOnClick="True">
                 <MenuItem.Icon>
                     <Image
@@ -51,7 +53,8 @@
                 Command="{CompiledBinding Skip10Command}"
                 Header="{CompiledBinding AdvanceBy10Images,
                                          Mode=OneWay}"
-                IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 StaysOpenOnClick="True">
                 <MenuItem.Icon>
                     <Image
@@ -66,7 +69,8 @@
                 Command="{CompiledBinding Skip100Command}"
                 Header="{CompiledBinding AdvanceBy100Images,
                                          Mode=OneWay}"
-                IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 StaysOpenOnClick="True">
                 <MenuItem.Icon>
                     <Image
@@ -81,7 +85,8 @@
                 Command="{CompiledBinding Prev10Command}"
                 Header="{CompiledBinding GoBackBy10Images,
                                          Mode=OneWay}"
-                IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 StaysOpenOnClick="True">
                 <MenuItem.Icon>
                     <Image
@@ -96,7 +101,8 @@
                 Command="{CompiledBinding Prev100Command}"
                 Header="{CompiledBinding GoBackBy100Images,
                                          Mode=OneWay}"
-                IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
                 StaysOpenOnClick="True">
                 <MenuItem.Icon>
                     <Image
@@ -109,22 +115,29 @@
             <Separator />
 
             <!--  First Image  -->
-            <MenuItem Command="{CompiledBinding FirstCommand}" Header="{CompiledBinding FirstImage}">
+            <MenuItem
+                Command="{CompiledBinding FirstCommand}"
+                Header="{CompiledBinding FirstImage}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}">
                 <MenuItem.Icon>
                     <Image
                         Height="12"
-                        IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
                         Source="{StaticResource FirstImage}"
                         Width="12" />
                 </MenuItem.Icon>
             </MenuItem>
 
             <!--  Last Image  -->
-            <MenuItem Command="{CompiledBinding LastCommand}" Header="{CompiledBinding LastImage, Mode=OneWay}">
+            <MenuItem
+                Command="{CompiledBinding LastCommand}"
+                Header="{CompiledBinding LastImage,
+                                         Mode=OneWay}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}">
                 <MenuItem.Icon>
                     <Image
                         Height="12"
-                        IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
                         Source="{StaticResource LastImage}"
                         Width="12" />
                 </MenuItem.Icon>
@@ -133,7 +146,12 @@
             <Separator />
 
             <!--  Next folder  -->
-            <MenuItem Command="{CompiledBinding NextFolderCommand}" Header="{CompiledBinding NextFolder, Mode=OneWay}">
+            <MenuItem
+                Command="{CompiledBinding NextFolderCommand}"
+                Header="{CompiledBinding NextFolder,
+                                         Mode=OneWay}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}">
                 <MenuItem.Icon>
                     <Image
                         Height="14"
@@ -143,7 +161,12 @@
             </MenuItem>
 
             <!--  Prev folder  -->
-            <MenuItem Command="{CompiledBinding PreviousFolderCommand}" Header="{CompiledBinding PrevFolder, Mode=OneWay}">
+            <MenuItem
+                Command="{CompiledBinding PreviousFolderCommand}"
+                Header="{CompiledBinding PrevFolder,
+                                         Mode=OneWay}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}">
                 <MenuItem.Icon>
                     <Image
                         Height="14"
@@ -247,7 +270,8 @@
                     Height="25"
                     IconHeight="20"
                     IconWidth="17"
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     IsTabStop="False"
                     Width="90"
                     x:Name="PreviousButton" />
@@ -264,7 +288,8 @@
                     Height="25"
                     IconHeight="20"
                     IconWidth="17"
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     IsTabStop="False"
                     Width="90"
                     x:Name="NextButton" />

+ 97 - 24
src/PicView.Avalonia/Views/MainView.axaml

@@ -422,7 +422,8 @@
                     Command="{CompiledBinding NextCommand}"
                     Header="{CompiledBinding NextImage,
                                              Mode=OneWay}"
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Image
@@ -437,8 +438,9 @@
                     Command="{CompiledBinding PreviousCommand}"
                     Header="{CompiledBinding PrevImage,
                                              Mode=OneWay}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
                     <MenuItem.Icon>
                         <Image
                             Height="12"
@@ -454,7 +456,8 @@
                     Command="{CompiledBinding Skip10Command}"
                     Header="{CompiledBinding AdvanceBy10Images,
                                              Mode=OneWay}"
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Image
@@ -469,7 +472,8 @@
                     Command="{CompiledBinding Skip100Command}"
                     Header="{CompiledBinding AdvanceBy100Images,
                                              Mode=OneWay}"
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Image
@@ -484,7 +488,8 @@
                     Command="{CompiledBinding Prev10Command}"
                     Header="{CompiledBinding GoBackBy10Images,
                                              Mode=OneWay}"
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Image
@@ -499,7 +504,8 @@
                     Command="{CompiledBinding Prev100Command}"
                     Header="{CompiledBinding GoBackBy100Images,
                                              Mode=OneWay}"
-                    IsEnabled="{CompiledBinding AreNavigationButtonsEnabled}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Image
@@ -512,7 +518,11 @@
                 <Separator />
 
                 <!--  First Image  -->
-                <MenuItem Command="{CompiledBinding FirstCommand}" Header="{CompiledBinding FirstImage}">
+                <MenuItem
+                    Command="{CompiledBinding FirstCommand}"
+                    Header="{CompiledBinding FirstImage}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Image
                             Height="12"
@@ -522,7 +532,12 @@
                 </MenuItem>
 
                 <!--  Last Image  -->
-                <MenuItem Command="{CompiledBinding LastCommand}" Header="{CompiledBinding LastImage, Mode=OneWay}">
+                <MenuItem
+                    Command="{CompiledBinding LastCommand}"
+                    Header="{CompiledBinding LastImage,
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Image
                             Height="12"
@@ -534,7 +549,12 @@
                 <Separator />
 
                 <!--  Next folder  -->
-                <MenuItem Command="{CompiledBinding NextFolderCommand}" Header="{CompiledBinding NextFolder, Mode=OneWay}">
+                <MenuItem
+                    Command="{CompiledBinding NextFolderCommand}"
+                    Header="{CompiledBinding NextFolder,
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Image
                             Height="14"
@@ -544,7 +564,12 @@
                 </MenuItem>
 
                 <!--  Prev folder  -->
-                <MenuItem Command="{CompiledBinding PreviousFolderCommand}" Header="{CompiledBinding PrevFolder, Mode=OneWay}">
+                <MenuItem
+                    Command="{CompiledBinding PreviousFolderCommand}"
+                    Header="{CompiledBinding PrevFolder,
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Image
                             Height="14"
@@ -557,7 +582,12 @@
             <Separator />
 
             <!--  Set as wallpaper  -->
-            <MenuItem Header="{CompiledBinding SetAsWallpaper, Mode=OneWay}" x:Name="WallpaperMenuItem">
+            <MenuItem
+                Header="{CompiledBinding SetAsWallpaper,
+                                         Mode=OneWay}"
+                IsEnabled="{CompiledBinding ImageSource,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}"
+                x:Name="WallpaperMenuItem">
                 <MenuItem.Icon>
                     <Path
                         Data="{StaticResource PanoramaGeometry}"
@@ -573,7 +603,9 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Header="{CompiledBinding Fill,
-                                             Mode=OneWay}">
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="{StaticResource PanoramaGeometry}"
@@ -590,7 +622,9 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Header="{CompiledBinding Fit,
-                                             Mode=OneWay}">
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="{StaticResource PanoramaGeometry}"
@@ -607,7 +641,9 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Header="{CompiledBinding Stretch,
-                                             Mode=OneWay}">
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="{StaticResource PanoramaGeometry}"
@@ -626,7 +662,9 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Header="{CompiledBinding Center,
-                                             Mode=OneWay}">
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="{StaticResource PanoramaGeometry}"
@@ -643,7 +681,9 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Header="{CompiledBinding Tile,
-                                             Mode=OneWay}">
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="{StaticResource PanoramaGeometry}"
@@ -705,7 +745,9 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Header="{CompiledBinding FileProperties,
-                                             Mode=OneWay}">
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="{StaticResource FilePropertiesGeometry}"
@@ -739,7 +781,12 @@
                 <Separator />
 
                 <!--  Optimize image  -->
-                <MenuItem Command="{CompiledBinding OptimizeImageCommand}" Header="{CompiledBinding OptimizeImage, Mode=OneWay}">
+                <MenuItem
+                    Command="{CompiledBinding OptimizeImageCommand}"
+                    Header="{CompiledBinding OptimizeImage,
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ShouldOptimizeImageBeEnabled,
+                                                Mode=OneWay}">
                     <MenuItem.Icon>
                         <Image
                             Height="12"
@@ -755,6 +802,8 @@
                     Command="{CompiledBinding CropCommand}"
                     Header="{CompiledBinding Crop,
                                              Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ShouldCropBeEnabled,
+                                                Mode=OneWay}"
                     x:Name="CropMenuItem">
                     <MenuItem.Icon>
                         <Path
@@ -772,6 +821,8 @@
                 <MenuItem
                     Command="{CompiledBinding FlipCommand}"
                     Header="{CompiledBinding GetIsFlippedTranslation}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Path
@@ -792,6 +843,8 @@
                     Command="{CompiledBinding RotateLeftCommand}"
                     Header="{CompiledBinding RotateLeft,
                                              Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Path
@@ -808,6 +861,8 @@
                     Command="{CompiledBinding RotateRightCommand}"
                     Header="{CompiledBinding RotateRight,
                                              Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     StaysOpenOnClick="True">
                     <MenuItem.Icon>
                         <Path
@@ -828,7 +883,9 @@
                 CommandParameter="{CompiledBinding FileInfo.FullName,
                                                    FallbackValue=''}"
                 Header="{CompiledBinding DeleteFile,
-                                         Mode=OneWay}">
+                                         Mode=OneWay}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}">
                 <MenuItem.Icon>
                     <Path
                         Data="{StaticResource RecycleGeometry}"
@@ -870,7 +927,12 @@
                 </MenuItem.Icon>
 
                 <!--  Copy image  -->
-                <MenuItem Command="{CompiledBinding CopyImageCommand}" Header="{CompiledBinding CopyImage, Mode=OneWay}">
+                <MenuItem
+                    Command="{CompiledBinding CopyImageCommand}"
+                    Header="{CompiledBinding CopyImage,
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="M384 336H192c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16l140.1 0L400 115.9V320c0 8.8-7.2 16-16 16zM192 384H384c35.3 0 64-28.7 64-64V115.9c0-12.7-5.1-24.9-14.1-33.9L366.1 14.1c-9-9-21.2-14.1-33.9-14.1H192c-35.3 0-64 28.7-64 64V320c0 35.3 28.7 64 64 64zM64 128c-35.3 0-64 28.7-64 64V448c0 35.3 28.7 64 64 64H256c35.3 0 64-28.7 64-64V416H272v32c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V192c0-8.8 7.2-16 16-16H96V128H64z"
@@ -886,7 +948,9 @@
                     Command="{CompiledBinding CopyFilePathCommand}"
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
-                    Header="{Binding FileCopyPath, Mode=OneWay}">
+                    Header="{Binding FileCopyPath, Mode=OneWay}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="{StaticResource CopyGeometry}"
@@ -898,7 +962,12 @@
                 </MenuItem>
 
                 <!--  Copy base64  -->
-                <MenuItem Command="{CompiledBinding CopyBase64Command}" CommandParameter="{CompiledBinding FileInfo.FullName, FallbackValue=''}">
+                <MenuItem
+                    Command="{CompiledBinding CopyBase64Command}"
+                    CommandParameter="{CompiledBinding FileInfo.FullName,
+                                                       FallbackValue=''}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Header>
                         <TextBlock>
                             <Run Text="{CompiledBinding Copy, Mode=OneWay}" />
@@ -923,7 +992,9 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Header="{CompiledBinding DuplicateFile,
-                                             Mode=OneWay}">
+                                             Mode=OneWay}"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}">
                     <MenuItem.Icon>
                         <Path
                             Data="M448 384H256c-35.3 0-64-28.7-64-64V64c0-35.3 28.7-64 64-64H396.1c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9V320c0 35.3-28.7 64-64 64zM64 128h96v48H64c-8.8 0-16 7.2-16 16V448c0 8.8 7.2 16 16 16H256c8.8 0 16-7.2 16-16V416h48v32c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V192c0-35.3 28.7-64 64-64z"
@@ -959,7 +1030,9 @@
                 CommandParameter="{CompiledBinding FileInfo.FullName,
                                                    FallbackValue=''}"
                 Header="{CompiledBinding CopyFile,
-                                         Mode=OneWay}">
+                                         Mode=OneWay}"
+                IsEnabled="{CompiledBinding FileInfo,
+                                            Converter={x:Static ObjectConverters.IsNotNull}}">
                 <MenuItem.Icon>
                     <Path
                         Data="{StaticResource CopyGeometry}"

+ 3 - 0
src/PicView.Avalonia/Views/MainView.axaml.cs

@@ -4,6 +4,7 @@ using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Input;
 using Avalonia.Media;
+using PicView.Avalonia.Converters;
 using PicView.Avalonia.Crop;
 using PicView.Avalonia.DragAndDrop;
 using PicView.Avalonia.Input;
@@ -48,6 +49,7 @@ public partial class MainView : UserControl
             HideInterfaceLogic.AddHoverButtonEvents(AltButtonsPanel, vm);
             PointerWheelChanged += async (_, e) => await vm.ImageViewer.PreviewOnPointerWheelChanged(this, e);
             
+            
         };
     }
 
@@ -93,6 +95,7 @@ public partial class MainView : UserControl
         }
 
         CropMenuItem.IsEnabled = CropFunctions.DetermineIfShouldBeEnabled(vm);
+        ConversionHelper.DetermineIfOptimizeImageShouldBeEnabled(vm);
 
         // Set source for ChangeCtrlZoomImage
         // TODO should probably be refactored inside a command (It doesn't update the UI in the zoom view, so should be made into a command)

+ 18 - 0
src/PicView.Avalonia/Views/UC/Menus/FileMenu.axaml

@@ -54,6 +54,8 @@
                     Data="{StaticResource ReloadGeometry}"
                     IconHeight="17"
                     IconWidth="17"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding Reload,
                                                   Mode=OneWay}" />
 
@@ -66,6 +68,8 @@
                     Data="{StaticResource PrintGeometry}"
                     IconHeight="17"
                     IconWidth="17"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding Print,
                                                   Mode=OneWay}" />
 
@@ -78,6 +82,8 @@
                     Data="{StaticResource RecycleGeometry}"
                     IconHeight="17"
                     IconWidth="17"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding DeleteFile,
                                                   Mode=OneWay}" />
 
@@ -88,6 +94,8 @@
                     Data="{StaticResource SaveGeometry}"
                     IconHeight="17"
                     IconWidth="17"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding Save,
                                                   Mode=OneWay}" />
 
@@ -100,6 +108,8 @@
                     Data="{StaticResource CopyGeometry}"
                     IconHeight="17"
                     IconWidth="17"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding CopyFile,
                                                   Mode=OneWay}" />
 
@@ -112,6 +122,8 @@
                     Data="{StaticResource DuplicateGeometry}"
                     IconHeight="17"
                     IconWidth="17"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding DuplicateFile,
                                                   Mode=OneWay}" />
 
@@ -158,6 +170,8 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Height="46"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding OpenWith}">
                     <StackPanel Orientation="Horizontal">
                         <Path
@@ -181,6 +195,8 @@
                     CommandParameter="{CompiledBinding FileInfo.FullName,
                                                        FallbackValue=''}"
                     Height="46"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding ShowInFolder,
                                                   Mode=OneWay}">
                     <StackPanel Orientation="Horizontal">
@@ -202,6 +218,8 @@
                     Classes="ButtonBorder altHover"
                     Command="{CompiledBinding RenameCommand}"
                     Height="46"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding RenameFile,
                                                   Mode=OneWay}">
                     <StackPanel Orientation="Horizontal">

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

@@ -52,6 +52,8 @@
                     Height="45"
                     IconHeight="15"
                     IconWidth="15"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding RotateLeft,
                                                   Mode=OneWay}"
                     Width="45"
@@ -67,6 +69,8 @@
                     Height="45"
                     IconHeight="15"
                     IconWidth="15"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding RotateRight,
                                                   Mode=OneWay}"
                     Width="45"
@@ -84,6 +88,8 @@
                     Height="45"
                     IconHeight="15"
                     IconWidth="15"
+                    IsEnabled="{CompiledBinding ImageSource,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding GetIsFlippedTranslation,
                                                   Mode=OneWay}"
                     Width="45">
@@ -116,6 +122,8 @@
                     Canvas.Left="180"
                     Classes="noBorderHover"
                     Height="45"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding GoToImageAtSpecifiedIndex,
                                                   Mode=OneWay}"
                     Width="90"
@@ -185,6 +193,8 @@
                     Classes="ButtonBorder altHover"
                     Command="{CompiledBinding ShowSingleImageResizeWindowCommand}"
                     Height="46"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding ResizeImage,
                                                   Mode=OneWay}">
                     <StackPanel Orientation="Horizontal">
@@ -234,10 +244,10 @@
                     Classes="ButtonBorder altHover"
                     Command="{CompiledBinding CropCommand}"
                     Height="46"
-                    IsEnabled="False"
+                    IsEnabled="{CompiledBinding ShouldCropBeEnabled,
+                                                Mode=OneWay}"
                     ToolTip.Tip="{CompiledBinding Crop,
-                                                  Mode=OneWay}"
-                    x:Name="CropButton">
+                                                  Mode=OneWay}">
                     <StackPanel Orientation="Horizontal">
                         <Path
                             Data="{StaticResource CropGeometry}"
@@ -260,6 +270,8 @@
                     CommandParameter="0"
                     Foreground="{DynamicResource MainTextColor}"
                     Height="46"
+                    IsEnabled="{CompiledBinding FileInfo,
+                                                Converter={x:Static ObjectConverters.IsNotNull}}"
                     ToolTip.Tip="{CompiledBinding Slideshow,
                                                   Mode=OneWay}"
                     x:Name="SlideShowButton">

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

@@ -40,7 +40,7 @@ public partial class ImageMenu  : AnimatedMenu
             return;
         }
 
-        CropButton.IsEnabled = CropFunctions.DetermineIfShouldBeEnabled(vm);
+        CropFunctions.DetermineIfShouldBeEnabled(vm);
     }
 
     private async Task GoToPicBox_OnKeyDown(KeyEventArgs e)

+ 4 - 1
src/PicView.Avalonia/Views/UC/Menus/ToolsMenu.axaml

@@ -155,9 +155,12 @@
                     Classes="ButtonBorder altHover"
                     Command="{CompiledBinding OptimizeImageCommand}"
                     Height="46"
+                    IsEnabled="{CompiledBinding ShouldOptimizeImageBeEnabled,
+                                                Mode=OneWay}"
                     ToolTip.Tip="{CompiledBinding OptimizeImage,
                                                   Mode=OneWay}"
-                    Width="169">
+                    Width="169"
+                    x:Name="OptimizeImageButton">
                     <StackPanel Orientation="Horizontal">
                         <Image
                             Height="20"

+ 14 - 0
src/PicView.Avalonia/Views/UC/Menus/ToolsMenu.axaml.cs

@@ -1,5 +1,8 @@
 using Avalonia.Media;
+using PicView.Avalonia.Converters;
 using PicView.Avalonia.CustomControls;
+using PicView.Avalonia.ViewModels;
+using ReactiveUI;
 
 namespace PicView.Avalonia.Views.UC.Menus;
 
@@ -22,6 +25,17 @@ public partial class ToolsMenu : AnimatedMenu
             {
                 TopBorder.Background = Brushes.White;
             }
+            this.WhenAnyValue(x => x.IsOpen).Subscribe(_ => DetermineIfOptimizeImageShouldBeEnabled());
         };
     }
+
+    private void DetermineIfOptimizeImageShouldBeEnabled()
+    {
+        if (DataContext is not MainViewModel vm)
+        {
+            return;
+        }
+
+        ConversionHelper.DetermineIfOptimizeImageShouldBeEnabled(vm);
+    }
 }