From 4ee139ad8fcf7d33d48c2620ead41ab4dd52730c Mon Sep 17 00:00:00 2001 From: jack Date: Thu, 9 Jul 2026 13:07:31 -0700 Subject: [PATCH] fix: The QML cross-component id resolution for root.waferDetected was failing silently. Exposing a proper waferDetected property on the Python DeviceController ensures reliable gating, and resetting it on refresh blocks the actions until the next successful detection. --- .../ISC/Tabs/components/StatusActionsPanel.qml | 5 +++-- .../backend/controllers/device_controller.py | 16 ++++++++++++++++ tmp/settings.json | 2 -- 3 files changed, 19 insertions(+), 4 deletions(-) delete mode 100644 tmp/settings.json diff --git a/src/pygui/ISC/Tabs/components/StatusActionsPanel.qml b/src/pygui/ISC/Tabs/components/StatusActionsPanel.qml index 74fdd85..44141e2 100644 --- a/src/pygui/ISC/Tabs/components/StatusActionsPanel.qml +++ b/src/pygui/ISC/Tabs/components/StatusActionsPanel.qml @@ -44,7 +44,7 @@ ColumnLayout { label: "READ MEMORY" iconSource: "../icons/read.svg" Layout.fillWidth: true - enabled: root.waferDetected + enabled: deviceController.waferDetected && !deviceController.operationInProgress onClicked: deviceController.readMemoryAsync() } @@ -53,7 +53,7 @@ ColumnLayout { iconSource: "../icons/erase.svg" Layout.fillWidth: true destructive: true - enabled: root.waferDetected + enabled: deviceController.waferDetected && !deviceController.operationInProgress onClicked: deviceController.eraseMemory( deviceController.selectedPort) } @@ -87,6 +87,7 @@ ColumnLayout { label: "REFRESH SESSION" iconSource: "../icons/refresh.svg" Layout.fillWidth: true + enabled: !deviceController.operationInProgress onClicked: deviceController.clearSession() } diff --git a/src/pygui/backend/controllers/device_controller.py b/src/pygui/backend/controllers/device_controller.py index dc23dc8..3b87776 100644 --- a/src/pygui/backend/controllers/device_controller.py +++ b/src/pygui/backend/controllers/device_controller.py @@ -38,6 +38,7 @@ class DeviceController(QObject): portsUpdated = Signal(list) connectionStatusChanged = Signal() operationInProgressChanged = Signal() + waferDetectedChanged = Signal() selectedPortChanged = Signal() detectResult = Signal(object) # WaferInfo dict or None readResult = Signal(dict) # {"success": bool, "bytes": int} or {"error": str} @@ -77,6 +78,7 @@ class DeviceController(QObject): # → denied = safe default. Called by P2.1. # See docs/pending/license-gating-plan.md §1.2. self._last_wafer_info: dict[str, Any] = {} + self._wafer_detected: bool = False self._last_csv_path: str = "" self._selected_port: str = "" self._data_row_count: int = 0 @@ -212,6 +214,17 @@ class DeviceController(QObject): info.get("cycleCount", 0), ] + @Property(bool, notify=waferDetectedChanged) + def waferDetected(self) -> bool: + """Whether a wafer is currently detected and ready for read/erase.""" + return self._wafer_detected + + def _set_wafer_detected(self, detected: bool) -> None: + if self._wafer_detected != detected: + self._wafer_detected = detected + self.waferDetectedChanged.emit() + + @Property(object, notify=detectResult) def dataModel(self) -> TemperatureTableModel: """QAbstractTableModel for the parsed temperature data table.""" @@ -276,6 +289,7 @@ class DeviceController(QObject): self._set_connection_status("Disconnected") self._selected_port = "" self._last_wafer_info = {} + self._set_wafer_detected(False) self._data_row_count = 0 self._data_col_count = 0 self._raw_bytes = None @@ -366,6 +380,7 @@ class DeviceController(QObject): wafer_dict = self._wafer_info_to_dict(info) self._selected_port = port or "" self._last_wafer_info = wafer_dict + self._set_wafer_detected(True) self._set_connection_status("Connected") self.detectResult.emit(wafer_dict) self.selectedPortChanged.emit() @@ -375,6 +390,7 @@ class DeviceController(QObject): self._set_connection_status("Disconnected") self._append_log("No wafer detected on any port") self._last_wafer_info = {} + self._set_wafer_detected(False) self.detectResult.emit(None) self.selectedPortChanged.emit() finally: diff --git a/tmp/settings.json b/tmp/settings.json deleted file mode 100644 index 9012666..0000000 --- a/tmp/settings.json +++ /dev/null @@ -1,2 +0,0 @@ -{ - "_mock_return_value": \ No newline at end of file