1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2026-03-08 01:37:52 +01:00

feat: add tools to procedure log panel

This commit is contained in:
2025-12-04 10:53:24 +01:00
parent 2d2c773ce5
commit 5861b4a538
4 changed files with 64 additions and 12 deletions

View File

@@ -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):

View File

@@ -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:

View File

@@ -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)

View File

@@ -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)