Forráskód Böngészése

Image effects window, work in progress

Ruben 9 hónapja
szülő
commit
ca2d9c1e8c
36 módosított fájl, 853 hozzáadás és 47 törlés
  1. 32 1
      src/PicView.Avalonia.MacOS/App.axaml.cs
  2. 4 0
      src/PicView.Avalonia.MacOS/PicView.Avalonia.MacOS.csproj
  3. 48 0
      src/PicView.Avalonia.MacOS/Views/EffectsWindow.axaml
  4. 39 0
      src/PicView.Avalonia.MacOS/Views/EffectsWindow.axaml.cs
  5. 36 5
      src/PicView.Avalonia.Win32/App.axaml.cs
  6. 4 0
      src/PicView.Avalonia.Win32/PicView.Avalonia.Win32.csproj
  7. 90 0
      src/PicView.Avalonia.Win32/Views/EffectsWindow.axaml
  8. 77 0
      src/PicView.Avalonia.Win32/Views/EffectsWindow.axaml.cs
  9. 1 0
      src/PicView.Avalonia.Win32/Views/SingleImageResizeWindow.axaml
  10. 10 1
      src/PicView.Avalonia/CustomControls/CustomSlider.cs
  11. 4 0
      src/PicView.Avalonia/PicView.Avalonia.csproj
  12. 242 0
      src/PicView.Avalonia/PicViewTheme/Controls/Expander.axaml
  13. 5 37
      src/PicView.Avalonia/PicViewTheme/Icons.axaml
  14. 1 0
      src/PicView.Avalonia/PicViewTheme/Index.axaml
  15. 2 0
      src/PicView.Avalonia/ViewModels/MainViewModel.cs
  16. 14 0
      src/PicView.Avalonia/ViewModels/ViewModelBase.cs
  17. 102 0
      src/PicView.Avalonia/Views/EffectsView.axaml
  18. 12 0
      src/PicView.Avalonia/Views/EffectsView.axaml.cs
  19. 2 2
      src/PicView.Avalonia/Views/UC/Menus/ToolsMenu.axaml
  20. 2 0
      src/PicView.Core/Config/Languages/da.json
  21. 2 0
      src/PicView.Core/Config/Languages/de.json
  22. 2 0
      src/PicView.Core/Config/Languages/en.json
  23. 2 0
      src/PicView.Core/Config/Languages/es.json
  24. 2 0
      src/PicView.Core/Config/Languages/fr.json
  25. 2 0
      src/PicView.Core/Config/Languages/it.json
  26. 2 0
      src/PicView.Core/Config/Languages/ko.json
  27. 2 0
      src/PicView.Core/Config/Languages/pl.json
  28. 2 0
      src/PicView.Core/Config/Languages/pt-br.json
  29. 2 0
      src/PicView.Core/Config/Languages/ro.json
  30. 2 0
      src/PicView.Core/Config/Languages/ru.json
  31. 2 0
      src/PicView.Core/Config/Languages/sv.json
  32. 2 0
      src/PicView.Core/Config/Languages/tr.json
  33. 2 0
      src/PicView.Core/Config/Languages/zh-CN.json
  34. 2 0
      src/PicView.Core/Config/Languages/zh-TW.json
  35. 3 0
      src/PicView.Core/Localization/LanguageModel.cs
  36. 95 1
      src/PicView.Tests/LanguageAndSettingsUnitTest.cs

+ 32 - 1
src/PicView.Avalonia.MacOS/App.axaml.cs

@@ -26,6 +26,7 @@ public class App : Application, IPlatformSpecificService
     private AboutWindow? _aboutWindow;
     private SingleImageResizeWindow? _singleImageResizeWindow;
     private BatchResizeWindow? _batchResizeWindow;
+    private EffectsWindow? _effectsWindow;
     private MainViewModel? _vm;
 
     public override void Initialize()
@@ -268,7 +269,37 @@ public class App : Application, IPlatformSpecificService
 
     public void ShowEffectsWindow()
     {
-        // TODO: Implement ShowEffectsWindow
+        if (Dispatcher.UIThread.CheckAccess())
+        {
+            Set();
+        }
+        else
+        {
+            Dispatcher.UIThread.InvokeAsync(Set);
+        }
+        return;
+        void Set()
+        {
+            if (Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
+            {
+                return;
+            }
+            if (_effectsWindow is null)
+            {
+                _effectsWindow = new EffectsWindow
+                {
+                    DataContext = _vm,    
+                    WindowStartupLocation = WindowStartupLocation.CenterOwner,
+                };
+                _effectsWindow.Show(desktop.MainWindow);
+                _effectsWindow.Closing += (s, e) => _effectsWindow = null;
+            }
+            else
+            {
+                _effectsWindow.Activate();
+            }
+            _= FunctionsHelper.CloseMenus();
+        }
     }
 
     public void ShowSingleImageResizeWindow()

+ 4 - 0
src/PicView.Avalonia.MacOS/PicView.Avalonia.MacOS.csproj

@@ -63,6 +63,10 @@
       <DependentUpon>BatchResizeWindow.axaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Update="Views\EffectsWindow.axaml.cs">
+      <DependentUpon>EffectsWindow.axaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
   </ItemGroup>
 
 	<ItemGroup>

+ 48 - 0
src/PicView.Avalonia.MacOS/Views/EffectsWindow.axaml

@@ -0,0 +1,48 @@
+<Window
+    CanResize="False"
+    ExtendClientAreaChromeHints="SystemChrome"
+    ExtendClientAreaTitleBarHeightHint="-1"
+    SizeToContent="WidthAndHeight"
+    Title="Loading..."
+    d:DesignHeight="450"
+    d:DesignWidth="800"
+    mc:Ignorable="d"
+    x:Class="PicView.Avalonia.MacOS.Views.EffectsWindow"
+    x:DataType="viewModels:MainViewModel"
+    xmlns="https://github.com/avaloniaui"
+    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+    xmlns:viewModels="clr-namespace:PicView.Avalonia.ViewModels;assembly=PicView.Avalonia"
+    xmlns:views="clr-namespace:PicView.Avalonia.Views;assembly=PicView.Avalonia"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Design.DataContext>
+        <viewModels:MainViewModel />
+    </Design.DataContext>
+    <Border
+        BorderBrush="{DynamicResource MainBorderColor}"
+        BorderThickness="1"
+        CornerRadius="8">
+        <Panel>
+
+            <DockPanel
+                Background="{DynamicResource SecondaryBackgroundColor}"
+                Height="28"
+                PointerPressed="MoveWindow"
+                VerticalAlignment="Top">
+
+                <TextBlock
+                    Classes="txt"
+                    Text="{CompiledBinding Effects,
+                                           Mode=OneWay}"
+                    TextAlignment="Center" />
+            </DockPanel>
+
+            <views:EffectsView
+                Background="{DynamicResource WindowBackgroundColor}"
+                Margin="0,28,0,0"
+                Padding="10,5,5,10"
+                PointerPressed="MoveWindow"
+                x:Name="XEffectsView" />
+        </Panel>
+    </Border>
+</Window>

+ 39 - 0
src/PicView.Avalonia.MacOS/Views/EffectsWindow.axaml.cs

@@ -0,0 +1,39 @@
+using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.Media;
+using PicView.Core.Config;
+using PicView.Core.Localization;
+
+namespace PicView.Avalonia.MacOS.Views;
+
+public partial class EffectsWindow : Window
+{
+    public EffectsWindow()
+    {
+        InitializeComponent();
+        if (!SettingsHelper.Settings.Theme.Dark || SettingsHelper.Settings.Theme.GlassTheme)
+        {
+            XEffectsView.Background = Brushes.Transparent;
+        }
+        Loaded += delegate
+        {
+            MinWidth = MaxWidth = Width;
+            Title = $"{TranslationHelper.Translation.Effects} - PicView";
+        };
+        KeyDown += (_, e) =>
+        {
+            if (e.Key is Key.Escape)
+            {
+                Close();
+            }
+        };
+    }
+
+    private void MoveWindow(object? sender, PointerPressedEventArgs e)
+    {
+        if (VisualRoot is null) { return; }
+
+        var hostWindow = (Window)VisualRoot;
+        hostWindow?.BeginMoveDrag(e);
+    }
+}

+ 36 - 5
src/PicView.Avalonia.Win32/App.axaml.cs

@@ -33,6 +33,7 @@ public partial class App : Application, IPlatformSpecificService
     private AboutWindow? _aboutWindow;
     private SingleImageResizeWindow? _singleImageResizeWindow;
     private BatchResizeWindow? _batchResizeWindow;
+    private EffectsWindow? _effectsWindow;
     private MainViewModel? _vm;
     
     private TaskbarProgress? _taskbarProgress;
@@ -305,11 +306,6 @@ public partial class App : Application, IPlatformSpecificService
             
         }
     }
-    
-    public void ShowEffectsWindow()
-    {
-        // TODO: Implement ShowEffectsWindow
-    }
 
     public void ShowSingleImageResizeWindow()
     {
@@ -380,6 +376,41 @@ public partial class App : Application, IPlatformSpecificService
             _= FunctionsHelper.CloseMenus();
         }   
     }
+    
+    public void ShowEffectsWindow()
+    {
+        if (Dispatcher.UIThread.CheckAccess())
+        {
+            Set();
+        }
+        else
+        {
+            Dispatcher.UIThread.InvokeAsync(Set);
+        }
+        return;
+        void Set()
+        {
+            if (Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
+            {
+                return;
+            }
+            if (_effectsWindow is null)
+            {
+                _effectsWindow = new EffectsWindow
+                {
+                    DataContext = _vm,
+                    WindowStartupLocation = WindowStartupLocation.CenterOwner,    
+                };
+                _effectsWindow.Show(desktop.MainWindow);
+                _effectsWindow.Closing += (s, e) => _effectsWindow = null;
+            }
+            else
+            {
+                _effectsWindow.Show();
+            }
+            _= FunctionsHelper.CloseMenus();
+        }
+    }
 
     public void Print(string path)
     {

+ 4 - 0
src/PicView.Avalonia.Win32/PicView.Avalonia.Win32.csproj

@@ -68,6 +68,10 @@
       <DependentUpon>BatchResizeResizeWindow.axaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Update="Views\EffectsWindow.axaml.cs">
+      <DependentUpon>EffectsWindow.axaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
   </ItemGroup>
 
 	<ItemGroup>

+ 90 - 0
src/PicView.Avalonia.Win32/Views/EffectsWindow.axaml

@@ -0,0 +1,90 @@
+<Window
+    BorderThickness="1"
+    CanResize="False"
+    CornerRadius="8"
+    SizeToContent="WidthAndHeight"
+    Title="Loading..."
+    x:Class="PicView.Avalonia.Win32.Views.EffectsWindow"
+    x:DataType="viewModels:MainViewModel"
+    xmlns="https://github.com/avaloniaui"
+    xmlns:customControls="clr-namespace:PicView.Avalonia.CustomControls;assembly=PicView.Avalonia"
+    xmlns:viewModels="clr-namespace:PicView.Avalonia.ViewModels;assembly=PicView.Avalonia"
+    xmlns:views="clr-namespace:PicView.Avalonia.Views;assembly=PicView.Avalonia"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+
+    <Border
+        BorderBrush="{DynamicResource WindowBorderColor}"
+        BorderThickness="1"
+        PointerPressed="MoveWindow"
+        x:Name="ParentBorder">
+        <StackPanel>
+
+            <DockPanel Height="28" LastChildFill="True">
+
+                <Border
+                    Background="{DynamicResource WindowButtonBackgroundColor}"
+                    BorderBrush="{DynamicResource MainBorderColor}"
+                    BorderThickness="0,0,1,0"
+                    DockPanel.Dock="Left"
+                    x:Name="IconBorder">
+                    <Image
+                        Height="25"
+                        Margin="7,1,7,1"
+                        Source="{StaticResource LogoImage}"
+                        Width="20" />
+                </Border>
+
+                <customControls:IconButton
+                    Background="{DynamicResource WindowButtonBackgroundColor}"
+                    BorderThickness="0"
+                    Classes="hover"
+                    Click="Close"
+                    ClickMode="Release"
+                    Data="{StaticResource CloseGeometry}"
+                    DockPanel.Dock="Right"
+                    Foreground="{DynamicResource MainTextColor}"
+                    IconHeight="10"
+                    IconWidth="10"
+                    Width="30"
+                    x:Name="CloseButton" />
+
+                <customControls:IconButton
+                    Background="{DynamicResource WindowButtonBackgroundColor}"
+                    BorderBrush="{DynamicResource MainBorderColor}"
+                    BorderThickness="1,0,1,0"
+                    Classes="hover"
+                    Click="Minimize"
+                    Data="{StaticResource MinimizeGeometry}"
+                    DockPanel.Dock="Right"
+                    Foreground="{DynamicResource MainTextColor}"
+                    IconHeight="12"
+                    IconWidth="12"
+                    Width="30"
+                    x:Name="MinimizeButton" />
+
+                <TextBlock
+                    Background="{DynamicResource WindowSecondaryBackgroundColor}"
+                    Classes="txt"
+                    Foreground="{DynamicResource MainTextColor}"
+                    Height="28"
+                    LineHeight="28"
+                    Padding="30,0,0,0"
+                    Text="{CompiledBinding Effects}"
+                    TextAlignment="Center"
+                    x:Name="TitleText" />
+            </DockPanel>
+
+            <Rectangle
+                Fill="{DynamicResource WindowBorderColor}"
+                Height="1"
+                x:Name="BorderRectangle" />
+
+            <views:EffectsView
+                Background="{DynamicResource NoisyTexture}"
+                Focusable="True"
+                Margin="0"
+                Padding="10,2,5,10"
+                PointerPressed="MoveWindow" />
+        </StackPanel>
+    </Border>
+</Window>

+ 77 - 0
src/PicView.Avalonia.Win32/Views/EffectsWindow.axaml.cs

@@ -0,0 +1,77 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Input;
+using Avalonia.Interactivity;
+using Avalonia.Media;
+using PicView.Core.Config;
+using PicView.Core.Localization;
+
+namespace PicView.Avalonia.Win32.Views;
+
+public partial class EffectsWindow : Window
+{
+    public EffectsWindow()
+    {
+        InitializeComponent();
+        if (SettingsHelper.Settings.Theme.GlassTheme)
+        {
+            IconBorder.Background = Brushes.Transparent;
+            IconBorder.BorderThickness = new Thickness(0);
+            MinimizeButton.Background = Brushes.Transparent;
+            MinimizeButton.BorderThickness = new Thickness(0);
+            CloseButton.Background = Brushes.Transparent;
+            CloseButton.BorderThickness = new Thickness(0);
+            BorderRectangle.Height = 0;
+            TitleText.Background = Brushes.Transparent;
+            
+            if (!Application.Current.TryGetResource("SecondaryTextColor",
+                    Application.Current.RequestedThemeVariant, out var textColor))
+            {
+                return;
+            }
+
+            if (textColor is not Color color)
+            {
+                return;
+            }
+            
+            TitleText.Foreground = new SolidColorBrush(color);
+            MinimizeButton.Foreground = new SolidColorBrush(color);
+            CloseButton.Foreground = new SolidColorBrush(color);
+        }
+        else if (!SettingsHelper.Settings.Theme.Dark)
+        {
+            ParentBorder.Background = new SolidColorBrush(Color.FromArgb(114,132, 132, 132));
+        }
+        Loaded += delegate
+        {
+            MinWidth = MaxWidth = Width;
+            Title = $"{TranslationHelper.Translation.Effects}  - PicView";
+        };
+        KeyDown += (_, e) =>
+        {
+            if (e.Key is Key.Escape)
+            {
+                Close();
+            }
+        };
+    }
+
+    private void MoveWindow(object? sender, PointerPressedEventArgs e)
+    {
+        if (VisualRoot is null) { return; }
+
+        var hostWindow = (Window)VisualRoot;
+        hostWindow?.BeginMoveDrag(e);
+    }
+
+    private void Close(object? sender, RoutedEventArgs e)
+    {
+        Close();
+    }
+
+    private void Minimize(object? sender, RoutedEventArgs e)
+    {
+        WindowState = WindowState.Minimized;
+    }
+}

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

@@ -13,6 +13,7 @@
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 
     <Border
+        Background="Transparent"
         BorderBrush="{DynamicResource WindowBorderColor}"
         BorderThickness="1"
         PointerPressed="MoveWindow"

+ 10 - 1
src/PicView.Avalonia/CustomControls/CustomSlider.cs

@@ -19,7 +19,16 @@ public class CustomSlider : Slider
             // Don't scroll unintentionally
             return;
         }
-        var indexChange = e.Delta.Y > 0 ? TickFrequency : -TickFrequency;
+
+        double indexChange;
+        if (SettingsHelper.Settings.Zoom.HorizontalReverseScroll)
+        {
+            indexChange = e.Delta.Y > 0 ? -TickFrequency : TickFrequency;
+        }
+        else
+        {
+            indexChange = e.Delta.Y < 0 ? -TickFrequency : TickFrequency;
+        }
         Value += indexChange;
     }
 }

+ 4 - 0
src/PicView.Avalonia/PicView.Avalonia.csproj

@@ -88,6 +88,10 @@
       <DependentUpon>DeleteDialog.axaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Update="Views\EffectsView.axaml.cs">
+      <DependentUpon>EffectsView.axaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
   </ItemGroup>
 
   

+ 242 - 0
src/PicView.Avalonia/PicViewTheme/Controls/Expander.axaml

@@ -0,0 +1,242 @@
+<ResourceDictionary
+    x:ClassModifier="internal"
+    xmlns="https://github.com/avaloniaui"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+
+    <ControlTheme TargetType="ToggleButton" x:Key="SimpleExpanderToggleButtonTheme">
+        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
+        <Setter Property="Background" Value="Transparent" />
+        <Setter Property="Template">
+            <ControlTemplate>
+                <Panel Name="PART_toggle">
+                    <ContentPresenter
+                        Background="Transparent"
+                        Content="{TemplateBinding Content}"
+                        ContentTemplate="{Binding $parent[Expander].HeaderTemplate}"
+                        HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+                        Name="PART_ContentPresenter"
+                        Padding="{TemplateBinding Padding}"
+                        VerticalAlignment="Center"
+                        VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
+                    <Border
+                        Height="20"
+                        HorizontalAlignment="Right"
+                        VerticalAlignment="Center"
+                        Width="20">
+                        <Image
+                            Height="12"
+                            Source="{StaticResource ChevronDownImage}"
+                            Width="12" />
+                    </Border>
+                </Panel>
+            </ControlTemplate>
+        </Setter>
+
+        <Style Selector="^:pointerover /template/ Panel#PART_toggle">
+            <Style.Animations>
+                <Animation Duration="{StaticResource ButtonHoverAnimationDuration}" IterationCount="1">
+                    <KeyFrame>
+                        <Setter Property="Background">
+                            <SolidColorBrush Color="{DynamicResource SecondaryBackgroundColor}" />
+                        </Setter>
+                    </KeyFrame>
+                    <KeyFrame Cue="1">
+                        <Setter Property="Background">
+                            <SolidColorBrush Color="{DynamicResource AltBackgroundHoverColor}" />
+                        </Setter>
+                    </KeyFrame>
+                </Animation>
+            </Style.Animations>
+            <Setter Property="Background" Value="{DynamicResource AltBackgroundHoverColor}" />
+        </Style>
+
+    </ControlTheme>
+    <ControlTheme
+        BasedOn="{StaticResource SimpleExpanderToggleButtonTheme}"
+        TargetType="ToggleButton"
+        x:Key="SimpleExpanderToggleButtonUpTheme">
+        <Style Selector="^ /template/ Path">
+            <Setter Property="RenderTransform">
+                <RotateTransform Angle="-90" />
+            </Setter>
+        </Style>
+    </ControlTheme>
+    <ControlTheme
+        BasedOn="{StaticResource SimpleExpanderToggleButtonTheme}"
+        TargetType="ToggleButton"
+        x:Key="SimpleExpanderToggleButtonDownTheme">
+        <Style Selector="^ /template/ Image">
+            <Setter Property="RenderTransform">
+                <RotateTransform Angle="90" />
+            </Setter>
+        </Style>
+    </ControlTheme>
+    <ControlTheme
+        BasedOn="{StaticResource SimpleExpanderToggleButtonTheme}"
+        TargetType="ToggleButton"
+        x:Key="SimpleExpanderToggleButtonLeftTheme">
+        <Style Selector="^ /template/ Image">
+            <Setter Property="RenderTransform">
+                <RotateTransform Angle="180" />
+            </Setter>
+        </Style>
+    </ControlTheme>
+    <ControlTheme
+        BasedOn="{StaticResource SimpleExpanderToggleButtonTheme}"
+        TargetType="ToggleButton"
+        x:Key="SimpleExpanderToggleButtonRightTheme">
+        <Style Selector="^ /template/ Image">
+            <Setter Property="RenderTransform">
+                <RotateTransform Angle="0" />
+            </Setter>
+        </Style>
+    </ControlTheme>
+
+    <ControlTheme TargetType="Expander" x:Key="{x:Type Expander}">
+        <Setter Property="ContentTransition">
+            <Setter.Value>
+                <CrossFade Duration="00:00:00.25" />
+            </Setter.Value>
+        </Setter>
+        <Style Selector="^[ExpandDirection=Down]">
+            <Setter Property="Template">
+                <ControlTemplate>
+                    <Border
+                        Background="{TemplateBinding Background}"
+                        BorderBrush="{TemplateBinding BorderBrush}"
+                        BorderThickness="{TemplateBinding BorderThickness}"
+                        CornerRadius="{TemplateBinding CornerRadius}">
+                        <Grid RowDefinitions="Auto,*">
+                            <ToggleButton
+                                Content="{TemplateBinding Header}"
+                                Grid.Row="0"
+                                HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
+                                IsChecked="{TemplateBinding IsExpanded,
+                                                            Mode=TwoWay}"
+                                Name="PART_toggle"
+                                Theme="{StaticResource SimpleExpanderToggleButtonRightTheme}"
+                                VerticalAlignment="{TemplateBinding VerticalAlignment}" />
+                            <ContentPresenter
+                                Content="{TemplateBinding Content}"
+                                ContentTemplate="{TemplateBinding ContentTemplate}"
+                                Grid.Row="1"
+                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+                                IsVisible="{TemplateBinding IsExpanded}"
+                                Name="PART_ContentPresenter"
+                                Padding="{TemplateBinding Padding}"
+                                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
+                        </Grid>
+                    </Border>
+                </ControlTemplate>
+            </Setter>
+            <Style Selector="^:expanded /template/ ToggleButton#PART_toggle">
+                <Setter Property="Theme" Value="{StaticResource SimpleExpanderToggleButtonDownTheme}" />
+            </Style>
+        </Style>
+        <Style Selector="^[ExpandDirection=Up]">
+            <Setter Property="Template">
+                <ControlTemplate>
+                    <Border
+                        Background="{TemplateBinding Background}"
+                        BorderBrush="{TemplateBinding BorderBrush}"
+                        BorderThickness="{TemplateBinding BorderThickness}"
+                        CornerRadius="{TemplateBinding CornerRadius}">
+                        <Grid RowDefinitions="*,Auto">
+                            <ToggleButton
+                                Content="{TemplateBinding Header}"
+                                Grid.Row="1"
+                                HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
+                                IsChecked="{TemplateBinding IsExpanded,
+                                                            Mode=TwoWay}"
+                                Name="PART_toggle"
+                                Theme="{StaticResource SimpleExpanderToggleButtonRightTheme}"
+                                VerticalAlignment="{TemplateBinding VerticalAlignment}" />
+                            <ContentPresenter
+                                Content="{TemplateBinding Content}"
+                                ContentTemplate="{TemplateBinding ContentTemplate}"
+                                Grid.Row="0"
+                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+                                IsVisible="{TemplateBinding IsExpanded}"
+                                Name="PART_ContentPresenter"
+                                Padding="{TemplateBinding Padding}"
+                                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
+                        </Grid>
+                    </Border>
+                </ControlTemplate>
+            </Setter>
+            <Style Selector="^:expanded /template/ ToggleButton#PART_toggle">
+                <Setter Property="Theme" Value="{StaticResource SimpleExpanderToggleButtonUpTheme}" />
+            </Style>
+        </Style>
+        <Style Selector="^[ExpandDirection=Right]">
+            <Setter Property="Template">
+                <ControlTemplate>
+                    <Border
+                        Background="{TemplateBinding Background}"
+                        BorderBrush="{TemplateBinding BorderBrush}"
+                        BorderThickness="{TemplateBinding BorderThickness}"
+                        CornerRadius="{TemplateBinding CornerRadius}">
+                        <Grid ColumnDefinitions="Auto,*">
+                            <ToggleButton
+                                Content="{TemplateBinding Header}"
+                                Grid.Column="0"
+                                HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
+                                IsChecked="{TemplateBinding IsExpanded,
+                                                            Mode=TwoWay}"
+                                Name="PART_toggle"
+                                Theme="{StaticResource SimpleExpanderToggleButtonLeftTheme}"
+                                VerticalAlignment="{TemplateBinding VerticalAlignment}" />
+                            <ContentPresenter
+                                Content="{TemplateBinding Content}"
+                                ContentTemplate="{TemplateBinding ContentTemplate}"
+                                Grid.Column="1"
+                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+                                IsVisible="{TemplateBinding IsExpanded}"
+                                Name="PART_ContentPresenter"
+                                Padding="{TemplateBinding Padding}"
+                                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
+                        </Grid>
+                    </Border>
+                </ControlTemplate>
+            </Setter>
+            <Style Selector="^:expanded /template/ ToggleButton#PART_toggle">
+                <Setter Property="Theme" Value="{StaticResource SimpleExpanderToggleButtonRightTheme}" />
+            </Style>
+        </Style>
+        <Style Selector="^[ExpandDirection=Left]">
+            <Setter Property="Template">
+                <ControlTemplate>
+                    <Border
+                        Background="{TemplateBinding Background}"
+                        BorderBrush="{TemplateBinding BorderBrush}"
+                        BorderThickness="{TemplateBinding BorderThickness}"
+                        CornerRadius="{TemplateBinding CornerRadius}">
+                        <Grid ColumnDefinitions="*,Auto">
+                            <ToggleButton
+                                Content="{TemplateBinding Header}"
+                                Grid.Column="1"
+                                HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
+                                IsChecked="{TemplateBinding IsExpanded,
+                                                            Mode=TwoWay}"
+                                Name="PART_toggle"
+                                Theme="{StaticResource SimpleExpanderToggleButtonRightTheme}"
+                                VerticalAlignment="{TemplateBinding VerticalAlignment}" />
+                            <ContentPresenter
+                                Content="{TemplateBinding Content}"
+                                ContentTemplate="{TemplateBinding ContentTemplate}"
+                                Grid.Column="0"
+                                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+                                IsVisible="{TemplateBinding IsExpanded}"
+                                Name="PART_ContentPresenter"
+                                Padding="{TemplateBinding Padding}"
+                                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
+                        </Grid>
+                    </Border>
+                </ControlTemplate>
+            </Setter>
+            <Style Selector="^:expanded /template/ ToggleButton#PART_toggle">
+                <Setter Property="Theme" Value="{StaticResource SimpleExpanderToggleButtonLeftTheme}" />
+            </Style>
+        </Style>
+    </ControlTheme>
+</ResourceDictionary>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 5 - 37
src/PicView.Avalonia/PicViewTheme/Icons.axaml


+ 1 - 0
src/PicView.Avalonia/PicViewTheme/Index.axaml

@@ -14,6 +14,7 @@
                 <ResourceInclude Source="Controls/CheckBox.axaml" />
                 <ResourceInclude Source="Controls/ComboBox.axaml" />
                 <ResourceInclude Source="Controls/ComboBoxItem.axaml" />
+                <ResourceInclude Source="Controls/Expander.axaml" />
                 <ResourceInclude Source="Controls/FlyoutPresenter.axaml" />
                 <ResourceInclude Source="Controls/ListBox.axaml" />
                 <ResourceInclude Source="Controls/ListBoxItem.axaml" />

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

@@ -418,6 +418,7 @@ public class MainViewModel : ViewModelBase
     public ReactiveCommand<Unit, Unit>? ShowKeybindingsWindowCommand { get; }
     public ReactiveCommand<Unit, Unit>? ShowBatchResizeWindowCommand { get; }
     public ReactiveCommand<Unit, Unit>? ShowSingleImageResizeWindowCommand { get; }
+    public ReactiveCommand<Unit, Unit>? ShowEffectsWindowCommand { get; }
     public ReactiveCommand<Unit, Unit>? SetExifRating0Command { get; }
     public ReactiveCommand<Unit, Unit>? SetExifRating1Command { get; }
     public ReactiveCommand<Unit, Unit>? SetExifRating2Command { get; }
@@ -1542,6 +1543,7 @@ public class MainViewModel : ViewModelBase
         ShowAboutWindowCommand = ReactiveCommand.Create(platformSpecificService.ShowAboutWindow);
         ShowBatchResizeWindowCommand = ReactiveCommand.Create(platformSpecificService.ShowBatchResizeWindow);
         ShowSingleImageResizeWindowCommand = ReactiveCommand.Create(platformSpecificService.ShowSingleImageResizeWindow);
+        ShowEffectsWindowCommand = ReactiveCommand.Create(platformSpecificService.ShowEffectsWindow);
         #endregion Window commands
 
         #region Navigation Commands

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

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

+ 102 - 0
src/PicView.Avalonia/Views/EffectsView.axaml

@@ -0,0 +1,102 @@
+<UserControl
+    x:Class="PicView.Avalonia.Views.EffectsView"
+    x:DataType="viewModels:MainViewModel"
+    xmlns="https://github.com/avaloniaui"
+    xmlns:customControls="clr-namespace:PicView.Avalonia.CustomControls"
+    xmlns:viewModels="clr-namespace:PicView.Avalonia.ViewModels"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+
+    <StackPanel Width="500">
+        <Expander Margin="0,15,0,10">
+            <Expander.Header>
+                <TextBlock
+                    Classes="txt"
+                    FontFamily="/Assets/Fonts/Roboto-Bold.ttf#Roboto"
+                    FontSize="14"
+                    Padding="10,5"
+                    Text="{CompiledBinding Lighting}" />
+            </Expander.Header>
+            <StackPanel Margin="15,20">
+
+                <!--  Brightness  -->
+                <Panel>
+                    <TextBlock
+                        Classes="txt"
+                        HorizontalAlignment="Left"
+                        Text="{CompiledBinding Brightness}"
+                        VerticalAlignment="Center" />
+                    <TextBlock
+                        Classes="txt"
+                        HorizontalAlignment="Right"
+                        Text="{Binding Path=Value, ElementName=BrightnessSlider}"
+                        VerticalAlignment="Center" />
+                </Panel>
+
+                <customControls:CustomSlider
+                    Height="30"
+                    IsSnapToTickEnabled="True"
+                    LargeChange="5"
+                    Margin="0,1,0,1"
+                    Maximum="100"
+                    Minimum="0"
+                    SmallChange="1"
+                    TickFrequency="1"
+                    x:Name="BrightnessSlider" />
+
+                <!--  Contrast  -->
+                <Panel Margin="0,10">
+                    <TextBlock
+                        Classes="txt"
+                        HorizontalAlignment="Left"
+                        Text="{CompiledBinding Contrast}"
+                        VerticalAlignment="Center" />
+                    <TextBlock
+                        Classes="txt"
+                        HorizontalAlignment="Right"
+                        Text="{Binding Path=Value, ElementName=ContrastSlider}"
+                        VerticalAlignment="Center" />
+                </Panel>
+
+                <customControls:CustomSlider
+                    Height="30"
+                    IsSnapToTickEnabled="True"
+                    LargeChange="5"
+                    Margin="0,1,0,1"
+                    Maximum="100"
+                    Minimum="0"
+                    SmallChange="1"
+                    TickFrequency="1"
+                    x:Name="ContrastSlider" />
+
+
+                <!--  Gamma  -->
+                <Panel Margin="0,10">
+                    <TextBlock
+                        Classes="txt"
+                        HorizontalAlignment="Left"
+                        Text="{CompiledBinding Gamma}"
+                        VerticalAlignment="Center" />
+                    <TextBlock
+                        Classes="txt"
+                        HorizontalAlignment="Right"
+                        Text="{Binding Path=Value, ElementName=GammaSlider}"
+                        VerticalAlignment="Center" />
+                </Panel>
+
+                <customControls:CustomSlider
+                    Height="30"
+                    IsSnapToTickEnabled="True"
+                    LargeChange="5"
+                    Margin="0,1,0,1"
+                    Maximum="100"
+                    Minimum="0"
+                    SmallChange="1"
+                    TickFrequency="1"
+                    x:Name="GammaSlider" />
+
+
+            </StackPanel>
+
+        </Expander>
+    </StackPanel>
+</UserControl>

+ 12 - 0
src/PicView.Avalonia/Views/EffectsView.axaml.cs

@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace PicView.Avalonia.Views;
+
+public partial class EffectsView : UserControl
+{
+    public EffectsView()
+    {
+        InitializeComponent();
+        Loaded += (_, _) => { };
+    }
+}

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

@@ -74,9 +74,9 @@
                     BorderBrush="{DynamicResource MainBorderColor}"
                     BorderThickness="0,0,1,0"
                     Canvas.Left="179"
-                    Classes="altHover"
+                    Classes="noBorderHover"
+                    Command="{CompiledBinding ShowEffectsWindowCommand}"
                     Height="45"
-                    IsEnabled="False"
                     ToolTip.Tip="{CompiledBinding EffectsTooltip,
                                                   Mode=OneWay}"
                     Width="136">

+ 2 - 0
src/PicView.Core/Config/Languages/da.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Fuldskærm",
   "GallerySettings": "Galleriindstillinger",
   "GalleryThumbnailStretch": "Udstrækning af galleribilleder",
+  "Gamma": "Gamma",
   "GeneralSettings": "Generale Indstillinger",
   "GenerateThumbnails": "Generer thumbnails",
   "GithubRepo": "Github side",
@@ -188,6 +189,7 @@
   "LensModel": "Linse model",
   "LightSource": "Lyskilde",
   "LightTheme": "Lyst tema",
+  "Lighting": "Belysning",
   "Loading": "Indlæser...",
   "Longitude": "Længdegrad",
   "Looping": "Loopning",

+ 2 - 0
src/PicView.Core/Config/Languages/de.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Vollbild",
   "GallerySettings": "Galerie Einstellungen",
   "GalleryThumbnailStretch": "Miniaturansicht-Verhältnis",
+  "Gamma": "Gamma",
   "GeneralSettings": "Allgemeine Einstellungen",
   "GenerateThumbnails": "Miniaturansichten generieren",
   "GithubRepo": "Github-Repository",
@@ -188,6 +189,7 @@
   "LensModel": "Objektivmodell",
   "LightSource": "Lichtquelle",
   "LightTheme": "Hell",
+  "Lighting": "Beleuchtung",
   "Loading": "Lädt...",
   "Longitude": "Längengrad",
   "Looping": "Schleife",

+ 2 - 0
src/PicView.Core/Config/Languages/en.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Fullscreen",
   "GallerySettings": "Gallery settings",
   "GalleryThumbnailStretch": "Gallery thumbnail stretch",
+  "Gamma": "Gamma",
   "GeneralSettings": "General Settings",
   "GenerateThumbnails": "Generate thumbnails",
   "GithubRepo": "Github repository",
@@ -188,6 +189,7 @@
   "LensModel": "Lens model",
   "LightSource": "Light source",
   "LightTheme": "Light theme",
+  "Lighting": "Lighting",
   "Loading": "Loading...",
   "Longitude": "Longitude",
   "Looping": "Looping",

+ 2 - 0
src/PicView.Core/Config/Languages/es.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Pantalla Completa",
   "GallerySettings": "Configuración de la Galería",
   "GalleryThumbnailStretch": "Estiramiento de la miniatura de la galería",
+  "Gamma": "Gamma",
   "GeneralSettings": "Opciones Generales",
   "GenerateThumbnails": "Generar miniaturas",
   "GithubRepo": "Repositorio de Github",
@@ -187,6 +188,7 @@
   "LensModel": "Modelo de lente",
   "LightSource": "Fuente de luz",
   "LightTheme": "Tema claro",
+  "Lighting": "Iluminación",
   "Loading": "Cargando...",
   "Longitude": "Longitud",
   "Looping": "Bucle",

+ 2 - 0
src/PicView.Core/Config/Languages/fr.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Plein Ecran",
   "GallerySettings": "Paramètres de la galerie",
   "GalleryThumbnailStretch": "Élargissement des miniatures de la galerie",
+  "Gamma": "Gamma",
   "GeneralSettings": "Paramètres généraux",
   "GenerateThumbnails": "Générer des miniatures",
   "GithubRepo": "Référentiel GitHub",
@@ -188,6 +189,7 @@
   "LensModel": "Modèle de l'objectif",
   "LightSource": "Source de lumière",
   "LightTheme": "Thème clair",
+  "Lighting": "Éclairage",
   "Loading": "Chargement ...",
   "Longitude": "Longitude",
   "Looping": "Boucle",

+ 2 - 0
src/PicView.Core/Config/Languages/it.json

@@ -150,6 +150,7 @@
   "Fullscreen": "A schermo intero",
   "GallerySettings": "Impostazioni della galleria",
   "GalleryThumbnailStretch": "Estensione della miniatura della galleria",
+  "Gamma": "Gamma",
   "GeneralSettings": "Impostazioni generali",
   "GenerateThumbnails": "Genera le miniature",
   "GithubRepo": "Repository Github",
@@ -188,6 +189,7 @@
   "LensModel": "Modello di lente",
   "LightSource": "Sorgente luminosa",
   "LightTheme": "Tema chiaro",
+  "Lighting": "Illuminazione",
   "Loading": "Caricamento in corso...",
   "Longitude": "Longitudine",
   "Looping": "Ciclo",

+ 2 - 0
src/PicView.Core/Config/Languages/ko.json

@@ -150,6 +150,7 @@
   "Fullscreen": "전체 화면",
   "GallerySettings": "갤러리 설정",
   "GalleryThumbnailStretch": "썸네일 스크립트",
+  "Gamma": "감마",
   "GeneralSettings": "일반 설정",
   "GenerateThumbnails": "썸네일 생성",
   "GithubRepo": "Github 저장소",
@@ -188,6 +189,7 @@
   "LensModel": "렌즈 모델",
   "LightSource": "광원",
   "LightTheme": "밝은 테마",
+  "Lighting": "조명",
   "Loading": "불러오는 중...",
   "Longitude": "경도",
   "Looping": "순환",

+ 2 - 0
src/PicView.Core/Config/Languages/pl.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Pełny ekran",
   "GallerySettings": "Ustawienia galerii",
   "GalleryThumbnailStretch": "Przytnij miniatury",
+  "Gamma": "Gamma",
   "GeneralSettings": "Ustawienia ogólne",
   "GenerateThumbnails": "Generuj miniatury",
   "GithubRepo": "Repozytorium na Github",
@@ -188,6 +189,7 @@
   "LensModel": "Model obiektywu",
   "LightSource": "Źródło światła",
   "LightTheme": "Jasny motyw",
+  "Lighting": "Oświetlenie",
   "Loading": "Ładowanie...",
   "Longitude": "Długość geograficzna",
   "Looping": "Zapętlanie",

+ 2 - 0
src/PicView.Core/Config/Languages/pt-br.json

@@ -151,6 +151,7 @@
   "Fullscreen": "Tela cheia",
   "GallerySettings": "Configurações da galeria",
   "GalleryThumbnailStretch": "Ampliação da miniatura da galeria",
+  "Gamma": "Gamma",
   "GeneralSettings": "Configurações gerais",
   "GenerateThumbnails": "Gerar miniaturas",
   "GithubRepo": "Repositório no Github",
@@ -189,6 +190,7 @@
   "LensModel": "Modelo da lente",
   "LightSource": "Fonte da luz",
   "LightTheme": "Tema claro",
+  "Lighting": "Iluminação",
   "Loading": "Carregando...",
   "Longitude": "Longitude",
   "Looping": "Repetição",

+ 2 - 0
src/PicView.Core/Config/Languages/ro.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Ecran complet",
   "GallerySettings": "Setări de galerie",
   "GalleryThumbnailStretch": "Extinde miniaturile de gallerie",
+  "Gamma": "Gamma",
   "GeneralSettings": "Setări generale",
   "GenerateThumbnails": "Generare miniaturi",
   "GithubRepo": "Depozit GitHub",
@@ -188,6 +189,7 @@
   "LensModel": "Model obiectiv",
   "LightSource": "Sursă de lumină",
   "LightTheme": "Temă luminoasă",
+  "Lighting": "Iluminare",
   "Loading": "Se încarcă...",
   "Longitude": "Longitudine",
   "Looping": "Repetare",

+ 2 - 0
src/PicView.Core/Config/Languages/ru.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Весь экран",
   "GallerySettings": "Настройки галерей",
   "GalleryThumbnailStretch": "Растягивание миниатюр",
+  "Gamma": "Гамма",
   "GeneralSettings": "Общие настройки",
   "GenerateThumbnails": "Генерировать миниатюры",
   "GithubRepo": "Репозиторий Github",
@@ -188,6 +189,7 @@
   "LensModel": "Модель объектива",
   "LightSource": "Источник света",
   "LightTheme": "Светлая тема",
+  "Lighting": "Освещение",
   "Loading": "Загрузка...",
   "Longitude": "Долгота",
   "Looping": "Зацикливание",

+ 2 - 0
src/PicView.Core/Config/Languages/sv.json

@@ -151,6 +151,7 @@
   "Fullscreen": "Fullskärm",
   "GallerySettings": "Inställningar galleri",
   "GalleryThumbnailStretch": "Sträck tumnaglar i galleriet",
+  "Gamma": "Gamma",
   "GeneralSettings": "Generella inställningar",
   "GenerateThumbnails": "Generera tumnaglar",
   "GithubRepo": "Github-repository",
@@ -189,6 +190,7 @@
   "LensModel": "Linsmodell",
   "LightSource": "Ljuskälla",
   "LightTheme": "Ljust tema",
+  "Lighting": "Belysning",
   "Loading": "Laddar...",
   "Longitude": "Longitud",
   "Looping": "Slinga",

+ 2 - 0
src/PicView.Core/Config/Languages/tr.json

@@ -150,6 +150,7 @@
   "Fullscreen": "Tam ekran",
   "GallerySettings": "Galeri ayarları",
   "GalleryThumbnailStretch": "Galeri küçük resmi esnetme",
+  "Gamma": "Gamma",
   "GeneralSettings": "Genel ayarlar",
   "GenerateThumbnails": "Küçük resimler oluştur",
   "GithubRepo": "Github deposu",
@@ -188,6 +189,7 @@
   "LensModel": "Lens modeli",
   "LightSource": "Işık kaynağı",
   "LightTheme": "Aydınlık tema",
+  "Lighting": "Aydınlatma",
   "Loading": "Yükleniyor...",
   "Longitude": "Boylam",
   "Looping": "Döngü",

+ 2 - 0
src/PicView.Core/Config/Languages/zh-CN.json

@@ -150,6 +150,7 @@
   "Fullscreen": "全屏",
   "GallerySettings": "图库设置",
   "GalleryThumbnailStretch": "图库缩略图拉伸",
+  "Gamma": "伽马",
   "GeneralSettings": "常规设置",
   "GenerateThumbnails": "生成缩略图",
   "GithubRepo": "Github 仓库",
@@ -188,6 +189,7 @@
   "LensModel": "镜头型号",
   "LightSource": "光源",
   "LightTheme": "亮色主题",
+  "Lighting": "照明",
   "Loading": "正在加载...",
   "Longitude": "经度",
   "Looping": "循环",

+ 2 - 0
src/PicView.Core/Config/Languages/zh-TW.json

@@ -150,6 +150,7 @@
   "Fullscreen": "全螢幕",
   "GallerySettings": "圖庫設定",
   "GalleryThumbnailStretch": "縮放縮圖",
+  "Gamma": "伽馬",
   "GeneralSettings": "常規設定",
   "GenerateThumbnails": "生成縮圖",
   "GithubRepo": "Github",
@@ -188,6 +189,7 @@
   "LensModel": "鏡頭型號",
   "LightSource": "光源",
   "LightTheme": "亮色主題",
+  "Lighting": "照明",
   "Loading": "載入中...",
   "Longitude": "經度",
   "Looping": "迴圈",

+ 3 - 0
src/PicView.Core/Localization/LanguageModel.cs

@@ -399,4 +399,7 @@ public record LanguageModel
     public string? ShowConfirmationOnEsc { get; set; }
     
     public string? PermanentlyDelete { get; set; }
+    
+    public string? Lighting { get; set; }
+    public string? Gamma { get; set; }
 }

+ 95 - 1
src/PicView.Tests/LanguageAndSettingsUnitTest.cs

@@ -60,9 +60,103 @@ public class LanguageAndSettingsUnitTest
     {
         var exists = await TranslationHelper.LoadLanguage("en");
         Assert.True(exists);
+        
+        // Window titles
+        Assert.Equal("About", TranslationHelper.GetTranslation("About"));
+        Assert.Equal("Settings", TranslationHelper.GetTranslation("Settings"));
+        
+        // Clipboard
+        Assert.Equal("Added to clipboard", TranslationHelper.GetTranslation("AddedToClipboard"));
+        Assert.Equal("Copy", TranslationHelper.GetTranslation("Copy"));
+        Assert.Equal("Paste", TranslationHelper.GetTranslation("Paste"));
+        
+        // EXIF data
+        Assert.Equal("ActionProgram", TranslationHelper.GetTranslation("ActionProgram"));
+        Assert.Equal("Camera maker", TranslationHelper.GetTranslation("CameraMaker"));
+        
+        // Basic UI elements
         Assert.Equal("Image", TranslationHelper.GetTranslation("Image"));
         Assert.Equal("files", TranslationHelper.GetTranslation("Files"));
-        Assert.Equal("Settings", TranslationHelper.GetTranslation("Settings"));
+
+        
+        // Image operations
+        Assert.Equal("Zoom in", TranslationHelper.GetTranslation("ZoomIn"));
+        Assert.Equal("Zoom out", TranslationHelper.GetTranslation("ZoomOut"));
+        Assert.Equal("Rotate left", TranslationHelper.GetTranslation("RotateLeft"));
+        Assert.Equal("Rotate right", TranslationHelper.GetTranslation("RotateRight"));
+        
+        // Slideshow
+        Assert.Equal("Start slideshow", TranslationHelper.GetTranslation("StartSlideshow"));
+        Assert.Equal("Adjust timing for slideshow", TranslationHelper.GetTranslation("AdjustTimingForSlideshow"));
+        Assert.Equal("Slideshow", TranslationHelper.GetTranslation("Slideshow"));
+        
+        // Zoom
+        Assert.Equal("Adjust zooming speed", TranslationHelper.GetTranslation("AdjustTimingForZoom"));
+        Assert.Equal("Avoid zooming out the image when it is already at the maximum size", TranslationHelper.GetTranslation("AllowZoomOut"));
+        Assert.Equal("Reset zoom", TranslationHelper.GetTranslation("ResetZoom"));
+        Assert.Equal("Zoom", TranslationHelper.GetTranslation("Zoom"));
+        Assert.Equal("Zoom in", TranslationHelper.GetTranslation("ZoomIn"));
+        Assert.Equal("Zoom out", TranslationHelper.GetTranslation("ZoomOut"));
+        Assert.Equal("Ctrl to zoom, scroll to navigate", TranslationHelper.GetTranslation("CtrlToZoom"));
+        Assert.Equal("Zoom with mousewheel, navigate with Ctrl", TranslationHelper.GetTranslation("ScrollToZoom"));
+        
+        // File operations
+        Assert.Equal("Save", TranslationHelper.GetTranslation("Save"));
+        Assert.Equal("Save as", TranslationHelper.GetTranslation("SaveAs"));
+        Assert.Equal("Open", TranslationHelper.GetTranslation("Open"));
+        Assert.Equal("Delete file", TranslationHelper.GetTranslation("DeleteFile"));
+        
+        // Navigation
+        Assert.Equal("Next image", TranslationHelper.GetTranslation("NextImage"));
+        Assert.Equal("Previous image", TranslationHelper.GetTranslation("PrevImage"));
+        Assert.Equal("First image", TranslationHelper.GetTranslation("FirstImage"));
+        Assert.Equal("Last image", TranslationHelper.GetTranslation("LastImage"));
+        Assert.Equal("Adjust speed when key is held down", TranslationHelper.GetTranslation("AdjustNavSpeed"));
+        
+        // Window controls
+        Assert.Equal("Fullscreen", TranslationHelper.GetTranslation("Fullscreen"));
+        Assert.Equal("Minimize", TranslationHelper.GetTranslation("Minimize"));
+        Assert.Equal("Maximize", TranslationHelper.GetTranslation("Maximize"));
+        Assert.Equal("Close", TranslationHelper.GetTranslation("Close"));
+        
+        // Ratings
+        Assert.Equal("1 star rating", TranslationHelper.GetTranslation("_1Star"));
+        Assert.Equal("2 star rating", TranslationHelper.GetTranslation("_2Star"));
+        Assert.Equal("3 star rating", TranslationHelper.GetTranslation("_3Star"));
+        Assert.Equal("4 star rating", TranslationHelper.GetTranslation("_4Star"));
+        Assert.Equal("5 star rating", TranslationHelper.GetTranslation("_5Star"));
+        
+        // Error messages
+        Assert.Equal("Loading...", TranslationHelper.GetTranslation("Loading"));
+        Assert.Equal("No image loaded", TranslationHelper.GetTranslation("NoImage"));
+        Assert.Equal("Unsupported file", TranslationHelper.GetTranslation("UnsupportedFile"));
+        
+        // Theme settings
+        Assert.Equal("Dark theme", TranslationHelper.GetTranslation("DarkTheme"));
+        Assert.Equal("Light theme", TranslationHelper.GetTranslation("LightTheme"));
+        Assert.Equal("Glass Theme", TranslationHelper.GetTranslation("GlassTheme"));
+        
+        // Gallery settings
+        Assert.Equal("Show bottom gallery", TranslationHelper.GetTranslation("ShowBottomGallery"));
+        Assert.Equal("Hide bottom gallery", TranslationHelper.GetTranslation("HideBottomGallery"));
+        Assert.Equal("Gallery settings", TranslationHelper.GetTranslation("GallerySettings"));
+        
+        // Image effects
+        Assert.Equal("Effects", TranslationHelper.GetTranslation("Effects"));
+        Assert.Equal("Black & White", TranslationHelper.GetTranslation("BlackAndWhite"));
+        Assert.Equal("Blur", TranslationHelper.GetTranslation("Blur"));
+        Assert.Equal("Brightness", TranslationHelper.GetTranslation("Brightness"));
+        Assert.Equal("Contrast", TranslationHelper.GetTranslation("Contrast"));
+        
+        // Image info
+        Assert.Equal("Width", TranslationHelper.GetTranslation("Width"));
+        Assert.Equal("Height", TranslationHelper.GetTranslation("Height"));
+        Assert.Equal("Resolution", TranslationHelper.GetTranslation("Resolution"));
+        Assert.Equal("Aspect ratio", TranslationHelper.GetTranslation("AspectRatio"));
+        Assert.Equal("File size", TranslationHelper.GetTranslation("FileSize"));
+        
+        // Misc
+        Assert.Equal("Additional functions", TranslationHelper.GetTranslation("AdditionalFunctions"));
     }
 
     [Fact]

Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott