using Avalonia.Controls; using Avalonia.Input; using Avalonia.Media.Imaging; using LindtLeerformPlugin.ViewModels; namespace LindtLeerformPlugin.Views; public partial class CalibrationWindow : Window { private static readonly Cursor HandCursor = new(StandardCursorType.Hand); private static readonly Cursor DefaultCursor = new(StandardCursorType.Arrow); public CalibrationWindow() { InitializeComponent(); PreviewImageControl.PointerMoved += OnPreviewPointerMoved; PreviewImageControl.PointerPressed += OnPreviewPointerPressed; PreviewImageControl.PointerExited += OnPreviewPointerExited; } protected override void OnClosing(WindowClosingEventArgs e) { (DataContext as CalibrationWindowViewModel)?.Dispose(); base.OnClosing(e); } private (int x, int y)? ToImageCoordinates(Avalonia.Point pointerPos) { if (PreviewImageControl.Source is not Bitmap bitmap) return null; var ctrlSize = PreviewImageControl.Bounds.Size; var imgSize = bitmap.Size; if (ctrlSize.Width <= 0 || ctrlSize.Height <= 0 || imgSize.Width <= 0 || imgSize.Height <= 0) return null; var scale = System.Math.Min(ctrlSize.Width / imgSize.Width, ctrlSize.Height / imgSize.Height); var displayW = imgSize.Width * scale; var displayH = imgSize.Height * scale; var offsetX = (ctrlSize.Width - displayW) / 2; var offsetY = (ctrlSize.Height - displayH) / 2; var imgX = (pointerPos.X - offsetX) / scale; var imgY = (pointerPos.Y - offsetY) / scale; if (imgX < 0 || imgY < 0 || imgX >= imgSize.Width || imgY >= imgSize.Height) return null; return ((int)imgX, (int)imgY); } private void OnPreviewPointerMoved(object? sender, PointerEventArgs e) { if (DataContext is not CalibrationWindowViewModel vm) return; var coords = ToImageCoordinates(e.GetPosition(PreviewImageControl)); if (coords == null) { PreviewImageControl.Cursor = DefaultCursor; return; } var cellIndex = vm.HitTestCell(coords.Value.x, coords.Value.y); PreviewImageControl.Cursor = cellIndex.HasValue ? HandCursor : DefaultCursor; } private void OnPreviewPointerExited(object? sender, PointerEventArgs e) { PreviewImageControl.Cursor = DefaultCursor; } private async void OnPreviewPointerPressed(object? sender, PointerPressedEventArgs e) { if (DataContext is not CalibrationWindowViewModel vm) return; if (!e.GetCurrentPoint(PreviewImageControl).Properties.IsLeftButtonPressed) return; var coords = ToImageCoordinates(e.GetPosition(PreviewImageControl)); if (coords == null) return; await vm.ShowCellHistogramAsync(coords.Value.x, coords.Value.y, this); } }