88 lines
2.9 KiB
C#
88 lines
2.9 KiB
C#
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);
|
|
}
|
|
}
|