7#include <qqmlcontext.h>
14#include <QFontDatabase>
16#include <private/qobject_p.h>
20#if QT_CONFIG(qml_network)
21#include <QNetworkRequest>
22#include <QNetworkReply>
25#include <QtCore/QCoreApplication>
26#include <QtCore/private/qduplicatetracker_p.h>
28#include <QtGui/private/qfontdatabase_p.h>
39#if QT_CONFIG(qml_network)
59 : QObject(
nullptr),
id(_id)
63#if QT_CONFIG(qml_network)
64void QQuickFontObject::download(
const QUrl &url, QNetworkAccessManager *manager)
66 QNetworkRequest req(url);
67 req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute,
true);
68 reply = manager->get(req);
69 QObject::connect(reply, SIGNAL(finished()),
this, SLOT(replyFinished()));
72void QQuickFontObject::replyFinished()
75 if (!reply->error()) {
76 id = QFontDatabase::addApplicationFontFromData(reply->readAll());
77 emit fontDownloaded(id);
79 qWarning(
"%s: Unable to load font '%s': %s", Q_FUNC_INFO,
80 qPrintable(reply->url().toString()), qPrintable(reply->errorString()));
81 emit fontDownloaded(-1);
91 Q_DECLARE_PUBLIC(QQuickFontLoader)
124 QDuplicateTracker<QQuickFontObject *, 256> deleted(map.size());
125 for (QQuickFontObject *fo : std::as_const(map)) {
126 if (!deleted.hasSeen(fo))
138 fontLoaderFonts()->reset();
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166QQuickFontLoader::QQuickFontLoader(QObject *parent)
167 : QObject(*(
new QQuickFontLoaderPrivate), parent)
169 connect(
this, &QQuickFontLoader::fontChanged,
this, &QQuickFontLoader::nameChanged);
173
174
175
176QUrl QQuickFontLoader::source()
const
178 Q_D(
const QQuickFontLoader);
182void QQuickFontLoader::setSource(
const QUrl &url)
184 Q_D(QQuickFontLoader);
188 emit sourceChanged();
190 auto &map = fontLoaderFonts()->map;
192 const QQmlContext *context = qmlContext(
this);
193 const QUrl &resolvedUrl = context ? context->resolvedUrl(d->url) : d->url;
194 const auto mapEntry = map.constFind(resolvedUrl);
195 const auto mapEnd = map.constEnd();
197 const QString localFile = QQmlFile::urlToLocalFileOrQrc(resolvedUrl);
198 if (!localFile.isEmpty()) {
199 if (mapEntry == mapEnd) {
200 int id = QFontDatabase::addApplicationFont(localFile);
203 QQuickFontObject *fo =
new QQuickFontObject(id);
204 map[resolvedUrl] = fo;
207 QQuickFontObject *fo = *mapEntry;
208 updateFontInfo(fo->id);
210 }
else if (mapEntry == mapEnd) {
212#if QT_CONFIG(qml_network)
213 QQuickFontObject *fo =
new QQuickFontObject;
214 map[resolvedUrl] = fo;
215 fo->download(resolvedUrl, context->engine()->networkAccessManager());
217 emit statusChanged();
218 QObject::connect(fo, SIGNAL(fontDownloaded(
int)),
219 this, SLOT(updateFontInfo(
int)));
224 QQuickFontObject *fo = *mapEntry;
226#if QT_CONFIG(qml_network)
228 emit statusChanged();
229 QObject::connect(fo, SIGNAL(fontDownloaded(
int)),
230 this, SLOT(updateFontInfo(
int)));
235 updateFontInfo(fo->id);
240void QQuickFontLoader::updateFontInfo(
int id)
242 Q_D(QQuickFontLoader);
246 QQuickFontLoader::Status status = Error;
248 QFontDatabasePrivate *p = QFontDatabasePrivate::instance();
249 if (id < p->applicationFonts.size()) {
250 const QFontDatabasePrivate::ApplicationFont &applicationFont = p->applicationFonts.at(id);
252 if (!applicationFont.properties.isEmpty()) {
253 const QFontDatabasePrivate::ApplicationFont::Properties &properties = applicationFont.properties.at(0);
254 font.setFamily(properties.familyName);
255 font.setStyleName(properties.styleName);
256 font.setWeight(QFont::Weight(properties.weight));
257 font.setStyle(properties.style);
258 font.setStretch(properties.stretch);
265 if (font != d->font) {
270 if (status != d->status) {
271 if (status == Error) {
272 const QQmlContext *context = qmlContext(
this);
273 qmlWarning(
this) <<
"Cannot load font: \""
274 << (context ? context->resolvedUrl(d->url) : d->url).toString() <<
'"';
277 emit statusChanged();
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329QFont QQuickFontLoader::font()
const
331 Q_D(
const QQuickFontLoader);
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362QString QQuickFontLoader::name()
const
364 Q_D(
const QQuickFontLoader);
365 return d->font.resolveMask() == 0 ? QString() : d->font.family();
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401QQuickFontLoader::Status QQuickFontLoader::status()
const
403 Q_D(
const QQuickFontLoader);
409#include <qquickfontloader.moc>
411#include "moc_qquickfontloader_p.cpp"
QHash< QUrl, QQuickFontObject * > map
static void q_QFontLoaderFontsAddReset()
static void q_QFontLoaderFontsStaticReset()
Q_GLOBAL_STATIC(QFontLoaderFonts, fontLoaderFonts)