def default_font_family(): global _dff if _dff is None: families = set(map(unicode, QFontDatabase().families())) for x in ('Ubuntu Mono', 'Consolas', 'Liberation Mono'): if x in families: _dff = x break if _dff is None: _dff = 'Courier New' return _dff
def __init__(self, *args): QAbstractListModel.__init__(self, *args) from calibre.utils.fonts import fontconfig try: self.families = fontconfig.find_font_families() except: self.families = [] print 'WARNING: Could not load fonts' traceback.print_exc() # Restrict to Qt families as Qt tends to crash qt_families = set([unicode(x) for x in QFontDatabase().families()]) self.families = list(qt_families.intersection(set(self.families))) self.families.sort() self.families[:0] = [_('None')] self.font = QFont('Verdana' if iswindows else 'sansserif')
def do_paint(self, painter, option, index): text = unicode(index.data(Qt.DisplayRole).toString()) font = QFont(option.font) font.setPointSize(QFontInfo(font).pointSize() * 1.5) font2 = QFont(font) font2.setFamily(text) system, has_latin = writing_system_for_font(font2) if has_latin: font = font2 r = option.rect if option.state & QStyle.State_Selected: painter.setPen(QPen(option.palette.highlightedText(), 0)) if (option.direction == Qt.RightToLeft): r.setRight(r.right() - 4) else: r.setLeft(r.left() + 4) painter.setFont(font) painter.drawText(r, Qt.AlignVCenter | Qt.AlignLeading | Qt.TextSingleLine, text) if (system != QFontDatabase.Any): w = painter.fontMetrics().width(text + " ") painter.setFont(font2) sample = QFontDatabase().writingSystemSample(system) if (option.direction == Qt.RightToLeft): r.setRight(r.right() - w) else: r.setLeft(r.left() + w) painter.drawText( r, Qt.AlignVCenter | Qt.AlignLeading | Qt.TextSingleLine, sample)
def writing_system_for_font(font): has_latin = True systems = QFontDatabase().writingSystems(font.family()) # this just confuses the algorithm below. Vietnamese is Latin with lots of # special chars try: systems.remove(QFontDatabase.Vietnamese) except ValueError: pass system = QFontDatabase.Any if (QFontDatabase.Latin not in systems): has_latin = False # we need to show something if systems: system = systems[-1] else: systems.remove(QFontDatabase.Latin) if not systems: return system, has_latin if (len(systems) == 1 and systems[0] > QFontDatabase.Cyrillic): return systems[0], has_latin if (len(systems) <= 2 and systems[-1] > QFontDatabase.Armenian and systems[-1] < QFontDatabase.Vietnamese): return systems[-1], has_latin if (len(systems) <= 5 and systems[-1] >= QFontDatabase.SimplifiedChinese and systems[-1] <= QFontDatabase.Korean): system = systems[-1] return system, has_latin