diff --git a/bec_widgets/widgets/dock/dock.py b/bec_widgets/widgets/dock/dock.py index c7541de1..6fef65ef 100644 --- a/bec_widgets/widgets/dock/dock.py +++ b/bec_widgets/widgets/dock/dock.py @@ -2,6 +2,7 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any, Literal, Optional +from qtpy.QtCore import QSize from pydantic import Field from pyqtgraph.dockarea import Dock, DockLabel from qtpy import QtCore, QtGui @@ -10,6 +11,7 @@ from bec_widgets.cli.rpc_wigdet_handler import widget_handler from bec_widgets.utils import ConnectionConfig, GridLayoutManager from bec_widgets.utils.bec_widget import BECWidget + if TYPE_CHECKING: from qtpy.QtWidgets import QWidget @@ -116,6 +118,7 @@ class BECDock(BECWidget, Dock): "remove", "attach", "detach", + "close", ] def __init__( @@ -126,6 +129,7 @@ class BECDock(BECWidget, Dock): name: str | None = None, client=None, gui_id: str | None = None, + temp: bool = False, closable: bool = True, **kwargs, ) -> None: @@ -147,6 +151,8 @@ class BECDock(BECWidget, Dock): # Layout Manager self.layout_manager = GridLayoutManager(self.layout) + self.temp = temp + def dropEvent(self, event): source = event.source() old_area = source.area @@ -172,6 +178,23 @@ class BECDock(BECWidget, Dock): else: super().float() + if self.temp: + self.make_dock_temporary() + + def make_dock_temporary(self): + """ + Make the dock temporary. + """ + from bec_widgets.widgets import BECDockArea + + self.orig_area.docks.pop(self.name(), None) + self.orig_area = BECDockArea() + self.area = self.orig_area + self.area.docks[self.name()] = self + self.config.parent_dock_area = self.area.gui_id + self.area.temporary = False + self.hide_title_bar() + @property def widget_list(self) -> list[BECWidget]: """ @@ -333,3 +356,7 @@ class BECDock(BECWidget, Dock): self.cleanup() super().close() self.parent_dock_area.dock_area.docks.pop(self.name(), None) + + if self.temp: + self.area.deleteLater() + self.deleteLater() diff --git a/bec_widgets/widgets/dock/dock_area.py b/bec_widgets/widgets/dock/dock_area.py index 3d947ff4..93f3398b 100644 --- a/bec_widgets/widgets/dock/dock_area.py +++ b/bec_widgets/widgets/dock/dock_area.py @@ -278,6 +278,7 @@ class BECDockArea(BECWidget, QWidget): name: str = None, position: Literal["bottom", "top", "left", "right", "above", "below"] = None, relative_to: BECDock | None = None, + temp: bool = False, closable: bool = True, floating: bool = False, prefix: str = "dock", @@ -294,6 +295,7 @@ class BECDockArea(BECWidget, QWidget): name(str): The name of the dock to be displayed and for further references. Has to be unique. position(Literal["bottom", "top", "left", "right", "above", "below"]): The position of the dock. relative_to(BECDock): The dock to which the new dock should be added relative to. + temp(bool): Whether the dock is temporary. Upon closing the dock is not returned to the parent dock area. closable(bool): Whether the dock is closable. floating(bool): Whether the dock is detached after creating. prefix(str): The prefix for the dock name if no name is provided. @@ -317,7 +319,7 @@ class BECDockArea(BECWidget, QWidget): if position is None: position = "bottom" - dock = BECDock(name=name, parent_dock_area=self, closable=closable) + dock = BECDock(name=name, parent_dock_area=self, closable=closable, temp=temp) dock.config.position = position self.config.docks[name] = dock.config @@ -338,10 +340,16 @@ class BECDockArea(BECWidget, QWidget): ): # TODO still decide how initial instructions should be handled self._instructions_visible = False self.update() - if floating: + if floating or temp: dock.detach() + print("dock added") return dock + # def add_temp_dock(self): + # area = BECDockArea() + # area.show() + # area.add_dock("dock1", widget="BECFigure") + def detach_dock(self, dock_name: str) -> BECDock: """ Undock a dock from the dock area. @@ -402,6 +410,10 @@ class BECDockArea(BECWidget, QWidget): self.cleanup() super().close() + def closeEvent(self, event): + print("close event called") + self.cleanup() + super().closeEvent(event) if __name__ == "__main__": from qtpy.QtWidgets import QApplication