1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2026-04-19 06:45:36 +02:00

Compare commits

..

2 Commits

6 changed files with 68 additions and 24 deletions

View File

@@ -1,14 +1,6 @@
# CHANGELOG
## v1.4.1 (2024-11-12)
### Bug Fixes
- **positioner_box**: Adjusted default signals
([`8e5c0ad`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/8e5c0ad8c8eff5a9308169bc663d2b7230f0ebb1))
## v1.4.0 (2024-11-11)
### Bug Fixes
@@ -207,3 +199,11 @@ This property tells if expand should show a popup (by default), or if the widget
- **image**: Image widget can take data from monitor_1d endpoint
([`9ef1d1c`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/9ef1d1c9ac2178d9fa2e655942208f8abbdf5c1b))
## v0.117.1 (2024-10-11)
### Bug Fixes
- **FPS**: Qtimer cleanup leaking
([`3a22392`](https://gitlab.psi.ch/bec/bec_widgets/-/commit/3a2239278075de7489ad10a58c31d7d89715e221))

View File

@@ -336,6 +336,13 @@ class BECDock(RPCBase):
Detach the dock from the parent dock area.
"""
@rpc_call
def close(self):
"""
Close the dock area and cleanup.
Has to be implemented to overwrite pyqtgraph event accept in Container close.
"""
class BECDockArea(RPCBase, BECGuiClientMixin):
@property
@@ -394,6 +401,7 @@ class BECDockArea(RPCBase, BECGuiClientMixin):
name: "str" = None,
position: "Literal['bottom', 'top', 'left', 'right', 'above', 'below']" = None,
relative_to: "BECDock | None" = None,
temporary: "bool" = False,
closable: "bool" = True,
floating: "bool" = False,
prefix: "str" = "dock",
@@ -410,6 +418,7 @@ class BECDockArea(RPCBase, BECGuiClientMixin):
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.

View File

@@ -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
@@ -116,6 +117,7 @@ class BECDock(BECWidget, Dock):
"remove",
"attach",
"detach",
"close",
]
def __init__(
@@ -126,6 +128,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 +150,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 +177,24 @@ 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.dock import BECDockArea
self.orig_area.docks.pop(self.name(), None)
self.orig_area = BECDockArea()
self.area = self.orig_area
self.area.panels[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()

View File

@@ -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,
temporary: 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=temporary)
dock.config.position = position
self.config.docks[name] = dock.config
@@ -338,10 +340,19 @@ class BECDockArea(BECWidget, QWidget):
): # TODO still decide how initial instructions should be handled
self._instructions_visible = False
self.update()
if floating:
if floating or temporary:
dock.detach()
print("dock added")
return dock
# def add_temp_dock(self):
# area = BECDockArea()
# area.show()
# area.add_dock("dock1", widget="BECFigure")
def addDock(self, *args, **kwargs):
return self.add_dock(*args, **kwargs)
def detach_dock(self, dock_name: str) -> BECDock:
"""
Undock a dock from the dock area.
@@ -402,6 +413,11 @@ 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
@@ -412,4 +428,5 @@ if __name__ == "__main__":
set_theme("auto")
dock_area = BECDockArea()
dock_area.show()
dock_area.add_dock("dock1", widget="BECFigure", temporary=True)
app.exec_()

View File

@@ -240,18 +240,11 @@ class PositionerBox(BECWidget, CompactPopupWidget):
signal = hinted_signals[0]
readback_val = signals.get(signal, {}).get("value")
for setpoint_signal in ["setpoint", "user_setpoint"]:
setpoint_val = signals.get(f"{self.device}_{setpoint_signal}", {}).get("value")
if setpoint_val is not None:
break
if f"{self.device}_setpoint" in signals:
setpoint_val = signals.get(f"{self.device}_setpoint", {}).get("value")
for moving_signal in ["motor_done_move", "motor_is_moving"]:
is_moving = signals.get(f"{self.device}_{moving_signal}", {}).get("value")
if is_moving is not None:
break
if is_moving is not None:
self.ui.spinner_widget.setVisible(True)
if f"{self.device}_motor_is_moving" in signals:
is_moving = signals.get(f"{self.device}_motor_is_moving", {}).get("value")
if is_moving:
self.ui.spinner_widget.start()
self.ui.spinner_widget.setToolTip("Device is moving")
@@ -260,8 +253,6 @@ class PositionerBox(BECWidget, CompactPopupWidget):
self.ui.spinner_widget.stop()
self.ui.spinner_widget.setToolTip("Device is idle")
self.set_global_state("success")
else:
self.ui.spinner_widget.setVisible(False)
if readback_val is not None:
self.ui.readback.setText(f"{readback_val:.{precision}f}")

View File

@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "bec_widgets"
version = "1.4.1"
version = "1.4.0"
description = "BEC Widgets"
requires-python = ">=3.10"
classifiers = [