11import sys
22
3- from PyQt5 .QtWidgets import (QLabel , QMainWindow , QToolBar , QDockWidget , QAction )
3+ from typing import Optional
4+ from PyQt5 .QtCore import pyqtSlot
5+ from PyQt5 .QtWidgets import (QApplication , QLabel , QMainWindow , QToolBar , QDockWidget , QAction )
46from logbook import Logger
57import cadquery as cq
68
@@ -65,6 +67,8 @@ def __init__(self,parent=None, filename=None):
6567
6668 self .restoreComponentState ()
6769
70+ self .on_idle ()
71+
6872 def closeEvent (self ,event ):
6973
7074 self .saveWindow ()
@@ -202,7 +206,7 @@ def prepare_toolbar(self):
202206 self .toolbar = QToolBar ('Main toolbar' ,self ,objectName = 'Main toolbar' )
203207
204208 for c in self .components .values ():
205- add_actions (self .toolbar ,c .toolbarActions ())
209+ add_actions (self .toolbar , c .toolbarActions ())
206210
207211 self .addToolBar (self .toolbar )
208212
@@ -213,18 +217,25 @@ def prepare_statusbar(self):
213217
214218 def prepare_actions (self ):
215219
220+ self .components ['debugger' ].sigRenderStarted \
221+ .connect (self .on_render_start )
216222 self .components ['debugger' ].sigRendered \
217223 .connect (self .components ['object_tree' ].addObjects )
218224 self .components ['debugger' ].sigTraceback \
219225 .connect (self .components ['traceback_viewer' ].addTraceback )
226+ self .components ['debugger' ].sigRendered \
227+ .connect (lambda _ : self .on_idle ())
228+ self .components ['debugger' ].sigTraceback \
229+ .connect (lambda _ : self .on_idle ())
230+
220231 self .components ['debugger' ].sigLocals \
221232 .connect (self .components ['variables_viewer' ].update_frame )
222233 self .components ['debugger' ].sigLocals \
223234 .connect (self .components ['console' ].push_vars )
224235
225- self .components ['object_tree' ].sigObjectsAdded [list ]\
226- .connect (self .components ['viewer' ].display_many )
227- self .components ['object_tree' ].sigObjectsAdded [list ,bool ]\
236+ self .components ['object_tree' ].sigObjectsAdded [list , list ]\
237+ .connect (lambda objects , names : self .components ['viewer' ].display_many ( objects , None , names ) )
238+ self .components ['object_tree' ].sigObjectsAdded [list , bool , list ]\
228239 .connect (self .components ['viewer' ].display_many )
229240 self .components ['object_tree' ].sigItemChanged .\
230241 connect (self .components ['viewer' ].update_item )
@@ -239,6 +250,8 @@ def prepare_actions(self):
239250
240251 self .components ['viewer' ].sigObjectSelected \
241252 .connect (self .components ['object_tree' ].handleGraphicalSelection )
253+ self .components ['viewer' ].sigDisplayProgress \
254+ .connect (self .on_display_progress )
242255
243256 self .components ['traceback_viewer' ].sigHighlightLine \
244257 .connect (self .components ['editor' ].go_to_line )
@@ -344,6 +357,27 @@ def handle_filename_change(self, fname):
344357 new_title = fname if fname else "*"
345358 self .setWindowTitle (f"{ self .name } : { new_title } " )
346359
347- if __name__ == "__main__" :
360+ def on_idle (self ):
361+ self .components ['debugger' ].set_rendering_state (False )
362+ self .set_status_message ('Idle' , '#000000' )
348363
349- pass
364+ @pyqtSlot ()
365+ def on_render_start (self ):
366+ self .components ['debugger' ].set_rendering_state (True )
367+ self .set_status_message ('Rendering...' , '#ff0000' )
368+
369+ @pyqtSlot (int , int , str )
370+ def on_display_progress (self , current : int , total : int , name : Optional [str ]):
371+ if current == total :
372+ self .on_idle ()
373+ else :
374+ message = f'Displaying Shape { current + 1 } / { total } '
375+ if name :
376+ message += f' ({ name } )'
377+ self .set_status_message (message , '#0000ff' )
378+
379+ def set_status_message (self , message : str , color : str ):
380+ self .statusBar ().showMessage (message )
381+ self .statusBar ().setStyleSheet (f'color: { color } ' )
382+ # required because rendering is currently done on the main thread
383+ QApplication .processEvents ()
0 commit comments