Skip to content

Commit 851efb7

Browse files
committed
Normalize camera ID and improve scan cleanup
Normalize dlc_camera_id values (split on ':' and lowercase backend part, fallback to lowercasing whole string) and refresh camera labels accordingly. Improve camera discovery shutdown: set scan state to CANCELING when stopping, avoid immediate cleanup if the scan thread is still running, and route worker finished to a new handler (_on_scan_thread_finished) that performs cleanup and sets state to IDLE. Also stop calling _populate_from_settings() when opening the camera dialog to avoid overwriting unsaved changes; let the dialog refresh itself when shown.
1 parent 61b6dae commit 851efb7

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

dlclivegui/gui/camera_config/camera_config_dialog.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,15 @@ def dlc_camera_id(self) -> str | None:
8888

8989
@dlc_camera_id.setter
9090
def dlc_camera_id(self, value: str | None) -> None:
91-
"""Set the currently selected DLC camera ID."""
92-
self._dlc_camera_id = value
91+
if not value:
92+
self._dlc_camera_id = None
93+
else:
94+
try:
95+
b, idx = value.split(":", 1)
96+
self._dlc_camera_id = f"{b.lower()}:{idx}"
97+
except ValueError:
98+
# fallback: lowercase entire string
99+
self._dlc_camera_id = value.lower()
93100
self._refresh_camera_labels()
94101

95102
def showEvent(self, event):
@@ -197,8 +204,10 @@ def _on_close_cleanup(self) -> None:
197204
except Exception:
198205
pass
199206
# Keep this short to reduce UI freeze
207+
self._set_scan_state(CameraScanState.CANCELING, message="Canceling discovery…")
200208
sw.wait(300)
201-
self._set_scan_state(CameraScanState.IDLE)
209+
if sw.isRunning():
210+
return # Let finished() handle cleanup
202211
if self._scan_worker and not self._scan_worker.isRunning():
203212
self._cleanup_scan_worker()
204213

@@ -592,7 +601,7 @@ def _refresh_available_cameras(self) -> None:
592601
w.canceled.connect(self._on_scan_canceled)
593602

594603
# Cleanup only
595-
w.finished.connect(self._cleanup_scan_worker)
604+
w.finished.connect(self._on_scan_thread_finished)
596605

597606
self.scan_started.emit(f"Scanning {backend} cameras…")
598607
w.start()
@@ -605,6 +614,10 @@ def _on_scan_progress(self, msg: str) -> None:
605614
return
606615
self._show_scan_overlay(msg or "Discovering cameras…")
607616

617+
def _on_scan_thread_finished(self):
618+
self._cleanup_scan_worker()
619+
self._set_scan_state(CameraScanState.IDLE)
620+
608621
def _on_scan_result(self, cams: list) -> None:
609622
if self.sender() is not self._scan_worker:
610623
LOGGER.debug("[Scan] Ignoring result from old worker: %d cameras", len(cams) if cams else 0)

dlclivegui/gui/main_window.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1193,7 +1193,8 @@ def _open_camera_config_dialog(self) -> None:
11931193
self._cam_dialog.settings_changed.connect(self._on_multi_camera_settings_changed)
11941194
else:
11951195
# Refresh its UI from current settings when reopened
1196-
self._cam_dialog._populate_from_settings()
1196+
# self._cam_dialog._populate_from_settings()
1197+
# ^ do not call here -let the dialog handle it via showEvent to avoid overwriting unsaved changes
11971198
self._cam_dialog.dlc_camera_id = self._inference_camera_id
11981199

11991200
self._cam_dialog.show()

0 commit comments

Comments
 (0)