11import sys
22
3- from PyQt5 .QtWidgets import (QLabel , QMainWindow , QToolBar , QDockWidget , QAction )
3+ from typing import Optional
4+ from PyQt5 .QtCore import pyqtSlot , Qt
5+ from PyQt5 .QtGui import QPalette , QColor
6+ from PyQt5 .QtWidgets import (QLabel , QMainWindow , QToolBar , QDockWidget , QAction , QApplication )
47
58import cadquery as cq
69
@@ -55,6 +58,8 @@ def __init__(self,parent=None):
5558 self .restoreWindow ()
5659 self .restoreComponentState ()
5760
61+ self .on_idle ()
62+
5863 def closeEvent (self ,event ):
5964
6065 self .saveWindow ()
@@ -192,7 +197,7 @@ def prepare_toolbar(self):
192197 self .toolbar = QToolBar ('Main toolbar' ,self ,objectName = 'Main toolbar' )
193198
194199 for c in self .components .values ():
195- add_actions (self .toolbar ,c .toolbarActions ())
200+ add_actions (self .toolbar , c .toolbarActions ())
196201
197202 self .addToolBar (self .toolbar )
198203
@@ -203,18 +208,25 @@ def prepare_statusbar(self):
203208
204209 def prepare_actions (self ):
205210
211+ self .components ['debugger' ].sigRenderStarted \
212+ .connect (self .on_render_start )
206213 self .components ['debugger' ].sigRendered \
207214 .connect (self .components ['object_tree' ].addObjects )
208215 self .components ['debugger' ].sigTraceback \
209216 .connect (self .components ['traceback_viewer' ].addTraceback )
217+ self .components ['debugger' ].sigRendered \
218+ .connect (lambda _ : self .on_idle ())
219+ self .components ['debugger' ].sigTraceback \
220+ .connect (lambda _ : self .on_idle ())
221+
210222 self .components ['debugger' ].sigLocals \
211223 .connect (self .components ['variables_viewer' ].update_frame )
212224 self .components ['debugger' ].sigLocals \
213225 .connect (self .components ['console' ].push_vars )
214226
215- self .components ['object_tree' ].sigObjectsAdded [list ]\
216- .connect (self .components ['viewer' ].display_many )
217- self .components ['object_tree' ].sigObjectsAdded [list ,bool ]\
227+ self .components ['object_tree' ].sigObjectsAdded [list , list ]\
228+ .connect (lambda objects , names : self .components ['viewer' ].display_many ( objects , None , names ) )
229+ self .components ['object_tree' ].sigObjectsAdded [list , bool , list ]\
218230 .connect (self .components ['viewer' ].display_many )
219231 self .components ['object_tree' ].sigItemChanged .\
220232 connect (self .components ['viewer' ].update_item )
@@ -229,6 +241,8 @@ def prepare_actions(self):
229241
230242 self .components ['viewer' ].sigObjectSelected \
231243 .connect (self .components ['object_tree' ].handleGraphicalSelection )
244+ self .components ['viewer' ].sigDisplayProgress \
245+ .connect (self .on_display_progress )
232246
233247 self .components ['traceback_viewer' ].sigHighlightLine \
234248 .connect (self .components ['editor' ].go_to_line )
@@ -325,6 +339,25 @@ def cq_documentation(self):
325339
326340 open_url ('https://cadquery.readthedocs.io/en/latest/' )
327341
328- if __name__ == "__main__" :
342+ def on_idle (self ):
343+ self .set_status_message ('Idle' , '#000000' )
329344
330- pass
345+ @pyqtSlot ()
346+ def on_render_start (self ):
347+ self .set_status_message ('Rendering...' , '#ff0000' )
348+
349+ @pyqtSlot (int , int , str )
350+ def on_display_progress (self , current : int , total : int , name : Optional [str ]):
351+ if current == total :
352+ self .on_idle ()
353+ else :
354+ message = f'Displaying Shape { current + 1 } / { total } '
355+ if name :
356+ message += f' ({ name } )'
357+ self .set_status_message (message , '#0000ff' )
358+
359+ def set_status_message (self , message : str , color : str ):
360+ self .statusBar ().showMessage (message )
361+ self .statusBar ().setStyleSheet (f'color: { color } ' )
362+ # required because rendering is currently done on the main thread
363+ QApplication .processEvents ()
0 commit comments