26 case QLocale::ArabicScript:
27 return QFontDatabase::Arabic;
28 case QLocale::CyrillicScript:
29 return QFontDatabase::Cyrillic;
30 case QLocale::GurmukhiScript:
31 return QFontDatabase::Gurmukhi;
32 case QLocale::SimplifiedHanScript:
33 return QFontDatabase::SimplifiedChinese;
34 case QLocale::TraditionalHanScript:
35 return QFontDatabase::TraditionalChinese;
36 case QLocale::LatinScript:
37 return QFontDatabase::Latin;
38 case QLocale::ArmenianScript:
39 return QFontDatabase::Armenian;
40 case QLocale::BengaliScript:
41 return QFontDatabase::Bengali;
42 case QLocale::DevanagariScript:
43 return QFontDatabase::Devanagari;
44 case QLocale::GeorgianScript:
45 return QFontDatabase::Georgian;
46 case QLocale::GreekScript:
47 return QFontDatabase::Greek;
48 case QLocale::GujaratiScript:
49 return QFontDatabase::Gujarati;
50 case QLocale::HebrewScript:
51 return QFontDatabase::Hebrew;
52 case QLocale::JapaneseScript:
53 return QFontDatabase::Japanese;
54 case QLocale::KhmerScript:
55 return QFontDatabase::Khmer;
56 case QLocale::KannadaScript:
57 return QFontDatabase::Kannada;
58 case QLocale::KoreanScript:
59 return QFontDatabase::Korean;
60 case QLocale::LaoScript:
61 return QFontDatabase::Lao;
62 case QLocale::MalayalamScript:
63 return QFontDatabase::Malayalam;
64 case QLocale::MyanmarScript:
65 return QFontDatabase::Myanmar;
66 case QLocale::TamilScript:
67 return QFontDatabase::Tamil;
68 case QLocale::TeluguScript:
69 return QFontDatabase::Telugu;
70 case QLocale::ThaanaScript:
71 return QFontDatabase::Thaana;
72 case QLocale::ThaiScript:
73 return QFontDatabase::Thai;
74 case QLocale::TibetanScript:
75 return QFontDatabase::Tibetan;
76 case QLocale::SinhalaScript:
77 return QFontDatabase::Sinhala;
78 case QLocale::SyriacScript:
79 return QFontDatabase::Syriac;
80 case QLocale::OriyaScript:
81 return QFontDatabase::Oriya;
82 case QLocale::OghamScript:
83 return QFontDatabase::Ogham;
84 case QLocale::RunicScript:
85 return QFontDatabase::Runic;
86 case QLocale::NkoScript:
87 return QFontDatabase::Nko;
89 return QFontDatabase::Any;
107 QList<QFontDatabase::WritingSystem> writingSystems = QFontDatabase::writingSystems(font.families().constFirst());
111 writingSystems.removeOne(QFontDatabase::Vietnamese);
112 *hasLatin = writingSystems.removeOne(QFontDatabase::Latin);
114 if (writingSystems.isEmpty())
115 return QFontDatabase::Any;
117 QFontDatabase::WritingSystem system = writingSystemFromLocale();
119 if (writingSystems.contains(system))
122 if (system == QFontDatabase::TraditionalChinese
123 && writingSystems.contains(QFontDatabase::SimplifiedChinese)) {
124 return QFontDatabase::SimplifiedChinese;
127 if (system == QFontDatabase::SimplifiedChinese
128 && writingSystems.contains(QFontDatabase::TraditionalChinese)) {
129 return QFontDatabase::TraditionalChinese;
132 system = writingSystems.constLast();
139 if (writingSystems.size() == 1 && system > QFontDatabase::Cyrillic)
142 if (writingSystems.size() <= 2 && system > QFontDatabase::Armenian && system < QFontDatabase::Vietnamese)
145 if (writingSystems.size() <= 5 && system >= QFontDatabase::SimplifiedChinese && system <= QFontDatabase::Korean)
148 return QFontDatabase::Any;
197 const QStyleOptionViewItem &option,
200 QString text = index.data(Qt::DisplayRole).toString();
201 QFont font(option.font);
202 font.setPointSize(QFontInfo(font).pointSize() * 3 / 2);
204 font2.setFamilies(QStringList{text});
207 QFontDatabase::WritingSystem system = writingSystemForFont(font2, &hasLatin);
211 font =
comboPrivate->displayFontForFontFamily.value(text, font);
213 QRect r = option.rect;
215 if (option.state & QStyle::State_Selected) {
217 painter->setBrush(option.palette.highlight());
218 painter->setPen(Qt::NoPen);
219 painter->drawRect(option.rect);
220 painter->setPen(QPen(option.palette.highlightedText(), 0));
223 const QIcon *icon = &bitmap;
224 if (QFontDatabase::isSmoothlyScalable(text)) {
227 const QSize actualSize = icon->actualSize(r.size());
228 const QRect iconRect = QStyle::alignedRect(option.direction, option.displayAlignment,
230 icon->paint(painter, iconRect, Qt::AlignLeft|Qt::AlignVCenter);
231 if (option.direction == Qt::RightToLeft)
232 r.setRight(r.right() - actualSize.width() - 4);
234 r.setLeft(r.left() + actualSize.width() + 4);
236 QFont old = painter->font();
237 painter->setFont(font);
239 const Qt::Alignment textAlign = QStyle::visualAlignment(option.direction, option.displayAlignment);
244 QFontMetricsF fontMetrics(font);
245 if (fontMetrics.ascent() > r.height()) {
246 QRectF tbr = fontMetrics.tightBoundingRect(text);
248 textRect.setHeight(textRect.height() + (r.height() - tbr.height()));
249 painter->drawText(textRect, Qt::AlignBottom|Qt::TextSingleLine|textAlign, text);
251 painter->drawText(r, Qt::AlignVCenter|Qt::TextSingleLine|textAlign, text);
254 if (writingSystem != QFontDatabase::Any)
255 system = writingSystem;
257 const QString sampleText =
comboPrivate->sampleTextForFontFamily.value(text,
comboPrivate->sampleTextForWritingSystem.value(system));
258 if (system != QFontDatabase::Any || !sampleText.isEmpty()) {
259 int w = painter->fontMetrics().horizontalAdvance(text +
" "_L1);
260 painter->setFont(font2);
261 const QString sample = !sampleText.isEmpty() ? sampleText : QFontDatabase::writingSystemSample(system);
262 if (option.direction == Qt::RightToLeft)
263 r.setRight(r.right() - w);
265 r.setLeft(r.left() + w);
266 painter->drawText(r, Qt::AlignVCenter|Qt::TextSingleLine|textAlign, sample);
268 painter->setFont(old);
270 if (option.state & QStyle::State_Selected)
291 if (QCoreApplication::closingDown())
294 const int scalableMask = (QFontComboBox::ScalableFonts | QFontComboBox::NonScalableFonts);
295 const int spacingMask = (QFontComboBox::ProportionalFonts | QFontComboBox::MonospacedFonts);
297 QStringListModel *m = qobject_cast<QStringListModel *>(q->model());
300 QFontFamilyDelegate *delegate = qobject_cast<QFontFamilyDelegate *>(q->view()->itemDelegate());
301 QFontDatabase::WritingSystem system = delegate ? delegate->writingSystem : QFontDatabase::Any;
303 const QStringList list = QFontDatabase::families(system);
307 QFontInfo fi(currentFont);
309 for (
const auto &family : list) {
310 if (QFontDatabase::isPrivateFamily(family))
313 if ((filters & scalableMask) && (filters & scalableMask) != scalableMask) {
314 if (
bool(filters & QFontComboBox::ScalableFonts) != QFontDatabase::isSmoothlyScalable(family))
317 if ((filters & spacingMask) && (filters & spacingMask) != spacingMask) {
318 if (
bool(filters & QFontComboBox::MonospacedFonts) != QFontDatabase::isFixedPitch(family))
322 if (family == fi.family() || family.startsWith(fi.family() +
" ["_L1))
323 offset = result.size() - 1;
331 const QSignalBlocker blocker(m);
332 m->setStringList(result);
334 #if QT_CONFIG(accessibility)
335 if (QAccessible::isActive()) {
336 QAccessibleTableModelChangeEvent accessibleEvent(q->view(), QAccessibleTableModelChangeEvent::ModelReset);
337 QAccessible::updateAccessibility(&accessibleEvent);
342 if (result.isEmpty()) {
343 if (currentFont != QFont()) {
344 currentFont = QFont();
345 emit q->currentFontChanged(currentFont);
348 q->setCurrentIndex(offset);
399QFontComboBox::QFontComboBox(QWidget *parent)
400 : QComboBox(*
new QFontComboBoxPrivate, parent)
403 d->currentFont = font();
406 QStringListModel *m =
new QStringListModel(
this);
408 setItemDelegate(
new QFontFamilyDelegate(
this, d));
409 QListView *lview = qobject_cast<QListView*>(view());
411 lview->setUniformItemSizes(
true);
412 setWritingSystem(QFontDatabase::Any);
415 QObjectPrivate::connect(
this, &QFontComboBox::currentTextChanged,
416 d, &QFontComboBoxPrivate::currentChanged),
417 QObjectPrivate::connect(
qApp, &QGuiApplication::fontDatabaseChanged,
418 d, &QFontComboBoxPrivate::updateModel),
530bool QFontComboBox::event(QEvent *e)
532 if (e->type() == QEvent::Resize) {
533 QListView *lview = qobject_cast<QListView*>(view());
535 lview->window()->setFixedWidth(qMin(width() * 5 / 3,
536 QWidgetPrivate::availableScreenGeometry(lview).width()));
539 return QComboBox::event(e);