def __init__(self, shortcuts, config_file_base_name, parent=None): QAbstractListModel.__init__(self, parent) self.descriptions = {} for k, v in shortcuts.items(): self.descriptions[k] = v[-1] self.keys = {} for k, v in shortcuts.items(): self.keys[k] = v[0] self.order = list(shortcuts) self.order.sort(key=lambda x: sort_key(self.descriptions[x])) self.sequences = {} for k, v in self.keys.items(): self.sequences[k] = [QKeySequence(x) for x in v] self.custom = XMLConfig(config_file_base_name)
QPagedPaintDevice, QPalette, QClipboard) from calibre.constants import iswindows, ismacos from calibre.gui2 import (error_dialog, pixmap_to_data, gprefs, warning_dialog) from calibre.gui2.filename_pattern_ui import Ui_Form from calibre import fit_image, strftime, force_unicode from calibre.ebooks import BOOK_EXTENSIONS from calibre.utils.config import prefs, XMLConfig from calibre.gui2.progress_indicator import ProgressIndicator as _ProgressIndicator from calibre.gui2.dnd import (dnd_has_image, dnd_get_image, dnd_get_files, image_extensions, dnd_has_extension, dnd_get_local_image_and_pixmap, DownloadDialog) from calibre.utils.localization import localize_user_manual_link from polyglot.builtins import native_string_type history = XMLConfig('history') class ProgressIndicator(QWidget): # {{{ def __init__(self, *args): QWidget.__init__(self, *args) self.setGeometry(0, 0, 300, 350) self.pi = _ProgressIndicator(self) self.status = QLabel(self) self.status.setWordWrap(True) self.status.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignTop) self.setVisible(False) self.pos = None def start(self, msg=''):
class Shortcuts(QAbstractListModel): TEMPLATE = u''' <p><b>{0}</b><br> {2}: <code>{1}</code></p> ''' def __init__(self, shortcuts, config_file_base_name, parent=None): QAbstractListModel.__init__(self, parent) self.descriptions = {} for k, v in shortcuts.items(): self.descriptions[k] = v[-1] self.keys = {} for k, v in shortcuts.items(): self.keys[k] = v[0] self.order = list(shortcuts) self.order.sort(key=lambda x: sort_key(self.descriptions[x])) self.sequences = {} for k, v in self.keys.items(): self.sequences[k] = [QKeySequence(x) for x in v] self.custom = XMLConfig(config_file_base_name) def rowCount(self, parent): return len(self.order) def get_sequences(self, key): custom = self.custom.get(key, []) if custom: return [QKeySequence(x) for x in custom] return self.sequences[key] def get_match(self, event_or_sequence, ignore=tuple()): q = event_or_sequence if isinstance(q, QKeyEvent): q = QKeySequence(q.key() | (int(q.modifiers()) & ~Qt.KeypadModifier)) for key in self.order: if key not in ignore: for seq in self.get_sequences(key): if seq.matches(q) == QKeySequence.ExactMatch: return key return None def duplicate_check(self, seq, ignore): key = self.get_match(seq, ignore=[ignore]) if key is not None: return self.descriptions[key] def get_shortcuts(self, key): return [ unicode_type(x.toString(x.NativeText)) for x in self.get_sequences(key) ] def data(self, index, role): row = index.row() if row < 0 or row >= len(self.order): return None key = self.order[row] if role == Qt.DisplayRole: return self.TEMPLATE.format( self.descriptions[key], _(' or ').join(self.get_shortcuts(key)), _('Keys')) if role == Qt.ToolTipRole: return _('Double click to change') if role == DEFAULTS: return self.sequences[key] if role == DESCRIPTION: return self.descriptions[key] if role == CUSTOM: if key in self.custom: return self.custom[key] else: return [] if role == KEY: return key return None def set_data(self, index, custom): key = self.order[index.row()] if custom: self.custom[key] = [ unicode_type(x.toString(QKeySequence.PortableText)) for x in custom ] elif key in self.custom: del self.custom[key] def flags(self, index): if not index.isValid(): return Qt.ItemIsEnabled return QAbstractListModel.flags(self, index) | Qt.ItemIsEditable
class Shortcuts(QAbstractListModel): TEMPLATE = u""" <p><b>{0}</b><br> {2}: <code>{1}</code></p> """ def __init__(self, shortcuts, config_file_base_name, parent=None): QAbstractListModel.__init__(self, parent) self.descriptions = {} for k, v in shortcuts.items(): self.descriptions[k] = v[-1] self.keys = {} for k, v in shortcuts.items(): self.keys[k] = v[0] self.order = list(shortcuts) self.order.sort(key=lambda x: sort_key(self.descriptions[x])) self.sequences = {} for k, v in self.keys.items(): self.sequences[k] = [QKeySequence(x) for x in v] self.custom = XMLConfig(config_file_base_name) def rowCount(self, parent): return len(self.order) def get_sequences(self, key): custom = self.custom.get(key, []) if custom: return [QKeySequence(x) for x in custom] return self.sequences[key] def get_match(self, event_or_sequence, ignore=tuple()): q = event_or_sequence if isinstance(q, QKeyEvent): q = QKeySequence(q.key() | (int(q.modifiers()) & ~Qt.KeypadModifier)) for key in self.order: if key not in ignore: for seq in self.get_sequences(key): if seq.matches(q) == QKeySequence.ExactMatch: return key return None def duplicate_check(self, seq, ignore): key = self.get_match(seq, ignore=[ignore]) if key is not None: return self.descriptions[key] def get_shortcuts(self, key): return [unicode(x.toString(x.NativeText)) for x in self.get_sequences(key)] def data(self, index, role): row = index.row() if row < 0 or row >= len(self.order): return None key = self.order[row] if role == Qt.DisplayRole: return self.TEMPLATE.format(self.descriptions[key], _(" or ").join(self.get_shortcuts(key)), _("Keys")) if role == Qt.ToolTipRole: return _("Double click to change") if role == DEFAULTS: return self.sequences[key] if role == DESCRIPTION: return self.descriptions[key] if role == CUSTOM: if key in self.custom: return self.custom[key] else: return [] if role == KEY: return key return None def set_data(self, index, custom): key = self.order[index.row()] if custom: self.custom[key] = [unicode(x.toString(QKeySequence.PortableText)) for x in custom] elif key in self.custom: del self.custom[key] def flags(self, index): if not index.isValid(): return Qt.ItemIsEnabled return QAbstractListModel.flags(self, index) | Qt.ItemIsEditable