From faea33fc569b8a008204aa74b9bf73811aeb859a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 28 Oct 2012 18:58:13 +0530 Subject: [PATCH] Font family chooser: Show the faces available for a family when clicking on the family --- src/calibre/gui2/font_family_chooser.py | 70 +++++++++++++++++++++---- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/src/calibre/gui2/font_family_chooser.py b/src/calibre/gui2/font_family_chooser.py index 065ca9f472..93682e3966 100644 --- a/src/calibre/gui2/font_family_chooser.py +++ b/src/calibre/gui2/font_family_chooser.py @@ -110,8 +110,54 @@ class FontFamilyDelegate(QStyledItemDelegate): r.setLeft(r.left() + w) painter.drawText(r, Qt.AlignVCenter|Qt.AlignLeading|Qt.TextSingleLine, sample) -class Typefaces(QWidget): - pass +class Typefaces(QLabel): + + def __init__(self, parent=None): + QLabel.__init__(self, parent) + self.setMinimumWidth(400) + self.base_msg = '

'+_('Choose a font family')+'

' + self.setText(self.base_msg) + self.setWordWrap(True) + + def show_family(self, family, faces): + if not family: + self.setText(self.base_msg) + return + msg = ''' +

%s

+
+ {0} +
+ '''%(_('Available faces for %s')%family) + entries = [] + for font in faces: + sf = (font['wws_subfamily_name'] or font['preferred_subfamily_name'] + or font['subfamily_name']) + entries.append(''' +
{sf}
+
font-stretch: {width} font-weight: {weight} font-style: + {style}
+ + '''.format(sf=sf, width=font['font-stretch'], + weight=font['font-weight'], style=font['font-style'])) + msg = msg.format('\n\n'.join(entries)) + self.setText(msg) + +class FontsView(QListView): + + changed = pyqtSignal() + + def __init__(self, parent): + QListView.__init__(self, parent) + self.setSelectionMode(self.SingleSelection) + self.setAlternatingRowColors(True) + self.d = FontFamilyDelegate(self) + self.setItemDelegate(self.d) + + def currentChanged(self, current, previous): + self.changed.emit() + QListView.currentChanged(self, current, previous) + class FontFamilyDialog(QDialog): @@ -120,6 +166,7 @@ class FontFamilyDialog(QDialog): self.setWindowTitle(_('Choose font family')) self.setWindowIcon(QIcon(I('font.png'))) from calibre.utils.fonts.scanner import font_scanner + self.font_scanner = font_scanner try: self.families = list(font_scanner.find_font_families()) except: @@ -131,11 +178,9 @@ class FontFamilyDialog(QDialog): self.l = l = QGridLayout() self.setLayout(l) - self.view = QListView(self) + self.view = FontsView(self) self.m = QStringListModel(self.families) self.view.setModel(self.m) - self.d = FontFamilyDelegate(self) - self.view.setItemDelegate(self.d) self.view.setCurrentIndex(self.m.index(0)) if current_family: for i, val in enumerate(self.families): @@ -143,22 +188,22 @@ class FontFamilyDialog(QDialog): self.view.setCurrentIndex(self.m.index(i)) break self.view.doubleClicked.connect(self.accept, type=Qt.QueuedConnection) - self.view.setSelectionMode(self.view.SingleSelection) - self.view.setAlternatingRowColors(True) - + self.view.changed.connect(self.current_changed, + type=Qt.QueuedConnection) + self.faces = Typefaces(self) self.bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel) self.bb.accepted.connect(self.accept) self.bb.rejected.connect(self.reject) self.ml = QLabel(_('Choose a font family from the list below:')) - self.faces = Typefaces(self) 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.setAlignment(self.faces, Qt.AlignTop) - self.resize(600, 500) + self.resize(800, 600) @property def font_family(self): @@ -166,6 +211,11 @@ class FontFamilyDialog(QDialog): if idx == 0: return None return self.families[idx] + def current_changed(self): + fam = self.font_family + self.faces.show_family(fam, self.font_scanner.fonts_for_family(fam) + if fam else None) + class FontFamilyChooser(QWidget): family_changed = pyqtSignal(object)