From d1cf14703d2b6644f6c25613dec14e60f88e0d20 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 3 Nov 2012 11:06:56 +0530 Subject: [PATCH] Add search to the font family chooser dialog and get rid of the obsolete fontfamilymodel --- src/calibre/gui2/font_family_chooser.py | 51 ++++++++++++++++++++++--- src/calibre/gui2/widgets.py | 49 +++--------------------- 2 files changed, 51 insertions(+), 49 deletions(-) diff --git a/src/calibre/gui2/font_family_chooser.py b/src/calibre/gui2/font_family_chooser.py index 72240636c1..e3a2662ac4 100644 --- a/src/calibre/gui2/font_family_chooser.py +++ b/src/calibre/gui2/font_family_chooser.py @@ -13,7 +13,7 @@ from PyQt4.Qt import (QFontInfo, QFontMetrics, Qt, QFont, QFontDatabase, QPen, QStyledItemDelegate, QSize, QStyle, QStringListModel, pyqtSignal, QDialog, QVBoxLayout, QApplication, QFontComboBox, QPushButton, QToolButton, QGridLayout, QListView, QWidget, QDialogButtonBox, QIcon, - QHBoxLayout, QLabel, QModelIndex) + QHBoxLayout, QLabel, QModelIndex, QLineEdit) from calibre.constants import config_dir from calibre.gui2 import choose_files, error_dialog, info_dialog @@ -197,15 +197,56 @@ class FontFamilyDialog(QDialog): afb.setIcon(QIcon(I('plus.png'))) afb.clicked.connect(self.add_fonts) self.ml = QLabel(_('Choose a font family from the list below:')) + self.search = QLineEdit(self) + self.search.setPlaceholderText(_('Search')) + self.search.returnPressed.connect(self.find) + self.nb = QToolButton(self) + self.nb.setIcon(QIcon(I('arrow-down.png'))) + self.nb.setToolTip(_('Find Next')) + self.pb = QToolButton(self) + self.pb.setIcon(QIcon(I('arrow-up.png'))) + self.pb.setToolTip(_('Find Previous')) + self.nb.clicked.connect(self.find_next) + self.pb.clicked.connect(self.find_previous) - l.addWidget(self.ml, 0, 0, 1, 2) - l.addWidget(self.view, 1, 0, 1, 1) - l.addWidget(self.faces, 1, 1, 1, 1) - l.addWidget(self.bb, 2, 0, 1, 2) + l.addWidget(self.ml, 0, 0, 1, 4) + l.addWidget(self.search, 1, 0, 1, 1) + l.addWidget(self.nb, 1, 1, 1, 1) + l.addWidget(self.pb, 1, 2, 1, 1) + l.addWidget(self.view, 2, 0, 1, 3) + l.addWidget(self.faces, 1, 3, 2, 1) + l.addWidget(self.bb, 3, 0, 1, 4) l.setAlignment(self.faces, Qt.AlignTop) self.resize(800, 600) + def set_current(self, i): + self.view.setCurrentIndex(self.m.index(i)) + + def keyPressEvent(self, e): + if e.key() == Qt.Key_Return: + return + return QDialog.keyPressEvent(self, e) + + def find(self, backwards=False): + i = self.view.currentIndex().row() + if i < 0: i = 0 + q = icu_lower(unicode(self.search.text())).strip() + if not q: return + r = (xrange(i-1, -1, -1) if backwards else xrange(i+1, + len(self.families))) + for j in r: + f = self.families[j] + if q in icu_lower(f): + self.set_current(j) + return + + def find_next(self): + self.find() + + def find_previous(self): + self.find(backwards=True) + def build_font_list(self): try: self.families = list(self.font_scanner.find_font_families()) diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index dfbcbdcbf0..7730d2d733 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -3,18 +3,16 @@ __copyright__ = '2008, Kovid Goyal ' ''' Miscellaneous widgets used in the GUI ''' -import re, traceback, os +import re, os from PyQt4.Qt import (QIcon, QFont, QLabel, QListWidget, QAction, QListWidgetItem, QTextCharFormat, QApplication, QSyntaxHighlighter, QCursor, QColor, QWidget, QPixmap, QSplitterHandle, QToolButton, - QAbstractListModel, QVariant, Qt, SIGNAL, pyqtSignal, QRegExp, QSize, - QSplitter, QPainter, QLineEdit, QComboBox, QPen, QGraphicsScene, QMenu, - QStringListModel, QCompleter, QStringList, QTimer, QRect, - QGraphicsView, QByteArray) + QVariant, Qt, SIGNAL, pyqtSignal, QRegExp, QSize, QSplitter, QPainter, + QLineEdit, QComboBox, QPen, QGraphicsScene, QMenu, QStringListModel, + QCompleter, QStringList, QTimer, QRect, QGraphicsView, QByteArray) -from calibre.constants import iswindows -from calibre.gui2 import (NONE, error_dialog, pixmap_to_data, gprefs, +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 @@ -348,43 +346,6 @@ class CoverView(QGraphicsView, ImageDropMixin): # {{{ # }}} -class FontFamilyModel(QAbstractListModel): # {{{ - - def __init__(self, *args): - QAbstractListModel.__init__(self, *args) - from calibre.utils.fonts.scanner import font_scanner - try: - self.families = font_scanner.find_font_families() - except: - self.families = [] - print 'WARNING: Could not load fonts' - traceback.print_exc() - # Restrict to Qt families as Qt tends to crash - self.families[:0] = [_('None')] - self.font = QFont('Arial' if iswindows else 'sansserif') - - def rowCount(self, *args): - return len(self.families) - - def data(self, index, role): - try: - family = self.families[index.row()] - except: - traceback.print_exc() - return NONE - if role == Qt.DisplayRole: - return QVariant(family) - if role == Qt.FontRole: - # If a user chooses some non standard font as the interface font, - # rendering some font names causes Qt to crash, so return what is - # hopefully a "safe" font - return QVariant(self.font) - return NONE - - def index_of(self, family): - return self.families.index(family.strip()) -# }}} - # BasicList {{{ class BasicListItem(QListWidgetItem):