cell histogram
This commit is contained in:
@@ -1,13 +1,22 @@
|
||||
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)
|
||||
@@ -15,4 +24,64 @@ public partial class CalibrationWindow : Window
|
||||
(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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user