From 4b102b27f0665b2873f074af305cc756e6480218 Mon Sep 17 00:00:00 2001 From: Roberto Martins Date: Wed, 5 Aug 2026 09:29:02 +0100 Subject: [PATCH 1/3] upd: updated button logic --- BlocksScreen/lib/panels/widgets/basicFilamentPanel.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py b/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py index 4dac964e..735ade9f 100644 --- a/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py +++ b/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py @@ -2,6 +2,7 @@ import logging from functools import partial +from devices.amu.models import FilamentPos, GateStatus from lib.filament import Filament from lib.panels.widgets.popupDialogWidget import Popup from lib.printer import Printer @@ -256,10 +257,13 @@ def on_mmu_state_changed(self, mmu_state): btn.clicked.connect(partial(self.open_pre_gate_popup, _filament_type)) self.mmu_configured = True - if mmu_state.filament == "Loaded": - self.filament_state = self.FilamentStates.LOADED - else: + if mmu_state.filament_pos == FilamentPos.UNLOADED: self.filament_state = self.FilamentStates.UNLOADED + gate_info = mmu_state.current_gate_info + status = gate_info.status if gate_info is not None else GateStatus.UNKNOWN + self.filament_page_load_btn.setEnabled(status != GateStatus.EMPTY) + else: + self.filament_state = self.FilamentStates.LOADED @property def filament_state(self): From de3287c629f3a5cb22a334c7f4e654f3bab1dc21 Mon Sep 17 00:00:00 2001 From: Roberto Martins Date: Wed, 5 Aug 2026 10:42:11 +0100 Subject: [PATCH 2/3] fix test --- tests/widgets/conftest.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/widgets/conftest.py b/tests/widgets/conftest.py index 17b60b68..cd957523 100644 --- a/tests/widgets/conftest.py +++ b/tests/widgets/conftest.py @@ -13,7 +13,14 @@ if str(_project_root) not in sys.path: sys.path.insert(0, str(_project_root)) -for _pkg in ("lib", "lib.panels", "lib.panels.widgets", "lib.utils"): +for _pkg in ( + "lib", + "lib.panels", + "lib.panels.widgets", + "lib.utils", + "devices", + "devices.amu", +): sys.modules.pop(_pkg, None) _lib_mod = types.ModuleType("lib") @@ -21,6 +28,16 @@ _lib_mod.__package__ = "lib" sys.modules["lib"] = _lib_mod +_devices_mod = types.ModuleType("devices") +_devices_mod.__path__ = [str(_project_root / "BlocksScreen" / "devices")] +_devices_mod.__package__ = "devices" +sys.modules["devices"] = _devices_mod + +_devices_amu_mod = types.ModuleType("devices.amu") +_devices_amu_mod.__path__ = [str(_project_root / "BlocksScreen" / "devices" / "amu")] +_devices_amu_mod.__package__ = "devices.amu" +sys.modules["devices.amu"] = _devices_amu_mod + for _mod_name in ("events", "helper_methods"): _mod_path = _project_root / "BlocksScreen" / f"{_mod_name}.py" _spec = importlib.util.spec_from_file_location(_mod_name, _mod_path) From b66dc508fc7549644a1bb504699b4a526f337824 Mon Sep 17 00:00:00 2001 From: Robert0Mart Date: Wed, 23 Sep 2026 17:29:21 +0100 Subject: [PATCH 3/3] refactor: small changes --- .../lib/panels/widgets/basicFilamentPanel.py | 37 ++++++++++++------- tests/widgets/conftest.py | 24 +++++------- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py b/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py index 735ade9f..cae36c69 100644 --- a/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py +++ b/BlocksScreen/lib/panels/widgets/basicFilamentPanel.py @@ -52,6 +52,7 @@ def __init__(self, printer: Printer, cfg, parent=None) -> None: self.has_load_unload_objects = None self.filament_buttons_list = [] self.mmu_configured = False + self._mmu_state = None self._setupUi() self.filament_state = self.FilamentStates.UNKNOWN @@ -257,14 +258,26 @@ def on_mmu_state_changed(self, mmu_state): btn.clicked.connect(partial(self.open_pre_gate_popup, _filament_type)) self.mmu_configured = True - if mmu_state.filament_pos == FilamentPos.UNLOADED: + self._mmu_state = mmu_state + if mmu_state.filament_pos == FilamentPos.UNKNOWN: + self.filament_state = self.FilamentStates.UNKNOWN + elif mmu_state.filament_pos == FilamentPos.UNLOADED: self.filament_state = self.FilamentStates.UNLOADED - gate_info = mmu_state.current_gate_info - status = gate_info.status if gate_info is not None else GateStatus.UNKNOWN - self.filament_page_load_btn.setEnabled(status != GateStatus.EMPTY) else: self.filament_state = self.FilamentStates.LOADED + @property + def _gate_has_filament(self) -> bool: + _gate = self._mmu_state.current_gate_info if self._mmu_state else None + return _gate is None or _gate.status != GateStatus.EMPTY + + @property + def _mmu_busy(self) -> bool: + return self._mmu_state is not None and self._mmu_state.action not in ( + "", + "Idle", + ) + @property def filament_state(self): return self._filament_state @@ -272,15 +285,13 @@ def filament_state(self): @filament_state.setter def filament_state(self, update: FilamentStates) -> None: self._filament_state = update - if update is self.FilamentStates.LOADED: - self.filament_page_unload_btn.setEnabled(True) - self.filament_page_load_btn.setEnabled(False) - elif update is self.FilamentStates.UNLOADED: - self.filament_page_unload_btn.setEnabled(False) - self.filament_page_load_btn.setEnabled(True) - else: - self.filament_page_load_btn.setEnabled(True) - self.filament_page_unload_btn.setEnabled(True) + _idle = not self._mmu_busy + _loaded = update is self.FilamentStates.LOADED + _unloaded = update is self.FilamentStates.UNLOADED + self.filament_page_unload_btn.setEnabled(_idle and not _unloaded) + self.filament_page_load_btn.setEnabled( + _idle and not _loaded and self._gate_has_filament + ) def change_page(self, index: int) -> None: self.setCurrentIndex(index) diff --git a/tests/widgets/conftest.py b/tests/widgets/conftest.py index cd957523..8c6a3103 100644 --- a/tests/widgets/conftest.py +++ b/tests/widgets/conftest.py @@ -20,23 +20,19 @@ "lib.utils", "devices", "devices.amu", + "devices.amu.models", ): sys.modules.pop(_pkg, None) -_lib_mod = types.ModuleType("lib") -_lib_mod.__path__ = [str(_project_root / "BlocksScreen" / "lib")] -_lib_mod.__package__ = "lib" -sys.modules["lib"] = _lib_mod - -_devices_mod = types.ModuleType("devices") -_devices_mod.__path__ = [str(_project_root / "BlocksScreen" / "devices")] -_devices_mod.__package__ = "devices" -sys.modules["devices"] = _devices_mod - -_devices_amu_mod = types.ModuleType("devices.amu") -_devices_amu_mod.__path__ = [str(_project_root / "BlocksScreen" / "devices" / "amu")] -_devices_amu_mod.__package__ = "devices.amu" -sys.modules["devices.amu"] = _devices_amu_mod +for _name, _parts in ( + ("lib", ("lib",)), + ("devices", ("devices",)), + ("devices.amu", ("devices", "amu")), +): + _m = types.ModuleType(_name) + _m.__path__ = [str(_project_root.joinpath("BlocksScreen", *_parts))] + _m.__package__ = _name + sys.modules[_name] = _m for _mod_name in ("events", "helper_methods"): _mod_path = _project_root / "BlocksScreen" / f"{_mod_name}.py"