diff --git a/bec_widgets/widgets/control/procedure_control/procedure_control.py b/bec_widgets/widgets/control/procedure_control/procedure_control.py index 217950be..e78bcf2c 100644 --- a/bec_widgets/widgets/control/procedure_control/procedure_control.py +++ b/bec_widgets/widgets/control/procedure_control/procedure_control.py @@ -9,8 +9,8 @@ from bec_lib.messages import ( ProcedureQNotifMessage, ProcedureRequestMessage, ) +from bec_lib.procedures.helper import FrontendProcedureHelper from bec_qthemes._icon.material_icons import material_icon -from bec_server.scan_server.procedures.helper import FrontendProcedureHelper from pydantic import BaseModel, ConfigDict from qtpy.QtCore import QSize, Qt, Signal from qtpy.QtWidgets import ( @@ -218,6 +218,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..6285d011 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_server.scan_server.procedures.helper import FrontendProcedureHelper -from PySide6.QtWidgets import QLabel +from bec_lib.procedures.helper import FrontendProcedureHelper +from bec_qthemes import material_icon 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 cb6f54bc..1dd81d05 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) diff --git a/tests/unit_tests/test_procedure_control.py b/tests/unit_tests/test_procedure_control.py index 5e873220..593eb86f 100644 --- a/tests/unit_tests/test_procedure_control.py +++ b/tests/unit_tests/test_procedure_control.py @@ -4,10 +4,10 @@ from unittest.mock import MagicMock, patch import pytest from bec_lib.messages import ProcedureExecutionMessage, ProcedureRequestMessage -from bec_server.scan_server.procedures.helper import BackendProcedureHelper -from bec_server.scan_server.procedures.manager import ProcedureManager -from bec_server.scan_server.procedures.procedure_registry import register -from bec_server.scan_server.procedures.worker_base import ProcedureWorker +from bec_lib.procedures.helper import BackendProcedureHelper +from bec_server.procedures.manager import ProcedureManager +from bec_server.procedures.procedure_registry import register +from bec_server.procedures.worker_base import ProcedureWorker from bec_widgets.widgets.control.procedure_control.procedure_control import ( ProcedureControl, @@ -40,8 +40,7 @@ def proc_ctrl_w_helper(qtbot, mocked_client: MagicMock): proc_ctrl = ProcedureControl(client=mocked_client) qtbot.addWidget(proc_ctrl) with patch( - "bec_server.scan_server.procedures.manager.RedisConnector", - lambda _: proc_ctrl.client.connector, + "bec_server.procedures.manager.RedisConnector", lambda _: proc_ctrl.client.connector ): manager = ProcedureManager(MagicMock(), MockWorker) yield proc_ctrl, BackendProcedureHelper(proc_ctrl.client.connector)