Skip to content

Commit 1390503

Browse files
committed
Remove CompressCoco, improve GUI and image loading
Remove unused ok/feature/CompressCoco.py and tweak FeatureSet cleanup. Patch MainWindow to override MessageBoxBase.keyPressEvent so Enter/Escape act as confirm/cancel when appropriate. Update MarkUpWindow/AnnotationCanvas to better handle draw/delete/pan interactions: accept relevant mouse events, add delete_selected confirmation flow, update cursors based on mode/zoom, and handle Delete key for deletion. Rework TemplateTab to load and filter images off the UI thread (ImageLoaderThread), add an indeterminate progress ring, lazy-load on show, and make ImageCard/FlowWidget responsive: support preloaded thumbnails, dynamic card sizing, and improved layout logic. Overall changes improve responsiveness, UX and robustness.
1 parent 0859470 commit 1390503

5 files changed

Lines changed: 188 additions & 55 deletions

File tree

ok/feature/CompressCoco.py

Lines changed: 0 additions & 13 deletions
This file was deleted.

ok/feature/FeatureSet.pyx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,6 @@ def compress_copy_x_anylabeling(x_anylabeling_folder, target_folder, generate_la
479479
except Exception:
480480
cli_tool = "xanylabeling"
481481

482-
if os.path.exists(classes_path):
483-
os.remove(classes_path)
484482
if os.path.exists(output_dir):
485483
shutil.rmtree(output_dir)
486484

ok/gui/MainWindow.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,23 @@
66
from PySide6.QtGui import QScreen
77
from PySide6.QtWidgets import QMenu, QSystemTrayIcon, QApplication
88
from qfluentwidgets import MSFluentWindow, qconfig, FluentIcon, NavigationItemPosition, MessageBox, InfoBar, \
9-
InfoBarPosition, SystemThemeListener, Theme, setTheme
9+
InfoBarPosition, SystemThemeListener, Theme, setTheme, MessageBoxBase
10+
11+
_original_MessageBoxBase_keyPressEvent = MessageBoxBase.keyPressEvent
12+
13+
def _patched_message_box_base_keyPressEvent(self, e):
14+
if e.key() == Qt.Key_Escape:
15+
if hasattr(self, 'cancelButton') and self.cancelButton.isEnabled() and self.cancelButton.isVisible():
16+
self.cancelButton.click()
17+
return
18+
elif e.key() == Qt.Key_Enter or e.key() == Qt.Key_Return:
19+
if hasattr(self, 'yesButton') and self.yesButton.isEnabled() and self.yesButton.isVisible():
20+
self.yesButton.click()
21+
return
22+
_original_MessageBoxBase_keyPressEvent(self, e)
23+
24+
MessageBoxBase.keyPressEvent = _patched_message_box_base_keyPressEvent
25+
1026

1127
from ok.util.config import Config
1228

ok/gui/tasks/MarkUpWindow.py

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)