1212from bec_lib .endpoints import MessageEndpoints
1313from bec_lib .logger import LogLevel , bec_logger
1414from bec_lib .messages import LogMessage , StatusMessage
15+ from bec_qthemes import material_icon
1516from qtpy .QtCore import Signal # type: ignore
1617from qtpy .QtCore import (
1718 QAbstractTableModel ,
4041 QPushButton ,
4142 QSizePolicy ,
4243 QTableView ,
44+ QToolButton ,
4345 QVBoxLayout ,
4446 QWidget ,
4547)
@@ -84,6 +86,7 @@ class BecLogsQueue(BECConnector, QObject):
8486
8587 RPC = False
8688 new_messages = Signal ()
89+ paused = Signal (bool )
8790 _instance : BecLogsQueue | None = None
8891
8992 @classmethod
@@ -97,6 +100,7 @@ def __init__(self, parent: QObject | None, maxlen: int = 2500, **kwargs) -> None
97100 raise RuntimeError ("Create no more than one BecLogsQueue - use BecLogsQueue.instance()" )
98101 super ().__init__ (parent = parent , ** kwargs )
99102 self ._max_length = maxlen
103+ self ._paused = False
100104 self ._data = deque (
101105 (
102106 item ["data" ]
@@ -117,6 +121,11 @@ def __init__(self, parent: QObject | None, maxlen: int = 2500, **kwargs) -> None
117121 def __len__ (self ):
118122 return len (self ._data )
119123
124+ @SafeSlot ()
125+ def toggle_pause (self ):
126+ self ._paused = not self ._paused
127+ self .paused .emit (self ._paused )
128+
120129 def row_data (self , index : int ) -> LogMessage | None :
121130 if index < 0 or index > (len (self ._data ) - 1 ):
122131 return None
@@ -162,7 +171,7 @@ def _process_incoming_log_msg(self, msg: dict, _metadata: dict):
162171
163172 @SafeSlot (verify_sender = True )
164173 def _proc_update (self ):
165- if len (self ._incoming ) == 0 :
174+ if self . _paused or len (self ._incoming ) == 0 :
166175 return
167176 self ._data .extend (self ._incoming )
168177 self ._incoming .clear ()
@@ -411,6 +420,8 @@ def _connect_toolbar(self):
411420 self ._toolbar .level_changed .connect (self ._proxy .update_level_filter )
412421 self ._toolbar .fuzzy_changed .connect (self ._proxy .update_fuzzy )
413422 self ._toolbar .timestamp_update .connect (self ._proxy .update_timestamp )
423+ self ._toolbar .pause_button .clicked .connect (self ._model .log_queue .toggle_pause )
424+ self ._model .log_queue .paused .connect (self ._toolbar ._update_pause_button_icon )
414425
415426 def _update_service_filter (self , filter : set [str ]):
416427 self ._service_filter = filter
@@ -463,6 +474,18 @@ def __init__(self, parent: QWidget | None = None, client: BECClient | None = Non
463474 self ._layout .addWidget (self .timerange_button )
464475 self .timerange_button .clicked .connect (self ._open_datetime_dialog )
465476
477+ self .pause_button = QToolButton ()
478+ self .pause_button .setIcon (material_icon ("pause" , size = (20 , 20 ), convert_to_pixmap = False ))
479+ self ._layout .addWidget (self .pause_button )
480+
481+ @SafeSlot (bool )
482+ def _update_pause_button_icon (self , paused ):
483+ self .pause_button .setIcon (
484+ material_icon (
485+ "play_arrow" if paused else "pause" , size = (20 , 20 ), convert_to_pixmap = False
486+ )
487+ )
488+
466489 def _string_search_box (self ):
467490 self ._layout .addWidget (QLabel ("Search: " ))
468491 self .search_textbox = QLineEdit ()
0 commit comments