magscope.ui.auto_bead_selection_dialog
======================================

.. py:module:: magscope.ui.auto_bead_selection_dialog


Classes
-------

.. autoapisummary::

   magscope.ui.auto_bead_selection_dialog._AutoBeadSearchProcessBackend
   magscope.ui.auto_bead_selection_dialog.AutoBeadSelectionDialog


Module Contents
---------------

.. py:class:: _AutoBeadSearchProcessBackend

   .. py:attribute:: _NO_ACTIVE_REQUEST_ID
      :value: -1



   .. py:attribute:: _context
      :value: None



   .. py:attribute:: _request_queue


   .. py:attribute:: _result_queue


   .. py:attribute:: _active_request_id


   .. py:attribute:: _process


   .. py:method:: start_search(*, request_id: int, image: numpy.ndarray, seed_roi: tuple[int, int, int, int], existing_rois: tuple[tuple[int, int, int, int], Ellipsis]) -> None


   .. py:method:: cancel_search() -> None


   .. py:method:: poll_messages() -> list[tuple]


   .. py:method:: shutdown() -> None


.. py:class:: AutoBeadSelectionDialog(*, parent, image: numpy.ndarray, roi_size: int, existing_rois: dict[int, tuple[int, int, int, int]], display_scale: int)

   Bases: :py:obj:`PyQt6.QtWidgets.QDialog`


   .. py:attribute:: selectionAccepted


   .. py:attribute:: SLIDER_STEPS
      :value: 1000



   .. py:attribute:: _image


   .. py:attribute:: _roi_size


   .. py:attribute:: _existing_rois


   .. py:attribute:: _display_scale


   .. py:attribute:: _seed_roi
      :type:  tuple[int, int, int, int] | None
      :value: None



   .. py:attribute:: _candidates
      :type:  list[magscope.auto_bead_selection.AutoBeadCandidate]
      :value: []



   .. py:attribute:: _visible_candidates
      :type:  list[magscope.auto_bead_selection.AutoBeadCandidate]
      :value: []



   .. py:attribute:: _candidate_min_score
      :value: 0.0



   .. py:attribute:: _candidate_max_score
      :value: 1.0



   .. py:attribute:: _score_map
      :type:  numpy.ndarray | None
      :value: None



   .. py:attribute:: _next_search_request_id
      :value: 0



   .. py:attribute:: _active_search_request_id
      :type:  int | None
      :value: None



   .. py:attribute:: _search_in_progress
      :value: False



   .. py:attribute:: _search_backend
      :type:  _AutoBeadSearchProcessBackend | None
      :value: None



   .. py:attribute:: _search_poll_timer


   .. py:attribute:: step_1_card


   .. py:attribute:: step_1_title_label


   .. py:attribute:: step_1_body_label


   .. py:attribute:: step_2_card


   .. py:attribute:: step_2_title_label


   .. py:attribute:: step_2_body_label


   .. py:attribute:: video_viewer


   .. py:attribute:: threshold_slider


   .. py:attribute:: threshold_value_label


   .. py:attribute:: search_progress_label


   .. py:attribute:: search_progress_bar


   .. py:attribute:: search_cancel_button


   .. py:attribute:: status_label


   .. py:attribute:: close_button


   .. py:attribute:: accept_button


   .. py:method:: _create_search_backend() -> _AutoBeadSearchProcessBackend


   .. py:method:: _create_instruction_card(name: str, title: str, body: str) -> PyQt6.QtWidgets.QFrame


   .. py:property:: seed_roi
      :type: tuple[int, int, int, int] | None



   .. py:property:: visible_candidates
      :type: list[magscope.auto_bead_selection.AutoBeadCandidate]



   .. py:method:: _image_to_pixmap() -> PyQt6.QtGui.QPixmap


   .. py:method:: _accept_selection() -> None


   .. py:method:: _on_scene_clicked(pos: PyQt6.QtCore.QPoint, button) -> None


   .. py:method:: _set_seed_roi(seed_roi: tuple[int, int, int, int]) -> None


   .. py:method:: _reset_search_results() -> None


   .. py:method:: _clear_seed_and_results() -> None


   .. py:method:: _set_search_ui_state(in_progress: bool) -> None


   .. py:method:: _cancel_search() -> None


   .. py:method:: _poll_search_backend() -> None


   .. py:method:: _on_search_progress_changed(completed_steps: int, total_steps: int) -> None


   .. py:method:: _on_search_canceled(request_id: int) -> None


   .. py:method:: _on_search_finished(request_id: int, candidate_payload: list[tuple[tuple[int, int, int, int], float]]) -> None


   .. py:method:: _on_search_failed(request_id: int, message: str) -> None


   .. py:method:: _shutdown_search_backend() -> None


   .. py:method:: _configure_threshold_slider() -> None


   .. py:method:: _score_to_slider_value(score: float) -> int


   .. py:method:: _slider_value_to_score(slider_value: int) -> float


   .. py:method:: _refresh_visible_candidates() -> None


   .. py:method:: _set_instruction_cards_state(*, has_seed: bool, has_candidates: bool) -> None


   .. py:method:: _apply_instruction_card_style(card: PyQt6.QtWidgets.QFrame, *, active: bool) -> None


   .. py:method:: _update_overlay() -> None


   .. py:method:: reject() -> None


   .. py:method:: accept() -> None


   .. py:method:: force_close() -> None


   .. py:method:: closeEvent(event) -> None


