@@ -444,18 +444,17 @@ def mousePressEvent(self, event: QMouseEvent):
444444
445445 if event .button () == Qt .LeftButton :
446446 if self .mode == self .MODE_DRAW :
447+ event .accept ()
447448 if self .draw_start is None :
448449 self .draw_start = pos # widget coords
449450 else :
450451 self ._finish_drawing (pos )
451452 elif self .mode == self .MODE_DELETE :
453+ event .accept ()
452454 idx = self ._find_ann_at (pos )
453455 if idx >= 0 :
454- self .annotations .pop (idx )
455- self .selected_ann_index = - 1
456- self .hovered_ann_index = - 1
457- self .annotations_changed .emit ()
458- self .update ()
456+ self .selected_ann_index = idx
457+ self .delete_selected ()
459458 else :
460459 # Check for resize handle first
461460 idx , handle = self ._find_handle_at (pos )
@@ -514,9 +513,11 @@ def mouseMoveEvent(self, event: QMouseEvent):
514513 # Update color info at mouse position
515514 self ._update_color_at (pos )
516515
517- if self .mode == self .MODE_DRAW and self .draw_start is not None :
518- self .draw_preview = pos
519- self .update ()
516+ if self .mode == self .MODE_DRAW :
517+ event .accept ()
518+ if self .draw_start is not None :
519+ self .draw_preview = pos
520+ self .update ()
520521 elif self .resizing and self .selected_ann_index >= 0 and self .resize_start_pos :
521522 self ._do_resize (pos )
522523 self .update ()
@@ -570,9 +571,44 @@ def mouseMoveEvent(self, event: QMouseEvent):
570571 else :
571572 self .setCursor (Qt .ArrowCursor )
572573 self .update ()
574+ elif self .mode == self .MODE_DRAW :
575+ self .setCursor (Qt .CrossCursor )
576+ if self .hovered_ann_index != - 1 :
577+ self .hovered_ann_index = - 1
578+ self .hovered_handle = HANDLE_NONE
579+ self .update ()
580+ elif self .mode == self .MODE_DELETE :
581+ idx = self ._find_ann_at (pos )
582+ if idx >= 0 :
583+ self .setCursor (Qt .PointingHandCursor )
584+ if self .hovered_ann_index != idx :
585+ self .hovered_ann_index = idx
586+ self .hovered_handle = HANDLE_NONE
587+ self .update ()
588+ else :
589+ self .setCursor (Qt .ArrowCursor )
590+ if self .hovered_ann_index != - 1 :
591+ self .hovered_ann_index = - 1
592+ self .hovered_handle = HANDLE_NONE
593+ self .update ()
573594
574595 super ().mouseMoveEvent (event )
575596
597+ def delete_selected (self ):
598+ idx = self .selected_ann_index
599+ if idx >= 0 :
600+ ann = self .annotations [idx ]
601+ cat = ann .get ('category' , '' )
602+ w = MessageBox (self .tr ('Confirm Delete' ),
603+ self .tr ("Are you sure you want to delete '{}'?" ).format (cat ),
604+ self .window ())
605+ if w .exec ():
606+ self .annotations .pop (idx )
607+ self .selected_ann_index = - 1
608+ self .hovered_ann_index = - 1
609+ self .annotations_changed .emit ()
610+ self .update ()
611+
576612 def mouseReleaseEvent (self , event : QMouseEvent ):
577613 if self .dragging :
578614 self .dragging = False
@@ -1057,14 +1093,29 @@ def end_draw_mode(self):
10571093 self .canvas .mode = AnnotationCanvas .MODE_NONE
10581094 self .canvas .draw_start = None
10591095 self .canvas .draw_preview = None
1096+ if self .canvas ._is_zoomed_beyond_window ():
1097+ self .canvas .setCursor (Qt .OpenHandCursor )
1098+ else :
1099+ self .canvas .setCursor (Qt .ArrowCursor )
10601100 self .canvas .update ()
10611101
10621102 def toggle_draw_mode (self , checked ):
10631103 if checked :
10641104 self .delete_box_btn .setChecked (False )
10651105 self .canvas .mode = AnnotationCanvas .MODE_DRAW
1106+ self .canvas .dragging = False
1107+ self .canvas .resizing = False
1108+ self .canvas .panning = False
1109+ self .canvas .drag_start_pos = None
1110+ self .canvas .resize_start_pos = None
1111+ self .canvas .pan_start_pos = None
1112+ self .canvas .setCursor (Qt .CrossCursor )
10661113 else :
10671114 self .canvas .mode = AnnotationCanvas .MODE_NONE
1115+ if self .canvas ._is_zoomed_beyond_window ():
1116+ self .canvas .setCursor (Qt .OpenHandCursor )
1117+ else :
1118+ self .canvas .setCursor (Qt .ArrowCursor )
10681119 self .canvas .draw_start = None
10691120 self .canvas .draw_preview = None
10701121 self .canvas .update ()
@@ -1073,8 +1124,19 @@ def toggle_delete_mode(self, checked):
10731124 if checked :
10741125 self .draw_btn .setChecked (False )
10751126 self .canvas .mode = AnnotationCanvas .MODE_DELETE
1127+ self .canvas .dragging = False
1128+ self .canvas .resizing = False
1129+ self .canvas .panning = False
1130+ self .canvas .drag_start_pos = None
1131+ self .canvas .resize_start_pos = None
1132+ self .canvas .pan_start_pos = None
1133+ self .canvas .setCursor (Qt .ArrowCursor )
10761134 else :
10771135 self .canvas .mode = AnnotationCanvas .MODE_NONE
1136+ if self .canvas ._is_zoomed_beyond_window ():
1137+ self .canvas .setCursor (Qt .OpenHandCursor )
1138+ else :
1139+ self .canvas .setCursor (Qt .ArrowCursor )
10781140 self .canvas .draw_start = None
10791141 self .canvas .draw_preview = None
10801142 self .canvas .update ()
@@ -1105,7 +1167,9 @@ def keyPressEvent(self, event: QKeyEvent):
11051167 if event .key () == Qt .Key_R :
11061168 self .draw_btn .setChecked (not self .draw_btn .isChecked ())
11071169 self .toggle_draw_mode (self .draw_btn .isChecked ())
1108- elif event .key () == Qt .Key_D :
1170+ elif event .key () == Qt .Key_Delete and self .canvas .selected_ann_index >= 0 and self .canvas .mode == AnnotationCanvas .MODE_NONE :
1171+ self .canvas .delete_selected ()
1172+ elif event .key () in (Qt .Key_D , Qt .Key_Delete ):
11091173 self .delete_box_btn .setChecked (not self .delete_box_btn .isChecked ())
11101174 self .toggle_delete_mode (self .delete_box_btn .isChecked ())
11111175 elif event .key () == Qt .Key_Left :
0 commit comments