fix qurey progress window bug

This commit is contained in:
St.Huang 2018-07-02 01:16:20 +08:00
parent e83be5cde1
commit b44d1f4bf5

View File

@ -17,14 +17,15 @@ from .lang import _
########################################################################## ##########################################################################
class ProgressManager(object): class ProgressWindow(object):
"""
Query progress window
"""
def __init__(self, mw): def __init__(self, mw):
self.mw = mw self.mw = mw
self.app = QApplication.instance() self.app = QApplication.instance()
self.blockUpdates = False
self._win = None self._win = None
self._levels = 0
self._msg_count = defaultdict(int) self._msg_count = defaultdict(int)
# Creating progress dialogs # Creating progress dialogs
########################################################################## ##########################################################################
@ -53,90 +54,55 @@ class ProgressManager(object):
number_info += u'<br>{0}: {1}{2}'.format( number_info += u'<br>{0}: {1}{2}'.format(
_('FAILURE'), fails_number, _('WORDS')) _('FAILURE'), fails_number, _('WORDS'))
self.update(label=number_info, value=words_number) self._update(label=number_info, value=words_number)
self._win.adjustSize() self._win.adjustSize()
def update_title(self, title): def update_title(self, title):
if self.abort():
return
self._win.setWindowTitle(title) self._win.setWindowTitle(title)
def reset_count(self): def start(self, max=0, min=0, label=None, parent=None):
self._msg_count.clear() self._msg_count.clear()
def start(self, max=0, min=0, label=None, parent=None, immediate=False, rows=0):
self._msg_count.clear()
self._levels += 1
if self._levels > 1:
return
# setup window # setup window
parent = parent or self.app.activeWindow() or self.mw
label = label or _("Processing...") label = label or _("Processing...")
cancel_btn = QPushButton("Cancel") parent = parent or self.app.activeWindow() or self.mw
self._win = QProgressDialog(label, "", min, max, parent) self._win = QProgressDialog(label, '', min, max, parent)
self._win.setWindowTitle("Querying...")
self._win.setCancelButton(None)
# cancel_btn.clicked.connect(self.abort)
# self._win.setAutoClose(False)
# self._win.setAutoReset(False)
self._win.setWindowModality(Qt.ApplicationModal) self._win.setWindowModality(Qt.ApplicationModal)
self._win.setCancelButton(None)
self._win.canceled.connect(self.finish)
self._win.setWindowTitle("Querying...")
# we need to manually manage minimum time to show, as qt gets confused # we need to manually manage minimum time to show, as qt gets confused
# by the db handler # by the db handler
self._win.setMinimumDuration(100000) # self._win.setMinimumDuration(100000)
if immediate:
self._shown = True
self._win.show()
self.app.processEvents()
else:
self._shown = False
self._counter = min self._counter = min
self._min = min self._min = min
self._max = max self._max = max
self._firstTime = time.time() self._firstTime = time.time()
self._lastUpdate = time.time() self._lastUpdate = time.time()
self._disabled = False self._disabled = False
self._win.show()
def update(self, label=None, value=None, process=True, maybeShow=True): self.app.processEvents()
# print self._min, self._counter, self._max, label, time.time() -
# self._lastTime
if maybeShow:
self._maybeShow()
elapsed = time.time() - self._lastUpdate
if label:
self._win.setLabelText(label)
if self._max and self._shown:
self._counter = value or (self._counter + 1)
self._win.setValue(self._counter)
if process and elapsed >= 0.2:
self.app.processEvents(QEventLoop.ExcludeUserInputEvents)
self._lastUpdate = time.time()
def abort(self): def abort(self):
# self.aborted = True # self.aborted = True
return self._win.wasCanceled() return self._win.wasCanceled()
def finish(self): def finish(self):
self._levels -= 1 self._win.hide()
self._levels = max(0, self._levels) self._unsetBusy()
if self._levels == 0 and self._win: self._win.destroy()
self._win.cancel()
self._unsetBusy()
def clear(self): def _update(self, label=None, value=None, process=True, maybeShow=True):
"Restore the interface after an error." elapsed = time.time() - self._lastUpdate
if self._levels: if label:
self._levels = 1 self._win.setLabelText(label)
self.finish() if self._max:
self._counter = value or (self._counter + 1)
def _maybeShow(self): self._win.setValue(self._counter)
if not self._levels: if process and elapsed >= 0.2:
return self.app.processEvents(QEventLoop.ExcludeUserInputEvents)
if self._shown: self._lastUpdate = time.time()
self.update(maybeShow=False)
return
delta = time.time() - self._firstTime
if delta > 0.5:
self._shown = True
self._win.show()
self._setBusy()
def _setBusy(self): def _setBusy(self):
self._disabled = True self._disabled = True
@ -145,7 +111,3 @@ class ProgressManager(object):
def _unsetBusy(self): def _unsetBusy(self):
self._disabled = False self._disabled = False
self.app.restoreOverrideCursor() self.app.restoreOverrideCursor()
def busy(self):
"True if processing."
return self._levels