diff --git a/bec_widgets/examples/jupyter_console/jupyter_console_window.py b/bec_widgets/examples/jupyter_console/jupyter_console_window.py index 62591a9e..32aca6fe 100644 --- a/bec_widgets/examples/jupyter_console/jupyter_console_window.py +++ b/bec_widgets/examples/jupyter_console/jupyter_console_window.py @@ -43,22 +43,22 @@ class JupyterConsoleWindow(QWidget): # pragma: no cover: "pg": pg, "wh": wh, "dock": self.dock, - "im": self.im, - "mi": self.mi, - "mm": self.mm, - "lm": self.lm, - "btn1": self.btn1, - "btn2": self.btn2, - "btn3": self.btn3, - "btn4": self.btn4, - "btn5": self.btn5, - "btn6": self.btn6, - "pb": self.pb, - "pi": self.pi, - "wf": self.wf, - "scatter": self.scatter, - "scatter_mi": self.scatter, - "mwf": self.mwf, + # "im": self.im, + # "mi": self.mi, + # "mm": self.mm, + # "lm": self.lm, + # "btn1": self.btn1, + # "btn2": self.btn2, + # "btn3": self.btn3, + # "btn4": self.btn4, + # "btn5": self.btn5, + # "btn6": self.btn6, + # "pb": self.pb, + # "pi": self.pi, + # "wf": self.wf, + # "scatter": self.scatter, + # "scatter_mi": self.scatter, + # "mwf": self.mwf, } ) @@ -77,76 +77,76 @@ class JupyterConsoleWindow(QWidget): # pragma: no cover: first_tab_layout.addWidget(self.dock) tab_widget.addTab(first_tab, "Dock Area") - third_tab = QWidget() - third_tab_layout = QVBoxLayout(third_tab) - self.lm = LayoutManagerWidget() - third_tab_layout.addWidget(self.lm) - tab_widget.addTab(third_tab, "Layout Manager Widget") - - fourth_tab = QWidget() - fourth_tab_layout = QVBoxLayout(fourth_tab) - self.pb = PlotBase() - self.pi = self.pb.plot_item - fourth_tab_layout.addWidget(self.pb) - tab_widget.addTab(fourth_tab, "PlotBase") - - tab_widget.setCurrentIndex(3) - + # third_tab = QWidget() + # third_tab_layout = QVBoxLayout(third_tab) + # self.lm = LayoutManagerWidget() + # third_tab_layout.addWidget(self.lm) + # tab_widget.addTab(third_tab, "Layout Manager Widget") + # + # fourth_tab = QWidget() + # fourth_tab_layout = QVBoxLayout(fourth_tab) + # self.pb = PlotBase() + # self.pi = self.pb.plot_item + # fourth_tab_layout.addWidget(self.pb) + # tab_widget.addTab(fourth_tab, "PlotBase") + # + # tab_widget.setCurrentIndex(3) + # group_box = QGroupBox("Jupyter Console", splitter) group_box_layout = QVBoxLayout(group_box) self.console = BECJupyterConsole(inprocess=True) group_box_layout.addWidget(self.console) - - # Some buttons for layout testing - self.btn1 = QPushButton("Button 1") - self.btn2 = QPushButton("Button 2") - self.btn3 = QPushButton("Button 3") - self.btn4 = QPushButton("Button 4") - self.btn5 = QPushButton("Button 5") - self.btn6 = QPushButton("Button 6") - - fifth_tab = QWidget() - fifth_tab_layout = QVBoxLayout(fifth_tab) - self.wf = Waveform() - fifth_tab_layout.addWidget(self.wf) - tab_widget.addTab(fifth_tab, "Waveform Next Gen") - tab_widget.setCurrentIndex(4) - - sixth_tab = QWidget() - sixth_tab_layout = QVBoxLayout(sixth_tab) - self.im = Image() - self.mi = self.im.main_image - sixth_tab_layout.addWidget(self.im) - tab_widget.addTab(sixth_tab, "Image Next Gen") - tab_widget.setCurrentIndex(5) - - seventh_tab = QWidget() - seventh_tab_layout = QVBoxLayout(seventh_tab) - self.scatter = ScatterWaveform() - self.scatter_mi = self.scatter.main_curve - self.scatter.plot("samx", "samy", "bpm4i") - seventh_tab_layout.addWidget(self.scatter) - tab_widget.addTab(seventh_tab, "Scatter Waveform") - tab_widget.setCurrentIndex(6) - - eighth_tab = QWidget() - eighth_tab_layout = QVBoxLayout(eighth_tab) - self.mm = MotorMap() - eighth_tab_layout.addWidget(self.mm) - tab_widget.addTab(eighth_tab, "Motor Map") - tab_widget.setCurrentIndex(7) - - ninth_tab = QWidget() - ninth_tab_layout = QVBoxLayout(ninth_tab) - self.mwf = MultiWaveform() - ninth_tab_layout.addWidget(self.mwf) - tab_widget.addTab(ninth_tab, "MultiWaveform") - tab_widget.setCurrentIndex(8) - - # add stuff to the new Waveform widget - self._init_waveform() - - self.setWindowTitle("Jupyter Console Window") + # + # # Some buttons for layout testing + # self.btn1 = QPushButton("Button 1") + # self.btn2 = QPushButton("Button 2") + # self.btn3 = QPushButton("Button 3") + # self.btn4 = QPushButton("Button 4") + # self.btn5 = QPushButton("Button 5") + # self.btn6 = QPushButton("Button 6") + # + # fifth_tab = QWidget() + # fifth_tab_layout = QVBoxLayout(fifth_tab) + # self.wf = Waveform() + # fifth_tab_layout.addWidget(self.wf) + # tab_widget.addTab(fifth_tab, "Waveform Next Gen") + # tab_widget.setCurrentIndex(4) + # + # sixth_tab = QWidget() + # sixth_tab_layout = QVBoxLayout(sixth_tab) + # self.im = Image() + # self.mi = self.im.main_image + # sixth_tab_layout.addWidget(self.im) + # tab_widget.addTab(sixth_tab, "Image Next Gen") + # tab_widget.setCurrentIndex(5) + # + # seventh_tab = QWidget() + # seventh_tab_layout = QVBoxLayout(seventh_tab) + # self.scatter = ScatterWaveform() + # self.scatter_mi = self.scatter.main_curve + # self.scatter.plot("samx", "samy", "bpm4i") + # seventh_tab_layout.addWidget(self.scatter) + # tab_widget.addTab(seventh_tab, "Scatter Waveform") + # tab_widget.setCurrentIndex(6) + # + # eighth_tab = QWidget() + # eighth_tab_layout = QVBoxLayout(eighth_tab) + # self.mm = MotorMap() + # eighth_tab_layout.addWidget(self.mm) + # tab_widget.addTab(eighth_tab, "Motor Map") + # tab_widget.setCurrentIndex(7) + # + # ninth_tab = QWidget() + # ninth_tab_layout = QVBoxLayout(ninth_tab) + # self.mwf = MultiWaveform() + # ninth_tab_layout.addWidget(self.mwf) + # tab_widget.addTab(ninth_tab, "MultiWaveform") + # tab_widget.setCurrentIndex(8) + # + # # add stuff to the new Waveform widget + # self._init_waveform() + # + # self.setWindowTitle("Jupyter Console Window") def _init_waveform(self): self.wf.plot(y_name="bpm4i", y_entry="bpm4i", dap="GaussianModel") @@ -174,7 +174,7 @@ if __name__ == "__main__": # pragma: no cover icon = material_icon("terminal", color=(255, 255, 255, 255), filled=True) app.setWindowIcon(icon) - bec_dispatcher = BECDispatcher() + bec_dispatcher = BECDispatcher(gui_id="jupyter_console") client = bec_dispatcher.client client.start() diff --git a/bec_widgets/utils/bec_connector.py b/bec_widgets/utils/bec_connector.py index a50fed70..2d830281 100644 --- a/bec_widgets/utils/bec_connector.py +++ b/bec_widgets/utils/bec_connector.py @@ -85,7 +85,6 @@ class BECConnector: gui_id: str | None = None, object_name: str | None = None, parent_dock: BECDock | None = None, # TODO should go away -> issue created #473 - parent_id: str | None = None, **kwargs, ): # Extract object_name from kwargs to not pass it to Qt class @@ -131,7 +130,6 @@ class BECConnector: ) self.config = ConnectionConfig(widget_class=self.__class__.__name__) - self.parent_id = parent_id # If the gui_id is passed, it should be respected. However, this should be revisted since # the gui_id has to be unique, and may no longer be. if gui_id: @@ -150,11 +148,6 @@ class BECConnector: # 2) Enforce unique objectName among siblings with the same BECConnector parent self.setParent(parent) - if parent_id is None: - connector_parent = WidgetHierarchy._get_becwidget_ancestor(self) - if connector_parent is not None: - self.parent_id = connector_parent.gui_id - if isinstance(self.parent(), QObject) and hasattr(self, "cleanup"): self.parent().destroyed.connect(self._run_cleanup_on_deleted_parent) @@ -167,6 +160,14 @@ class BECConnector: QTimer.singleShot(0, self._update_object_name) + @property + def parent_id(self) -> str | None: + try: + connector_parent = WidgetHierarchy._get_becwidget_ancestor(self) + return connector_parent.gui_id if connector_parent else None + except: + logger.error(f"Error getting parent_id for {self.__class__.__name__}") + @SafeSlot() def _run_cleanup_on_deleted_parent(self) -> None: """ diff --git a/bec_widgets/utils/bec_widget.py b/bec_widgets/utils/bec_widget.py index 35920c18..b43ee769 100644 --- a/bec_widgets/utils/bec_widget.py +++ b/bec_widgets/utils/bec_widget.py @@ -33,7 +33,6 @@ class BECWidget(BECConnector): gui_id: str | None = None, theme_update: bool = False, parent_dock: BECDock | None = None, # TODO should go away -> issue created #473 - parent_id: str | None = None, **kwargs, ): """ @@ -55,12 +54,7 @@ class BECWidget(BECConnector): """ super().__init__( - client=client, - config=config, - gui_id=gui_id, - parent_dock=parent_dock, - parent_id=parent_id, - **kwargs, + client=client, config=config, gui_id=gui_id, parent_dock=parent_dock, **kwargs ) if not isinstance(self, QObject): raise RuntimeError(f"{repr(self)} is not a subclass of QWidget") diff --git a/bec_widgets/widgets/containers/dock/dock.py b/bec_widgets/widgets/containers/dock/dock.py index 1ffd9f7d..ed0271d3 100644 --- a/bec_widgets/widgets/containers/dock/dock.py +++ b/bec_widgets/widgets/containers/dock/dock.py @@ -131,7 +131,6 @@ class BECDock(BECWidget, Dock): self, parent: QWidget | None = None, parent_dock_area: BECDockArea | None = None, - parent_id: str | None = None, config: DockConfig | None = None, name: str | None = None, object_name: str | None = None, @@ -325,11 +324,7 @@ class BECDock(BECWidget, Dock): widget = cast( BECWidget, widget_handler.create_widget( - widget_type=widget, - object_name=name, - parent_dock=self, - parent_id=self.gui_id, - parent=self, + widget_type=widget, object_name=name, parent_dock=self, parent=self ), ) else: @@ -425,6 +420,7 @@ class BECDock(BECWidget, Dock): self.delete_all() self.widgets.clear() super().cleanup() + self.deleteLater() def close(self): """ diff --git a/bec_widgets/widgets/containers/dock/dock_area.py b/bec_widgets/widgets/containers/dock/dock_area.py index 6856338d..d96268ce 100644 --- a/bec_widgets/widgets/containers/dock/dock_area.py +++ b/bec_widgets/widgets/containers/dock/dock_area.py @@ -102,7 +102,7 @@ class BECDockArea(BECWidget, QWidget): self._instructions_visible = True - self.dark_mode_button = DarkModeButton(parent=self, parent_id=self.gui_id, toolbar=True) + self.dark_mode_button = DarkModeButton(parent=self, toolbar=True) self.dock_area = DockArea(parent=self) self.toolbar = ModularToolBar( parent=self, @@ -377,7 +377,6 @@ class BECDockArea(BECWidget, QWidget): name=name, # this is dock name pyqtgraph property, this is displayed on label object_name=name, # this is a real qt object name passed to BECConnector parent_dock_area=self, - parent_id=self.gui_id, closable=closable, ) dock.config.position = position diff --git a/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py b/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py index a221121f..b857ec3d 100644 --- a/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py +++ b/bec_widgets/widgets/control/device_input/base_classes/device_input_base.py @@ -82,7 +82,7 @@ class DeviceInputBase(BECWidget): ReadoutPriority.ON_REQUEST: "readout_on_request", } - def __init__(self, client=None, config=None, gui_id: str | None = None, **kwargs): + def __init__(self, parent=None, client=None, config=None, gui_id: str | None = None, **kwargs): if config is None: config = DeviceInputConfig(widget_class=self.__class__.__name__) @@ -90,7 +90,9 @@ class DeviceInputBase(BECWidget): if isinstance(config, dict): config = DeviceInputConfig(**config) self.config = config - super().__init__(client=client, config=config, gui_id=gui_id, theme_update=True, **kwargs) + super().__init__( + parent=parent, client=client, config=config, gui_id=gui_id, theme_update=True, **kwargs + ) self.get_bec_shortcuts() self._device_filter = [] self._readout_filter = [] diff --git a/bec_widgets/widgets/control/scan_control/scan_group_box.py b/bec_widgets/widgets/control/scan_control/scan_group_box.py index 7cdf0386..9a51a0d9 100644 --- a/bec_widgets/widgets/control/scan_control/scan_group_box.py +++ b/bec_widgets/widgets/control/scan_control/scan_group_box.py @@ -274,6 +274,7 @@ class ScanGroupBox(QGroupBox): for widget in self.widgets[-len(self.inputs) :]: if isinstance(widget, DeviceLineEdit): self.selected_devices[widget] = "" + widget.close() widget.deleteLater() self.widgets = self.widgets[: -len(self.inputs)] diff --git a/bec_widgets/widgets/plots/image/image.py b/bec_widgets/widgets/plots/image/image.py index 384c6b26..3cf65b8a 100644 --- a/bec_widgets/widgets/plots/image/image.py +++ b/bec_widgets/widgets/plots/image/image.py @@ -137,7 +137,7 @@ class Image(PlotBase): super().__init__( parent=parent, config=config, client=client, gui_id=gui_id, popups=popups, **kwargs ) - self._main_image = ImageItem(parent_image=self, parent_id=self.gui_id) + self._main_image = ImageItem(parent_image=self) self.plot_item.addItem(self._main_image) self.scan_id = None diff --git a/bec_widgets/widgets/plots/image/image_item.py b/bec_widgets/widgets/plots/image/image_item.py index 8ead1599..71021c96 100644 --- a/bec_widgets/widgets/plots/image/image_item.py +++ b/bec_widgets/widgets/plots/image/image_item.py @@ -86,7 +86,6 @@ class ImageItem(BECConnector, pg.ImageItem): self.set_parent(parent_image) else: self.parent_image = None - self.parent_id = None super().__init__(config=config, gui_id=gui_id, **kwargs) self.raw_data = None @@ -98,7 +97,6 @@ class ImageItem(BECConnector, pg.ImageItem): def set_parent(self, parent: BECConnector): self.parent_image = parent - self.parent_id = parent.gui_id def parent(self): return self.parent_image diff --git a/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py b/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py index 14198512..86402ee9 100644 --- a/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py +++ b/bec_widgets/widgets/plots/multi_waveform/toolbar_bundles/monitor_selection.py @@ -29,9 +29,7 @@ class MultiWaveformSelectionToolbarBundle(ToolbarBundle): # Monitor Selection self.monitor = DeviceComboBox( - device_filter=BECDeviceFilter.DEVICE, - readout_priority_filter=ReadoutPriority.ASYNC, - parent_id=self.target_widget.gui_id, + device_filter=BECDeviceFilter.DEVICE, readout_priority_filter=ReadoutPriority.ASYNC ) self.monitor.addItem("", None) self.monitor.setCurrentText("") @@ -40,7 +38,7 @@ class MultiWaveformSelectionToolbarBundle(ToolbarBundle): self.add_action("monitor", WidgetAction(widget=self.monitor, adjust_size=False)) # Colormap Selection - self.colormap_widget = BECColorMapWidget(cmap="plasma", parent_id=self.target_widget.gui_id) + self.colormap_widget = BECColorMapWidget(cmap="plasma") self.add_action("color_map", WidgetAction(widget=self.colormap_widget, adjust_size=False)) # Connect slots, a device will be connected upon change of any combobox diff --git a/bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py b/bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py index 4ad325ae..bd12e648 100644 --- a/bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py +++ b/bec_widgets/widgets/plots/scatter_waveform/scatter_curve.py @@ -78,7 +78,6 @@ class ScatterCurve(BECConnector, pg.PlotDataItem): self.config = config name = config.label self.parent_item = parent_item - self.parent_id = self.parent_item.gui_id object_name = name.replace("-", "_").replace(" ", "_") if name else None super().__init__(name=name, object_name=object_name, config=config, gui_id=gui_id, **kwargs) diff --git a/bec_widgets/widgets/plots/waveform/curve.py b/bec_widgets/widgets/plots/waveform/curve.py index af767513..c24c9657 100644 --- a/bec_widgets/widgets/plots/waveform/curve.py +++ b/bec_widgets/widgets/plots/waveform/curve.py @@ -92,7 +92,6 @@ class Curve(BECConnector, pg.PlotDataItem): else: self.config = config self.parent_item = parent_item - self.parent_id = self.parent_item.gui_id object_name = name.replace("-", "_").replace(" ", "_") if name else None super().__init__(name=name, object_name=object_name, config=config, gui_id=gui_id, **kwargs)