Browse Source

Changes to ZoomPanel positioning

Kenric Nugteren 1 week ago
parent
commit
9426d8aa9b

+ 2 - 6
InABox.Avalonia.Platform.Desktop/Desktop.PdfRenderer.cs

@@ -16,12 +16,8 @@ public class Desktop_PdfRenderer : IPdfRenderer
         {
             using (var converter = new PdfToImageConverter(inData))
             {
-                using (var outData = new MemoryStream())
-                {
-                    converter.Convert(page,true,false)
-                        .CopyTo(outData);
-                    return outData.ToArray();
-                }
+                var output = converter.Convert(page, true, false) as MemoryStream;
+                return output.ToArray();
 
             }
         }

+ 27 - 0
InABox.Avalonia/Components/ZoomPanel/ZoomPanel.cs

@@ -8,9 +8,14 @@ using Avalonia.Layout;
 using Avalonia.Markup.Xaml;
 using Avalonia.Media;
 using Avalonia.Metadata;
+using System;
 
 namespace InABox.Avalonia.Components;
 
+/// <summary>
+/// Presents a control within a panel in which to zoom in and out and pan. The <see cref="Content"/> must be a <see cref="Layoutable"/>,
+/// and its <see cref="Layoutable.Width"/> and <see cref="Layoutable.Height"/> <b>must</b> be set.
+/// </summary>
 [TemplatePart("PART_ZoomContent", typeof(ContentControl))]
 [TemplatePart("PART_ZoomCanvas", typeof(Canvas))]
 [TemplatePart("PART_ZoomContentBorder", typeof(Border))]
@@ -43,6 +48,28 @@ public partial class ZoomPanel : TemplatedControl
     // Center of the image.
     private Point ContentCentre = new();
 
+    public ZoomPanel()
+    {
+        this.GetPropertyChangedObservable(ContentProperty).Subscribe(ContentChanged);
+    }
+
+    private void ContentChanged(AvaloniaPropertyChangedEventArgs args)
+    {
+        if(Content is null) return;
+
+        void Update(AvaloniaPropertyChangedEventArgs? args = null)
+        {
+            if(OuterCanvas is not null)
+            {
+                PositionContent();
+            }
+        }
+
+        Update();
+        Content.GetPropertyChangedObservable(Layoutable.WidthProperty).Subscribe(Update);
+        Content.GetPropertyChangedObservable(Layoutable.HeightProperty).Subscribe(Update);
+    }
+
     protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
     {
         base.OnApplyTemplate(e);

+ 1 - 0
InABox.Avalonia/InABox.Avalonia.csproj

@@ -32,6 +32,7 @@
       <PackageReference Include="AvaloniaDialogs" Version="3.6.1" />
       <PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
       <PackageReference Include="Microsoft.Maui.Essentials" Version="9.0.90" />
+      <PackageReference Include="ReactiveUI" Version="20.4.1" />
       <PackageReference Include="Serilog" Version="4.3.0" />
       <PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
       <PackageReference Include="SkiaSharp" Version="3.119.0" />