From 0452a9c60564d778b596b6bae389715c59b7645d Mon Sep 17 00:00:00 2001 From: David Perl Date: Thu, 4 Dec 2025 10:53:24 +0100 Subject: [PATCH] feat: add tools to procedure log panel --- .../procedure_control/procedure_control.py | 2 + .../procedure_control/procedure_logs.py | 52 +++++++++++++++++-- .../procedure_control/procedure_panel.py | 7 ++- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/bec_widgets/widgets/control/procedure_control/procedure_control.py b/bec_widgets/widgets/control/procedure_control/procedure_control.py index c223742d..e293176f 100644 --- a/bec_widgets/widgets/control/procedure_control/procedure_control.py +++ b/bec_widgets/widgets/control/procedure_control/procedure_control.py @@ -220,6 +220,8 @@ class CategoryItem(QTreeWidgetItem): class ProcedureControl(BECWidget, QWidget): + RPC = False + queue_selected = Signal(str) def __init__(self, parent=None, client=None, config=None, gui_id: str | None = None, **kwargs): diff --git a/bec_widgets/widgets/control/procedure_control/procedure_logs.py b/bec_widgets/widgets/control/procedure_control/procedure_logs.py index b82be468..a1ec28fa 100644 --- a/bec_widgets/widgets/control/procedure_control/procedure_logs.py +++ b/bec_widgets/widgets/control/procedure_control/procedure_logs.py @@ -1,9 +1,18 @@ from bec_lib.endpoints import MessageEndpoints from bec_lib.logger import bec_logger +from bec_qthemes import material_icon from bec_server.scan_server.procedures.helper import FrontendProcedureHelper -from PySide6.QtWidgets import QLabel from qtpy.QtGui import QFont -from qtpy.QtWidgets import QSizePolicy, QTextEdit, QVBoxLayout, QWidget +from qtpy.QtWidgets import ( + QComboBox, + QHBoxLayout, + QLabel, + QSizePolicy, + QTextEdit, + QToolButton, + QVBoxLayout, + QWidget, +) from bec_widgets.utils.bec_connector import ConnectionConfig from bec_widgets.utils.bec_widget import BECWidget @@ -14,16 +23,46 @@ logger = bec_logger.logger class ProcedureLogs(BECWidget, QWidget): + RPC = False + def __init__(self, parent=None, client=None, config=None, gui_id: str | None = None, **kwargs): config = config or ConnectionConfig() super().__init__(parent=parent, client=client, config=config, gui_id=gui_id, **kwargs) self._conn = self.bec_dispatcher.client.connector self._queue: str | None = None + self._helper = FrontendProcedureHelper(self._conn) self._setup_ui() + @SafeSlot() + def _update_selection_box(self): + self._selection_box.clear() + self._available_streams = self._helper.get.log_queue_names() + self._selection_box.addItems(self._available_streams) + def _setup_ui(self): self._layout = QVBoxLayout() self.setLayout(self._layout) + self._setup_tools() + self._setup_display() + + def _setup_tools(self): + self.tools = QWidget(self) + self._tools_layout = QHBoxLayout() + self._tools_layout.setContentsMargins(0, 0, 0, 0) + self.tools.setLayout(self._tools_layout) + self._selection_box = QComboBox() + self._update_selection_box() + self._selection_box.setCurrentIndex(-1) + self._selection_box.currentTextChanged.connect(self.set_queue) + self._refresh_button = QToolButton() + self._refresh_button.setIcon(material_icon("refresh", convert_to_pixmap=False)) + self._tools_layout.addWidget(QLabel("Select logs stream: ")) + self._tools_layout.addWidget(self._selection_box) + self._tools_layout.addWidget(self._refresh_button) + self._refresh_button.clicked.connect(self._update_selection_box) + self._layout.addWidget(self.tools) + + def _setup_display(self): self.widget = QTextEdit(lineWrapMode=QTextEdit.LineWrapMode.NoWrap, readOnly=True) font = QFont("Courier New") font.setStyleHint(QFont.StyleHint.Monospace) @@ -36,16 +75,23 @@ class ProcedureLogs(BECWidget, QWidget): self.widget.append(msg.get("data").strip()) def _init_content(self): + self.widget.setText("") if self._queue is None: - self.widget.setText("") return if msgs := self._conn.xread(MessageEndpoints.procedure_logs(self._queue), from_start=True): self.widget.append("\n".join(msg.get("data").data.strip() for msg in msgs)) + @SafeSlot() + def clear_selection_box(self, *_, **__): + self._selection_box.setCurrentIndex(-1) + @SafeSlot(None) @SafeSlot(str) def set_queue(self, queue: str | None): + if queue == "": + return self.queue = queue + self._selection_box.setCurrentIndex(-1) @SafeProperty(str) def queue(self) -> str | None: diff --git a/bec_widgets/widgets/control/procedure_control/procedure_panel.py b/bec_widgets/widgets/control/procedure_control/procedure_panel.py index 5b3550bd..55b0fbc6 100644 --- a/bec_widgets/widgets/control/procedure_control/procedure_panel.py +++ b/bec_widgets/widgets/control/procedure_control/procedure_panel.py @@ -12,7 +12,12 @@ class ProcedurePanel(DockAreaWidget): self.procedure_logs = ProcedureLogs(parent=self) self.procedure_logs.setObjectName("Procedure Logs") - _dock_kwargs = {"closable": False, "movable": False, "floatable": False} + _dock_kwargs = { + "closable": False, + "movable": False, + "floatable": False, + "title_buttons": {"float": False, "close": False, "menu": False}, + } self.new(self.procedure_control, **_dock_kwargs) self.new(self.procedure_logs, where="bottom", **_dock_kwargs)