diff --git a/src/aare/gui/panels/automation_panel.py b/src/aare/gui/panels/automation_panel.py
index 1baa2070..3625684a 100644
--- a/src/aare/gui/panels/automation_panel.py
+++ b/src/aare/gui/panels/automation_panel.py
@@ -42,15 +42,21 @@ class AutomationProgressWidget(QWidget):
def _setup_ui(self) -> None:
layout = QVBoxLayout(self)
- layout.setContentsMargins(8, 8, 8, 8)
- layout.setSpacing(6)
+ layout.setContentsMargins(10, 10, 10, 10)
+ layout.setSpacing(10)
self._title_label = QLabel("Automation progress")
- self._title_label.setStyleSheet("font-size: 14px; font-weight: bold;")
+ self._title_label.setStyleSheet(
+ "font-size: 16px; font-weight: 700; color: #1F2937; margin-bottom: 2px;"
+ )
layout.addWidget(self._title_label)
self._stats_label = QLabel()
- self._stats_label.setStyleSheet("color: #555; font-size: 11px; margin-bottom: 4px;")
+ self._stats_label.setStyleSheet(
+ "color: #374151; font-size: 13px; "
+ "background-color: #F8FAFC; border: 1px solid #E2E8F0; "
+ "border-radius: 8px; padding: 10px;"
+ )
self._stats_label.setWordWrap(True)
layout.addWidget(self._stats_label)
@@ -100,7 +106,7 @@ class AutomationProgressWidget(QWidget):
WorkflowStateKind.LOOP_CENTRE: "Center",
WorkflowStateKind.RASTER: "Raster",
WorkflowStateKind.DATA_COLLECTION: "Collect",
- WorkflowStateKind.FINAL: "Paused/Finished",
+ WorkflowStateKind.FINAL: "Status",
}.get(step, str(step.value))
@staticmethod
@@ -116,19 +122,22 @@ class AutomationProgressWidget(QWidget):
@staticmethod
def _style_for_status(status: StepStatus) -> str:
- base = "padding: 6px; border-radius: 4px;"
+ base = (
+ "padding: 10px 12px; border-radius: 10px; "
+ "font-size: 14px; border: 1px solid transparent;"
+ )
if status == StepStatus.SUCCESS:
- return base + " background-color: #E8F5E9; color: #1B5E20;"
+ return base + " background-color: #ECFDF3; color: #166534; border-color: #A7F3D0;"
if status == StepStatus.RUNNING:
- return base + " background-color: #E3F2FD; color: #0D47A1; font-weight: bold;"
+ return base + " background-color: #EFF6FF; color: #1D4ED8; font-weight: 700; border-color: #BFDBFE;"
if status == StepStatus.FAILED:
- return base + " background-color: #FFEBEE; color: #B71C1C; font-weight: bold;"
+ return base + " background-color: #FEF2F2; color: #B91C1C; font-weight: 700; border-color: #FECACA;"
if status == StepStatus.PAUSED:
- return base + " background-color: #FFF3E0; color: #E65100; font-weight: bold;"
+ return base + " background-color: #FFF7ED; color: #C2410C; font-weight: 700; border-color: #FED7AA;"
if status == StepStatus.SKIPPED:
- return base + " background-color: #F5F5F5; color: #616161;"
- return base + " background-color: #F7F7F7; color: #757575;"
+ return base + " background-color: #F8FAFC; color: #475569; border-color: #E2E8F0;"
+ return base + " background-color: #F8FAFC; color: #64748B; border-color: #E2E8F0;"
@staticmethod
def _format_duration(seconds: float | None) -> str:
@@ -156,16 +165,6 @@ class AutomationProgressWidget(QWidget):
for step in progress.steps
)
- def _current_sample_elapsed_seconds(self, progress: AutomationProgress) -> float:
- started_times = [
- step.started_at
- for step in progress.steps
- if step.started_at is not None and step.step != WorkflowStateKind.FINAL
- ]
- if not started_times:
- return 0.0
- return max(0.0, time.time() - min(started_times))
-
def _has_active_sample(self, progress: AutomationProgress) -> bool:
if progress.finished:
return False
@@ -199,7 +198,6 @@ class AutomationProgressWidget(QWidget):
if self._is_paused:
self._refresh_timer.stop()
- progress.current_step = "Paused"
if final_step is not None:
final_step.status = StepStatus.PAUSED
final_step.message = "Automation paused"
@@ -232,7 +230,6 @@ class AutomationProgressWidget(QWidget):
measured_avg_seconds = progress.avg_time_per_sample if progress.avg_time_per_sample > 0 else None
displayed_avg_seconds = measured_avg_seconds or self.DEFAULT_SAMPLE_ESTIMATE_S
- current_step = "Paused" if self._is_paused else (progress.current_step or "Idle")
current_sample = progress.current_sample_name or "None"
samples_left = (
self._gui_samples_in_queue
@@ -240,27 +237,17 @@ class AutomationProgressWidget(QWidget):
else max(0, int(progress.samples_in_queue or 0))
)
- has_active_sample = self._has_active_sample(progress) and not self._is_paused
- current_sample_elapsed = self._current_sample_elapsed_seconds(progress)
-
- if progress.finished or not has_active_sample:
- current_sample_remaining = 0.0
+ if progress.finished or self._is_paused or not self._has_active_sample(progress):
queue_remaining = displayed_avg_seconds * samples_left
else:
- current_sample_remaining = max(0.0, displayed_avg_seconds - current_sample_elapsed)
- if samples_left == 0:
- queue_remaining = current_sample_remaining
- else:
- queue_remaining = current_sample_remaining + (displayed_avg_seconds * samples_left)
+ queue_remaining = displayed_avg_seconds * max(0, samples_left)
eta_clock = time.time() + queue_remaining if queue_remaining > 0 else None
stats_lines = [
f"Current sample: {current_sample}",
- f"Current step: {current_step}",
f"Samples left: {samples_left}",
f"Avg sample time: {self._format_duration(displayed_avg_seconds)}",
- f"This sample ETA: {self._format_duration(current_sample_remaining)}",
f"Queue remaining: {self._format_duration(queue_remaining)}",
f"Done by: {self._format_eta_timestamp(eta_clock)}",
]
@@ -286,16 +273,4 @@ class AutomationProgressWidget(QWidget):
label.setStyleSheet(self._style_for_status(step_state.status))
if self._title_label is not None:
- if self._is_paused:
- self._title_label.setText("Automation progress — Paused")
- elif progress.finished:
- if progress.success is True:
- self._title_label.setText("Automation progress — Finished")
- elif progress.success is False:
- self._title_label.setText("Automation progress — Finished with error")
- else:
- self._title_label.setText("Automation progress")
- elif progress.current_step:
- self._title_label.setText(f"Automation progress — {progress.current_step}")
- else:
- self._title_label.setText("Automation progress")
\ No newline at end of file
+ self._title_label.setText("Automation progress")