feat: add Unmeasured filter chip to the sample table

Complement of Measured (rotation count <= 1): one click shows
everything still to be done, so it can be selected wholesale and
queued. Plain chip like All - unmeasured rows carry no tint, so
there is no legend color to wear; cross-status marks (queued/
flagged) show like in the Measured view.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 15:34:58 +02:00
committed by duan_j
co-authored by Claude Fable 5
parent f303f29214
commit 4175cb8edf
3 changed files with 15 additions and 2 deletions
+6 -2
View File
@@ -92,7 +92,8 @@ class UserSampleSpreadsheet(QAbstractTableModel):
# SampleQueueSpreadsheet.
self.queued_ids: set[int] = set()
self.flagged_ids: set[int] = set()
# None = All; otherwise "queued" | "flagged" | "measured" (chip row).
# None = All; otherwise "queued" | "flagged" | "measured" |
# "unmeasured" (chip row).
self.status_filter: str | None = None
self._sort()
@@ -150,7 +151,7 @@ class UserSampleSpreadsheet(QAbstractTableModel):
return SAMPLE_STATUS_FLAGGED_BG if flagged else None
if self.status_filter == "flagged":
return SAMPLE_STATUS_QUEUED_BG if queued else None
if self.status_filter == "measured":
if self.status_filter in ("measured", "unmeasured"):
if queued:
return SAMPLE_STATUS_QUEUED_BG
return SAMPLE_STATUS_FLAGGED_BG if flagged else None
@@ -263,6 +264,9 @@ class UserSampleSpreadsheet(QAbstractTableModel):
rows = [r for r in rows if r.db_id in self.flagged_ids]
elif self.status_filter == "measured":
rows = [r for r in rows if self._measured(r)]
elif self.status_filter == "unmeasured":
# Everything still to be done — the view to select-all and queue.
rows = [r for r in rows if not self._measured(r)]
# Default filter by User using current p-group if no explicit filter set
filters: dict[int, str] = {
+6
View File
@@ -158,6 +158,7 @@ class TellSamplePanel(QFrame):
("Queued", "queued"),
("Flagged", "flagged"),
("Measured", "measured"),
("Unmeasured", "unmeasured"),
):
if key == "queued":
chip = QueueDropChip(label, self)
@@ -175,6 +176,11 @@ class TellSamplePanel(QFrame):
chip = QPushButton(label, self)
if key == "measured":
chip.setToolTip("Filter measured samples (automatic: rotation count > 1)")
elif key == "unmeasured":
chip.setToolTip(
"Filter samples not yet measured — select all here to queue"
" everything still to be done"
)
chip.setCheckable(True)
chip.setChecked(key is None)
chip.setProperty("status_key", key)
+3
View File
@@ -200,6 +200,9 @@ def test_status_filter_selects_rows(status_model):
assert {model.get_id(r).db_id for r in range(model.rowCount())} == {3}
model.set_status_filter("measured")
assert {model.get_id(r).db_id for r in range(model.rowCount())} == {4}
# Unmeasured is the complement: everything still to be done.
model.set_status_filter("unmeasured")
assert {model.get_id(r).db_id for r in range(model.rowCount())} == {1, 2, 3}
model.set_status_filter(None)
assert model.rowCount() == 4