Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion probeflow/gui/dialogs/image_viewer_chrome_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ def _build_viewer_menu_bar(self) -> None:
processing_menu.addSeparator()
self._add_combo_menu(
processing_menu, "Align rows", self._processing_panel._align_combo,
["None", "Median", "Mean"],
["None", "Median", "Mean", "Linear"],
)
self._add_combo_menu(
processing_menu, "Bad line correction", self._processing_panel._bad_lines_combo,
Expand Down
9 changes: 5 additions & 4 deletions probeflow/gui/processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,11 @@ def _col_lbl(text: str, target):
line_lbl.setAlignment(Qt.AlignCenter)
lay.addWidget(line_lbl)

self._align_combo = _combo_row("Align rows:", ["None", "Median", "Mean"])
self._align_combo = _combo_row("Align rows:", ["None", "Median", "Mean", "Linear"])
self._align_combo.setToolTip(
"Level each scan line by subtracting its median or mean, removing "
"row-to-row offsets and slow tilt along the slow-scan direction."
"row-to-row offsets and slow tilt along the slow-scan direction. "
"'Linear' also fits and removes a straight slope within each row."
)

self._bad_lines_combo = _combo_row(
Expand Down Expand Up @@ -340,7 +341,7 @@ def _col_lbl(text: str, target):
lay.addWidget(self._filter_section)

def state(self) -> dict:
align_map = {0: None, 1: "median", 2: "mean"}
align_map = {0: None, 1: "median", 2: "mean", 3: "linear"}
bad_map = {0: None, 1: "step", 2: "mad"}
cfg = {
"align_rows": align_map[self._align_combo.currentIndex()],
Expand Down Expand Up @@ -382,7 +383,7 @@ def set_state(self, state: dict | None) -> None:
state = state or {}
old_block = self._align_combo.blockSignals(True)
self._align_combo.setCurrentIndex(
{None: 0, "median": 1, "mean": 2}.get(state.get("align_rows"), 0))
{None: 0, "median": 1, "mean": 2, "linear": 3}.get(state.get("align_rows"), 0))
self._align_combo.blockSignals(old_block)
self._bad_lines_combo.setCurrentIndex(
{None: 0, "step": 1, "step_segments": 1,
Expand Down
14 changes: 14 additions & 0 deletions tests/test_gui_processing_panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,20 @@ def test_browse_quick_panel_emits_only_thumbnail_corrections(qapp):
assert panel.state() == {"align_rows": "median", "remove_bad_lines": None}


def test_align_rows_exposes_linear_option(qapp):
# The backend align_rows supports median/mean/linear; the GUI must offer all
# three so the documented 'linear' option is actually reachable.
from probeflow.gui import ProcessingControlPanel

panel = ProcessingControlPanel("viewer_full")
items = [panel._align_combo.itemText(i) for i in range(panel._align_combo.count())]
assert items == ["None", "Median", "Mean", "Linear"]

panel.set_state({"align_rows": "linear"})
assert panel._align_combo.currentIndex() == 3
assert panel.state()["align_rows"] == "linear"


def test_viewer_full_panel_round_trips_standard_processing_state(qapp):
from PySide6.QtWidgets import QCheckBox, QLabel, QPushButton
from probeflow.gui import ProcessingControlPanel
Expand Down
Loading