630 {
631 if (currentTool.type != Tool.Type.move ||
632 !buts.Event.State.HasFlag(ModifierType.Button1Mask))
633 return;
634
635
636 if (selectedROI != null && selectedROI.Selected && selectedROI.selectedPoints != null)
637 {
638 PointD delta = new PointD(e.X - App.viewer.MouseDown.X, e.Y - App.viewer.MouseDown.Y);
639
640
641 if (selectedROI.type == ROI.Type.Rectangle || selectedROI.type == ROI.Type.Ellipse)
642 {
643
644 if (selectedROI.selectedPoints.Count == 1)
645 {
646 int pointIndex = selectedROI.selectedPoints[0];
647 RectangleD rect = selectedROI.BoundingBox;
648
649
650 double left = rect.X;
651 double top = rect.Y;
652 double right = rect.X + rect.W;
653 double bottom = rect.Y + rect.H;
654
655 switch (pointIndex)
656 {
657 case 0:
658 left += delta.X;
659 top += delta.Y;
660 break;
661 case 1:
662 right += delta.X;
663 top += delta.Y;
664 break;
665 case 2:
666 right += delta.X;
667 bottom += delta.Y;
668 break;
669 case 3:
670 left += delta.X;
671 bottom += delta.Y;
672 break;
673 default:
674 break;
675 }
676
677
678 RectangleD newRect = new RectangleD(
679 Math.Min(left, right),
680 Math.Min(top, bottom),
681 Math.Abs(right - left),
682 Math.Abs(bottom - top)
683 );
684
685 selectedROI.BoundingBox = newRect;
686
687
688 SyncPointsFromBoundingBox(selectedROI);
689 selectedROI.UpdateBoundingBox();
690
691 App.viewer.MouseDown = new PointD(e.X, e.Y);
692 App.viewer.UpdateView();
693 return;
694 }
695 else
696 {
697
698 for (int i = 0; i < selectedROI.Points.Count; i++)
699 {
700 selectedROI.UpdatePoint(
701 new PointD(selectedROI.Points[i].X + delta.X,
702 selectedROI.Points[i].Y + delta.Y), i);
703 }
704
705
706 SyncBoundingBoxFromPoints(selectedROI);
707 selectedROI.UpdateBoundingBox();
708
709 App.viewer.MouseDown = new PointD(e.X, e.Y);
710 App.viewer.UpdateView();
711 return;
712 }
713 }
714 else
715 {
716
717 if (selectedROI.selectedPoints.Count == 0)
718 {
719
720 for (int i = 0; i < selectedROI.Points.Count; i++)
721 {
722 selectedROI.UpdatePoint(
723 new PointD(selectedROI.Points[i].X + delta.X,
724 selectedROI.Points[i].Y + delta.Y), i);
725 }
726 }
727 else
728 {
729
730 foreach (int pointIndex in selectedROI.selectedPoints.ToArray())
731 {
732 if (pointIndex >= 0 && pointIndex < selectedROI.Points.Count)
733 {
734 PointD pt = selectedROI.Points[pointIndex];
735 selectedROI.UpdatePoint(
736 new PointD(pt.X + delta.X, pt.Y + delta.Y), pointIndex);
737 }
738 }
739 }
740
741
742 SyncBoundingBoxFromPoints(selectedROI);
743 selectedROI.UpdateBoundingBox();
744
745 App.viewer.MouseDown = new PointD(e.X, e.Y);
746 App.viewer.UpdateView();
747 return;
748 }
749 }
750
751 else if (selectedROI != null && selectedROI.Selected)
752 {
753 PointD delta = new PointD(e.X - App.viewer.MouseDown.X, e.Y - App.viewer.MouseDown.Y);
754
755 for (int i = 0; i < selectedROI.Points.Count; i++)
756 {
757 selectedROI.UpdatePoint(
758 new PointD(selectedROI.Points[i].X + delta.X,
759 selectedROI.Points[i].Y + delta.Y), i);
760 }
761
762 SyncBoundingBoxFromPoints(selectedROI);
763 selectedROI.UpdateBoundingBox();
764
765 App.viewer.MouseDown = new PointD(e.X, e.Y);
766 App.viewer.UpdateView();
767 return;
768 }
769
770 else
771 {
772 PointD d = new PointD(e.X - App.viewer.MouseDown.X, e.Y - App.viewer.MouseDown.Y);
773 RectangleD selRect = new RectangleD(
774 Math.Min(App.viewer.MouseDown.X, e.X),
775 Math.Min(App.viewer.MouseDown.Y, e.Y),
776 Math.Abs(d.X), Math.Abs(d.Y));
777
778 Tools.GetTool(Tools.Tool.Type.move).Rectangle = selRect;
779
780 bool controlHeld = buts.Event.State.HasFlag(ModifierType.ControlMask);
781
782
783 foreach (ROI an in ImageView.SelectedImage.Annotations)
784 {
785 if (an == null) continue;
786
787 RectangleD selBound = an.GetSelectBound(
788 ROI.selectBoxSize * ImageView.SelectedImage.PhysicalSizeX,
789 ROI.selectBoxSize * ImageView.SelectedImage.PhysicalSizeY);
790
791 if (selBound.IntersectsWith(selRect))
792 {
793 an.Selected = true;
794
795 if (!controlHeld)
796 an.selectedPoints?.Clear();
797
798
799 RectangleD[] sels = an.GetSelectBoxes(
800 ROI.selectBoxSize * ImageView.SelectedImage.PhysicalSizeX);
801 if (sels != null)
802 {
803 for (int i = 0; i < sels.Length; i++)
804 {
805 if (sels[i].IntersectsWith(selRect))
806 {
807 if (an.selectedPoints == null) an.selectedPoints = new List<int>();
808 if (!an.selectedPoints.Contains(i))
809 an.selectedPoints.Add(i);
810 }
811 }
812 }
813 }
814 else if (!controlHeld)
815 {
816 an.Selected = false;
817 an.selectedPoints?.Clear();
818 }
819 }
820
821 if (selectedROI != null)
822 selectedROI.UpdateBoundingBox();
823
824 App.viewer.UpdateView();
825 }
826 }