Browse Source

[Avalonia] Alt interface buttons implementation

Ruben 1 year ago
parent
commit
f05c66f147

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

@@ -40,6 +40,14 @@
       <DependentUpon>DragDrogView.axaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Compile Update="Views\UC\Buttons\AltRestore.axaml.cs">
+      <DependentUpon>AltRestore.axaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Update="Views\UC\Buttons\AltMinimize.axaml.cs">
+      <DependentUpon>AltMinimize.axaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
   </ItemGroup>
 
   

+ 39 - 0
src/PicView.Avalonia/UI/HideInterfaceLogic.cs

@@ -114,6 +114,18 @@ public static class HideInterfaceLogic
 
     #region HoverButtons
     
+    public static void AddHoverButtonEvents(Control parent, MainViewModel vm)
+    {
+        parent.PointerEntered += async delegate
+        {
+            await DoHoverButtonAnimation(isShown:true, parent, vm);
+        };
+        parent.PointerExited += async delegate
+        {
+            await DoHoverButtonAnimation(isShown: false, parent, vm);
+        };
+    }
+    
     public static void AddHoverButtonEvents(Control parent, Control childControl, MainViewModel vm)
     {
         childControl.PointerEntered += delegate
@@ -172,6 +184,33 @@ public static class HideInterfaceLogic
     }
     
     private static bool _isHoverButtonAnimationRunning;
+    
+    private static async Task DoHoverButtonAnimation(bool isShown, Control parent, MainViewModel vm)
+    {
+        if (_isHoverButtonAnimationRunning)
+        {
+            return;
+        }
+
+        if (vm.ImageIterator is null)
+        {
+            parent.Opacity = 0;
+            return;
+        }
+
+        if (vm.ImageIterator.ImagePaths?.Count <= 1)
+        {
+            parent.Opacity = 0;
+            return;
+        }
+        _isHoverButtonAnimationRunning = true;
+        var from = isShown ? 0d : 1d;
+        var to = isShown ? 1d : 0d;
+        var speed = isShown ? 0.3 : 0.45;
+        var anim = AnimationsHelper.OpacityAnimation(from, to, speed);
+        await anim.RunAsync(parent);
+        _isHoverButtonAnimationRunning = false;
+    }
     private static async Task DoHoverButtonAnimation(bool isShown, Control parent, Control childControl, MainViewModel vm)
     {
         if (_isHoverButtonAnimationRunning)

+ 10 - 3
src/PicView.Avalonia/Views/MainView.axaml

@@ -556,11 +556,18 @@
             Opacity="0"
             VerticalAlignment="Center"
             x:Name="ClickArrowLeft" />
-        <buttons:AltClose
+        <StackPanel
+            Background="Transparent"
+            Height="150"
             HorizontalAlignment="Right"
-            Opacity="0"
+            IsVisible="{CompiledBinding !IsInterfaceShown}"
+            Orientation="Horizontal"
             VerticalAlignment="Top"
-            x:Name="AltClose" />
+            x:Name="AltButtonsPanel">
+            <buttons:AltMinimize />
+            <buttons:AltRestore />
+            <buttons:AltClose />
+        </StackPanel>
         <buttons:GalleryShortcut
             HorizontalAlignment="Right"
             Opacity="0"

+ 14 - 7
src/PicView.Avalonia/Views/MainView.axaml.cs

@@ -21,13 +21,20 @@ public partial class MainView : UserControl
     {
         InitializeComponent();
         // TODO add visual feedback for drag and drop
-        AddHandler(DragDrop.DragOverEvent, DragOver);
-        AddHandler(DragDrop.DropEvent, Drop);
-        
-        GotFocus += CloseTitlebarIfOpen;
-        PointerPressed += PointerPressedBehavior;
-        
-        MainContextMenu.Opened += OnMainContextMenuOpened;
+
+        Loaded += delegate
+        {
+            AddHandler(DragDrop.DragOverEvent, DragOver);
+            AddHandler(DragDrop.DropEvent, Drop);
+
+            GotFocus += CloseTitlebarIfOpen;
+            PointerPressed += PointerPressedBehavior;
+
+            MainContextMenu.Opened += OnMainContextMenuOpened;
+            
+            HideInterfaceLogic.AddHoverButtonEvents(AltButtonsPanel, DataContext as MainViewModel);
+        };
+
     }
     
     private void PointerPressedBehavior(object? sender, PointerPressedEventArgs e)

+ 9 - 11
src/PicView.Avalonia/Views/UC/Buttons/AltClose.axaml

@@ -1,8 +1,5 @@
 <UserControl
     Background="Transparent"
-    Height="170"
-    IsEnabled="{CompiledBinding !IsInterfaceShown}"
-    Width="170"
     d:DesignHeight="450"
     d:DesignWidth="800"
     mc:Ignorable="d"
@@ -14,25 +11,26 @@
     xmlns:viewModels="clr-namespace:PicView.Avalonia.ViewModels"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
     <Button
-        BorderThickness="1,0,0,0"
-        Classes="ButtonBorder hover"
+        Background="{StaticResource AltBackgroundColor}"
+        BorderThickness="1,0,0,1"
+        Classes="ButtonBorder noBorderHover"
         Command="{CompiledBinding ExitCommand}"
-        CornerRadius="0,0,0,45"
+        CornerRadius="0,0,0,0"
         DockPanel.Dock="Right"
-        Height="60"
+        Height="30"
         HorizontalAlignment="Right"
         IsVisible="{CompiledBinding !IsInterfaceShown}"
         ToolTip.Tip="{Binding Close, Mode=OneWay}"
         VerticalAlignment="Top"
-        Width="50"
+        Width="35"
         ZIndex="99"
         x:Name="XButton">
         <Path
             Data="{StaticResource CloseGeometry}"
             Fill="{StaticResource MainIconColor}"
-            Height="23"
-            Margin="7,0,0,11"
+            Height="12"
+            Margin="0,0,0,3"
             Stretch="Fill"
-            Width="23" />
+            Width="12" />
     </Button>
 </UserControl>

+ 0 - 11
src/PicView.Avalonia/Views/UC/Buttons/AltClose.axaml.cs

@@ -1,6 +1,4 @@
 using Avalonia.Controls;
-using PicView.Avalonia.UI;
-using PicView.Avalonia.ViewModels;
 
 namespace PicView.Avalonia.Views.UC.Buttons;
 public partial class AltClose : UserControl
@@ -8,14 +6,5 @@ public partial class AltClose : UserControl
     public AltClose()
     {
         InitializeComponent();
-        Loaded += delegate
-        {
-            if (DataContext is not MainViewModel vm)
-            {
-                return;
-            }            
-            HideInterfaceLogic.AddHoverButtonEvents(this, XButton, vm);
-            PointerWheelChanged += async (_, e) => await vm.ImageViewer.PreviewOnPointerWheelChanged(this, e);
-        };
     }
 }

+ 36 - 0
src/PicView.Avalonia/Views/UC/Buttons/AltMinimize.axaml

@@ -0,0 +1,36 @@
+<UserControl
+    Background="Transparent"
+    d:DesignHeight="450"
+    d:DesignWidth="800"
+    mc:Ignorable="d"
+    x:Class="PicView.Avalonia.Views.UC.Buttons.AltMinimize"
+    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"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Button
+        Background="{StaticResource AltBackgroundColor}"
+        BorderBrush="{StaticResource MainBorderColor}"
+        BorderThickness="1,0,0,0"
+        Classes="ButtonBorder noBorderHover"
+        Command="{CompiledBinding MinimizeCommand}"
+        CornerRadius="0,0,0,10"
+        DockPanel.Dock="Right"
+        Height="30"
+        HorizontalAlignment="Right"
+        IsVisible="{CompiledBinding !IsInterfaceShown}"
+        VerticalAlignment="Top"
+        Width="35"
+        ZIndex="99"
+        x:Name="XButton">
+        <Viewbox Height="15" Width="15">
+            <Path
+                Data="{StaticResource MinimizeGeometry}"
+                Fill="{StaticResource MainIconColor}"
+                Margin="7.5,0,0,7"
+                Stretch="Fill" />
+        </Viewbox>
+    </Button>
+</UserControl>

+ 10 - 0
src/PicView.Avalonia/Views/UC/Buttons/AltMinimize.axaml.cs

@@ -0,0 +1,10 @@
+using Avalonia.Controls;
+
+namespace PicView.Avalonia.Views.UC.Buttons;
+public partial class AltMinimize : UserControl
+{
+    public AltMinimize()
+    {
+        InitializeComponent();
+    }
+}

+ 36 - 0
src/PicView.Avalonia/Views/UC/Buttons/AltRestore.axaml

@@ -0,0 +1,36 @@
+<UserControl
+    Background="Transparent"
+    d:DesignHeight="450"
+    d:DesignWidth="800"
+    mc:Ignorable="d"
+    x:Class="PicView.Avalonia.Views.UC.Buttons.AltRestore"
+    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"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Button
+        Background="{StaticResource AltBackgroundColor}"
+        BorderBrush="{StaticResource MainBorderColor}"
+        BorderThickness="1,0,0,1"
+        Classes="ButtonBorder noBorderHover"
+        Command="{CompiledBinding ToggleFullscreenCommand}"
+        CornerRadius="0,0,0,0"
+        DockPanel.Dock="Right"
+        Height="30"
+        HorizontalAlignment="Right"
+        IsVisible="{CompiledBinding !IsInterfaceShown}"
+        VerticalAlignment="Top"
+        Width="35"
+        ZIndex="99"
+        x:Name="RestoreButton">
+        <Path
+            Data="{StaticResource FullscreenGeometry}"
+            Fill="{StaticResource MainIconColor}"
+            Height="12"
+            Margin="0,0,0,3"
+            Stretch="Fill"
+            Width="12" />
+    </Button>
+</UserControl>

+ 10 - 0
src/PicView.Avalonia/Views/UC/Buttons/AltRestore.axaml.cs

@@ -0,0 +1,10 @@
+using Avalonia.Controls;
+
+namespace PicView.Avalonia.Views.UC.Buttons;
+public partial class AltRestore : UserControl
+{
+    public AltRestore()
+    {
+        InitializeComponent();
+    }
+}