Просмотр исходного кода

Changes to image navigation, update project, misc

Ruben 4 лет назад
Родитель
Сommit
444a840a3c

+ 1 - 4
src/PicView.Data/Imaging/ImageDecoder.cs

@@ -1,7 +1,4 @@
-using System;
-using System.IO;
-using System.Threading.Tasks;
-using Avalonia.Media;
+using Avalonia.Media;
 using Avalonia.Media.Imaging;
 
 namespace PicView.Data.Imaging

+ 1 - 1
src/PicView.Data/PicView.Data.csproj

@@ -7,7 +7,7 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="Avalonia" Version="0.10.11-rc.2" />
+		<PackageReference Include="Avalonia" Version="0.10.11" />
 	</ItemGroup>
 
 	<ItemGroup>

+ 2 - 2
src/PicView.Data/Sizing/ImageSizeHelper.cs

@@ -22,7 +22,7 @@ public static class ImageSizeHelper
         
         var aspectRatio = Math.Min(maxWidth / width, maxHeight / height);
         
-        var interfaceSize = 190;
+        var interfaceSize = 195;
         double titleMaxWidth = 0;
         
         if (Dispatcher.UIThread.CheckAccess())
@@ -36,7 +36,7 @@ public static class ImageSizeHelper
             {
                 var x = rotation is 0 or 180 ? Math.Max(maxWidth, window.MinWidth) : Math.Max(maxHeight, window.MinHeight);
                 titleMaxWidth = x - interfaceSize < interfaceSize ? interfaceSize : x - interfaceSize;
-            }, Avalonia.Threading.DispatcherPriority.Normal).Wait();
+            }, DispatcherPriority.Normal).Wait();
         }
         
         return new[] { width * aspectRatio, height * aspectRatio, titleMaxWidth };

+ 1 - 1
src/PicView.Win32/Taskbar/Progress.cs

@@ -4,7 +4,7 @@
     {
         public static void SetProgress(int value)
         {
-
+            
         }
 
         public static void Reset()

+ 2 - 0
src/PicView.sln.DotSettings

@@ -0,0 +1,2 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:Boolean x:Key="/Default/CodeEditing/SuppressUninitializedWarningFix/Enabled/@EntryValue">False</s:Boolean></wpf:ResourceDictionary>

+ 1 - 1
src/PicView/Navigation/ImageIterator.cs

@@ -62,7 +62,7 @@ namespace PicView.Navigation
             FolderIndex = index;
 
             var preloadValue = Preloader.Get(index);
-            if (Application.Current.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop ||
+            if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop ||
                 preloadValue?.Image is null)
             {
                 return null;

+ 4 - 5
src/PicView/Navigation/Preloader.cs

@@ -78,7 +78,7 @@ namespace PicView.Navigation
                 key = Math.Abs(key);
             }
 
-            else if (key >= pics?.Count)
+            else if (key >= pics.Count)
             {
 #if DEBUG
                 Trace.WriteLine("Preloader " + nameof(Remove) + " key null, " + key);
@@ -97,7 +97,7 @@ namespace PicView.Navigation
 #if DEBUG
                 if (!_sources.TryRemove(key, out _))
                 {
-                    Trace.WriteLine($"Failed to Remove {key} from Preloader, index {pics?[key]}");
+                    Trace.WriteLine($"Failed to Remove {key} from Preloader, index {pics[key]}");
                 }
 #else
             _sources.TryRemove(key, out _);
@@ -107,12 +107,11 @@ namespace PicView.Navigation
             catch (Exception e)
             {
                 Trace.WriteLine("Preloader " + nameof(Remove) + "exception" + Environment.NewLine + e.Message);
-                return;
             }
 #else
             catch (Exception)
             {
-                return;
+                
             }
 #endif
 
@@ -171,7 +170,7 @@ namespace PicView.Navigation
         /// <param name="pics"></param>
         public Task PreLoad(int index, bool reverse, List<string> pics) => Task.Run(async() =>
         {
-            var loadInfront = pics.Count >= 10 ? 5 : 3;
+            var loadInfront = pics.Count >= 10 ? 4 : 2;
             var loadBehind = pics.Count >= 10 ? 3 : 2;
 
             int endPoint;

+ 4 - 4
src/PicView/PicView.csproj

@@ -25,11 +25,11 @@
 		<Content Include="Assets\PicView\icon__Q6k_icon.ico" />
 	</ItemGroup>
 	<ItemGroup>
-		<PackageReference Include="Avalonia" Version="0.10.11-rc.2" />
-		<PackageReference Include="Avalonia.Desktop" Version="0.10.11-rc.2" />
-		<PackageReference Include="Avalonia.Diagnostics" Version="0.10.11-rc.2" />
+		<PackageReference Include="Avalonia" Version="0.10.11" />
+		<PackageReference Include="Avalonia.Desktop" Version="0.10.11" />
+		<PackageReference Include="Avalonia.Diagnostics" Version="0.10.11" />
 		<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
-		<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.11-rc.2" />
+		<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.11" />
 		<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
 	</ItemGroup>
 	<ItemGroup>

+ 71 - 0
src/PicView/Shortcuts/MainShortcuts.cs

@@ -0,0 +1,71 @@
+using Avalonia.Input;
+using PicView.ViewModels;
+
+namespace PicView.Shortcuts;
+
+public static class MainShortcuts
+{
+    public static void HandleKeyDown(MainWindowViewModel? vm, KeyEventArgs e)
+    {
+        if (vm is null) { return; }
+        
+        switch (e.Key)
+        {
+            case Key.Escape:
+                vm.ExitCommand?.Execute(null);
+                break;
+            case Key.D:
+            case Key.Right:
+                if (false) // TODO figure out when key is held down
+                {
+                    // TODO re-implement timer navigation
+                }
+                else if (e.KeyModifiers == KeyModifiers.Control)
+                {
+                    vm.Last.Execute();
+                }
+                else
+                {
+                    vm.Next.Execute();    
+                }
+                break;
+            
+            case Key.A:
+            case Key.Left:
+                if (false) // TODO figure out when key is held down
+                {
+                    // TODO re-implement timer navigation
+                }
+                else if (e.KeyModifiers == KeyModifiers.Control)
+                {
+                    vm.First.Execute();
+                }
+                else
+                {
+                    vm.Prev.Execute();    
+                }
+                break;
+        }
+    }
+    
+    public static void HandleKeyUp(MainWindowViewModel? vm, KeyEventArgs e)
+    {
+        if (vm is null) { return; }
+        
+        // TODO re-implement timer navigation
+    }
+
+    public static void HandlePointerWheel(MainWindowViewModel? vm, PointerWheelEventArgs e)
+    {
+        if (vm is null) { return; }
+        
+        if (e.Delta.Y > 0)
+        {
+            vm.Prev.Execute();
+        }
+        else
+        {
+            vm.Next.Execute();
+        }
+    }
+}

+ 13 - 17
src/PicView/ViewModels/MainWindowViewModel.cs

@@ -1,7 +1,4 @@
-using System.Diagnostics;
-using System.Reactive;
-using System.Reactive.Linq;
-using System.Runtime.Serialization;
+using System.Reactive;
 using ReactiveUI;
 using System.Windows.Input;
 using Avalonia;
@@ -10,7 +7,6 @@ using Avalonia.Controls.ApplicationLifetimes;
 using Avalonia.Media;
 using PicView.Data.Imaging;
 using PicView.Navigation;
-using PicView.Views;
 
 namespace PicView.ViewModels
 {
@@ -18,7 +14,7 @@ namespace PicView.ViewModels
     {
         public MainWindowViewModel()
         {
-            if (Application.Current.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
+            if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
             {
                 return;
             }
@@ -28,16 +24,16 @@ namespace PicView.ViewModels
                 desktop.MainWindow.WindowState = WindowState.Minimized);
 
             Task NextTask(ImageIterator.Values _) => SetValues(Iterator?.GetValues(NavigateTo.Next));
-            Next = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values?, Task>) NextTask);
+            Next = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values, Task>) NextTask);
             
             Task PrevTask(ImageIterator.Values _) => SetValues(Iterator?.GetValues(NavigateTo.Prev));
-            Prev = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values?, Task>) PrevTask);
+            Prev = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values, Task>) PrevTask);
             
             Task LastTask(ImageIterator.Values _) => SetValues(Iterator?.GetValues(NavigateTo.Last));
-            Last = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values?, Task>) LastTask);
+            Last = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values, Task>) LastTask);
             
             Task FirstTask(ImageIterator.Values _) => SetValues(Iterator?.GetValues(NavigateTo.First));
-            First = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values?, Task>) FirstTask);
+            First = ReactiveCommand.CreateFromTask((Func<ImageIterator.Values, Task>) FirstTask);
             
             LoadCommand = ReactiveCommand.Create(LoadTask);
         }
@@ -68,9 +64,9 @@ namespace PicView.ViewModels
                 TitleWidth = values.Sizes[2];
             }
 
-            WindowTitle = values?.Titles[0] ?? "Loading...";
-            Title = values?.Titles[1] ?? "Loading...";
-            Tooltip = values?.Titles[2] ?? "Loading...";
+            WindowTitle = values.Titles[0];
+            Title = values.Titles[1];
+            Tooltip = values.Titles[2];
             
             if (Iterator is null) { return; }
             
@@ -83,10 +79,10 @@ namespace PicView.ViewModels
         
         private ImageIterator? Iterator { get; set; }
         
-        public ReactiveCommand<ImageIterator.Values?, Unit>? Next { get; }
-        public ICommand? Prev { get; }
-        public ICommand? First { get; }
-        public ICommand? Last { get; }
+        public ReactiveCommand<ImageIterator.Values, Unit> Next { get; }
+        public ReactiveCommand<ImageIterator.Values, Unit> Prev { get; }
+        public ReactiveCommand<ImageIterator.Values, Unit> First { get; }
+        public ReactiveCommand<ImageIterator.Values, Unit> Last { get; }
 
         private string _windowTitle = "PicView";
         public string WindowTitle

+ 1 - 1
src/PicView/Views/CustomTitleBars/WinTitleBar.axaml

@@ -112,7 +112,7 @@
             Height="30"
             MaxWidth="{Binding TitleWidth}"
             IsTabStop="False"
-            Padding="3,6,3,6"
+            Padding="3,6.5,3,5"
             Text="{Binding Title}"
             TextTrimming="CharacterEllipsis"
             TextAlignment="Center"

+ 2 - 16
src/PicView/Views/MainWindow.axaml

@@ -13,28 +13,13 @@
     WindowStartupLocation="CenterScreen"
     x:Class="PicView.Views.MainWindow"
     xmlns="https://github.com/avaloniaui"
-    xmlns:customTitleBars="clr-namespace:PicView.Views.CustomTitleBars" 
-    PointerWheelChanged="InputElement_OnPointerWheelChanged"
+    xmlns:customTitleBars="clr-namespace:PicView.Views.CustomTitleBars"
     xmlns:vm="using:PicView.ViewModels"
-    Opened="TopLevel_OnOpened"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
     
     <Design.DataContext>
         <vm:MainWindowViewModel />
     </Design.DataContext>
-    
-    <Window.KeyBindings>
-        <KeyBinding Command="{Binding ExitCommand}" Gesture="Escape"/>
-        
-        <KeyBinding Command="{Binding Next}" Gesture="Right"/>
-        <KeyBinding Command="{Binding Next}" Gesture="D"/>
-        
-        <KeyBinding Command="{Binding Prev}" Gesture="Left"/>
-        <KeyBinding Command="{Binding Prev}" Gesture="A"/>
-        
-        <KeyBinding Command="{Binding Last}" Gesture="Ctrl + Left"/>
-        <KeyBinding Command="{Binding First}" Gesture="Ctrl + A"/>
-    </Window.KeyBindings>
 
 
     <Border
@@ -53,6 +38,7 @@
                 BorderBrush="{StaticResource BorderColor}"
                 BorderThickness="0,1,0,0"
                 DockPanel.Dock="Bottom"
+                PointerPressed="MoveWindow"
                 Height="25">
                 <Grid x:Name="LowerBar">
                     <Canvas

+ 16 - 18
src/PicView/Views/MainWindow.axaml.cs

@@ -1,19 +1,14 @@
-using System.Reactive.Disposables;
 using Avalonia;
-using Avalonia.Animation.Animators;
 using Avalonia.Controls;
 using Avalonia.Input;
-using Avalonia.Input.Raw;
 using Avalonia.Markup.Xaml;
-using Avalonia.Platform;
 using Avalonia.ReactiveUI;
-using Avalonia.Win32;
+using PicView.Shortcuts;
 using PicView.ViewModels;
-using ReactiveUI;
 
 namespace PicView.Views
 {
-    public partial class MainWindow : ReactiveWindow<MainWindowViewModel>
+    public class MainWindow : ReactiveWindow<MainWindowViewModel>
     {
         public MainWindow()
         {
@@ -21,6 +16,7 @@ namespace PicView.Views
 #if DEBUG
             this.AttachDevTools();
 #endif
+            Opened += (_,_) => TopLevel_OnOpened();
         }
 
         private void InitializeComponent()
@@ -28,10 +24,11 @@ namespace PicView.Views
             AvaloniaXamlLoader.Load(this);
         }
 
-        private void TopLevel_OnOpened(object? sender, EventArgs e)
+        private void TopLevel_OnOpened()
         {
             (DataContext as MainWindowViewModel)?.LoadCommand?.Execute(null);
             
+            // Keep window position when resizing
             ClientSizeProperty.Changed.Subscribe(size =>
             {
                 var x = (size.OldValue.Value.Width - size.NewValue.Value.Width) / 2;
@@ -39,18 +36,19 @@ namespace PicView.Views
 
                 Position = new PixelPoint(Position.X + (int)x, Position.Y + (int)y);
             });
+            
+            var vm = (DataContext as MainWindowViewModel);
+            KeyDown += (_, e) => MainShortcuts.HandleKeyDown(vm, e);
+            KeyUp += (_, e) => MainShortcuts.HandleKeyUp(vm, e);
+            PointerWheelChanged += (_, e) => MainShortcuts.HandlePointerWheel(vm, e);
         }
-
-        private void InputElement_OnPointerWheelChanged(object? sender, PointerWheelEventArgs e)
+        
+        private void MoveWindow(object? sender, PointerPressedEventArgs e)
         {
-            if (e.Delta.Y > 0)
-            {
-                (DataContext as MainWindowViewModel)?.Prev?.Execute(null);
-            }
-            else
-            {
-                (DataContext as MainWindowViewModel)?.Next?.Execute(null);
-            }
+            if (VisualRoot is null) { return; }
+            
+            var hostWindow = (Window)VisualRoot;
+            hostWindow.BeginMoveDrag(e);
         }
     }
 }