569 {
570 if (currentTool.type != Tool.Type.move ||
571 !buts.Event.State.HasFlag(ModifierType.Button1Mask))
572 return;
573
574
575 if (selectedROI != null && selectedROI.Selected && selectedROI.selectedPoints != null)
576 {
577 PointD delta = new PointD(e.X - App.viewer.MouseDown.X, e.Y - App.viewer.MouseDown.Y);
578
579
580 if (selectedROI.type == ROI.Type.Rectangle || selectedROI.type == ROI.Type.Ellipse)
581 {
582
583 if (selectedROI.selectedPoints.Count == 1)
584 {
585 int pointIndex = selectedROI.selectedPoints[0];
586 RectangleD rect = selectedROI.BoundingBox;
587
588
589 double left = rect.X;
590 double top = rect.Y;
591 double right = rect.X + rect.W;
592 double bottom = rect.Y + rect.H;
593
594 switch (pointIndex)
595 {
596 case 0:
597 left += delta.X;
598 top += delta.Y;
599 break;
600 case 1:
601 right += delta.X;
602 top += delta.Y;
603 break;
604 case 2:
605 right += delta.X;
606 bottom += delta.Y;
607 break;
608 case 3:
609 left += delta.X;
610 bottom += delta.Y;
611 break;
612 default:
613 break;
614 }
615
616
617 RectangleD newRect = new RectangleD(
618 Math.Min(left, right),
619 Math.Min(top, bottom),
620 Math.Abs(right - left),
621 Math.Abs(bottom - top)
622 );
623
624 selectedROI.BoundingBox = newRect;
625
626
627 SyncPointsFromBoundingBox(selectedROI);
628 selectedROI.UpdateBoundingBox();
629
630 App.viewer.MouseDown = new PointD(e.X, e.Y);
631 App.viewer.UpdateView();
632 return;
633 }
634 else
635 {
636
637 for (int i = 0; i < selectedROI.Points.Count; i++)
638 {
639 selectedROI.UpdatePoint(
640 new PointD(selectedROI.Points[i].X + delta.X,
641 selectedROI.Points[i].Y + delta.Y), i);
642 }
643
644
645 SyncBoundingBoxFromPoints(selectedROI);
646 selectedROI.UpdateBoundingBox();
647
648 App.viewer.MouseDown = new PointD(e.X, e.Y);
649 App.viewer.UpdateView();
650 return;
651 }
652 }
653 else
654 {
655
656 if (selectedROI.selectedPoints.Count == 0)
657 {
658
659 for (int i = 0; i < selectedROI.Points.Count; i++)
660 {
661 selectedROI.UpdatePoint(
662 new PointD(selectedROI.Points[i].X + delta.X,
663 selectedROI.Points[i].Y + delta.Y), i);
664 }
665 }
666 else
667 {
668
669 foreach (int pointIndex in selectedROI.selectedPoints.ToArray())
670 {
671 if (pointIndex >= 0 && pointIndex < selectedROI.Points.Count)
672 {
673 PointD pt = selectedROI.Points[pointIndex];
674 selectedROI.UpdatePoint(
675 new PointD(pt.X + delta.X, pt.Y + delta.Y), pointIndex);
676 }
677 }
678 }
679
680
681 SyncBoundingBoxFromPoints(selectedROI);
682 selectedROI.UpdateBoundingBox();
683
684 App.viewer.MouseDown = new PointD(e.X, e.Y);
685 App.viewer.UpdateView();
686 return;
687 }
688 }
689
690 else if (selectedROI != null && selectedROI.Selected)
691 {
692 PointD delta = new PointD(e.X - App.viewer.MouseDown.X, e.Y - App.viewer.MouseDown.Y);
693
694 for (int i = 0; i < selectedROI.Points.Count; i++)
695 {
696 selectedROI.UpdatePoint(
697 new PointD(selectedROI.Points[i].X + delta.X,
698 selectedROI.Points[i].Y + delta.Y), i);
699 }
700
701 SyncBoundingBoxFromPoints(selectedROI);
702 selectedROI.UpdateBoundingBox();
703
704 App.viewer.MouseDown = new PointD(e.X, e.Y);
705 App.viewer.UpdateView();
706 return;
707 }
708
709 else
710 {
711 PointD d = new PointD(e.X - App.viewer.MouseDown.X, e.Y - App.viewer.MouseDown.Y);
712 RectangleD selRect = new RectangleD(
713 Math.Min(App.viewer.MouseDown.X, e.X),
714 Math.Min(App.viewer.MouseDown.Y, e.Y),
715 Math.Abs(d.X), Math.Abs(d.Y));
716
717 Tools.GetTool(Tools.Tool.Type.move).Rectangle = selRect;
718
719 bool controlHeld = buts.Event.State.HasFlag(ModifierType.ControlMask);
720
721
722 foreach (ROI an in ImageView.SelectedImage.Annotations)
723 {
724 if (an == null) continue;
725
726 RectangleD selBound = an.GetSelectBound(
727 ROI.selectBoxSize * ImageView.SelectedImage.PhysicalSizeX,
728 ROI.selectBoxSize * ImageView.SelectedImage.PhysicalSizeY);
729
730 if (selBound.IntersectsWith(selRect))
731 {
732 an.Selected = true;
733
734 if (!controlHeld)
735 an.selectedPoints?.Clear();
736
737
738 RectangleD[] sels = an.GetSelectBoxes(
739 ROI.selectBoxSize * ImageView.SelectedImage.PhysicalSizeX);
740 if (sels != null)
741 {
742 for (int i = 0; i < sels.Length; i++)
743 {
744 if (sels[i].IntersectsWith(selRect))
745 {
746 if (an.selectedPoints == null) an.selectedPoints = new List<int>();
747 if (!an.selectedPoints.Contains(i))
748 an.selectedPoints.Add(i);
749 }
750 }
751 }
752 }
753 else if (!controlHeld)
754 {
755 an.Selected = false;
756 an.selectedPoints?.Clear();
757 }
758 }
759
760 if (selectedROI != null)
761 selectedROI.UpdateBoundingBox();
762
763 App.viewer.UpdateView();
764 }
765 }