diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py b/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py index ba93df9..653883f 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/gui_tools.py @@ -18,10 +18,17 @@ class flomniGuiToolsError(Exception): class flomniGuiTools: + GUI_RPC_TIMEOUT = 20 def __init__(self): self.text_box = None self.progressbar = None + self.flomni_window = None + self.xeyegui = None + self.pdf_viewer = None + self.idle_text_box = None + self.camera_gripper_image = None + self.camera_overview_image = None def set_client(self, client): self.client = client @@ -29,9 +36,10 @@ class flomniGuiTools: def flomnigui_show_gui(self): if "flomni" in self.gui.windows: + self.flomni_window = self.gui.windows["flomni"] self.gui.flomni.raise_window() else: - self.gui.new("flomni") + self.flomni_window = self.gui.new("flomni", timeout=self.GUI_RPC_TIMEOUT) time.sleep(1) def flomnigui_stop_gui(self): @@ -42,9 +50,11 @@ class flomniGuiTools: def flomnigui_show_xeyealign(self): self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("xeyegui"): + if self._flomnigui_is_missing("xeyegui"): self.flomnigui_remove_all_docks() - self.xeyegui = self.gui.flomni.new("XRayEye", object_name="xrayeye") + self.xeyegui = self.gui.flomni.new( + "XRayEye", object_name="xrayeye", timeout=self.GUI_RPC_TIMEOUT + ) # start live if not dev.cam_xeye.live_mode_enabled.get(): dev.cam_xeye.live_mode_enabled.put(True) @@ -52,9 +62,11 @@ class flomniGuiTools: def flomnigui_show_xeyealign_fittab(self): self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("xeyegui"): + if self._flomnigui_is_missing("xeyegui"): self.flomnigui_remove_all_docks() - self.xeyegui = self.gui.flomni.new("XRayEye") + self.xeyegui = self.gui.flomni.new( + "XRayEye", object_name="xrayeye", timeout=self.GUI_RPC_TIMEOUT + ) self.xeyegui.switch_tab("fit") def _flomnigui_check_attribute_not_exists(self, attribute_name): @@ -70,31 +82,39 @@ class flomniGuiTools: return False return True + def _flomnigui_is_missing(self, attribute_name): + widget = getattr(self, attribute_name, None) + if widget is None: + return True + if hasattr(widget, "_is_deleted") and widget._is_deleted(): + return True + return False + def flomnigui_show_cameras(self): self.flomnigui_show_gui() if self._flomnigui_check_attribute_not_exists( "cam_flomni_gripper" ) or self._flomnigui_check_attribute_not_exists("cam_flomni_overview"): self.flomnigui_remove_all_docks() - camera_gripper_image = self.gui.flomni.new("Image") + self.camera_gripper_image = self.gui.flomni.new("Image") if self._flomnicam_check_device_exists(dev.cam_flomni_gripper): - camera_gripper_image.image(device="cam_flomni_gripper", signal="preview") - camera_gripper_image.lock_aspect_ratio = True - camera_gripper_image.enable_fps_monitor = True - camera_gripper_image.enable_toolbar = False - camera_gripper_image.outer_axes = False - camera_gripper_image.inner_axes = False + self.camera_gripper_image.image(device="cam_flomni_gripper", signal="preview") + self.camera_gripper_image.lock_aspect_ratio = True + self.camera_gripper_image.enable_fps_monitor = True + self.camera_gripper_image.enable_toolbar = False + self.camera_gripper_image.outer_axes = False + self.camera_gripper_image.inner_axes = False dev.cam_flomni_gripper.start_live_mode() else: print("Cannot open camera_gripper. Device does not exist.") - camera_overview_image = self.gui.flomni.new("Image") + self.camera_overview_image = self.gui.flomni.new("Image") if self._flomnicam_check_device_exists(dev.cam_flomni_overview): - camera_overview_image.image(device="cam_flomni_overview", signal="preview") - camera_overview_image.lock_aspect_ratio = True - camera_overview_image.enable_fps_monitor = True - camera_overview_image.enable_toolbar = False - camera_overview_image.outer_axes = False - camera_overview_image.inner_axes = False + self.camera_overview_image.image(device="cam_flomni_overview", signal="preview") + self.camera_overview_image.lock_aspect_ratio = True + self.camera_overview_image.enable_fps_monitor = True + self.camera_overview_image.enable_toolbar = False + self.camera_overview_image.outer_axes = False + self.camera_overview_image.inner_axes = False dev.cam_flomni_overview.start_live_mode() else: print("Cannot open camera_overview. Device does not exist.") @@ -104,15 +124,20 @@ class flomniGuiTools: # dev.cam_flomni_gripper.stop_live_mode() # dev.cam_xeye.live_mode = False if hasattr(self.gui, "flomni"): - self.gui.flomni.delete_all() + self.gui.flomni.delete_all(timeout=self.GUI_RPC_TIMEOUT) self.progressbar = None self.text_box = None + self.xeyegui = None + self.pdf_viewer = None + self.idle_text_box = None + self.camera_gripper_image = None + self.camera_overview_image = None def flomnigui_idle(self): self.flomnigui_show_gui() - if self._flomnigui_check_attribute_not_exists("idle_text_box"): + if self._flomnigui_is_missing("idle_text_box"): self.flomnigui_remove_all_docks() - idle_text_box = self.gui.flomni.new("TextBox") + self.idle_text_box = self.gui.flomni.new("TextBox") text = ( "
"
+ "██████╗ ███████╗ ██████╗ ███████╗██╗ ██████╗ ███╗ ███╗███╗ ██╗██╗\n"
@@ -123,7 +148,7 @@ class flomniGuiTools:
+ "╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝\n"
+ ""
)
- idle_text_box.set_html_text(text)
+ self.idle_text_box.set_html_text(text)
def flomnigui_docs(self, filename: str | None = None):
import csaxs_bec
@@ -167,7 +192,7 @@ class flomniGuiTools:
# --- GUI handling (active existence check) ----------------------------
self.flomnigui_show_gui()
- if self._flomnigui_check_attribute_not_exists("PdfViewerWidget"):
+ if self._flomnigui_is_missing("pdf_viewer"):
self.flomnigui_remove_all_docks()
self.pdf_viewer = self.gui.flomni.new(widget="PdfViewerWidget")
@@ -185,7 +210,7 @@ class flomniGuiTools:
def flomnigui_show_progress(self):
self.flomnigui_show_gui()
- if self._flomnigui_check_attribute_not_exists("progressbar"):
+ if self._flomnigui_is_missing("progressbar"):
self.flomnigui_remove_all_docks()
# Add a new dock with a RingProgressBar widget
self.progressbar = self.gui.flomni.new("RingProgressBar")