qfontcombobox.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/widgets/widgets/qfontcombobox.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7static QFontDatabase::WritingSystem writingSystemFromScript(QLocale::Script script)-
8{-
9 switch (script) {-
10 case QLocale::ArabicScript:-
11 return QFontDatabase::Arabic;-
12 case QLocale::CyrillicScript:-
13 return QFontDatabase::Cyrillic;-
14 case QLocale::GurmukhiScript:-
15 return QFontDatabase::Gurmukhi;-
16 case QLocale::SimplifiedHanScript:-
17 return QFontDatabase::SimplifiedChinese;-
18 case QLocale::TraditionalHanScript:-
19 return QFontDatabase::TraditionalChinese;-
20 case QLocale::LatinScript:-
21 return QFontDatabase::Latin;-
22 case QLocale::ArmenianScript:-
23 return QFontDatabase::Armenian;-
24 case QLocale::BengaliScript:-
25 return QFontDatabase::Bengali;-
26 case QLocale::DevanagariScript:-
27 return QFontDatabase::Devanagari;-
28 case QLocale::GeorgianScript:-
29 return QFontDatabase::Georgian;-
30 case QLocale::GreekScript:-
31 return QFontDatabase::Greek;-
32 case QLocale::GujaratiScript:-
33 return QFontDatabase::Gujarati;-
34 case QLocale::HebrewScript:-
35 return QFontDatabase::Hebrew;-
36 case QLocale::JapaneseScript:-
37 return QFontDatabase::Japanese;-
38 case QLocale::KhmerScript:-
39 return QFontDatabase::Khmer;-
40 case QLocale::KannadaScript:-
41 return QFontDatabase::Kannada;-
42 case QLocale::KoreanScript:-
43 return QFontDatabase::Korean;-
44 case QLocale::LaoScript:-
45 return QFontDatabase::Lao;-
46 case QLocale::MalayalamScript:-
47 return QFontDatabase::Malayalam;-
48 case QLocale::MyanmarScript:-
49 return QFontDatabase::Myanmar;-
50 case QLocale::TamilScript:-
51 return QFontDatabase::Tamil;-
52 case QLocale::TeluguScript:-
53 return QFontDatabase::Telugu;-
54 case QLocale::ThaanaScript:-
55 return QFontDatabase::Thaana;-
56 case QLocale::ThaiScript:-
57 return QFontDatabase::Thai;-
58 case QLocale::TibetanScript:-
59 return QFontDatabase::Tibetan;-
60 case QLocale::SinhalaScript:-
61 return QFontDatabase::Sinhala;-
62 case QLocale::SyriacScript:-
63 return QFontDatabase::Syriac;-
64 case QLocale::OriyaScript:-
65 return QFontDatabase::Oriya;-
66 case QLocale::OghamScript:-
67 return QFontDatabase::Ogham;-
68 case QLocale::RunicScript:-
69 return QFontDatabase::Runic;-
70 case QLocale::NkoScript:-
71 return QFontDatabase::Nko;-
72 default:-
73 return QFontDatabase::Any;-
74 }-
75}-
76-
77static QFontDatabase::WritingSystem writingSystemFromLocale()-
78{-
79 QStringList uiLanguages = QLocale::system().uiLanguages();-
80 QLocale::Script script;-
81 if (!uiLanguages.isEmpty())-
82 script = QLocale(uiLanguages.at(0)).script();-
83 else-
84 script = QLocale::system().script();-
85-
86 return writingSystemFromScript(script);-
87}-
88-
89static QFontDatabase::WritingSystem writingSystemForFont(const QFont &font, bool *hasLatin)-
90{-
91 QList<QFontDatabase::WritingSystem> writingSystems = QFontDatabase().writingSystems(font.family());-
92-
93-
94-
95 writingSystems.removeOne(QFontDatabase::Vietnamese);-
96 *hasLatin = writingSystems.removeOne(QFontDatabase::Latin);-
97-
98 if (writingSystems.isEmpty()
writingSystems.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
99 return
never executed: return QFontDatabase::Any;
QFontDatabase::Any;
never executed: return QFontDatabase::Any;
0
100-
101 QFontDatabase::WritingSystem system = writingSystemFromLocale();-
102-
103 if (writingSystems.contains(system)
writingSystems...ntains(system)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
104 return
never executed: return system;
system;
never executed: return system;
0
105-
106 if (system == QFontDatabase::TraditionalChinese
system == QFon...itionalChineseDescription
TRUEnever evaluated
FALSEnever evaluated
0
107 && writingSystems.contains(QFontDatabase::SimplifiedChinese)
writingSystems...lifiedChinese)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
108 return
never executed: return QFontDatabase::SimplifiedChinese;
QFontDatabase::SimplifiedChinese;
never executed: return QFontDatabase::SimplifiedChinese;
0
109 }-
110-
111 if (system == QFontDatabase::SimplifiedChinese
system == QFon...plifiedChineseDescription
TRUEnever evaluated
FALSEnever evaluated
0
112 && writingSystems.contains(QFontDatabase::TraditionalChinese)
writingSystems...tionalChinese)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
113 return
never executed: return QFontDatabase::TraditionalChinese;
QFontDatabase::TraditionalChinese;
never executed: return QFontDatabase::TraditionalChinese;
0
114 }-
115-
116 system = writingSystems.lastconstLast();-
117-
118 if (!*hasLatin
!*hasLatinDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
119-
120 return
never executed: return system;
system;
never executed: return system;
0
121 }-
122-
123 if (writingSystems.count() == 1
writingSystems.count() == 1Description
TRUEnever evaluated
FALSEnever evaluated
&& system > QFontDatabase::Cyrillic
system > QFont...base::CyrillicDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
124 return
never executed: return system;
system;
never executed: return system;
0
125-
126 if (writingSystems.count() <= 2
writingSystems.count() <= 2Description
TRUEnever evaluated
FALSEnever evaluated
&& system > QFontDatabase::Armenian
system > QFont...base::ArmenianDescription
TRUEnever evaluated
FALSEnever evaluated
&& system < QFontDatabase::Vietnamese
system < QFont...se::VietnameseDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
127 return
never executed: return system;
system;
never executed: return system;
0
128-
129 if (writingSystems.count() <= 5
writingSystems.count() <= 5Description
TRUEnever evaluated
FALSEnever evaluated
&& system >= QFontDatabase::SimplifiedChinese
system >= QFon...plifiedChineseDescription
TRUEnever evaluated
FALSEnever evaluated
&& system <= QFontDatabase::Korean
system <= QFon...tabase::KoreanDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
130 return
never executed: return system;
system;
never executed: return system;
0
131-
132 return
never executed: return QFontDatabase::Any;
QFontDatabase::Any;
never executed: return QFontDatabase::Any;
0
133}-
134-
135class QFontFamilyDelegate : public QAbstractItemDelegate-
136{-
137 public: template <typename ThisObject> inline void qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i + 1; }-
138#pragma GCC diagnostic push-
139 static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private: __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);-
140#pragma GCC diagnostic pop-
141 struct QPrivateSignal {};-
142public:-
143 explicit QFontFamilyDelegate(QObject *parent);-
144-
145-
146 void paint(QPainter *painter,-
147 const QStyleOptionViewItem &option,-
148 const QModelIndex &index) const override;-
149-
150 QSize sizeHint(const QStyleOptionViewItem &option,-
151 const QModelIndex &index) const override;-
152-
153 const QIcon truetype;-
154 const QIcon bitmap;-
155 QFontDatabase::WritingSystem writingSystem;-
156};-
157-
158QFontFamilyDelegate::QFontFamilyDelegate(QObject *parent)-
159 : QAbstractItemDelegate(parent)-
{),
160 truetype(([]() -> QString { enum { Size = QIconsizeof(QLatin1Stringu"" ":/qt-project.org/styles/commonstyle/images/fonttruetype-16.png")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" ":/qt-project.org/styles/commonstyle/images/fonttruetype-16.png" ));}; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return qstring_literal_temp; }())),-
161 bitmap(([]() -> QString { enum { Size = QIconsizeof(QLatin1Stringu"" ":/qt-project.org/styles/commonstyle/images/fontbitmap-16.png")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" ":/qt-project.org/styles/commonstyle/images/fontbitmap-16.png" ));-
writingSystem}; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return qstring_literal_temp; }())),
162 writingSystem(QFontDatabase::Any;)-
163{-
164}
never executed: end of block
0
165-
166void QFontFamilyDelegate::paint(QPainter *painter,-
167 const QStyleOptionViewItem &option,-
168 const QModelIndex &index) const-
169{-
170 QString text = index.data(Qt::DisplayRole).toString();-
171 QFont font(option.font);-
172 font.setPointSize(QFontInfo(font).pointSize() * 3 / 2);-
173 QFont font2 = font;-
174 font2.setFamily(text);-
175-
176 bool hasLatin;-
177 QFontDatabase::WritingSystem system = writingSystemForFont(font2, &hasLatin);-
178 if (hasLatin)-
179 font = font2;-
180-
181 QRect r = option.rect;-
182-
183 if (option.state & QStyle::State_Selected) {-
184 painter->save();-
185 painter->setBrush(option.palette.highlight());-
186 painter->setPen(Qt::NoPen);-
187 painter->drawRect(option.rect);-
188 painter->setPen(QPen(option.palette.highlightedText(), 0));-
189 }-
190-
191 const QIcon *icon = &bitmap;-
192 if (QFontDatabase().isSmoothlyScalable(text)) {-
193 icon = &truetype;-
194 }-
195 QSize actualSize = icon->actualSize(r.size());-
196-
197 icon->paint(painter, r, Qt::AlignLeft|Qt::AlignVCenter);-
198 if (option.direction == Qt::RightToLeft)-
199 r.setRight(r.right() - actualSize.width() - 4);-
200 else-
201 r.setLeft(r.left() + actualSize.width() + 4);-
202-
203 QFont old = painter->font();-
204 painter->setFont(font);-
205-
206-
207-
208-
209-
210 QFontMetricsF fontMetrics(font);-
211 if (fontMetrics.ascent() > r.height()) {-
212 QRectF tbr = fontMetrics.tightBoundingRect(text);-
213 painter->drawText(r.x(), r.y() + (r.height() + tbr.height()) / 2.0, text);-
214 } else {-
215 painter->drawText(r, Qt::AlignVCenter|Qt::AlignLeading|Qt::TextSingleLine, text);-
216 }-
217-
218 if (writingSystem != QFontDatabase::Any)-
219 system = writingSystem;-
220-
221 if (system != QFontDatabase::Any) {-
222 int w = painter->fontMetrics().width(text + QLatin1String(" "));-
223 painter->setFont(font2);-
224 QString sample = QFontDatabase().writingSystemSample(system);-
225 if (option.direction == Qt::RightToLeft)-
226 r.setRight(r.right() - w);-
227 else-
228 r.setLeft(r.left() + w);-
229 painter->drawText(r, Qt::AlignVCenter|Qt::AlignLeading|Qt::TextSingleLine, sample);-
230 }-
231 painter->setFont(old);-
232-
233 if (option.state & QStyle::State_Selected)-
234 painter->restore();-
235-
236}-
237-
238QSize QFontFamilyDelegate::sizeHint(const QStyleOptionViewItem &option,-
239 const QModelIndex &index) const-
240{-
241 QString text = index.data(Qt::DisplayRole).toString();-
242 QFont font(option.font);-
243-
244 font.setPointSize(QFontInfo(font).pointSize() * 3/2);-
245 QFontMetrics fontMetrics(font);-
246 return QSize(fontMetrics.width(text), fontMetrics.height());-
247}-
248-
249-
250class QFontComboBoxPrivate : public QComboBoxPrivate-
251{-
252public:-
253 inline QFontComboBoxPrivate() { filters = QFontComboBox::AllFonts; }-
254-
255 QFontComboBox::FontFilters filters;-
256 QFont currentFont;-
257-
258 void _q_updateModel();-
259 void _q_currentChanged(const QString &);-
260-
261 inline QFontComboBox* q_func() { return static_cast<QFontComboBox *>(q_ptr); } inline const QFontComboBox* q_func() const { return static_cast<const QFontComboBox *>(q_ptr); } friend class QFontComboBox;-
262};-
263-
264-
265void QFontComboBoxPrivate::_q_updateModel()-
266{-
267 QFontComboBox * const q = q_func();-
268 const int scalableMask = (QFontComboBox::ScalableFonts | QFontComboBox::NonScalableFonts);-
269 const int spacingMask = (QFontComboBox::ProportionalFonts | QFontComboBox::MonospacedFonts);-
270-
271 QStringListModel *m = qobject_cast<QStringListModel *>(q->model());-
272 if (!m)-
273 return;-
274 QFontFamilyDelegate *delegate = qobject_cast<QFontFamilyDelegate *>(q->view()->itemDelegate());-
275 QFontDatabase::WritingSystem system = delegate ? delegate->writingSystem : QFontDatabase::Any;-
276-
277 QFontDatabase fdb;-
278 QStringList list = fdb.families(system);-
279 QStringList result;-
280-
281 int offset = 0;-
282 QFontInfo fi(currentFont);-
283-
284 for (int i = 0; i < list.size(); ++i) {-
285 if (fdb.isPrivateFamily(list.at(i)))-
286 continue;-
287-
288 if ((filters & scalableMask) && (filters & scalableMask) != scalableMask) {-
289 if (bool(filters & QFontComboBox::ScalableFonts) != fdb.isSmoothlyScalable(list.at(i)))-
290 continue;-
291 }-
292 if ((filters & spacingMask) && (filters & spacingMask) != spacingMask) {-
293 if (bool(filters & QFontComboBox::MonospacedFonts) != fdb.isFixedPitch(list.at(i)))-
294 continue;-
295 }-
296 result += list.at(i);-
297 if (list.at(i) == fi.family() || list.at(i).startsWith(fi.family() + QLatin1String(" [")))-
298 offset = result.count() - 1;-
299 }-
300 list = result;-
301-
302-
303-
304-
305-
306 {-
307 const QSignalBlocker blocker(m);-
308 m->setStringList(list);-
309 }-
310-
311 if (list.isEmpty()) {-
312 if (currentFont != QFont()) {-
313 currentFont = QFont();-
314 q->currentFontChanged(currentFont);-
315 }-
316 } else {-
317 q->setCurrentIndex(offset);-
318 }-
319}-
320-
321-
322void QFontComboBoxPrivate::_q_currentChanged(const QString &text)-
323{-
324 QFontComboBox * const q = q_func();-
325 if (currentFont.family() != text) {-
326 currentFont.setFamily(text);-
327 q->currentFontChanged(currentFont);-
328 }-
329}-
330QFontComboBox::QFontComboBox(QWidget *parent)-
331 : QComboBox(*new QFontComboBoxPrivate, parent)-
332{-
333 QFontComboBoxPrivate * const d = d_func();-
334 d->currentFont = font();-
335 setEditable(true);-
336-
337 QStringListModel *m = new QStringListModel(this);-
338 setModel(m);-
339 setItemDelegate(new QFontFamilyDelegate(this));-
340 QListView *lview = qobject_cast<QListView*>(view());-
341 if (lview)-
342 lview->setUniformItemSizes(true);-
343 setWritingSystem(QFontDatabase::Any);-
344-
345 connect(this, qFlagLocation("2""currentIndexChanged(QString)" "\0" __FILE__ ":" "421""427"),-
346 this, qFlagLocation("1""_q_currentChanged(QString)" "\0" __FILE__ ":" "422""428"));-
347-
348 connect((static_cast<QApplication *>(QCoreApplication::instance())), qFlagLocation("2""fontDatabaseChanged()" "\0" __FILE__ ":" "424""430"),-
349 this, qFlagLocation("1""_q_updateModel()" "\0" __FILE__ ":" "425""431"));-
350}-
351-
352-
353-
354-
355-
356QFontComboBox::~QFontComboBox()-
357{-
358}-
359void QFontComboBox::setWritingSystem(QFontDatabase::WritingSystem script)-
360{-
361 QFontComboBoxPrivate * const d = d_func();-
362 QFontFamilyDelegate *delegate = qobject_cast<QFontFamilyDelegate *>(view()->itemDelegate());-
363 if (delegate)-
364 delegate->writingSystem = script;-
365 d->_q_updateModel();-
366}-
367-
368QFontDatabase::WritingSystem QFontComboBox::writingSystem() const-
369{-
370 QFontFamilyDelegate *delegate = qobject_cast<QFontFamilyDelegate *>(view()->itemDelegate());-
371 if (delegate)-
372 return delegate->writingSystem;-
373 return QFontDatabase::Any;-
374}-
375void QFontComboBox::setFontFilters(FontFilters filters)-
376{-
377 QFontComboBoxPrivate * const d = d_func();-
378 d->filters = filters;-
379 d->_q_updateModel();-
380}-
381-
382QFontComboBox::FontFilters QFontComboBox::fontFilters() const-
383{-
384 const QFontComboBoxPrivate * const d = d_func();-
385 return d->filters;-
386}-
387-
388-
389-
390-
391-
392-
393-
394QFont QFontComboBox::currentFont() const-
395{-
396 const QFontComboBoxPrivate * const d = d_func();-
397 return d->currentFont;-
398}-
399-
400void QFontComboBox::setCurrentFont(const QFont &font)-
401{-
402 QFontComboBoxPrivate * const d = d_func();-
403 if (font != d->currentFont) {-
404 d->currentFont = font;-
405 d->_q_updateModel();-
406 if (d->currentFont == font) {-
407 currentFontChanged(d->currentFont);-
408 }-
409 }-
410}-
411bool QFontComboBox::event(QEvent *e)-
412{-
413 if (e->type() == QEvent::Resize) {-
414 QListView *lview = qobject_cast<QListView*>(view());-
415 if (lview) {-
416 lview->window()->setFixedWidth(qMin(width() * 5 / 3,-
417 QApplication::desktop()->availableGeometry(lview).width()));-
418 }-
419 }-
420 return QComboBox::event(e);-
421}-
422-
423-
424-
425-
426QSize QFontComboBox::sizeHint() const-
427{-
428 QSize sz = QComboBox::sizeHint();-
429 QFontMetrics fm(font());-
430 sz.setWidth(fm.width(QLatin1Char('m'))*14);-
431 return sz;-
432}-
433-
434-
435-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9