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:
@@ -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] = {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user