fix progress info bugs

This commit is contained in:
St.Huang 2018-07-01 18:12:31 +08:00
parent 774464ca9e
commit e83be5cde1
4 changed files with 54 additions and 64 deletions

BIN
2.0.x.zip

Binary file not shown.

View File

@ -25,40 +25,25 @@ class ProgressManager(object):
self.blockUpdates = False
self._win = None
self._levels = 0
self.aborted = False
self.rows_number = 0
self._msg_info = defaultdict(dict)
self._msg_count = defaultdict(int)
# Creating progress dialogs
##########################################################################
@pyqtSlot(dict)
def update_labels(self, data):
if self.abort():
return
if data.type == 'count':
self._msg_count.update(data)
else:
self._msg_info[data.index] = data
lst = []
for index in range(self.rows_number):
info = self._msg_info.get(index, None)
if not info:
continue
if info.type == 'text':
lst.append(info.text)
else:
lst.append(u"{2} [{0}] {1}".format(
info.service_name, info.field_name, info.flag))
return
number_info = ''
words_number, fields_number, fails_number = (
self._msg_count['words_number'],
self._msg_count['words_number'],
self._msg_count['fields_number'],
self._msg_count['fails_number']
)
)
if words_number or fields_number:
number_info += _('QUERIED') + '<br>' + 45 * '-'
number_info += u'<br>{0}: {1}{2}'.format(
@ -68,24 +53,17 @@ class ProgressManager(object):
number_info += u'<br>{0}: {1}{2}'.format(
_('FAILURE'), fails_number, _('WORDS'))
self.update('<br>'.join(lst) + number_info, value=words_number)
self.update(label=number_info, value=words_number)
self._win.adjustSize()
def update_title(self, title):
self._win.setWindowTitle(title)
def update_rows(self, number):
self.rows_number = number
self._msg_info.clear()
def reset_count(self):
self._msg_count.clear()
def start(self, max=0, min=0, label=None, parent=None, immediate=False, rows=0):
self._msg_info.clear()
self._msg_count.clear()
self.rows_number = rows
self.aborted = False
self._levels += 1
if self._levels > 1:
return

View File

@ -35,13 +35,16 @@ from .progress import ProgressManager
from .service import service_manager, QueryResult, copy_static_file
from .utils import Empty, MapDict, Queue, wrap_css
def inspect_note(note):
'''
"""
inspect the note, and get necessary input parameters
return word_ord: field index of the word in current note
return word: the word
return maps: dicts map of current note
'''
"""
maps = config.get_maps(note.model()['id'])
for i, m in enumerate(maps):
if m.get('word_checked', False):
@ -58,8 +61,11 @@ def inspect_note(note):
word = purify_word(note.fields[word_ord])
return word_ord, word, maps
# 工作线程
class QueryThread(QThread):
"""
Query Worker Thread
"""
progress_update = pyqtSignal(dict)
note_flush = pyqtSignal(object)
@ -87,7 +93,7 @@ class QueryThread(QThread):
if self.manager:
if self.manager.update(note, results, success_num):
self.note_flush.emit(note)
# 更新进度
# Update progress window infomation
self.progress_update.emit(
MapDict(
type='count',
@ -99,9 +105,11 @@ class QueryThread(QThread):
except InvalidWordException:
showInfo(_("NO_QUERY_WORD"))
class QueryWorkerManager(object):
"""
Query Worker Thread Manager
"""
def __init__(self):
self.workers = []
@ -122,7 +130,6 @@ class QueryWorkerManager(object):
self.get_worker()
self.total = self.queue.qsize()
progress.update_rows(len(self.workers))
for worker in self.workers:
worker.start()
@ -169,8 +176,11 @@ def handle_flush(note):
note.flush()
# 浏览界面查找
def query_from_browser(browser):
"""
Query word from Browser
"""
if not browser:
return
@ -184,8 +194,12 @@ def query_from_browser(browser):
query_all(notes)
browser.model.reset()
# 编辑界面查找
def query_from_editor_all_fields(editor):
"""
Query word fileds from Editor
"""
if not editor or not editor.note:
return
@ -193,9 +207,12 @@ def query_from_editor_all_fields(editor):
editor.setNote(editor.note, focus=True)
editor.saveNow()
def query_all(notes):
"""
Query maps word fileds
"""
# 查找所有
def query_all(notes):
if len(notes) == 0:
return
@ -215,7 +232,12 @@ def query_all(notes):
work_manager.clean()
service_pool.clean();
def update_note_fields(note, results):
"""
Update query result to note fields, return updated fields count.
"""
if not results or not note or len(results) == 0:
return
count = 0
@ -227,6 +249,10 @@ def update_note_fields(note, results):
def update_note_field(note, fld_index, fld_result):
"""
Update single field, if result is valid then return 1, else return 0
"""
result, js, jsfile = fld_result.result, fld_result.js, fld_result.jsfile
# js process: add to template of the note model
add_to_tmpl(note, js=js, jsfile=jsfile)
@ -287,7 +313,11 @@ def add_to_tmpl(note, **kwargs):
class InvalidWordException(Exception):
"""Invalid word exception"""
def query_all_flds(note, progress_update=None):
def query_all_flds(note):
"""
Query all fields of single note
"""
word_ord, word, maps = inspect_note(note)
if not word:
raise InvalidWordException
@ -315,7 +345,6 @@ def query_all_flds(note, progress_update=None):
for task in tasks:
try:
service = services.get(task['k'], None)
service.set_notifier(progress_update, task['i'])
qr = service.active(task['f'], task['w'])
if qr:
result.update({task['i']: qr})
@ -329,9 +358,11 @@ def query_all_flds(note, progress_update=None):
return result, success_num
# 服务实例对象池
class ServicePool(object):
"""
Service instance pool
"""
def __init__(self):
self.pools = {}
@ -358,6 +389,6 @@ class ServicePool(object):
self.pools = {}
progress = ProgressManager(mw)
work_manager = QueryWorkerManager()
service_pool = ServicePool()
progress = ProgressManager(mw) # progress window
work_manager = QueryWorkerManager() # Query Worker Thread Manager
service_pool = ServicePool() # Service Instance Pool Manager

View File

@ -159,33 +159,14 @@ class Service(object):
# if the service instance is LocalService,
# then have to build then index.
if isinstance(self, LocalService):
self.notify(MapDict(type='text', index=self.work_id,
text=u'Building %s...' % self._filename))
if isinstance(self, MdxService) or isinstance(self, StardictService):
self.builder.check_build()
for each in self.exporters:
if action_label == each[0]:
self.notify(MapDict(type='info', index=self.work_id,
service_name=self.title,
field_name=action_label,
flag=u'->'))
result = each[1]()
self.notify(MapDict(type='info', index=self.work_id,
service_name=self.title,
field_name=action_label,
flag=u''))
return result
return each[1]()
return QueryResult.default()
def set_notifier(self, progress_update, index):
self.notify_signal = progress_update
self.work_id = index
def notify(self, data):
if self.notify_signal:
self.notify_signal.emit(data)
@staticmethod
def get_anki_label(filename, type_):
formats = {'audio': u'[sound:{0}]',