From d9da91e156da25e3a0d963b651ecae504657a460 Mon Sep 17 00:00:00 2001 From: "St.Huang" Date: Tue, 31 Jul 2018 02:21:35 +0800 Subject: [PATCH] ui bug fixes. --- addons/fastwq/gui/base.py | 8 +-- addons/fastwq/gui/common.py | 8 +-- addons/fastwq/gui/foldermanager.py | 24 ++++---- addons/fastwq/gui/options.py | 93 +++++++++++++++++------------- addons/fastwq/gui/progress.py | 12 ++-- addons/fastwq/gui/setting.py | 20 +++---- addons21/fastwq/gui/base.py | 2 +- addons21/fastwq/gui/options.py | 18 ++++-- 8 files changed, 101 insertions(+), 84 deletions(-) diff --git a/addons/fastwq/gui/base.py b/addons/fastwq/gui/base.py index e6b6dc4..6cad186 100644 --- a/addons/fastwq/gui/base.py +++ b/addons/fastwq/gui/base.py @@ -17,14 +17,14 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from PyQt4 import QtCore, QtGui +from aqt.qt import * from ..context import APP_ICON __all__ = ['Dialog', 'WIDGET_SIZE'] -class Dialog(QtGui.QDialog): +class Dialog(QDialog): ''' Base used for all dialog windows. ''' @@ -42,7 +42,7 @@ class Dialog(QtGui.QDialog): self.setModal(True) self.setWindowFlags( self.windowFlags() & - ~QtCore.Qt.WindowContextHelpButtonHint + ~Qt.WindowContextHelpButtonHint ) self.setWindowIcon(APP_ICON) self.setWindowTitle( @@ -58,7 +58,7 @@ class WidgetSize(object): dialog_width = 700 dialog_height_margin = 120 map_min_height = 0 - map_max_height = 31 + map_max_height = 32 map_fld_width = 100 map_dictname_width = 150 map_dictfield_width = 160 diff --git a/addons/fastwq/gui/common.py b/addons/fastwq/gui/common.py index 49e867d..2e4b2a8 100644 --- a/addons/fastwq/gui/common.py +++ b/addons/fastwq/gui/common.py @@ -18,8 +18,8 @@ # along with this program. If not, see . import types -from PyQt4 import QtGui from aqt import mw +from aqt.qt import * from aqt.utils import showInfo from .options import OptionsDialog from .foldermanager import FoldersManageDialog @@ -48,7 +48,7 @@ def show_fm_dialog(browser = None): fm_dialog = FoldersManageDialog(parent, u'Dictionary Folder Manager') fm_dialog.activateWindow() fm_dialog.raise_() - if fm_dialog.exec_() == QtGui.QDialog.Accepted: + if fm_dialog.exec_() == QDialog.Accepted: # update local services service_manager.update_services() # reshow options window @@ -62,11 +62,11 @@ def show_options(browser = None, model_id = -1, callback = None, *args, **kwargs opt_dialog = OptionsDialog(parent, u'Options', model_id) opt_dialog.activateWindow() opt_dialog.raise_() - if opt_dialog.exec_() == QtGui.QDialog.Accepted: + if opt_dialog.exec_() == QDialog.Accepted: if isinstance(callback, types.FunctionType): callback(*args, **kwargs) def show_about_dialog(parent): '''open about dialog''' - QtGui.QMessageBox.about(parent, _('ABOUT'), Template.tmpl_about) + QMessageBox.about(parent, _('ABOUT'), Template.tmpl_about) diff --git a/addons/fastwq/gui/foldermanager.py b/addons/fastwq/gui/foldermanager.py index c172532..4e08307 100644 --- a/addons/fastwq/gui/foldermanager.py +++ b/addons/fastwq/gui/foldermanager.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from PyQt4 import QtCore, QtGui +from aqt.qt import * from .base import Dialog, WIDGET_SIZE from ..context import config from ..lang import _, _sl @@ -37,24 +37,24 @@ class FoldersManageDialog(Dialog): self.build() def build(self): - layout = QtGui.QVBoxLayout() - btn_layout = QtGui.QHBoxLayout() - add_btn = QtGui.QPushButton("+") - remove_btn = QtGui.QPushButton("-") + layout = QVBoxLayout() + btn_layout = QHBoxLayout() + add_btn = QPushButton("+") + remove_btn = QPushButton("-") btn_layout.addWidget(add_btn) btn_layout.addWidget(remove_btn) add_btn.clicked.connect(self.add_folder) remove_btn.clicked.connect(self.remove_folder) - self.folders_lst = QtGui.QListWidget() + self.folders_lst = QListWidget() self.folders_lst.addItems(config.dirs) - self.chk_use_filename = QtGui.QCheckBox(_('CHECK_FILENAME_LABEL')) - self.chk_export_media = QtGui.QCheckBox(_('EXPORT_MEDIA')) + self.chk_use_filename = QCheckBox(_('CHECK_FILENAME_LABEL')) + self.chk_export_media = QCheckBox(_('EXPORT_MEDIA')) self.chk_use_filename.setChecked(config.use_filename) self.chk_export_media.setChecked(config.export_media) - chk_layout = QtGui.QHBoxLayout() + chk_layout = QHBoxLayout() chk_layout.addWidget(self.chk_use_filename) chk_layout.addWidget(self.chk_export_media) - btnbox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self) + btnbox = QDialogButtonBox(QDialogButtonBox.Ok, Qt.Horizontal, self) btnbox.accepted.connect(self.accept) layout.addLayout(btn_layout) layout.addWidget(self.folders_lst) @@ -63,11 +63,11 @@ class FoldersManageDialog(Dialog): self.setLayout(layout) def add_folder(self): - dir_ = QtGui.QFileDialog.getExistingDirectory( + dir_ = QFileDialog.getExistingDirectory( self, caption=u"Select Folder", directory=config.last_folder, - options=QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontResolveSymlinks + options=QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks ) if dir_: self.folders_lst.addItem(dir_) diff --git a/addons/fastwq/gui/options.py b/addons/fastwq/gui/options.py index 1ec7982..a974641 100644 --- a/addons/fastwq/gui/options.py +++ b/addons/fastwq/gui/options.py @@ -17,11 +17,12 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from PyQt4 import QtCore, QtGui import anki import aqt import aqt.models +import sip from aqt import mw +from aqt.qt import * from aqt.studydeck import StudyDeck from .base import Dialog, WIDGET_SIZE from .setting import SettingDialog @@ -45,15 +46,16 @@ class OptionsDialog(Dialog): 'begore_build', 'after_build' ] + _signal = pyqtSignal(str) def __init__(self, parent, title=u'Options', model_id = -1): super(OptionsDialog, self).__init__(parent, title) - self.connect(self, QtCore.SIGNAL('before_build'), self._before_build, QtCore.Qt.QueuedConnection) - self.connect(self, QtCore.SIGNAL('after_build'), self._after_build, QtCore.Qt.QueuedConnection) + self._signal.connect(self._before_build) + self._signal.connect(self._after_build) # initlizing info - self.main_layout = QtGui.QVBoxLayout() - self.loading_label = QtGui.QLabel(_('INITLIZING_DICT')) - self.main_layout.addWidget(self.loading_label, 0, QtCore.Qt.AlignCenter) + 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.setLayout(self.main_layout) #initlize properties @@ -63,53 +65,60 @@ class OptionsDialog(Dialog): self.current_model = None # size and signal self.resize(WIDGET_SIZE.dialog_width, 4 * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin) - self.emit(QtCore.SIGNAL('before_build')) + self._signal.emit('before_build') - def _before_build(self): + def _before_build(self, s): + if s != 'before_build': + return for cls in service_manager.services: service = service_pool.get(cls.__unique__) if service: service_pool.put(service) - self.emit(QtCore.SIGNAL('after_build')) + self._signal.emit('after_build') - def _after_build(self): - self.main_layout.removeWidget(self.loading_label) - models_layout = QtGui.QHBoxLayout() + def _after_build(self, s): + if s != 'after_build': + return + if self.loading_label: + self.main_layout.removeWidget(self.loading_label) + sip.delete(self.loading_label) + self.loading_label = None + models_layout = QHBoxLayout() # add buttons - mdx_button = QtGui.QPushButton(_('DICTS_FOLDERS')) + mdx_button = QPushButton(_('DICTS_FOLDERS')) mdx_button.clicked.connect(self.show_fm_dialog) - self.models_button = QtGui.QPushButton(_('CHOOSE_NOTE_TYPES')) + self.models_button = QPushButton(_('CHOOSE_NOTE_TYPES')) self.models_button.clicked.connect(self.btn_models_pressed) models_layout.addWidget(mdx_button) models_layout.addWidget(self.models_button) self.main_layout.addLayout(models_layout) # add dicts mapping - dicts_widget = QtGui.QWidget() - self.dicts_layout = QtGui.QGridLayout() - self.dicts_layout.setSizeConstraint(QtGui.QLayout.SetMinAndMaxSize) + dicts_widget = QWidget() + self.dicts_layout = QGridLayout() + self.dicts_layout.setSizeConstraint(QLayout.SetMinAndMaxSize) dicts_widget.setLayout(self.dicts_layout) - scroll_area = QtGui.QScrollArea() + scroll_area = QScrollArea() scroll_area.setWidgetResizable(True) scroll_area.setWidget(dicts_widget) self.main_layout.addWidget(scroll_area) # add description of radio buttons AND ok button - bottom_layout = QtGui.QHBoxLayout() - paras_btn = QtGui.QPushButton(_('SETTINGS')) + bottom_layout = QHBoxLayout() + paras_btn = QPushButton(_('SETTINGS')) paras_btn.clicked.connect(self.show_paras) - about_btn = QtGui.QPushButton(_('ABOUT')) + about_btn = QPushButton(_('ABOUT')) about_btn.clicked.connect(self.show_about) # about_btn.clicked.connect(self.show_paras) - chk_update_btn = QtGui.QPushButton(_('UPDATE')) + chk_update_btn = QPushButton(_('UPDATE')) chk_update_btn.clicked.connect(self.check_updates) - home_label = QtGui.QLabel( + home_label = QLabel( 'User Guide'.format(url=Endpoint.user_guide)) home_label.setOpenExternalLinks(True) # shop_label = QLabel( # 'Service Shop'.format(url=Endpoint.service_shop)) # shop_label.setOpenExternalLinks(True) - btnbox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self) + btnbox = QDialogButtonBox(QDialogButtonBox.Ok, Qt.Horizontal, self) btnbox.accepted.connect(self.accept) bottom_layout.addWidget(paras_btn) bottom_layout.addWidget(chk_update_btn) @@ -183,12 +192,12 @@ class OptionsDialog(Dialog): labels = ['', '', 'DICTS', 'DICT_FIELDS', ''] for i, s in enumerate(labels): - label = QtGui.QLabel(_(s)) - label.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) + label = QLabel(_(s)) + label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) self.dicts_layout.addWidget(label, 0, i) maps = config.get_maps(model['id']) - self.radio_group = QtGui.QButtonGroup() + self.radio_group = QButtonGroup() for i, fld in enumerate(model['flds']): ord = fld['ord'] name = fld['name'] @@ -200,20 +209,22 @@ class OptionsDialog(Dialog): self.add_dict_layout(j, **each) break else: - self.add_dict_layout(i, fld_name=name, fld_ord=ord) + 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) + self.add_dict_layout(i, fld_name=name, fld_ord=ord, word_checked=i==0) #self.setLayout(self.main_layout) - self.resize(WIDGET_SIZE.dialog_width, - max(3, (i + 1)) * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin) + self.resize( + WIDGET_SIZE.dialog_width, + max(3, (i + 1)) * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin + ) self.save() def show_models(self): ''' show choose note type window ''' - edit = QtGui.QPushButton(anki.lang._("Manage"), + 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"), @@ -276,7 +287,7 @@ class OptionsDialog(Dialog): text = dict_fld_name if dict_fld_name else 'http://' field_combo.setEditable(True) field_combo.setEditText(text) - field_combo.setFocus(QtCore.Qt.MouseFocusReason) # MouseFocusReason + field_combo.setFocus(Qt.MouseFocusReason) # MouseFocusReason else: unique = dict_combo_itemdata service = service_pool.get(unique) @@ -293,7 +304,7 @@ class OptionsDialog(Dialog): """ add dictionary fields row """ - word_checked = i == 0 + word_checked = kwargs.get('word_checked', False) fld_name, fld_ord = ( kwargs.get('fld_name', ''), #笔记类型的字段名 @@ -312,38 +323,38 @@ class OptionsDialog(Dialog): kwargs.get('skip_valued', True), #略过有值项标志 ) # check - word_check_btn = QtGui.QRadioButton(fld_name) + word_check_btn = QRadioButton(fld_name) word_check_btn.setMinimumSize(WIDGET_SIZE.map_fld_width, 0) word_check_btn.setMaximumSize( WIDGET_SIZE.map_fld_width, WIDGET_SIZE.map_max_height ) - word_check_btn.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + word_check_btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) word_check_btn.setCheckable(True) word_check_btn.setChecked(word_checked) self.radio_group.addButton(word_check_btn) # dict combox - dict_combo = QtGui.QComboBox() + dict_combo = QComboBox() dict_combo.setMinimumSize(WIDGET_SIZE.map_dictname_width, 0) dict_combo.setFocusPolicy( - QtCore.Qt.TabFocus | QtCore.Qt.ClickFocus | QtCore.Qt.StrongFocus | QtCore.Qt.WheelFocus + Qt.TabFocus | Qt.ClickFocus | Qt.StrongFocus | Qt.WheelFocus ) dict_combo.setEnabled(not word_checked and not ignore) self.fill_dict_combo_options(dict_combo, dict_unique) dict_unique = dict_combo.itemData(dict_combo.currentIndex()) # field combox - field_combo = QtGui.QComboBox() + field_combo = QComboBox() field_combo.setMinimumSize(WIDGET_SIZE.map_dictfield_width, 0) 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) # ignore - ignore_check_btn = QtGui.QCheckBox(_("NOT_DICT_FIELD")) + ignore_check_btn = QCheckBox(_("NOT_DICT_FIELD")) ignore_check_btn.setEnabled(not word_checked) ignore_check_btn.setChecked(ignore) # Skip valued - skip_check_btn = QtGui.QCheckBox(_("SKIP_VALUED")) + skip_check_btn = QCheckBox(_("SKIP_VALUED")) skip_check_btn.setEnabled(not word_checked and not ignore) skip_check_btn.setChecked(skip) diff --git a/addons/fastwq/gui/progress.py b/addons/fastwq/gui/progress.py index 2fa2ce1..35b9719 100644 --- a/addons/fastwq/gui/progress.py +++ b/addons/fastwq/gui/progress.py @@ -21,7 +21,7 @@ import time from collections import defaultdict -from PyQt4 import QtCore, QtGui +from aqt.qt import * from ..lang import _ @@ -44,7 +44,7 @@ class ProgressWindow(object): def __init__(self, mw): self.mw = mw - self.app = QtGui.QApplication.instance() + self.app = QApplication.instance() self._win = None self._msg_count = defaultdict(int) self._last_update = 0 @@ -86,8 +86,8 @@ class ProgressWindow(object): # setup window label = label or _("Processing...") parent = parent or self.app.activeWindow() or self.mw - self._win = QtGui.QProgressDialog(label, '', min, max, parent) - self._win.setWindowModality(QtCore.Qt.ApplicationModal) + self._win = QProgressDialog(label, '', min, max, parent) + self._win.setWindowModality(Qt.ApplicationModal) self._win.setCancelButton(None) self._win.canceled.connect(self.finish) self._win.setWindowTitle("Querying...") @@ -121,12 +121,12 @@ class ProgressWindow(object): if value: self._win.setValue(value) if process and elapsed >= 0.2: - self.app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents) + self.app.processEvents(QEventLoop.ExcludeUserInputEvents) self._last_update = time.time() def _set_busy(self): self._disabled = True - self.mw.app.setOverrideCursor(QtGui.QCursor(QtCore.Qt.WaitCursor)) + self.mw.app.setOverrideCursor(QCursor(Qt.WaitCursor)) def _unset_busy(self): self._disabled = False diff --git a/addons/fastwq/gui/setting.py b/addons/fastwq/gui/setting.py index 52554a2..5459a3a 100644 --- a/addons/fastwq/gui/setting.py +++ b/addons/fastwq/gui/setting.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from PyQt4 import QtCore, QtGui +from aqt.qt import * from .base import Dialog, WIDGET_SIZE from ..context import config from ..lang import _ @@ -39,31 +39,31 @@ class SettingDialog(Dialog): self.build() def build(self): - layout = QtGui.QVBoxLayout() + layout = QVBoxLayout() - check_force_update = QtGui.QCheckBox(_("FORCE_UPDATE")) + check_force_update = QCheckBox(_("FORCE_UPDATE")) check_force_update.setChecked(config.force_update) layout.addWidget(check_force_update) layout.addSpacing(10) - check_ignore_accents = QtGui.QCheckBox(_("IGNORE_ACCENTS")) + check_ignore_accents = QCheckBox(_("IGNORE_ACCENTS")) check_ignore_accents.setChecked(config.ignore_accents) layout.addWidget(check_ignore_accents) layout.addSpacing(10) - hbox = QtGui.QHBoxLayout() - input_thread_number = QtGui.QSpinBox(parent=self) + hbox = QHBoxLayout() + input_thread_number = QSpinBox(parent=self) input_thread_number.setRange(1, 120) input_thread_number.setValue(config.thread_number) - input_label = QtGui.QLabel(_("THREAD_NUMBER") + ":", parent=self) + input_label = QLabel(_("THREAD_NUMBER") + ":", parent=self) hbox.addWidget(input_label) hbox.setStretchFactor(input_label, 1) hbox.addWidget(input_thread_number) hbox.setStretchFactor(input_thread_number, 2) layout.addLayout(hbox) - buttonBox = QtGui.QDialogButtonBox(parent=self) - buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) + buttonBox = QDialogButtonBox(parent=self) + buttonBox.setStandardButtons(QDialogButtonBox.Ok) buttonBox.accepted.connect(self.accept) # 确定 layout.addSpacing(48) @@ -73,7 +73,7 @@ class SettingDialog(Dialog): self.check_ignore_accents = check_ignore_accents self.input_thread_number = input_thread_number - layout.setAlignment(QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft) + layout.setAlignment(Qt.AlignTop|Qt.AlignLeft) self.setLayout(layout) def accept(self): diff --git a/addons21/fastwq/gui/base.py b/addons21/fastwq/gui/base.py index 3d0d285..6cad186 100644 --- a/addons21/fastwq/gui/base.py +++ b/addons21/fastwq/gui/base.py @@ -58,7 +58,7 @@ class WidgetSize(object): dialog_width = 700 dialog_height_margin = 120 map_min_height = 0 - map_max_height = 31 + map_max_height = 32 map_fld_width = 100 map_dictname_width = 150 map_dictfield_width = 160 diff --git a/addons21/fastwq/gui/options.py b/addons21/fastwq/gui/options.py index b055d8c..a974641 100644 --- a/addons21/fastwq/gui/options.py +++ b/addons21/fastwq/gui/options.py @@ -20,6 +20,7 @@ import anki import aqt import aqt.models +import sip from aqt import mw from aqt.qt import * from aqt.studydeck import StudyDeck @@ -78,7 +79,10 @@ class OptionsDialog(Dialog): def _after_build(self, s): if s != 'after_build': return - self.main_layout.removeWidget(self.loading_label) + if self.loading_label: + self.main_layout.removeWidget(self.loading_label) + sip.delete(self.loading_label) + self.loading_label = None models_layout = QHBoxLayout() # add buttons mdx_button = QPushButton(_('DICTS_FOLDERS')) @@ -205,13 +209,15 @@ class OptionsDialog(Dialog): self.add_dict_layout(j, **each) break else: - self.add_dict_layout(i, fld_name=name, fld_ord=ord) + 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) + self.add_dict_layout(i, fld_name=name, fld_ord=ord, word_checked=i==0) #self.setLayout(self.main_layout) - self.resize(WIDGET_SIZE.dialog_width, - max(3, (i + 1)) * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin) + self.resize( + WIDGET_SIZE.dialog_width, + max(3, (i + 1)) * WIDGET_SIZE.map_max_height + WIDGET_SIZE.dialog_height_margin + ) self.save() def show_models(self): @@ -298,7 +304,7 @@ class OptionsDialog(Dialog): """ add dictionary fields row """ - word_checked = i == 0 + word_checked = kwargs.get('word_checked', False) fld_name, fld_ord = ( kwargs.get('fld_name', ''), #笔记类型的字段名