From e987f215bb62cc172aae6b06374d4e68a6fcb7b0 Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sun, 30 Aug 2026 21:05:43 +0100 Subject: [PATCH] bug fix painting the signature --- .../PostIt/Controls/SignaturePadControl.cs | 33 +++++++++++++++++-- .../PostIt/Views/SignaturePage.axaml.cs | 23 +++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/PostIt/PostIt/Controls/SignaturePadControl.cs b/src/PostIt/PostIt/Controls/SignaturePadControl.cs index 87949d30..3a552a05 100644 --- a/src/PostIt/PostIt/Controls/SignaturePadControl.cs +++ b/src/PostIt/PostIt/Controls/SignaturePadControl.cs @@ -68,21 +68,38 @@ public class SignaturePadControl : TemplatedControl public event EventHandler? RedrawRequested; private readonly List _strokes = new(capacity: 256); + private InputElement? _wiredCaptureArea; private int _pendingPoints; // number of (x, y) pairs awaiting a length prefix private bool _capturing; protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); + RewireCaptureArea(); + } - if (CaptureArea is { } previous) + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + if (change.Property == CaptureAreaProperty) + { + RewireCaptureArea(); + } + } + + private void RewireCaptureArea() + { + if (_wiredCaptureArea is { } previous) { previous.PointerPressed -= OnCapturePressed; previous.PointerMoved -= OnCaptureMoved; previous.PointerReleased -= OnCaptureReleased; } - if (CaptureArea is { } area) + _wiredCaptureArea = CaptureArea; + + if (_wiredCaptureArea is { } area) { area.PointerPressed += OnCapturePressed; area.PointerMoved += OnCaptureMoved; @@ -97,12 +114,14 @@ public class SignaturePadControl : TemplatedControl _capturing = true; _pendingPoints = 0; AppendPoint(e.GetPosition(CaptureArea)); + RedrawRequested?.Invoke(this, EventArgs.Empty); } private void OnCaptureMoved(object? sender, PointerEventArgs e) { if (!_capturing) return; AppendPoint(e.GetPosition(CaptureArea)); + RedrawRequested?.Invoke(this, EventArgs.Empty); } private void OnCaptureReleased(object? sender, PointerReleasedEventArgs e) @@ -169,6 +188,16 @@ public class SignaturePadControl : TemplatedControl /// public SignaturePadData Snapshot() => new(_strokes.ToArray()); + /// + /// Copy of the current in-progress stroke, without the length + /// prefix used for sealed strokes. The view can render this as a + /// live preview while the user is still drawing. + /// + internal IReadOnlyList PendingStroke + => _capturing && _pendingPoints > 0 + ? _strokes.GetRange(_strokes.Count - 2 * _pendingPoints, 2 * _pendingPoints) + : Array.Empty(); + // --- Test-only surface (visible to PostIt.Tests) ------------------- /// diff --git a/src/PostIt/PostIt/Views/SignaturePage.axaml.cs b/src/PostIt/PostIt/Views/SignaturePage.axaml.cs index da6b8b7b..b7af78bd 100644 --- a/src/PostIt/PostIt/Views/SignaturePage.axaml.cs +++ b/src/PostIt/PostIt/Views/SignaturePage.axaml.cs @@ -87,5 +87,28 @@ public partial class SignaturePage : ContentPage poly.Points = pts; InkLayer.Children.Add(poly); } + + var pending = _control.PendingStroke; + if (pending.Count > 0) + { + var poly = new Polyline + { + Stroke = StrokeBrush, + StrokeThickness = StrokeThickness, + StrokeLineCap = PenLineCap.Round, + StrokeJoin = PenLineJoin.Round, + }; + + var pts = new List(pending.Count / 2); + for (int p = 0; p < pending.Count; p += 2) + { + int nx = pending[p]; + int ny = pending[p + 1]; + pts.Add(new Point(nx / CoordinateMax * w, ny / CoordinateMax * h)); + } + + poly.Points = pts; + InkLayer.Children.Add(poly); + } } }