mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Font family chooser: Show the faces available for a family when clicking on the family
This commit is contained in:
parent
2844f87ba8
commit
faea33fc56
@ -110,8 +110,54 @@ class FontFamilyDelegate(QStyledItemDelegate):
|
|||||||
r.setLeft(r.left() + w)
|
r.setLeft(r.left() + w)
|
||||||
painter.drawText(r, Qt.AlignVCenter|Qt.AlignLeading|Qt.TextSingleLine, sample)
|
painter.drawText(r, Qt.AlignVCenter|Qt.AlignLeading|Qt.TextSingleLine, sample)
|
||||||
|
|
||||||
class Typefaces(QWidget):
|
class Typefaces(QLabel):
|
||||||
pass
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QLabel.__init__(self, parent)
|
||||||
|
self.setMinimumWidth(400)
|
||||||
|
self.base_msg = '<h3>'+_('Choose a font family')+'</h3>'
|
||||||
|
self.setText(self.base_msg)
|
||||||
|
self.setWordWrap(True)
|
||||||
|
|
||||||
|
def show_family(self, family, faces):
|
||||||
|
if not family:
|
||||||
|
self.setText(self.base_msg)
|
||||||
|
return
|
||||||
|
msg = '''
|
||||||
|
<h3>%s</h3>
|
||||||
|
<dl style="font-size: smaller">
|
||||||
|
{0}
|
||||||
|
</dl>
|
||||||
|
'''%(_('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('''
|
||||||
|
<dt><b>{sf}</b></dt>
|
||||||
|
<dd>font-stretch: <i>{width}</i> font-weight: <i>{weight}</i> font-style:
|
||||||
|
<i>{style}</i></dd>
|
||||||
|
|
||||||
|
'''.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):
|
class FontFamilyDialog(QDialog):
|
||||||
|
|
||||||
@ -120,6 +166,7 @@ class FontFamilyDialog(QDialog):
|
|||||||
self.setWindowTitle(_('Choose font family'))
|
self.setWindowTitle(_('Choose font family'))
|
||||||
self.setWindowIcon(QIcon(I('font.png')))
|
self.setWindowIcon(QIcon(I('font.png')))
|
||||||
from calibre.utils.fonts.scanner import font_scanner
|
from calibre.utils.fonts.scanner import font_scanner
|
||||||
|
self.font_scanner = font_scanner
|
||||||
try:
|
try:
|
||||||
self.families = list(font_scanner.find_font_families())
|
self.families = list(font_scanner.find_font_families())
|
||||||
except:
|
except:
|
||||||
@ -131,11 +178,9 @@ class FontFamilyDialog(QDialog):
|
|||||||
|
|
||||||
self.l = l = QGridLayout()
|
self.l = l = QGridLayout()
|
||||||
self.setLayout(l)
|
self.setLayout(l)
|
||||||
self.view = QListView(self)
|
self.view = FontsView(self)
|
||||||
self.m = QStringListModel(self.families)
|
self.m = QStringListModel(self.families)
|
||||||
self.view.setModel(self.m)
|
self.view.setModel(self.m)
|
||||||
self.d = FontFamilyDelegate(self)
|
|
||||||
self.view.setItemDelegate(self.d)
|
|
||||||
self.view.setCurrentIndex(self.m.index(0))
|
self.view.setCurrentIndex(self.m.index(0))
|
||||||
if current_family:
|
if current_family:
|
||||||
for i, val in enumerate(self.families):
|
for i, val in enumerate(self.families):
|
||||||
@ -143,22 +188,22 @@ class FontFamilyDialog(QDialog):
|
|||||||
self.view.setCurrentIndex(self.m.index(i))
|
self.view.setCurrentIndex(self.m.index(i))
|
||||||
break
|
break
|
||||||
self.view.doubleClicked.connect(self.accept, type=Qt.QueuedConnection)
|
self.view.doubleClicked.connect(self.accept, type=Qt.QueuedConnection)
|
||||||
self.view.setSelectionMode(self.view.SingleSelection)
|
self.view.changed.connect(self.current_changed,
|
||||||
self.view.setAlternatingRowColors(True)
|
type=Qt.QueuedConnection)
|
||||||
|
self.faces = Typefaces(self)
|
||||||
self.bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel)
|
self.bb = QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel)
|
||||||
self.bb.accepted.connect(self.accept)
|
self.bb.accepted.connect(self.accept)
|
||||||
self.bb.rejected.connect(self.reject)
|
self.bb.rejected.connect(self.reject)
|
||||||
self.ml = QLabel(_('Choose a font family from the list below:'))
|
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.ml, 0, 0, 1, 2)
|
||||||
l.addWidget(self.view, 1, 0, 1, 1)
|
l.addWidget(self.view, 1, 0, 1, 1)
|
||||||
l.addWidget(self.faces, 1, 1, 1, 1)
|
l.addWidget(self.faces, 1, 1, 1, 1)
|
||||||
l.addWidget(self.bb, 2, 0, 1, 2)
|
l.addWidget(self.bb, 2, 0, 1, 2)
|
||||||
|
l.setAlignment(self.faces, Qt.AlignTop)
|
||||||
|
|
||||||
self.resize(600, 500)
|
self.resize(800, 600)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def font_family(self):
|
def font_family(self):
|
||||||
@ -166,6 +211,11 @@ class FontFamilyDialog(QDialog):
|
|||||||
if idx == 0: return None
|
if idx == 0: return None
|
||||||
return self.families[idx]
|
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):
|
class FontFamilyChooser(QWidget):
|
||||||
|
|
||||||
family_changed = pyqtSignal(object)
|
family_changed = pyqtSignal(object)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user