Progress dialog is once again cancelable, and has a minimum time before displaying.

This commit is contained in:
David Vierra 2015-10-06 17:10:48 -10:00
parent 7fd974426e
commit dbbacea7a8

View File

@ -31,38 +31,50 @@ def showProgress(text, *tasks, **kwargs):
""" """
progress = None progress = None
cancel = kwargs.pop('cancel', None) cancel = kwargs.pop('cancel', None)
start = time.time()
shown = False
with LoaderTimer.stopCtx(): with LoaderTimer.stopCtx():
dialog = QtGui.QProgressDialog(QtGui.qApp.mainWindow) dialog = QtGui.QProgressDialog(QtGui.qApp.mainWindow)
dialog.setWindowTitle(text) dialog.setWindowTitle(text)
dialog.setWindowModality(Qt.WindowModal) dialog.setWindowModality(Qt.WindowModal)
#dialog.show()
log.info("Starting progress: %d tasks." % len(tasks)) log.info("Starting progress: %d tasks." % len(tasks))
maximum = len(tasks) * 100 totalMaximum = len(tasks) * 100
for i, task in enumerate(tasks): for i, task in enumerate(tasks):
log.info("Task #%d", i) log.info("Task #%d", i)
task = rescaleProgress(task, i*100, i*100+100) task = rescaleProgress(task, i*100, i*100+100)
for progress in task: for progress in task:
if isinstance(progress, basestring): if isinstance(progress, basestring):
current = 0 current = 0
maximum = 0
status = progress status = progress
elif isinstance(progress, tuple): elif isinstance(progress, tuple):
if len(progress) > 2: if len(progress) > 2:
current, _, status = progress[:3] current, maximum, status = progress[:3]
else: else:
current, _ = progress current, maximum = progress
status = "" status = ""
else: else:
current = 1 current = 0
maximum = 0
status = "" status = ""
dialog.setValue(current) dialog.setValue(current)
dialog.setMaximum(maximum) if maximum == 0:
# Task progress is indeterminate
dialog.setMaximum(0)
else:
dialog.setMaximum(totalMaximum)
dialog.setLabelText(status) dialog.setLabelText(status)
#QtGui.QApplication.processEvents() if time.time() > start + timeBeforeDialog:
if not shown:
dialog.show()
shown = True
QtGui.QApplication.processEvents()
if dialog.wasCanceled(): if dialog.wasCanceled():
return False return False
dialog.close() dialog.hide()
return progress return progress