diff --git a/addons21/fastwq/__init__.py b/addons21/fastwq/__init__.py index 1e3504c..e02a78b 100644 --- a/addons21/fastwq/__init__.py +++ b/addons21/fastwq/__init__.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -19,6 +19,7 @@ import ssl import sys + from anki.hooks import addHook from anki.utils import isMac @@ -28,6 +29,7 @@ if isMac: ############## other config here ################## shortcut = ('Ctrl+Alt' if isMac else 'Ctrl') + '+Q' + ################################################### @@ -42,7 +44,6 @@ def start_here(): fastwq.browser_menu() fastwq.context_menu() fastwq.customize_addcards() - # if fastwq.config.auto_update: - # fastwq.check_updates(True) -addHook("profileLoaded", start_here) \ No newline at end of file + +addHook("profileLoaded", start_here) diff --git a/addons21/fastwq/common.py b/addons21/fastwq/common.py index 956cfd5..94f0e3a 100644 --- a/addons21/fastwq/common.py +++ b/addons21/fastwq/common.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -18,24 +18,23 @@ # along with this program. If not, see . from operator import itemgetter + +from anki.hooks import addHook, remHook, wrap from aqt import mw -from aqt.qt import * -from anki.hooks import addHook, wrap, remHook from aqt.addcards import AddCards -from aqt.utils import showInfo, shortcut, downArrow -from .gui import show_options, show_about_dialog #, check_updates -from .query import query_from_browser, query_from_editor_fields -from .context import config, APP_ICON, Config +from aqt.qt import * +from aqt.utils import downArrow, shortcut, showInfo + +from .context import APP_ICON, Config, config +from .gui import show_about_dialog, show_options # , check_updates from .lang import _ +from .query import query_from_browser, query_from_editor_fields from .service import service_pool from .utils import get_icon - __all__ = [ - 'browser_menu', 'customize_addcards', - 'config_menu', 'context_menu' -] # 'check_updates', - + 'browser_menu', 'customize_addcards', 'config_menu', 'context_menu' +] # 'check_updates', have_setup = False my_shortcut = '' @@ -52,18 +51,23 @@ def set_options_def(mid, i): data = dict() data[mid] = conf config.update(data) + + # end set_options_def + def browser_menu(): """ add add-on's menu to browser window """ + def on_setup_menus(browser): """ on browser setupMenus was called """ # main menu menu = browser.form.menubar.addMenu("FastWQ") + # menu gen def init_fastwq_menu(): try: @@ -78,6 +82,7 @@ def browser_menu(): menu.addAction(action) # Options action = QAction(_('OPTIONS'), browser) + def _show_options(): model_id = -1 for note_id in browser.selectedNotes(): @@ -85,26 +90,31 @@ def browser_menu(): model_id = note.model()['id'] break show_options(browser, model_id) + action.triggered.connect(_show_options) menu.addAction(action) # Default configs menu.addSeparator() b = False - for m in sorted(browser.mw.col.models.all(), key=itemgetter("name")): + for m in sorted( + browser.mw.col.models.all(), key=itemgetter("name")): conf = config.get_maps(m['id']) - conf = {'list': [conf], 'def': 0} if isinstance(conf, list) else conf + conf = { + 'list': [conf], + 'def': 0 + } if isinstance(conf, list) else conf maps_list = conf['list'] if len(maps_list) > 1: submenu = menu.addMenu(m['name']) for i, maps in enumerate(maps_list): submenu.addAction( - _OK_ICON if i==conf['def'] else _NULL_ICON, - _('CONFIG_INDEX') % (i+1) if isinstance(maps, list) else maps['name'], - lambda mid=m['id'], i=i: set_options_def(mid, i) - ) + _OK_ICON if i == conf['def'] else _NULL_ICON, + _('CONFIG_INDEX') % (i + 1) if isinstance( + maps, list) else maps['name'], + lambda mid=m['id'], i=i: set_options_def(mid, i)) b = True - if b: + if b: menu.addSeparator() # # check update @@ -120,6 +130,7 @@ def browser_menu(): # end init_fastwq_menu init_fastwq_menu() addHook('config.update', init_fastwq_menu) + addHook('browser.setupMenus', on_setup_menus) @@ -127,6 +138,7 @@ def customize_addcards(): """ add button to addcards window """ + def add_query_button(self): ''' add a button in add card window @@ -136,44 +148,47 @@ def customize_addcards(): # button fastwqBtn = QPushButton(_("QUERY") + u" " + downArrow()) fastwqBtn.setShortcut(QKeySequence(my_shortcut)) - fastwqBtn.setToolTip( - _(u"Shortcut: %s") % shortcut(my_shortcut) - ) + fastwqBtn.setToolTip(_(u"Shortcut: %s") % shortcut(my_shortcut)) bb.addButton(fastwqBtn, ar) + # signal def onQuery(e): if isinstance(e, QMouseEvent): if e.buttons() & Qt.LeftButton: menu = QMenu(self) - menu.addAction(_("ALL_FIELDS"), lambda: query_from_editor_fields(self.editor), QKeySequence(my_shortcut)) + menu.addAction( + _("ALL_FIELDS"), + lambda: query_from_editor_fields(self.editor), + QKeySequence(my_shortcut)) # default options mid = self.editor.note.model()['id'] conf = config.get_maps(mid) - conf = {'list': [conf], 'def': 0} if isinstance(conf, list) else conf + conf = { + 'list': [conf], + 'def': 0 + } if isinstance(conf, list) else conf maps_list = conf['list'] if len(maps_list) > 1: menu.addSeparator() for i, maps in enumerate(maps_list): menu.addAction( - _OK_ICON if i==conf['def'] else _NULL_ICON, - _('CONFIG_INDEX') % (i+1) if isinstance(maps, list) else maps['name'], - lambda mid=mid, i=i: set_options_def(mid, i) - ) + _OK_ICON if i == conf['def'] else _NULL_ICON, + _('CONFIG_INDEX') % (i + 1) if isinstance( + maps, list) else maps['name'], + lambda mid=mid, i=i: set_options_def(mid, i)) menu.addSeparator() # end default options menu.addAction(_("OPTIONS"), lambda: show_options(self, self.editor.note.model()['id'])) - menu.exec_(fastwqBtn.mapToGlobal(QPoint(0, fastwqBtn.height()))) + menu.exec_( + fastwqBtn.mapToGlobal(QPoint(0, fastwqBtn.height()))) else: query_from_editor_fields(self.editor) fastwqBtn.mousePressEvent = onQuery fastwqBtn.clicked.connect(onQuery) - - AddCards.setupButtons = wrap( - AddCards.setupButtons, - add_query_button, - "after" - ) + + AddCards.setupButtons = wrap(AddCards.setupButtons, add_query_button, + "after") def config_menu(): @@ -187,6 +202,7 @@ def config_menu(): def context_menu(): '''mouse right click menu''' + def on_setup_menus(web_view, menu): """ add context menu to webview @@ -217,32 +233,30 @@ def context_menu(): name = s.title + ' :-> ' + s.fields[dict_fld_ord] if name not in names: names.append(name) - curr_flds.append({ - 'name': name, - 'def': i - }) + curr_flds.append({'name': name, 'def': i}) service_pool.put(s) submenu = menu.addMenu(_('QUERY')) - submenu.addAction(_('ALL_FIELDS'), lambda: query_from_editor_fields(web_view.editor), QKeySequence(my_shortcut)) + submenu.addAction( + _('ALL_FIELDS'), lambda: query_from_editor_fields(web_view.editor), + QKeySequence(my_shortcut)) if len(curr_flds) > 0: # quer hook method def query_from_editor_hook(i): conf = config.get_maps(current_model_id) - maps_old_def = 0 if isinstance(conf, list) else conf.get('def', 0) + maps_old_def = 0 if isinstance(conf, list) else conf.get( + 'def', 0) set_options_def(current_model_id, i) query_from_editor_fields( - web_view.editor, - fields=[web_view.editor.currentField] - ) + web_view.editor, fields=[web_view.editor.currentField]) set_options_def(current_model_id, maps_old_def) + # sub menu - #flds_menu = submenu.addMenu(_('CURRENT_FIELDS')) + # flds_menu = submenu.addMenu(_('CURRENT_FIELDS')) submenu.addSeparator() for c in curr_flds: - submenu.addAction(c['name'], - lambda i=c['def']: query_from_editor_hook(i) - ) + submenu.addAction( + c['name'], lambda i=c['def']: query_from_editor_hook(i)) submenu.addSeparator() submenu.addAction(_("OPTIONS"), lambda: show_options(web_view, web_view.editor.note.model()['id'])) diff --git a/addons21/fastwq/constants.py b/addons21/fastwq/constants.py index 58de6fe..86728c9 100644 --- a/addons21/fastwq/constants.py +++ b/addons21/fastwq/constants.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -17,13 +17,12 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . - from .lang import _ - __all__ = ['VERSION', 'Endpoint', 'Template'] -VERSION = 'v1.3.5' +VERSION = 'v2.0.0b' + class Endpoint: repository = u'https://github.com/sth2018/FastWordQuery' @@ -36,10 +35,13 @@ class Endpoint: class Template: tmpl_about = u'''{t0}
{version}
{t1}
- {url}
{t2}
- {feedback0}
- {feedback1}'''.format( - t0=_('VERSION'), version=VERSION, - t1=_('REPOSITORY'), url=Endpoint.repository, - t2=_('FEEDBACK'), feedback0=Endpoint.feedback_issue, feedback1=Endpoint.feedback_mail) - miss_css = u'MDX dictonary {dict} misses css file {css}.
Please choose the file.' +{url}
{t2}
+{feedback0}
+{feedback1}'''.format( + t0=_('VERSION'), + version=VERSION, + t1=_('REPOSITORY'), + url=Endpoint.repository, + t2=_('FEEDBACK'), + feedback0=Endpoint.feedback_issue, + feedback1=Endpoint.feedback_mail) diff --git a/addons21/fastwq/context.py b/addons21/fastwq/context.py index aed659b..8231c7c 100644 --- a/addons21/fastwq/context.py +++ b/addons21/fastwq/context.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -28,17 +28,15 @@ from .utils import get_icon __all__ = ['APP_ICON', 'config'] - -APP_ICON = get_icon('wqicon.png') # Addon Icon +APP_ICON = get_icon('wqicon.png') # Addon Icon class Config(object): - """ Addon Config """ - _CONFIG_FILENAME = 'fastwqcfg.json' # Config File Path + _CONFIG_FILENAME = 'fastwqcfg.json' # Config File Path def __init__(self, window): self.path = u'_' + self._CONFIG_FILENAME @@ -56,10 +54,12 @@ class Config(object): Update && Save """ data['version'] = VERSION - data['%s_last' % self.pmname] = data.get('last_model', self.last_model_id) + data['%s_last' % self.pmname] = data.get('last_model', + self.last_model_id) self.data.update(data) with open(self.path, 'w', encoding='utf-8') as f: - json.dump(self.data, f, indent=4, sort_keys=True, ensure_ascii=False) + json.dump( + self.data, f, indent=4, sort_keys=True, ensure_ascii=False) f.close() runHook('config.update') @@ -70,13 +70,15 @@ class Config(object): if self.data: return self.data try: - path = self.path if os.path.exists(self.path) else u'.' + self._CONFIG_FILENAME + path = self.path if os.path.exists( + self.path) else u'.' + self._CONFIG_FILENAME with open(path, 'r', encoding="utf-8") as f: self.data = json.load(f) f.close() if not os.path.exists(self.path): self.update(self.data) - except: + except Exception as e: + print('can not find config file', e) self.data = dict() def get_maps(self, model_id): @@ -108,7 +110,7 @@ class Config(object): @property def force_update(self): return self.data.get('force_update', False) - + @property def ignore_mdx_wordcase(self): return self.data.get('ignore_mdx_wordcase', False) @@ -140,4 +142,5 @@ class Config(object): tmpstr = '{{c1::%s}}' return tmpstr + config = Config(mw) diff --git a/addons21/fastwq/gui/__init__.py b/addons21/fastwq/gui/__init__.py index 6febba1..22b5f25 100644 --- a/addons21/fastwq/gui/__init__.py +++ b/addons21/fastwq/gui/__init__.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- from .common import * from .progress import * diff --git a/addons21/fastwq/gui/base.py b/addons21/fastwq/gui/base.py index 6918495..9eb57e3 100644 --- a/addons21/fastwq/gui/base.py +++ b/addons21/fastwq/gui/base.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -18,10 +18,11 @@ # along with this program. If not, see . import sys + from anki.utils import isMac from aqt.qt import * -from ..context import APP_ICON +from ..context import APP_ICON __all__ = ['Dialog', 'WIDGET_SIZE'] @@ -37,20 +38,15 @@ class Dialog(QDialog): return value of the _ui() method, and sets a default title. ''' - self._title = title + self._title = title if "FastWQ" in title else "FastWQ - " + title self._parent = parent super(Dialog, self).__init__(parent) self.setModal(True) self.setWindowFlags( - self.windowFlags() & - ~Qt.WindowContextHelpButtonHint - ) + self.windowFlags() & ~Qt.WindowContextHelpButtonHint) self.setWindowIcon(APP_ICON) - self.setWindowTitle( - title if "FastWQ" in title - else "FastWQ - " + title - ) + self.setWindowTitle(self._title) # 2 & 3 & mac compatible if isMac and sys.hexversion >= 0x03000000: QApplication.setStyle('Fusion') diff --git a/addons21/fastwq/gui/common.py b/addons21/fastwq/gui/common.py index 3a5d444..69e0083 100644 --- a/addons21/fastwq/gui/common.py +++ b/addons21/fastwq/gui/common.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # diff --git a/addons21/fastwq/gui/dictmanager.py b/addons21/fastwq/gui/dictmanager.py index 768f120..7d38440 100644 --- a/addons21/fastwq/gui/dictmanager.py +++ b/addons21/fastwq/gui/dictmanager.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -19,19 +19,20 @@ import os import sys -from aqt.qt import * + from aqt.forms.editaddon import Ui_Dialog -from .base import Dialog, WIDGET_SIZE -from ..service import service_manager, service_pool +from aqt.qt import * + from ..context import config from ..lang import _, _sl +from ..service import service_manager, service_pool from ..utils import get_icon +from .base import WIDGET_SIZE, Dialog # 2x3 compatible if sys.hexversion >= 0x03000000: unicode = str - __all__ = ['DictManageDialog'] @@ -45,14 +46,14 @@ class DictManageDialog(Dialog): self.main_layout = QVBoxLayout() self.setLayout(self.main_layout) self._options = list() - btnbox = QDialogButtonBox(QDialogButtonBox.Ok, Qt.Horizontal , self) + btnbox = QDialogButtonBox(QDialogButtonBox.Ok, Qt.Horizontal, self) btnbox.accepted.connect(self.accept) # add dicts mapping self.dicts_layout = QGridLayout() self.main_layout.addLayout(self.dicts_layout) self.main_layout.addWidget(btnbox) self.build() - + def build(self): ''' ''' # labels @@ -80,10 +81,14 @@ class DictManageDialog(Dialog): services = service_manager.local_custom_services + service_manager.web_services for clazz in services: dicts.append({ - 'title': clazz.__title__, - 'unique': clazz.__unique__, - 'path': clazz.__path__, - 'enabled': confs.get(clazz.__unique__, dict()).get('enabled', True) + 'title': + clazz.__title__, + 'unique': + clazz.__unique__, + 'path': + clazz.__path__, + 'enabled': + confs.get(clazz.__unique__, dict()).get('enabled', True) }) # add dict for i, d in enumerate(dicts): @@ -102,7 +107,7 @@ class DictManageDialog(Dialog): ) # button check_btn = QCheckBox(title) - check_btn.setMinimumSize(WIDGET_SIZE.map_dict_width*1.5, 0) + check_btn.setMinimumSize(WIDGET_SIZE.map_dict_width * 1.5, 0) check_btn.setEnabled(True) check_btn.setChecked(enabled) edit_btn = QToolButton(self) @@ -114,9 +119,9 @@ class DictManageDialog(Dialog): self.dicts_layout.addWidget(check_btn, i + 1, 0) self.dicts_layout.addWidget(edit_btn, i + 1, 1) self._options.append({ - 'unique': unique, - 'check_btn': check_btn, - 'edit_btn': edit_btn, + 'unique': unique, + 'check_btn': check_btn, + 'edit_btn': edit_btn, }) def enabled_all_update(self): @@ -126,7 +131,7 @@ class DictManageDialog(Dialog): b = False break self.enabled_all_check_btn.setChecked(b) - + def enabled_all_changed(self): b = self.enabled_all_check_btn.isChecked() for row in self._options: diff --git a/addons21/fastwq/gui/foldermanager.py b/addons21/fastwq/gui/foldermanager.py index 4e08307..9981eb1 100644 --- a/addons21/fastwq/gui/foldermanager.py +++ b/addons21/fastwq/gui/foldermanager.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -18,10 +18,10 @@ # along with this program. If not, see . from aqt.qt import * -from .base import Dialog, WIDGET_SIZE + from ..context import config from ..lang import _, _sl - +from .base import WIDGET_SIZE, Dialog __all__ = ['FoldersManageDialog'] @@ -33,7 +33,7 @@ class FoldersManageDialog(Dialog): def __init__(self, parent, title=u'Dictionary Folder Manager'): super(FoldersManageDialog, self).__init__(parent, title) - #self._dict_paths = [] + # self._dict_paths = [] self.build() def build(self): @@ -65,10 +65,9 @@ class FoldersManageDialog(Dialog): def add_folder(self): dir_ = QFileDialog.getExistingDirectory( self, - caption=u"Select Folder", - directory=config.last_folder, - options=QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks - ) + caption=u"Select Folder", + directory=config.last_folder, + options=QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks) if dir_: self.folders_lst.addItem(dir_) config.update({'last_folder': dir_}) @@ -80,8 +79,10 @@ class FoldersManageDialog(Dialog): @property def dirs(self): '''dictionary folders list''' - return [self.folders_lst.item(i).text() - for i in range(self.folders_lst.count())] + return [ + self.folders_lst.item(i).text() + for i in range(self.folders_lst.count()) + ] def accept(self): '''ok button clicked''' diff --git a/addons21/fastwq/gui/options.py b/addons21/fastwq/gui/options.py index d4613af..fefa2e3 100644 --- a/addons21/fastwq/gui/options.py +++ b/addons21/fastwq/gui/options.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -18,22 +18,23 @@ # along with this program. If not, see . import sys + import anki import aqt import aqt.models import sip +from anki.utils import isMac from aqt import mw from aqt.qt import * from aqt.studydeck import StudyDeck -from anki.utils import isMac -from .base import Dialog, WIDGET_SIZE -from .setting import SettingDialog + +from ..constants import Endpoint from ..context import config from ..lang import _, _sl from ..service import service_manager, service_pool -from ..utils import get_model_byId, get_icon -from ..constants import Endpoint - +from ..utils import get_icon, get_model_byId +from .base import WIDGET_SIZE, Dialog +from .setting import SettingDialog __all__ = ['OptionsDialog'] @@ -44,16 +45,13 @@ class OptionsDialog(Dialog): setting query dictionary and fileds ''' - __slot__ = [ - 'begore_build', - 'after_build' - ] + __slot__ = ['begore_build', 'after_build'] _signal = pyqtSignal(str) _NULL_ICON = get_icon('null.png') _OK_ICON = get_icon('ok.png') - def __init__(self, parent, title=u'Options', model_id = -1): + def __init__(self, parent, title=u'Options', model_id=-1): super(OptionsDialog, self).__init__(parent, title) self._signal.connect(self._before_build) self._signal.connect(self._after_build) @@ -61,32 +59,34 @@ class OptionsDialog(Dialog): self.main_layout = QVBoxLayout() self.loading_label = QLabel(_('INITLIZING_DICT')) self.main_layout.addWidget(self.loading_label, 0, Qt.AlignCenter) - #self.loading_layout.addLayout(models_layout) + # self.loading_layout.addLayout(models_layout) self.setLayout(self.main_layout) - #initlize properties + # initlize properties self.model_id = model_id if model_id != -1 else config.last_model_id self.current_model = None self.tabs = [] self.dict_services = None # size and signal - self.resize(WIDGET_SIZE.dialog_width, 4 * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin) + self.resize( + WIDGET_SIZE.dialog_width, + 4 * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin) self._signal.emit('before_build') - + def _before_build(self, s): if s != 'before_build': return # dict service list dicts = config.dicts self.dict_services = { - 'local': [], #本地词典 - 'web': [] #网络词典 + 'local': [], # 本地词典 + 'web': [] # 网络词典 } for clazz in service_manager.local_services: if dicts.get(clazz.__unique__, dict()).get('enabled', True): service = service_pool.get(clazz.__unique__) if service and service.support: self.dict_services['local'].append({ - 'title': service.title, + 'title': service.title, 'unique': service.unique }) service_pool.put(service) @@ -95,7 +95,7 @@ class OptionsDialog(Dialog): service = service_pool.get(clazz.__unique__) if service and service.support: self.dict_services['web'].append({ - 'title': service.title, + 'title': service.title, 'unique': service.unique }) service_pool.put(service) @@ -121,13 +121,11 @@ class OptionsDialog(Dialog): # tabs self.tab_widget = QTabWidget() self.tab_widget.setTabBar(CTabBar()) - self.tab_widget.setStyleSheet( - """ + self.tab_widget.setStyleSheet(""" QTabWidget::pane { /* The tab widget frame */ border: 1px solid #c3c3c3; } - """ - ) + """) tab_corner = QWidget() tab_corner_layout = QHBoxLayout() tab_corner_layout.setSpacing(1) @@ -160,8 +158,7 @@ class OptionsDialog(Dialog): # chk_update_btn = QPushButton(_('UPDATE')) # chk_update_btn.clicked.connect(self.check_updates) home_label = QLabel( - 'User Guide'.format(url=Endpoint.user_guide) - ) + 'User Guide'.format(url=Endpoint.user_guide)) home_label.setOpenExternalLinks(True) # buttons btnbox = QDialogButtonBox(QDialogButtonBox.Ok, Qt.Horizontal, self) @@ -171,7 +168,7 @@ class OptionsDialog(Dialog): bottom_layout.addWidget(about_btn) bottom_layout.addWidget(home_label) bottom_layout.addWidget(btnbox) - #self.setLayout(self.main_layout) + # self.setLayout(self.main_layout) self.main_layout.addLayout(bottom_layout) # init from saved data self.current_model = None @@ -179,7 +176,8 @@ class OptionsDialog(Dialog): self.current_model = get_model_byId(mw.col.models, self.model_id) if self.current_model: self.models_button.setText( - u'%s [%s]' % (_('CHOOSE_NOTE_TYPES'), self.current_model['name'])) + u'%s [%s]' % (_('CHOOSE_NOTE_TYPES'), + self.current_model['name'])) # build fields -- dicts layout self.build_tabs_layout() @@ -198,7 +196,7 @@ class OptionsDialog(Dialog): '''open folder manager dialog''' self.accept() self.setResult(1001) - + def show_dm_dialog(self): '''open dictionary manager dialog''' self.accept() @@ -225,13 +223,18 @@ class OptionsDialog(Dialog): ''' build dictionary、fields etc ''' - try: self.tab_widget.currentChanged.disconnect() - except Exception: pass + try: + self.tab_widget.currentChanged.disconnect() + except Exception: + pass while len(self.tabs) > 0: self.removeTab(0, True) # tabs conf = config.get_maps(self.current_model['id']) - maps_list = {'list': [conf], 'def': 0} if isinstance(conf, list) else conf + maps_list = { + 'list': [conf], + 'def': 0 + } if isinstance(conf, list) else conf for maps in maps_list['list']: self.addTab(maps, False) self.tab_widget.currentChanged.connect(self.changedTab) @@ -240,28 +243,21 @@ class OptionsDialog(Dialog): self.tab_widget.setCurrentIndex(maps_list['def']) # size self.resize( - WIDGET_SIZE.dialog_width, - min(max(3, len(self.current_model['flds'])+1), 14) * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin - ) + WIDGET_SIZE.dialog_width, + min(max(3, + len(self.current_model['flds']) + 1), 14) * + WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin) self.save() - + def addTab(self, maps=None, forcus=True): i = len(self.tabs) if isinstance(maps, list): - maps = { - 'fields': maps, - 'name': _('CONFIG_INDEX') % (i+1) - } - tab = TabContent( - self.current_model, - maps['fields'] if maps else None, - self.dict_services - ) + maps = {'fields': maps, 'name': _('CONFIG_INDEX') % (i + 1)} + tab = TabContent(self.current_model, maps['fields'] if maps else None, + self.dict_services) self.tabs.append(tab) self.tab_widget.addTab( - tab, - maps['name'] if maps else _('CONFIG_INDEX') % (i+1) - ) + tab, maps['name'] if maps else _('CONFIG_INDEX') % (i + 1)) if forcus: self.tab_widget.setCurrentIndex(i) @@ -273,7 +269,7 @@ class OptionsDialog(Dialog): del self.tabs[i] self.tab_widget.removeTab(i) tab.destroy() - #for k in range(0, len(self.tabs)): + # for k in range(0, len(self.tabs)): # self.tab_widget.setTabText(k, _('CONFIG_INDEX') % (k+1)) def changedTab(self, i): @@ -289,12 +285,18 @@ class OptionsDialog(Dialog): ''' show choose note type window ''' - edit = QPushButton(anki.lang._("Manage"), - clicked=lambda: aqt.models.Models(mw, self)) - ret = StudyDeck(mw, names=lambda: sorted(mw.col.models.allNames()), - accept=anki.lang._("Choose"), title=anki.lang._("Choose Note Type"), - help="_notes", parent=self, buttons=[edit], - cancel=True, geomKey="selectModel") + edit = QPushButton( + anki.lang._("Manage"), clicked=lambda: aqt.models.Models(mw, self)) + ret = StudyDeck( + mw, + names=lambda: sorted(mw.col.models.allNames()), + accept=anki.lang._("Choose"), + title=anki.lang._("Choose Note Type"), + help="_notes", + parent=self, + buttons=[edit], + cancel=True, + geomKey="selectModel") if ret.name: model = mw.col.models.byName(ret.name) self.models_button.setText( @@ -306,18 +308,17 @@ class OptionsDialog(Dialog): if not self.current_model: return data = dict() - maps_list = { - 'list': [], - 'def': self.tab_widget.currentIndex() - } + maps_list = {'list': [], 'def': self.tab_widget.currentIndex()} for i, tab in enumerate(self.tabs): maps_list['list'].append({ - 'fields': tab.data, - 'name': self.tab_widget.tabBar().tabText(i) + 'fields': + tab.data, + 'name': + self.tab_widget.tabBar().tabText(i) }) current_model_id = str(self.current_model['id']) data[current_model_id] = maps_list - data['last_model'] = self.current_model['id'] + data['last_model'] = self.current_model['id'] config.update(data) @@ -339,7 +340,7 @@ class TabContent(QScrollArea): self.setWidgetResizable(True) self.setWidget(dicts) self.dicts_layout = dicts.layout() - #self.dicts_layout.setSizeConstraint(QLayout.SetFixedSize) + # self.dicts_layout.setSizeConstraint(QLayout.SetFixedSize) def build_layout(self): ''' @@ -352,7 +353,7 @@ class TabContent(QScrollArea): self._last_checkeds = None self._was_built = True - model = self._model + model = self._model maps = self._conf # labels @@ -372,7 +373,8 @@ class TabContent(QScrollArea): self.ignore_all_check_btn.setEnabled(True) self.ignore_all_check_btn.setChecked(True) self.dicts_layout.addWidget(self.ignore_all_check_btn, 0, 1) - self.ignore_all_check_btn.clicked.connect(self.ignore_all_check_changed) + self.ignore_all_check_btn.clicked.connect( + self.ignore_all_check_changed) # Skip valued all self.skip_all_check_btn = QCheckBox(_('SELECT_ALL')) @@ -381,7 +383,7 @@ class TabContent(QScrollArea): self.skip_all_check_btn.setChecked(True) self.dicts_layout.addWidget(self.skip_all_check_btn, 0, 4) self.skip_all_check_btn.clicked.connect(self.skip_all_check_changed) - + # dict & fields self.radio_group = QButtonGroup() for i, fld in enumerate(model['flds']): @@ -389,16 +391,19 @@ class TabContent(QScrollArea): name = fld['name'] if maps: for j, each in enumerate(maps): - if each.get('fld_ord', -1) == ord or each.get('fld_name', '') == name: + if each.get('fld_ord', -1) == ord or each.get( + 'fld_name', '') == name: each['fld_name'] = name each['fld_ord'] = ord self.add_dict_layout(j, **each) break else: - self.add_dict_layout(i, fld_name=name, fld_ord=ord, word_checked=i==0) + self.add_dict_layout( + i, fld_name=name, fld_ord=ord, word_checked=i == 0) else: - self.add_dict_layout(i, fld_name=name, fld_ord=ord, word_checked=i==0) - + self.add_dict_layout( + i, fld_name=name, fld_ord=ord, word_checked=i == 0) + # update self.ignore_all_update() self.skip_all_update() @@ -410,21 +415,21 @@ class TabContent(QScrollArea): word_checked = kwargs.get('word_checked', False) fld_name, fld_ord = ( - kwargs.get('fld_name', ''), #笔记类型的字段名 - kwargs.get('fld_ord', ''), #笔记类型的字段编号 + kwargs.get('fld_name', ''), # 笔记类型的字段名 + kwargs.get('fld_ord', ''), # 笔记类型的字段编号 ) dict_name, dict_unique, dict_fld_name, dict_fld_ord = ( - kwargs.get('dict_name', ''), #字典名 - kwargs.get('dict_unique', ''), #字典ID - kwargs.get('dict_fld_name', ''), #对应字典的字段名 - kwargs.get('dcit_fld_ord', 0) #对应字典的字段编号 + kwargs.get('dict_name', ''), # 字典名 + kwargs.get('dict_unique', ''), # 字典ID + kwargs.get('dict_fld_name', ''), # 对应字典的字段名 + kwargs.get('dcit_fld_ord', 0) # 对应字典的字段编号 ) ignore, skip, cloze = ( - kwargs.get('ignore', True), #忽略标志 - kwargs.get('skip_valued', True), #略过有值项标志 - kwargs.get('cloze_word', False), #单词填空 + kwargs.get('ignore', True), # 忽略标志 + kwargs.get('skip_valued', True), # 略过有值项标志 + kwargs.get('cloze_word', False), # 单词填空 ) # check @@ -436,26 +441,23 @@ class TabContent(QScrollArea): # dict combox dict_combo = QComboBox() dict_combo.setMinimumSize(WIDGET_SIZE.map_dict_width, 0) - dict_combo.setMaximumSize( - WIDGET_SIZE.map_dict_width, - WIDGET_SIZE.map_max_height - ) - dict_combo.setFocusPolicy( - Qt.TabFocus | Qt.ClickFocus | Qt.StrongFocus | Qt.WheelFocus - ) - ignore = not self.fill_dict_combo_options(dict_combo, dict_unique, self._services) or ignore + dict_combo.setMaximumSize(WIDGET_SIZE.map_dict_width, + WIDGET_SIZE.map_max_height) + dict_combo.setFocusPolicy(Qt.TabFocus | Qt.ClickFocus | Qt.StrongFocus + | Qt.WheelFocus) + ignore = not self.fill_dict_combo_options(dict_combo, dict_unique, + self._services) or ignore dict_unique = dict_combo.itemData(dict_combo.currentIndex()) dict_combo.setEnabled(not word_checked and not ignore) # field combox field_combo = QComboBox() field_combo.setMinimumSize(WIDGET_SIZE.map_field_width, 0) - field_combo.setMaximumSize( - WIDGET_SIZE.map_field_width, - WIDGET_SIZE.map_max_height - ) + field_combo.setMaximumSize(WIDGET_SIZE.map_field_width, + WIDGET_SIZE.map_max_height) field_combo.setEnabled(not word_checked and not ignore) - self.fill_field_combo_options(field_combo, dict_name, dict_unique, dict_fld_name, dict_fld_ord) - + self.fill_field_combo_options(field_combo, dict_name, dict_unique, + dict_fld_name, dict_fld_ord) + # ignore ignore_check_btn = QCheckBox(_("NOT_DICT_FIELD")) ignore_check_btn.setEnabled(not word_checked) @@ -489,13 +491,14 @@ class TabContent(QScrollArea): cloze_check_btn.setEnabled(not word_checked and not ignore) if word_checked: self._last_checkeds = [ - ignore_check_btn, dict_combo, - field_combo, skip_check_btn + ignore_check_btn, dict_combo, field_combo, skip_check_btn ] + word_check_btn.clicked.connect(radio_btn_checked) - if word_checked: + if word_checked: self._last_checkeds = None radio_btn_checked() + # ignor def ignore_check_changed(): word_checked = word_check_btn.isChecked() @@ -504,35 +507,38 @@ class TabContent(QScrollArea): field_combo.setEnabled(not word_checked and not ignore) skip_check_btn.setEnabled(not word_checked and not ignore) cloze_check_btn.setEnabled(not word_checked and not ignore) + ignore_check_btn.stateChanged.connect(ignore_check_changed) ignore_check_btn.clicked.connect(self.ignore_all_update) # skip skip_check_btn.clicked.connect(self.skip_all_update) + # dict def dict_combo_changed(index): '''dict combo box index changed''' self.fill_field_combo_options( - field_combo, - dict_combo.currentText(), - dict_combo.itemData(index), - field_combo.currentText(), - field_combo.itemData(field_combo.currentIndex()) - ) + field_combo, dict_combo.currentText(), + dict_combo.itemData(index), field_combo.currentText(), + field_combo.itemData(field_combo.currentIndex())) + dict_combo.currentIndexChanged.connect(dict_combo_changed) - + self.dicts_layout.addWidget(word_check_btn, i + 1, 0) self.dicts_layout.addWidget(ignore_check_btn, i + 1, 1) self.dicts_layout.addWidget(dict_combo, i + 1, 2) self.dicts_layout.addWidget(field_combo, i + 1, 3) self.dicts_layout.addWidget(skip_check_btn, i + 1, 4) self.dicts_layout.addWidget(cloze_check_btn, i + 1, 5) - + self._options.append({ - 'model': {'fld_name': fld_name, 'fld_ord': fld_ord}, - 'word_check_btn': word_check_btn, - 'dict_combo': dict_combo, - 'field_combo': field_combo, - 'ignore_check_btn': ignore_check_btn, + 'model': { + 'fld_name': fld_name, + 'fld_ord': fld_ord + }, + 'word_check_btn': word_check_btn, + 'dict_combo': dict_combo, + 'field_combo': field_combo, + 'ignore_check_btn': ignore_check_btn, 'skip_check_btn': skip_check_btn, 'cloze_check_btn': cloze_check_btn }) @@ -548,7 +554,7 @@ class TabContent(QScrollArea): # hr if len(services['local']) > 0: dict_combo.insertSeparator(dict_combo.count()) - + # web dict service for service in services['web']: dict_combo.addItem(service['title'], userData=service['unique']) @@ -561,15 +567,18 @@ class TabContent(QScrollArea): dict_combo.setCurrentIndex(i) return True return False + return set_dict_combo_index() - def fill_field_combo_options(self, field_combo, dict_combo_text, dict_combo_itemdata, dict_fld_name, dict_fld_ord): + def fill_field_combo_options(self, field_combo, dict_combo_text, + dict_combo_itemdata, dict_fld_name, + dict_fld_ord): '''setup field combobox''' field_combo.clear() field_combo.setEditable(False) - #if dict_combo_text in _sl('NOT_DICT_FIELD'): + # if dict_combo_text in _sl('NOT_DICT_FIELD'): # field_combo.setEnabled(False) - #el + # el if dict_combo_text in _sl('MDX_SERVER'): text = dict_fld_name if dict_fld_name else 'http://' field_combo.setEditable(True) @@ -594,16 +603,26 @@ class TabContent(QScrollArea): maps = [] for row in self._options: maps.append({ - 'fld_name': row['model']['fld_name'], - 'fld_ord': row['model']['fld_ord'], - 'word_checked': row['word_check_btn'].isChecked(), - 'dict_name': row['dict_combo'].currentText().strip(), - 'dict_unique': row['dict_combo'].itemData(row['dict_combo'].currentIndex()), - 'dict_fld_name': row['field_combo'].currentText().strip(), - 'dict_fld_ord': row['field_combo'].itemData(row['field_combo'].currentIndex()), - 'ignore': row['ignore_check_btn'].isChecked(), - 'skip_valued': row['skip_check_btn'].isChecked(), - 'cloze_word': row['cloze_check_btn'].isChecked() + 'fld_name': + row['model']['fld_name'], + 'fld_ord': + row['model']['fld_ord'], + 'word_checked': + row['word_check_btn'].isChecked(), + 'dict_name': + row['dict_combo'].currentText().strip(), + 'dict_unique': + row['dict_combo'].itemData(row['dict_combo'].currentIndex()), + 'dict_fld_name': + row['field_combo'].currentText().strip(), + 'dict_fld_ord': + row['field_combo'].itemData(row['field_combo'].currentIndex()), + 'ignore': + row['ignore_check_btn'].isChecked(), + 'skip_valued': + row['skip_check_btn'].isChecked(), + 'cloze_word': + row['cloze_check_btn'].isChecked() }) return maps @@ -624,7 +643,7 @@ class TabContent(QScrollArea): b = False break self.ignore_all_check_btn.setChecked(b) - + def skip_all_update(self): b = True for row in self._options: @@ -635,8 +654,7 @@ class TabContent(QScrollArea): class CTabBar(QTabBar): - - def __init__(self, parent = None): + def __init__(self, parent=None): super(CTabBar, self).__init__(parent) # style self.setTabsClosable(True) @@ -651,14 +669,17 @@ class CTabBar(QTabBar): self._editor.installEventFilter(self) def eventFilter(self, widget, event): - if ((event.type() == QEvent.MouseButtonPress and \ - not self._editor.geometry().contains(event.globalPos()) \ - ) or \ - (event.type() == QEvent.KeyPress and \ - event.key() == Qt.Key_Escape) - ): - self.hideEditor() - return True + bhide = False + if event.type() == QEvent.MouseButtonPress: + if not self._editor.geometry().contains(event.globalPos()): + bhide = True + if not bhide: + if event.type() == QEvent.KeyPress: + if event.key() == Qt.Key_Escape: + bhide = True + if bhide: + self.hideEditor() + return True return QTabBar.eventFilter(self, widget, event) def mouseDoubleClickEvent(self, event): @@ -676,7 +697,7 @@ class CTabBar(QTabBar): self._editor.selectAll() self._editor.setEnabled(True) self._editor.setFocus() - + def hideEditor(self): if self._editor.isVisible(): self._editor.setEnabled(False) diff --git a/addons21/fastwq/gui/progress.py b/addons21/fastwq/gui/progress.py index cedb98e..422dd44 100644 --- a/addons21/fastwq/gui/progress.py +++ b/addons21/fastwq/gui/progress.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -17,24 +17,22 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . - import time from collections import defaultdict from aqt.qt import * -from ..lang import _ -from ..context import APP_ICON +from ..context import APP_ICON +from ..lang import _ __all__ = ['ProgressWindow'] - _INFO_TEMPLATE = u''.join([ u'' + _('QUERIED') + u'', u'

' + 45 * u'-' + u'

', u'

' + _('SUCCESS') + u' {} ' + _('WORDS') + u'

', u'

' + _('SKIPED') + u' {} ' + _('WORDS') + u'

', - u'

' + _('UPDATE') + u' {} ' + _('FIELDS') + u'

', + u'

' + _('UPDATE') + u' {} ' + _('FIELDS') + u'

', u'

' + _('FAILURE') + u' {} ' + _('WORDS') + u'

', ]) @@ -66,15 +64,12 @@ class ProgressWindow(object): self._msg_count.get('words_number', 0), self._msg_count.get('fields_number', 0), self._msg_count.get('fails_number', 0), - self._msg_count.get('skips_number', 0) - ) - number_info = _INFO_TEMPLATE.format( - words_number, - skips_number, - fields_number, - fails_number - ) - self._update(label=number_info, value=words_number+skips_number+fails_number) + self._msg_count.get('skips_number', 0)) + number_info = _INFO_TEMPLATE.format(words_number, skips_number, + fields_number, fails_number) + self._update( + label=number_info, + value=words_number + skips_number + fails_number) self._win.adjustSize() self.app.processEvents() @@ -95,9 +90,7 @@ class ProgressWindow(object): self._win.setWindowTitle("FastWQ - Querying...") self._win.setModal(True) self._win.setWindowFlags( - self._win.windowFlags() & - ~Qt.WindowContextHelpButtonHint - ) + self._win.windowFlags() & ~Qt.WindowContextHelpButtonHint) self._win.setWindowIcon(APP_ICON) self._win.setAutoReset(True) self._win.setAutoClose(True) diff --git a/addons21/fastwq/gui/setting.py b/addons21/fastwq/gui/setting.py index 842454d..8327560 100644 --- a/addons21/fastwq/gui/setting.py +++ b/addons21/fastwq/gui/setting.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -21,7 +21,7 @@ from aqt.qt import * from ..context import config from ..lang import _ -from .base import WIDGET_SIZE, Dialog +from .base import Dialog __all__ = ['SettingDialog'] @@ -89,23 +89,23 @@ class SettingDialog(Dialog): hbox.addSpacing(300) hbox.addWidget(resetbtn) hbox.addWidget(okbtn) - + layout.addSpacing(48) layout.addLayout(hbox) - + self.check_force_update = check_force_update self.check_ignore_accents = check_ignore_accents self.check_ighore_mdx_wordcase = check_ighore_mdx_wordcase self.input_thread_number = input_thread_number self.input_cloze_str = input_cloze_str - layout.setAlignment(Qt.AlignTop|Qt.AlignLeft) + layout.setAlignment(Qt.AlignTop | Qt.AlignLeft) self.setLayout(layout) def accept(self): self.save() super(SettingDialog, self).accept() - + def reset(self): data = { 'force_update': False, @@ -120,7 +120,7 @@ class SettingDialog(Dialog): self.check_ighore_mdx_wordcase.setChecked(config.ignore_mdx_wordcase) self.input_thread_number.setValue(config.thread_number) self.input_cloze_str.setText(config.cloze_str) - + def save(self): data = { 'force_update': self.check_force_update.isChecked(), diff --git a/addons21/fastwq/lang.py b/addons21/fastwq/lang.py index 6b791b4..f8e2df5 100644 --- a/addons21/fastwq/lang.py +++ b/addons21/fastwq/lang.py @@ -1,4 +1,4 @@ -#-*- coding:utf-8 -*- +# -*- coding:utf-8 -*- # # Copyright (C) 2018 sthoo # @@ -18,15 +18,15 @@ # along with this program. If not, see . from anki.lang import currentLang + try: - basestring + basestring except NameError: - basestring = str + basestring = str __all__ = ['_', '_cl', '_sl'] - -#Language Define, [Key, zh_CN, en] +# Language Define, [Key, zh_CN, en] _arr = [ ['CHECK_FILENAME_LABEL', u'使用文件名作为标签', u'Use the Filename as Label'], ['EXPORT_MEDIA', u'导出媒体文件', u'Export Media Files'], @@ -42,13 +42,19 @@ _arr = [ ['QUERIED', u'查询', u'Queried'], ['FIELDS', u'字段', u'Fields'], ['WORDS', u'单词', u'Words'], - ['NOT_DICT_FIELD', u'忽略', u'Ignore'], #不是字典字段 + ['NOT_DICT_FIELD', u'忽略', u'Ignore'], # 不是字典字段 ['NOTE_TYPE_FIELDS', u'笔记字段', u'Note Fields'], ['DICTS', u'字典', u'Dictionary'], ['DICT_FIELDS', u'字典字段', u'Fields'], - ['RADIOS_DESC', u'单选框选中为待查询单词字段', u' Select the field to be queried with single selection.'], + [ + 'RADIOS_DESC', u'单选框选中为待查询单词字段', + u' Select the field to be queried with single selection.' + ], ['NO_QUERY_WORD', u'查询字段无单词', u'The query field is empty'], - ['CSS_NOT_FOUND', u'没有找到CSS文件,请手动选择', u'No CSS file found, please select one manually.'], + [ + 'CSS_NOT_FOUND', u'没有找到CSS文件,请手动选择', + u'No CSS file found, please select one manually.' + ], ['ABOUT', u'关于', u'About'], ['REPOSITORY', u'项目地址', u'Project Repo'], ['FEEDBACK', u'反馈', u'Feedback'], @@ -60,7 +66,10 @@ _arr = [ ['UPDATE', u'更新', u'Update'], ['AUTO_UPDATE', u'自动检测新版本', u'Auto check new version'], ['CHECK_UPDATE', u'检测更新', u'Check Update'], - ['IGNORE_MDX_WORDCASE', u'忽略本地词典单词大小写', u'Ignore MDX dictionary word case'], + [ + 'IGNORE_MDX_WORDCASE', u'忽略本地词典单词大小写', + u'Ignore MDX dictionary word case' + ], ['FORCE_UPDATE', u'强制更新字段', u'Forced Updates of all fields'], ['IGNORE_ACCENTS', u'忽略声调', u'Ignore Accents'], ['SKIP_VALUED', u'跳过有值项', u'Skip non-empty'], @@ -68,7 +77,10 @@ _arr = [ ['SETTINGS', u'参数', u'Settings'], ['THREAD_NUMBER', u'线程数', u'Number of Threads'], ['INITLIZING_DICT', u'初始化词典...', u'Initlizing Dictionary...'], - ['PLS_SET_DICTIONARY_FIELDS', u'请设置字典和字段', u'Please set the dictionary and fields.'], + [ + 'PLS_SET_DICTIONARY_FIELDS', u'请设置字典和字段', + u'Please set the dictionary and fields.' + ], ['CONFIG_INDEX', u'配置 %s', u'Config %s'], ['SELECT_ALL', u'全选', u'All'], ['DICTS_NAME', u'字典名称', u'Dictionary Name'], @@ -80,7 +92,6 @@ _arr = [ ['OPTIONS', u'选项', u'Options'], ['CLOZE_WORD', u'单词填空', u'Cloze word'], ['CLOZE_WORD_FORMAT', '单词填空格式', 'Cloze word formater'], - ['BRE_PRON', u'英式发音', u'British Pronunciation'], ['AME_PRON', u'美式发音', u'American Pronunciation'], ['PRON', u'发音', u'Audio Pronunciation'], @@ -103,7 +114,7 @@ def _(key, lang=currentLang): def disp(s): return s.lower().capitalize() - + if key not in _trans or lang not in _trans[key]: return disp(key) return _trans[key][lang]