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:
@@ -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):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user