2026-06-05 13:44:39 +09:00

180 lines
6.6 KiB
C#

using Aurora;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using VisionCommon;
using VisionCommonUI;
namespace WeldingCommon.Views
{
/// <summary>
/// Interaction logic for WDSelectScoutField.xaml
/// </summary>
public partial class WDSelectScoutField : Window
{
public WDSelectScoutField(IAuroraEnvironment aurora)
{
InitializeComponent();
var viewmodel = new WDSelectScoutFieldViewModel(aurora);
DataContext = viewmodel;
viewmodel.RequestClose += () => Close();
}
// 마우스 드래그 시작 위치
public class RectangleAdorner : Adorner
{
private Point? mStartPoint;
private Point? mEndPoint;
private readonly Pen mPen;
public RectangleAdorner(UIElement adornedElement) : base(adornedElement)
{
mPen = new Pen(Brushes.Red, 1) {
DashStyle = DashStyles.Dash
};
}
public void Start(Point startPoint)
{
this.mStartPoint = startPoint;
this.InvalidateVisual();
}
public void Update(Point endPoint)
{
this.mEndPoint = endPoint;
this.InvalidateVisual();
}
public void Stop()
{
this.mStartPoint = null;
this.mEndPoint = null;
this.InvalidateVisual();
}
protected override void OnRender(DrawingContext drawingContext)
{
if (this.mStartPoint.HasValue && this.mEndPoint.HasValue) {
var rect = new Rect(this.mStartPoint.Value, this.mEndPoint.Value);
drawingContext.DrawRectangle(null, mPen, rect);
}
}
}
// 마우스 드래그 시작 위치
Point? _DragStart = null;
// ListBox에서 마우스 이벤트 처리
private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var listBox = (ListBox)sender;
var adornerLayer = AdornerLayer.GetAdornerLayer(listBox);
var adorner = new RectangleAdorner(listBox);
adornerLayer.Add(adorner);
adorner.Start(e.GetPosition(listBox));
_DragStart = e.GetPosition(listBox);
foreach (var item in listBox.Items) {
var listBoxItem = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item);
var itemRect = VisualTreeHelper.GetDescendantBounds(listBoxItem);
var itemBounds = listBoxItem.TransformToAncestor(listBox).TransformBounds(itemRect);
if (itemBounds.Contains(_DragStart.Value)) {
listBoxItem.IsSelected = !listBoxItem.IsSelected;
}
}
}
private void ListBox_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed && _DragStart != null) {
var listBox = (ListBox)sender;
var adornerLayer = AdornerLayer.GetAdornerLayer(listBox);
var adorner = (RectangleAdorner)adornerLayer.GetAdorners(listBox)[0];
adorner.Update(e.GetPosition(listBox));
}
}
private void ListBox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var listBox = (ListBox)sender;
var adornerLayer = AdornerLayer.GetAdornerLayer(listBox);
var adorner = (RectangleAdorner)adornerLayer.GetAdorners(listBox)[0];
adornerLayer.Remove(adorner);
if (_DragStart != null) {
var dragEnd = e.GetPosition(listBox);
// 사각형 영역 계산
var rect = new Rect(_DragStart.Value, dragEnd);
foreach (var item in listBox.Items) {
var listBoxItem = (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item);
var itemRect = VisualTreeHelper.GetDescendantBounds(listBoxItem);
var itemBounds = listBoxItem.TransformToAncestor(listBox).TransformBounds(itemRect);
// 원래 코드
//if (itemBounds.Contains(rect)) {
// listBoxItem.IsSelected = !listBoxItem.IsSelected;
//}
//else if (rect.IntersectsWith(itemBounds)) {
// listBoxItem.IsSelected = true;
//}
if (rect.IntersectsWith(itemBounds)) {
listBoxItem.IsSelected = !listBoxItem.IsSelected;
}
}
}
_DragStart = null;
}
private void Button_Click_EditPosIdx(object sender, RoutedEventArgs e) {
var fovInfo = VisionRecipeManager.GetFovInfos().FirstOrDefault();
var cameraDisplay = CameraDisplayManager.GetDisplay(fovInfo, eDisplayType.Machine_B);
ChildImageSettingWindow.Instance?.Show(fovInfo, cameraDisplay);
}
private void Button_Click_SelectAll(object sender, RoutedEventArgs e) {
foreach (var item in ListBox.Items) {
var listBoxItem = (ListBoxItem)ListBox.ItemContainerGenerator.ContainerFromItem(item);
listBoxItem.IsSelected = true;
}
}
private void Button_Click_DeSelectAll(object sender, RoutedEventArgs e) {
foreach (var item in ListBox.Items) {
var listBoxItem = (ListBoxItem)ListBox.ItemContainerGenerator.ContainerFromItem(item);
listBoxItem.IsSelected = false;
}
}
private void Button_Click_Invert(object sender, RoutedEventArgs e) {
foreach (var item in ListBox.Items) {
var listBoxItem = (ListBoxItem)ListBox.ItemContainerGenerator.ContainerFromItem(item);
listBoxItem.IsSelected = !listBoxItem.IsSelected;
}
}
private void Button_Click_Save(object sender, RoutedEventArgs e) {
(this.DataContext as WDSelectScoutFieldViewModel).PerformCmdSave();
if (ChildImageSettingWindow.Instance.IsActive) {
ChildImageSettingWindow.Instance.Close();
}
}
}
}