magscope.ui#
Submodules#
Classes#
A titled QGroupBox that can optionally collapse its content. |
|
Simple class for adding '...' to QSplitter handles. |
|
Horizontally combined QLabel and QCheckbox. |
|
Horizontally combined QLabel and QLineedit. |
|
Horizontally combined QLabel, QLineedit, and a second QLabel to show the value. |
|
Horizontally combined QLabel and QLineedit with a QButton to increment/decrement the value on either side. |
|
Custom QLabel that emits a signal when it's resized. |
|
Modal dialog for global MagScope preferences. |
|
Allow importing, exporting, and editing MagScope configuration values. |
|
Adaptive workflow controls with movable tabs and responsive columns. |
|
Abstract base class for processes in the MagScope |
Package Contents#
- class magscope.ui.VideoViewer(scale_factor=1.25)[source]#
Bases:
PyQt6.QtWidgets.QGraphicsView- coordinatesChanged: PyQt6.QtCore.pyqtSignal#
- clicked: PyQt6.QtCore.pyqtSignal#
- sceneClicked: PyQt6.QtCore.pyqtSignal#
- _MINIMAP_MARGIN = 12#
- _MINIMAP_MIN_SIZE = 120#
- _MINIMAP_MAX_SIZE = 220#
- _MINIMAP_LABEL_SPACING = 6#
- _MINIMAP_ZOOM_HEIGHT = 26#
- _MINIMAP_BUTTON_SPACING = 6#
- _mouse_start_pos#
- _mouse_start_time = 0.0#
- _zoom = 0#
- scale_factor = 1.25#
- _empty = True#
- scene#
- _image#
- _overlay_entries: list[tuple[PyQt6.QtCore.QRectF, PyQt6.QtCore.QPointF, str, bool, str]] = []#
- _visible_overlay_entries: list[tuple[PyQt6.QtCore.QRectF, str, bool]] | None = None#
- _visible_label_entries: list[tuple[PyQt6.QtCore.QPointF, PyQt6.QtGui.QStaticText, bool]] | None = None#
- _overlay_cache_pixmap#
- _overlay_cache_dirty = True#
- _overlay_cache_size#
- _overlay_cache_device_pixel_ratio = 0.0#
- _static_label_cache: dict[str, PyQt6.QtGui.QStaticText]#
- _label_metrics#
- _label_ascent#
- _marker_x#
- _marker_y#
- _marker_size = 0#
- _minimap_label#
- _minimap_zoom_label#
- _minimap_reset_button#
- _minimap_base#
- _fit_scale = 1.0#
- class magscope.ui.PlotWorker[source]#
Bases:
PyQt6.QtCore.QObject- image_signal#
- limits_signal#
- selected_bead_signal#
- reference_bead_signal#
- stop_signal#
- figure_size_signal#
- time_mode_signal#
- relative_window_signal#
- axes: matplotlib.axes.Axes#
- locks: dict[str, multiprocessing.synchronize.Lock]#
- figure: matplotlib.figure.Figure | None = None#
- canvas: matplotlib.backends.backend_qtagg.FigureCanvasQTAgg#
- _is_running: bool = False#
- plots = []#
- limits: dict[str, tuple[float, float]]#
- selected_bead: int | None = 0#
- reference_bead: int | None = None#
- n_plots: int#
- update_on: bool = True#
- _update_last_time: float#
- fig_width = 5#
- fig_height = 4#
- dpi = 100#
- device_pixel_ratio = 1.0#
- time_mode = 'absolute'#
- relative_window_seconds: float | None = 300#
- _tracks_snapshot: numpy.ndarray | None = None#
- mutex: PyQt6.QtCore.QMutex#
- figure_size_changed = True#
- add_plot(plot: TimeSeriesPlotBase)[source]#
Used to add plots before the process has started
- class magscope.ui.TimeSeriesPlotBase(buffer_name: str, ylabel: str)[source]#
- buffer: magscope.datatypes.MatrixBuffer#
- buffer_name#
- parent: PlotWorker#
- axes: matplotlib.axes.Axes#
- ylabel#
- set_parent(parent: PlotWorker)[source]#
- class magscope.ui.BeadGraphic(parent: magscope.ui.ui.UIManager, id: int, roi: tuple[int, int, int, int], view_scene)[source]#
Bases:
PyQt6.QtWidgets.QGraphicsRectItem- LABEL_FONT#
- LABEL_COLOR#
- LABEL_OFFSET_X = 10#
- LABEL_OFFSET_Y = 1#
- BORDER_COLOR_DEFAULT = (0, 255, 255, 255)#
- FILL_COLOR_DEFAULT = None#
- BORDER_COLOR_SELECTED = (255, 0, 0, 255)#
- FILL_COLOR_SELECTED = None#
- BORDER_COLOR_REFERENCE = (0, 255, 0, 255)#
- FILL_COLOR_REFERENCE = None#
- HOVER_BORDER_COLOR = (255, 96, 96, 255)#
- DRAG_BORDER_COLOR = (255, 255, 255, 255)#
- IDLE_PEN_WIDTH = 0#
- HOVER_PEN_WIDTH = 2#
- SELECTED_PEN_WIDTH = 2#
- DRAG_PEN_WIDTH = 3#
- CORNER_GRIP_SIZE = 6.0#
- _parent: magscope.ui.ui.UIManager#
- id: int#
- _initializing: bool = True#
- _is_moving: bool = False#
- _is_hovered: bool = False#
- _locked: bool#
- _color_state: str = 'default'#
- _cached_roi: tuple[int, int, int, int] | None = None#
- pen_width = 0#
- label#
- property locked#
- view_scene#
- classmethod label_scene_position_for_roi(roi: tuple[int, int, int, int]) PyQt6.QtCore.QPointF[source]#
- classmethod clamp_roi_to_scene(roi: tuple[int, int, int, int], scene_rect: PyQt6.QtCore.QRectF) tuple[int, int, int, int][source]#
- classmethod move_roi(roi: tuple[int, int, int, int], dx: int, dy: int, scene_rect: PyQt6.QtCore.QRectF) tuple[int, int, int, int][source]#
- set_selection_state(state: str)[source]#
Update the bead overlay color to match selection/reference state.
- class magscope.ui.CollapsibleGroupBox(title='', collapsed=False, *, collapsible: bool = True)[source]#
Bases:
PyQt6.QtWidgets.QGroupBoxA titled QGroupBox that can optionally collapse its content.
- _DEFAULT_BORDER_COLOR = 'palette(mid)'#
- _DEFAULT_BORDER_WIDTH = 1#
- title = ''#
- collapsible = True#
- default_collapsed = False#
- _border_color = 'palette(mid)'#
- _border_width = 1#
- _settings_key = '_Group Box Collapsed'#
- toggle_button#
- drag_handle#
- content_area#
- animation#
- collapsed#
- property settings_key: str#
- class magscope.ui.GripSplitter(orientation, name=None, parent=None)[source]#
Bases:
PyQt6.QtWidgets.QSplitterSimple class for adding ‘…’ to QSplitter handles.
- name = None#
- shown_once = False#
- class magscope.ui.LabeledCheckbox(*, label_text: str, widths: tuple[int, int] = (0, 0), default=False, callback: callable = None)[source]#
Bases:
PyQt6.QtWidgets.QWidgetHorizontally combined QLabel and QCheckbox.
- layout#
- label#
- checkbox#
- class magscope.ui.LabeledLineEdit(*, label_text: str, widths: tuple[int, int] = (0, 0), default=None, validator: PyQt6.QtGui.QValidator = None, callback: callable = None)[source]#
Bases:
PyQt6.QtWidgets.QWidgetHorizontally combined QLabel and QLineedit.
- layout#
- label#
- lineedit#
- class magscope.ui.LabeledLineEditWithValue(*, label_text: str, validator: PyQt6.QtGui.QValidator = None, widths: tuple[int, int, int] = (0, 0, 0), default=None, callback: callable = None)[source]#
Bases:
PyQt6.QtWidgets.QWidgetHorizontally combined QLabel, QLineedit, and a second QLabel to show the value.
- layout#
- label#
- lineedit#
- value_label#
- class magscope.ui.LabeledStepperLineEdit(*, label_text: str, left_button_text: str, right_button_text: str, widths: tuple[int, int, int, int] = (0, 0, 0, 0), default=None, validator: PyQt6.QtGui.QValidator = None, callbacks: tuple[callable, callable, callable] = (None, None, None))[source]#
Bases:
PyQt6.QtWidgets.QWidgetHorizontally combined QLabel and QLineedit with a QButton to increment/decrement the value on either side.
- layout#
- name_label#
- left_button#
- lineedit#
- right_button#
- class magscope.ui.ResizableLabel(parent=None, *, ignore_pixmap_size_hint: bool = False)[source]#
Bases:
PyQt6.QtWidgets.QLabelCustom QLabel that emits a signal when it’s resized.
- resized#
- _ignore_pixmap_size_hint = False#
- class magscope.ui.AcquisitionPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
ControlPanelBase- NO_DIRECTORY_SELECTED_TEXT = 'No save folder selected'#
- acquisition_on_checkbox#
- acquisition_mode_combobox#
- acquisition_dir_on_checkbox#
- acquisition_dir_textedit#
- acquisition_dir_button#
- search_targets() list[magscope.ui.search.SearchTarget][source]#
- class magscope.ui.AllanDeviationPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
MatplotlibCleanupMixin,ControlPanelBase- _SETTINGS_GROUP = 'AllanDeviationPanel'#
- refresh_button#
- history_window#
- history_window_hint#
- taus_mode#
- figure#
- canvas#
- axes#
- status_label#
- class magscope.ui.BeadSelectionPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
ControlPanelBase- next_bead_id_label#
- reset_id_button#
- roi_size_label#
- clear_button#
- search_targets() list[magscope.ui.search.SearchTarget][source]#
- class magscope.ui.CameraPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
ControlPanelBase- _last_settings_update: datetime.datetime | None = None#
- settings#
- refresh_button#
- last_update_label#
- class magscope.ui.ControlPanelBase(manager: magscope.ui.ui.UIManager, title: str, collapsed_by_default: bool = False, collapsible: bool = False)[source]#
Bases:
PyQt6.QtWidgets.QWidget- manager: magscope.ui.ui.UIManager#
- groupbox: magscope.ui.widgets.CollapsibleGroupBox | None = None#
- _content_layout: PyQt6.QtWidgets.QBoxLayout | None = None#
- class magscope.ui.HistogramPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
MatplotlibCleanupMixin,ControlPanelBase- update_interval: float = 1#
- _update_last_time: float = 0#
- enable_checkbox#
- only_beads_checkbox#
- n_bins = 256#
- figure#
- canvas#
- axes#
- class magscope.ui.PlotSettingsPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
ControlPanelBase- selected_bead#
- reference_bead#
- limits: dict[str, tuple[PyQt6.QtWidgets.QLineEdit, PyQt6.QtWidgets.QLineEdit]]#
- grid_layout#
- time_mode#
- time_label#
- time_limits_absolute#
- time_relative_window#
- time_inputs_stack#
- beads_in_view_on#
- beads_in_view_count#
- beads_in_view_marker_size#
- search_targets() list[magscope.ui.search.SearchTarget][source]#
- class magscope.ui.PreferencesDialog(manager: magscope.ui.ui.UIManager)[source]#
Bases:
PyQt6.QtWidgets.QDialogModal dialog for global MagScope preferences.
- _SIDEBAR_SECTIONS: tuple[tuple[str, str], Ellipsis] = (('tune', 'MagScope'), ('ads_click', 'Tracking'), ('palette', 'Appearance/Layout'))#
- manager#
- load_preferences_button#
- save_preferences_button#
- reset_all_preferences_button#
- preferences_file_status#
- settings_panel#
- settings_scroll#
- tracking_options_panel#
- tracking_scroll#
- appearance_layout_tab#
- appearance_scroll#
- stack#
- reset_section_button#
- sidebar#
- class magscope.ui.ScriptPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
ControlPanelBase- NO_SCRIPT_SELECTED_TEXT = 'No script loaded'#
- status_prefix = 'Status'#
- status_label#
- step_position_label#
- step_description_label#
- button_layout#
- load_button#
- start_button#
- pause_button#
- filepath_textedit#
- update_status(status: magscope.scripting.ScriptStatus)[source]#
- class magscope.ui.StatusPanel(manager: magscope.ui.ui.UIManager)[source]#
Bases:
ControlPanelBase- dot_count = 0#
- display_rate_status#
- video_processors_status#
- video_buffer_size_status#
- video_buffer_status#
- video_buffer_status_bar#
- video_buffer_purge_label#
- class magscope.ui.TrackingOptionsPanel(manager: magscope.ui.ui.UIManager, *, collapsible: bool = True)[source]#
Bases:
ControlPanelBase- _current_options: dict[str, Any]#
- _updating_fields = False#
- background_combo#
- iterations#
- line_ratio#
- n_local#
- use_fft#
- fft_oversample#
- fft_rmin#
- fft_rmax#
- fft_gaus_factor#
- radial_oversample#
- lookup_n_local#
- static _build_preferences_group(title: str, parent: PyQt6.QtWidgets.QWidget) tuple[PyQt6.QtWidgets.QWidget, PyQt6.QtWidgets.QVBoxLayout][source]#
- static _configure_lineedit_row(widget: magscope.ui.widgets.LabeledLineEditWithValue) None[source]#
- static _configure_checkbox_row(widget: magscope.ui.widgets.LabeledCheckbox) None[source]#
- static search_targets() list[magscope.ui.search.SearchTarget][source]#
- _option_line_edits() tuple[magscope.ui.widgets.LabeledLineEditWithValue, Ellipsis][source]#
- class magscope.ui.MagScopeSettingsPanel(manager: magscope.ui.ui.UIManager, *, collapsible: bool = True, file_status_label: PyQt6.QtWidgets.QLabel | None = None)[source]#
Bases:
PyQt6.QtWidgets.QWidgetAllow importing, exporting, and editing MagScope configuration values.
- _SETTING_GROUPS: tuple[tuple[str, tuple[str, Ellipsis]], Ellipsis] = (('Imaging', ('ROI', 'magnification')), ('Data Buffers', ('tracks max datapoints', 'video buffer...#
- manager#
- _current_settings#
- _setting_inputs: dict[str, PyQt6.QtWidgets.QLineEdit]#
- _setting_value_labels: dict[str, PyQt6.QtWidgets.QLabel]#
- static search_targets() list[magscope.ui.search.SearchTarget][source]#
- _push_settings(settings: magscope.settings.MagScopeSettings) None[source]#
- class magscope.ui.Controls(manager: UIManager)[source]#
Bases:
PyQt6.QtWidgets.QWidgetAdaptive workflow controls with movable tabs and responsive columns.
- LAYOUT_SETTINGS_GROUP = 'controls/layout'#
- WORKFLOW_COLUMNS_SETTINGS_KEY = 'controls/workflow_columns'#
- MIN_COLUMN_WIDTH = 360#
- MAX_COLUMNS = 4#
- WORKFLOW_ORDER = ['Run', 'Analysis', 'Locking', 'Motors']#
- WORKFLOW_TAB_ALIASES#
- DEFAULT_LAYOUTS#
- manager#
- panels: dict[str, magscope.ui.controls.ControlPanelBase | PyQt6.QtWidgets.QWidget]#
- _settings#
- _tab_widgets: list[WorkflowTabWidget] = []#
- _tab_pages: dict[str, PyQt6.QtWidgets.QScrollArea]#
- _tab_content_layouts: dict[str, PyQt6.QtWidgets.QVBoxLayout]#
- _panel_to_tab: dict[str, str]#
- _current_column_count = 0#
- _loading_layout = False#
- _columns_layout#
- property settings#
- _fill_empty_columns(columns: list[list[str]], preferred_layout: list[list[str]]) list[list[str]][source]#
- class magscope.ui.UIManager[source]#
Bases:
magscope.processes.ManagerProcessBaseAbstract base class for processes in the MagScope
Subclass requirements: * Each subclass should have a unique name. * There should only be one instance of each subclass (singleton). * The class name is used for consistent inter-process identification.
- _material_symbols_font_family: str | None = None#
- VIEWER_LAYOUT_STATE_VERSION = 1#
- VIEWER_GEOMETRY_SETTINGS_KEY = 'viewer/main_window_geometry'#
- VIEWER_DOCK_STATE_SETTINGS_KEY = 'viewer/dock_state'#
- _ZLUT_TRACKING_ACQUISITION_MODES#
- _active_bead_graphic: magscope.ui.widgets.BeadGraphic | None = None#
- _active_bead_id: int | None = None#
- _bead_rois: dict[int, tuple[int, int, int, int]]#
- _pending_bead_add_id: int | None = None#
- _pending_bead_add_roi: tuple[int, int, int, int] | None = None#
- _bead_next_id: int = 0#
- beads_in_view_on = False#
- beads_in_view_count = 1#
- beads_in_view_marker_size = 20#
- central_widgets: list[PyQt6.QtWidgets.QWidget] = []#
- central_layouts: list[PyQt6.QtWidgets.QLayout] = []#
- controls_to_add = []#
- camera_dock: PyQt6.QtWidgets.QDockWidget | None = None#
- camera_dock_title_bar: PyQt6.QtWidgets.QWidget | None = None#
- camera_dock_header: PyQt6.QtWidgets.QWidget | None = None#
- bead_toolbar: PyQt6.QtWidgets.QWidget | None = None#
- bead_instructions_button: PyQt6.QtWidgets.QPushButton | None = None#
- bead_roi_size_label: PyQt6.QtWidgets.QLabel | None = None#
- bead_total_count_label: PyQt6.QtWidgets.QLabel | None = None#
- bead_next_id_label: PyQt6.QtWidgets.QLabel | None = None#
- bead_reassign_ids_button: PyQt6.QtWidgets.QPushButton | None = None#
- bead_remove_all_button: PyQt6.QtWidgets.QPushButton | None = None#
- _display_rate_counter: int = 0#
- _display_rate_last_time: float#
- _display_rate_last_rate: float = 0#
- plot_worker: magscope.ui.plots.PlotWorker#
- plot_thread: PyQt6.QtCore.QThread#
- plots_widget: PyQt6.QtWidgets.QLabel#
- plots_dock: PyQt6.QtWidgets.QDockWidget | None = None#
- plots_dock_title_bar: PyQt6.QtWidgets.QWidget | None = None#
- plots_dock_header: PyQt6.QtWidgets.QWidget | None = None#
- plots_to_add: list[magscope.ui.plots.TimeSeriesPlotBase] = []#
- plots_progress_indicator: LivePlotProgressIndicator | None = None#
- _plot_progress_timer: PyQt6.QtCore.QTimer | None = None#
- _plot_progress_started_at: float | None = None#
- _plot_progress_last_image_time: float | None = None#
- _plot_progress_interval_seconds = 1.0#
- _preferences_dialog: magscope.ui.controls.PreferencesDialog | None = None#
- qt_app: PyQt6.QtWidgets.QApplication | None = None#
- selected_bead = 0#
- reference_bead: int | None = None#
- _timer: PyQt6.QtCore.QTimer | None = None#
- _timer_video_view: PyQt6.QtCore.QTimer | None = None#
- _video_buffer_last_index: int = 0#
- _video_viewer_need_reset: bool = True#
- video_viewer: magscope.ui.video_viewer.VideoViewer | None = None#
- windows: list[PyQt6.QtWidgets.QMainWindow] = []#
- _suppress_bead_roi_updates: bool = False#
- _last_applied_roi: int | None = None#
- _settings_persistence_warning_shown = False#
- _bead_roi_capacity = 10000#
- _auto_bead_selection_dialog: magscope.ui.auto_bead_selection_dialog.AutoBeadSelectionDialog | None = None#
- _startup_ready_sent = False#
- _zlut_generation_dialog: magscope.ui.controls.ZLUTGenerationDialog | None = None#
- _zlut_generation_setup_dialog: magscope.ui.controls.ZLUTGenerationSetupDialog | None = None#
- _current_zlut_dialog: magscope.ui.controls.CurrentZLUTDialog | None = None#
- _current_zlut_filepath: str | None = None#
- _current_zlut_metadata: dict[str, float | int | None]#
- _zlut_generation_phase = 'idle'#
- _zlut_generation_z_axis_min_nm: float | None = None#
- _zlut_generation_z_axis_max_nm: float | None = None#
- _zlut_generation_z_axis_descending = False#
- _zlut_sweep_dataset: magscope.datatypes.ZLUTSweepDataset | None = None#
- _zlut_evaluation_bead_ids: list[int] = []#
- _zlut_evaluation_selected_bead_id: int | None = None#
- _zlut_preview_last_poll: float = 0.0#
- _shutdown_complete = False#
- _search_box: PyQt6.QtWidgets.QLineEdit | None = None#
- _search_container: PyQt6.QtWidgets.QWidget | None = None#
- _search_toggle_button: PyQt6.QtWidgets.QToolButton | None = None#
- _search_popup: PyQt6.QtWidgets.QWidget | None = None#
- _search_popup_box: PyQt6.QtWidgets.QLineEdit | None = None#
- _search_popup_escape_shortcut: PyQt6.QtGui.QShortcut | None = None#
- _search_status_label: PyQt6.QtWidgets.QLabel | None = None#
- _search_status_timer: PyQt6.QtCore.QTimer | None = None#
- _top_bar_action_buttons: dict[str, _TopBarActionButton]#
- _window_controls: PyQt6.QtWidgets.QWidget | None = None#
- _minimize_button: PyQt6.QtWidgets.QToolButton | None = None#
- _maximize_restore_button: PyQt6.QtWidgets.QToolButton | None = None#
- _close_button: PyQt6.QtWidgets.QToolButton | None = None#
- _caption_button_state_filter: _CaptionButtonStateFilter | None = None#
- _top_bar_compact_filter: _TopBarCompactModeFilter | None = None#
- _top_bar: _UnifiedTopBar | None = None#
- _window_icon_label: PyQt6.QtWidgets.QLabel | None = None#
- _window_title_label: PyQt6.QtWidgets.QLabel | None = None#
- _title_bar_safe_area_spacer: PyQt6.QtWidgets.QWidget | None = None#
- _title_bar_safe_area_window_handle: Any = None#
- _auto_bead_selection_action: PyQt6.QtGui.QAction | None = None#
- _new_zlut_action: PyQt6.QtGui.QAction | None = None#
- _load_zlut_action: PyQt6.QtGui.QAction | None = None#
- _unload_zlut_action: PyQt6.QtGui.QAction | None = None#
- _show_current_zlut_action: PyQt6.QtGui.QAction | None = None#
- _search_shortcuts: list[PyQt6.QtGui.QShortcut] = []#
- _search_registry#
- _search_highlighter#
- static _install_viewer_dock_separator_hover_delay(window: PyQt6.QtWidgets.QMainWindow) None[source]#
- static _zlut_requested_sweep_edges(z_axis_min_nm: float | None, z_axis_max_nm: float | None, n_steps: int) tuple[float | None, float | None][source]#
- static _build_zlut_preview_payload(preview_snapshot: dict[str, object], *, z_axis_min_nm: float | None, z_axis_max_nm: float | None, z_axis_descending: bool) dict[str, object][source]#
- set_settings(settings: magscope.settings.MagScopeSettings)[source]#
Apply new settings and clear beads if the ROI size changed.
- _create_live_plot_progress_indicator() LivePlotProgressIndicator[source]#
- _handle_timer_exception(exc: BaseException) None[source]#
Surface exceptions that occur inside Qt timer callbacks.
- _next_random_bead_roi(rng: numpy.random.Generator, visible_rect: PyQt6.QtCore.QRectF) tuple[int, int, int, int] | None[source]#
- _add_new_bead_batch(rois: Iterable[tuple[int, int, int, int]]) dict[int, tuple[int, int, int, int]][source]#
- _update_bead_highlights(*, old_selected: int | None = None, old_reference: int | None = None)[source]#
- property n_windows#
- property bead_roi_updates_suppressed: bool#
- property bead_next_id: int#
- _create_viewer_dock_title_bar(dock: PyQt6.QtWidgets.QDockWidget, title: str) PyQt6.QtWidgets.QWidget[source]#
- _create_viewer_dock_content(dock: PyQt6.QtWidgets.QDockWidget, viewer: PyQt6.QtWidgets.QWidget, toolbar: PyQt6.QtWidgets.QWidget | None = None, viewer_margins: tuple[int, int, int, int] | None = None, viewer_overlay: PyQt6.QtWidgets.QWidget | None = None) tuple[PyQt6.QtWidgets.QWidget, PyQt6.QtWidgets.QWidget][source]#
- _handle_viewer_dock_top_level_changed(dock: PyQt6.QtWidgets.QDockWidget, floating: bool) None[source]#
- _schedule_floating_dock_window_configuration(dock: PyQt6.QtWidgets.QDockWidget, floating: bool) None[source]#
- static _apply_top_bar_style(menu_container: PyQt6.QtWidgets.QWidget, menu_bar_vertical_padding: int) None[source]#
- _create_caption_button(parent: PyQt6.QtWidgets.QWidget, object_name: str, icon_text: str, tooltip: str, callback: Callable[[], None], target_height: int, role: str) PyQt6.QtWidgets.QToolButton[source]#
- _create_main_window_controls(window: PyQt6.QtWidgets.QMainWindow, parent: PyQt6.QtWidgets.QWidget, target_height: int) PyQt6.QtWidgets.QWidget[source]#
- _create_search_popup(window: PyQt6.QtWidgets.QMainWindow, target_height: int) tuple[PyQt6.QtWidgets.QWidget, PyQt6.QtWidgets.QLineEdit][source]#
- _handle_search_box_text_edited(search_box: PyQt6.QtWidgets.QLineEdit, model: PyQt6.QtCore.QStringListModel, completer: PyQt6.QtWidgets.QCompleter, text: str) None[source]#
- _generic_panel_search_targets() list[magscope.ui.search.SearchTarget][source]#
- _core_control_search_targets() list[magscope.ui.search.SearchTarget][source]#
- _find_search_target(text: str) magscope.ui.search.SearchTarget | None[source]#
- _find_exact_search_target(text: str) magscope.ui.search.SearchTarget | None[source]#
- _update_search_completion_model(model: PyQt6.QtCore.QStringListModel, completer: PyQt6.QtWidgets.QCompleter, text: str) None[source]#
- _guide_to_target(target: magscope.ui.search.SearchTarget) None[source]#
- _reveal_search_target(target: magscope.ui.search.SearchTarget) None[source]#
- _search_target_widget(target: magscope.ui.search.PanelControlTarget) PyQt6.QtWidgets.QWidget | None[source]#
- _reveal_preference_setting(target: magscope.ui.search.PreferencesSettingTarget) None[source]#
- _reveal_preference_widget(target: magscope.ui.search.PreferencesWidgetTarget) None[source]#
- _install_search_shortcuts(window: PyQt6.QtWidgets.QMainWindow, search_box: PyQt6.QtWidgets.QLineEdit) None[source]#
- update_script_status(status: magscope.scripting.ScriptStatus)[source]#
- set_acquisition_mode(mode: magscope.utils.AcquisitionMode)[source]#
- _set_current_zlut(*, filepath: str | None, z_min: float | None = None, z_max: float | None = None, step_size: float | None = None, profile_length: int | None = None) None[source]#
- _read_zlut_preview_snapshot(dataset: magscope.datatypes.ZLUTSweepDataset) dict[str, object][source]#
- start_zlut_generation(*, start_nm: float, step_nm: float, stop_nm: float, profiles_per_bead: int) None[source]#
- update_zlut_metadata(filepath: str | None = None, z_min: float | None = None, z_max: float | None = None, step_size: float | None = None, profile_length: int | None = None) None[source]#
- update_zlut_generation_state(status: str, detail: str | None = None, running: bool = False, can_cancel: bool = False, phase: str = 'idle', z_axis_min_nm: float | None = None, z_axis_max_nm: float | None = None, z_axis_descending: bool = False) None[source]#
- update_zlut_generation_evaluation(active: bool, bead_ids: list[int], selected_bead_id: int | None = None) None[source]#