|
|
@@ -244,8 +244,9 @@ class LFMRIWindow(QMainWindow):
|
|
|
self._spec_blink_timer.setInterval(700)
|
|
|
self._spec_blink_timer.timeout.connect(self._tick_spec_blink)
|
|
|
|
|
|
- # Mode selector state
|
|
|
- self._current_mode: str = "plug" # updated by background fetch after startup
|
|
|
+ # Mode selector state — initialised from server_config.json, then
|
|
|
+ # confirmed/overridden by a background GET /mode after startup.
|
|
|
+ self._current_mode: str = hw_mode
|
|
|
self._mode_bridge = _ModeSignalBridge(self)
|
|
|
|
|
|
self.menuBar().hide()
|
|
|
@@ -425,21 +426,27 @@ class LFMRIWindow(QMainWindow):
|
|
|
sb = QStatusBar()
|
|
|
self.setStatusBar(sb)
|
|
|
|
|
|
- # Permanent mode badge on the right
|
|
|
- mode_color = "#e65100" if self._hw_mode == "real" else "#336633"
|
|
|
- mode_lbl = QLabel(f" {self._hw_mode.upper()} ")
|
|
|
- mode_lbl.setStyleSheet(
|
|
|
- f"color: {mode_color}; font-weight: bold; font-size: 10px;"
|
|
|
- f" background: {mode_color}22; border: 1px solid {mode_color}55;"
|
|
|
+ # Permanent mode badge — stored so _refresh_mode_badge() can update it
|
|
|
+ self._mode_badge_lbl = QLabel()
|
|
|
+ sb.addPermanentWidget(self._mode_badge_lbl)
|
|
|
+ self._refresh_mode_badge()
|
|
|
+ sb.showMessage(f"{i18n.tr('active_tab')}: {i18n.tr(_TAB_NAV_KEYS[0])}")
|
|
|
+
|
|
|
+ def _refresh_mode_badge(self) -> None:
|
|
|
+ """Update the status-bar mode badge to reflect _current_mode."""
|
|
|
+ mode = self._current_mode
|
|
|
+ color = "#e65100" if mode == "real" else "#336633"
|
|
|
+ self._mode_badge_lbl.setText(f" {mode.upper()} ")
|
|
|
+ self._mode_badge_lbl.setStyleSheet(
|
|
|
+ f"color: {color}; font-weight: bold; font-size: 10px;"
|
|
|
+ f" background: {color}22; border: 1px solid {color}55;"
|
|
|
" border-radius: 3px; padding: 0 4px; margin: 2px 6px;"
|
|
|
)
|
|
|
- mode_lbl.setToolTip(
|
|
|
+ self._mode_badge_lbl.setToolTip(
|
|
|
"Hardware mode: real scanner connected"
|
|
|
- if self._hw_mode == "real"
|
|
|
+ if mode == "real"
|
|
|
else "Stub mode: simulated responses, no hardware"
|
|
|
)
|
|
|
- sb.addPermanentWidget(mode_lbl)
|
|
|
- sb.showMessage(f"{i18n.tr('active_tab')}: {i18n.tr(_TAB_NAV_KEYS[0])}")
|
|
|
|
|
|
def _size_and_center(self) -> None:
|
|
|
screen = QApplication.primaryScreen()
|
|
|
@@ -554,12 +561,15 @@ class LFMRIWindow(QMainWindow):
|
|
|
def _on_mode_fetched(self, mode: str) -> None:
|
|
|
self._current_mode = mode
|
|
|
self._update_mode_btn()
|
|
|
+ self._refresh_mode_badge()
|
|
|
self._scanner_tab.refresh_scenarios()
|
|
|
|
|
|
def _on_mode_set(self, mode: str) -> None:
|
|
|
self._current_mode = mode
|
|
|
self._mode_btn.setEnabled(True)
|
|
|
self._update_mode_btn()
|
|
|
+ self._refresh_mode_badge()
|
|
|
+ self.setWindowTitle(f"LF-MRI System [{mode.upper()}]")
|
|
|
self._scanner_tab.refresh_scenarios()
|
|
|
|
|
|
def _on_mode_error(self, msg: str) -> None:
|
|
|
@@ -575,10 +585,17 @@ class LFMRIWindow(QMainWindow):
|
|
|
def _on_mode_btn_clicked(self) -> None:
|
|
|
target = "real" if self._current_mode == "plug" else "plug"
|
|
|
confirm_key = f"mode_confirm_to_{target}"
|
|
|
+ msg = i18n.tr(confirm_key)
|
|
|
+ if target == "real":
|
|
|
+ msg += (
|
|
|
+ "\n\n⚠ Switching to REAL mode requires the native spectrometer "
|
|
|
+ "to be already running (start.ps1 -Mode real).\n"
|
|
|
+ "If it is not running, the first scan will fail with a connection error."
|
|
|
+ )
|
|
|
reply = QMessageBox.question(
|
|
|
self,
|
|
|
i18n.tr("mode_confirm_title"),
|
|
|
- i18n.tr(confirm_key),
|
|
|
+ msg,
|
|
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
|
|
QMessageBox.StandardButton.No,
|
|
|
)
|