GUI: sample_queue_panel.py automation update to FSM WIP

This commit is contained in:
2025-11-18 16:49:53 +01:00
parent 94a4f16e0b
commit d70b3fe3e5
@@ -5,6 +5,7 @@ from PySide6.QtGui import QKeySequence, QShortcut
from aaredaqlib.models import SampleShortInfoList, SampleShortInfo
from aaregui.models.sample_queue_model import SampleQueueSpreadsheet
from aaregui.threads.automation_worker import FSMWorker
from aaregui.widgets.title_label import TitleLabel
@@ -128,3 +129,171 @@ class SampleQueuePanel(QFrame):
self.__pause = True
self.play_button.setText("▶ Run")
self._current_db_id = None
# class MainWindow(QMainWindow):
# def __init__(self):
# super().__init__()
# self.setWindowTitle("FSM Queue Runner")
# self.resize(900, 400)
#
# # Sample queue - in a real app this is editable by user
# samples = [
# Sample(id="S1"),
# Sample(id="S2"),
# Sample(id="S3"),
# ]
# self.queue = samples
#
# # server client: replace DummyServerClient with your actual client
# self.server = DummyServerClient()
#
# # UI pieces
# central = QWidget()
# layout = QVBoxLayout(central)
#
# # controls
# controls = QHBoxLayout()
# self.btn_start = QPushButton("Start")
# self.btn_pause = QPushButton("Pause")
# self.btn_resume = QPushButton("Resume")
# self.btn_stop = QPushButton("Stop")
# self.btn_next = QPushButton("Next Sample")
# controls.addWidget(self.btn_start)
# controls.addWidget(self.btn_pause)
# controls.addWidget(self.btn_resume)
# controls.addWidget(self.btn_stop)
# controls.addWidget(self.btn_next)
#
# layout.addLayout(controls)
#
# # table showing queue and state toggles
# self.table = QTableWidget(len(self.queue), 1 + len(ALL_STATES))
# headers = ["Sample ID"] + [s.value for s in ALL_STATES]
# self.table.setHorizontalHeaderLabels(headers)
# self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
# self._populate_table()
#
# layout.addWidget(self.table)
#
# # status label
# self.status_label = QLabel("Idle")
# layout.addWidget(self.status_label)
#
# self.setCentralWidget(central)
#
# # worker thread and object will be created on start
# self.worker_thread = None
# self.worker = None
#
# # connect buttons
# self.btn_start.clicked.connect(self.start_worker)
# self.btn_pause.clicked.connect(self._on_pause)
# self.btn_resume.clicked.connect(self._on_resume)
# self.btn_stop.clicked.connect(self._on_stop)
# self.btn_next.clicked.connect(self._on_next_sample)
#
# def _populate_table(self):
# for row, s in enumerate(self.queue):
# self.table.setItem(row, 0, QTableWidgetItem(s.id))
# for col_idx, state in enumerate(ALL_STATES, start=1):
# cb = QCheckBox()
# cb.setChecked(s.run_states.get(state, True))
# # store mapping from widget to sample/state
# cb.state_enum = state
# cb.sample_index = row
# cb.stateChanged.connect(self._make_checkbox_handler(cb))
# self.table.setCellWidget(row, col_idx, cb)
#
# def _make_checkbox_handler(self, checkbox):
# def handler(_):
# row = checkbox.sample_index
# state = checkbox.state_enum
# checked = checkbox.isChecked()
# self.queue[row].run_states[state] = checked
# self.status_label.setText(f"Sample {self.queue[row].id}: set {state.value} -> {checked}")
# return handler
#
# def start_worker(self):
# if self.worker is not None:
# QMessageBox.warning(self, "Already running", "Worker is already running.")
# return
#
# # create worker & thread
# self.worker_thread = QThread()
# self.worker = FSMWorker(self.queue, self.server)
# self.worker.moveToThread(self.worker_thread)
#
# # connect thread start to worker.run
# self.worker_thread.started.connect(self.worker.run)
# # connect signals
# self.worker.progress.connect(self.on_progress)
# self.worker.state_changed.connect(self.on_state_changed)
# self.worker.error.connect(self.on_error)
# self.worker.sample_complete.connect(self.on_sample_complete)
# self.worker.finished.connect(self.on_finished)
#
# # start thread
# self.worker_thread.start()
# self.status_label.setText("Worker started.")
#
# @Slot(int, str)
# def on_progress(self, sample_idx, message):
# # update GUI (runs in GUI thread)
# if sample_idx >= 0:
# self.status_label.setText(f"[S{sample_idx}] {message}")
# else:
# self.status_label.setText(message)
# print("PROGRESS:", sample_idx, message)
#
# @Slot(int, str)
# def on_state_changed(self, sample_idx, state_name):
# # highlight table row, set status text
# self.status_label.setText(f"Sample {self.queue[sample_idx].id} - {state_name}")
# print("STATE_CHANGED:", sample_idx, state_name)
#
# @Slot(int, str)
# def on_error(self, sample_idx, err_msg):
# QMessageBox.critical(self, "Error", f"Sample {sample_idx}: {err_msg}")
# print("ERROR:", sample_idx, err_msg)
#
# @Slot(int)
# def on_sample_complete(self, sample_idx):
# print("SAMPLE COMPLETE:", sample_idx)
#
# @Slot()
# def on_finished(self):
# self.status_label.setText("Worker finished.")
# # clean up thread & worker
# try:
# self.worker_thread.quit()
# self.worker_thread.wait(timeout=1000)
# except Exception:
# pass
# self.worker = None
# self.worker_thread = None
#
# def _on_pause(self):
# if not self.worker:
# return
# # set pause flag on worker
# self.worker.request_pause()
# self.status_label.setText("Pause requested.")
#
# def _on_resume(self):
# if not self.worker:
# return
# self.worker.pause_requested = False
# self.worker.request_resume()
# self.status_label.setText("Resume requested.")
#
# def _on_stop(self):
# if not self.worker:
# return
# self.worker.request_stop()
# self.status_label.setText("Stop requested.")
#
# def _on_next_sample(self):
# if not self.worker:
# return
# self.worker.request_next_sample()
# self.status_label.setText("Next sample requested.")