Compare commits
1 Commits
fix/compar
...
feat/label
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a7e231518 |
0
debye_bec/bec_widgets/widgets/__init__.py
Normal file
0
debye_bec/bec_widgets/widgets/__init__.py
Normal file
0
debye_bec/bec_widgets/widgets/label_box/__init__.py
Normal file
0
debye_bec/bec_widgets/widgets/label_box/__init__.py
Normal file
150
debye_bec/bec_widgets/widgets/label_box/label_box.py
Normal file
150
debye_bec/bec_widgets/widgets/label_box/label_box.py
Normal file
@@ -0,0 +1,150 @@
|
||||
from qtpy.QtCore import Signal
|
||||
from qtpy.QtWidgets import QGridLayout, QSizePolicy, QVBoxLayout, QPushButton
|
||||
from qtpy.QtWidgets import QWidget
|
||||
from qtpy.QtWidgets import QGroupBox
|
||||
from qtpy.QtWidgets import QLabel
|
||||
|
||||
from bec_widgets import BECWidget, SafeProperty, SafeSlot
|
||||
from bec_widgets.utils import ConnectionConfig
|
||||
|
||||
|
||||
class BECLabelBox(BECWidget, QGroupBox):
|
||||
PLUGIN = True
|
||||
RPC = True
|
||||
ICON_NAME = "inventory_2"
|
||||
USER_ACCESS = ["qroup_box_title", "qroup_box_title.setter", "add_label", "labels"]
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
parent: QWidget | None = None,
|
||||
config: ConnectionConfig | None = None,
|
||||
client=None,
|
||||
gui_id: str | None = None,
|
||||
group_box_title: str = "Label",
|
||||
label_config: dict = None,
|
||||
**kwargs,
|
||||
) -> None:
|
||||
if config is None:
|
||||
config = ConnectionConfig(widget_class=self.__class__.__name__)
|
||||
super().__init__(parent=parent, client=client, gui_id=gui_id, config=config, **kwargs)
|
||||
|
||||
self.setTitle(group_box_title)
|
||||
self.layout = QGridLayout(self)
|
||||
self._labels = []
|
||||
if label_config is not None:
|
||||
self.apply_label_config(label_config)
|
||||
|
||||
def apply_label_config(self, label_config: dict):
|
||||
"""Apply the label configuration."""
|
||||
for label, config in label_config.items():
|
||||
defaults_value = config.get("defaults_value", 0.0)
|
||||
units = config.get("units", None)
|
||||
self.add_label(label, defaults_value=defaults_value, units=units)
|
||||
|
||||
@property
|
||||
def labels(self):
|
||||
"""Return the list of labels."""
|
||||
return self._labels
|
||||
|
||||
@SafeProperty(str)
|
||||
def qroup_box_title(self):
|
||||
"""Label of the group box."""
|
||||
return self.title()
|
||||
|
||||
@qroup_box_title.setter
|
||||
def qroup_box_title(self, value: str):
|
||||
"""Set the label of the group box."""
|
||||
self.setTitle(value)
|
||||
|
||||
def add_label(self, label: str, defaults_value: float = 0.0, units: str = None):
|
||||
"""Add a label to the group box."""
|
||||
text_label = QLabel(parent=self)
|
||||
text_label.setText(label)
|
||||
value_label = QLabel(parent=self)
|
||||
value_label.setText(str(defaults_value))
|
||||
unit_label = QLabel(parent=self)
|
||||
unit_label.setText(units if units else "")
|
||||
|
||||
spacer = QWidget(self)
|
||||
spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
||||
|
||||
self.layout.addWidget(text_label, len(self.labels), 0)
|
||||
self.layout.addWidget(spacer, len(self.labels), 1)
|
||||
self.layout.addWidget(value_label, len(self.labels), 2)
|
||||
self.layout.addWidget(unit_label, len(self.labels), 3)
|
||||
|
||||
label_holder = {
|
||||
"text_label": text_label,
|
||||
"value_label": value_label,
|
||||
"unit_label": unit_label,
|
||||
}
|
||||
|
||||
self._labels.append(label_holder)
|
||||
|
||||
@SafeSlot(float, int)
|
||||
def update_label(self, value: float, index: int):
|
||||
"""Update the label value."""
|
||||
if index < len(self.labels):
|
||||
self.labels[index]["value_label"].setText(str(value))
|
||||
else:
|
||||
raise IndexError("Index out of range for labels list.")
|
||||
|
||||
|
||||
class DemoGUI(QWidget):
|
||||
update_signal = Signal(float, int)
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("BECLabelBox Demo")
|
||||
self.layout = QVBoxLayout(self)
|
||||
|
||||
label_config = {
|
||||
"Label 1": {"defaults_value": 0.0, "units": "m"},
|
||||
"Label 2": {"defaults_value": 1.0, "units": "cm"},
|
||||
"Label 3": {"defaults_value": 2.0, "units": "mm"},
|
||||
}
|
||||
self.label_box = BECLabelBox(
|
||||
self, group_box_title="Demo Label Box", label_config=label_config
|
||||
)
|
||||
self.layout.addWidget(self.label_box)
|
||||
|
||||
# self.label_box.apply_label_config(label_config)
|
||||
|
||||
# alternative approach to add labels without dict config
|
||||
# self.label_box.add_label("Label 1", defaults_value=0.0, units="m")
|
||||
# self.label_box.add_label("Label 2", defaults_value=1.0, units="cm")
|
||||
# self.label_box.add_label("Label 3", defaults_value=2.0, units="mm")
|
||||
#
|
||||
self.button = QPushButton("Update Labels", self)
|
||||
self.button.clicked.connect(self.update_labels)
|
||||
self.layout.addWidget(self.button)
|
||||
|
||||
self.update_signal.connect(self.label_box.update_label)
|
||||
|
||||
def update_labels(self):
|
||||
"""Update the labels with new values."""
|
||||
for i, label in enumerate(self.label_box.labels):
|
||||
new_value = (i + 1) * 10.0
|
||||
self.update_signal.emit(new_value, i)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
from qtpy.QtWidgets import QApplication
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
demo = DemoGUI()
|
||||
demo.show()
|
||||
sys.exit(app.exec_())
|
||||
#
|
||||
# if __name__ == "__main__":
|
||||
# import sys
|
||||
# from qtpy.QtWidgets import QApplication
|
||||
#
|
||||
# app = QApplication(sys.argv)
|
||||
# widget = BECLabelBox(group_box_title="Test Label Box")
|
||||
# widget.show()
|
||||
# widget.add_label("Test Label 1")
|
||||
# widget.add_label("Test Label 2", units="m")
|
||||
# widget.add_label("Test Label 3", defaults_value=1.23456789, units="m")
|
||||
# sys.exit(app.exec_())
|
||||
Reference in New Issue
Block a user