Spectral/src/imageprovider.cpp

80 lines
2.3 KiB
C++
Raw Normal View History

2018-03-02 08:56:36 +00:00
#include "imageprovider.h"
#include <QFile>
2018-03-02 08:56:36 +00:00
#include <QMetaObject>
#include <QStandardPaths>
2018-07-09 02:45:26 +00:00
#include <QtCore/QDebug>
#include <QtCore/QWaitCondition>
2018-03-02 08:56:36 +00:00
2018-03-15 09:10:27 +00:00
#include "jobs/mediathumbnailjob.h"
#include "connection.h"
2018-03-02 08:56:36 +00:00
using QMatrixClient::MediaThumbnailJob;
ImageProvider::ImageProvider(QObject* parent)
2018-09-07 05:50:06 +00:00
: QObject(parent),
QQuickImageProvider(
2018-07-09 02:45:26 +00:00
QQmlImageProviderBase::Image,
QQmlImageProviderBase::ForceAsynchronousImageLoading) {
2018-03-02 08:56:36 +00:00
#if (QT_VERSION < QT_VERSION_CHECK(5, 10, 0))
2018-07-09 02:45:26 +00:00
qRegisterMetaType<MediaThumbnailJob*>();
2018-03-02 08:56:36 +00:00
#endif
}
2018-07-09 02:45:26 +00:00
QImage ImageProvider::requestImage(const QString& id, QSize* pSize,
const QSize& requestedSize) {
if (!id.startsWith("mxc://")) {
qWarning() << "ImageProvider: won't fetch an invalid id:" << id
<< "doesn't follow server/mediaId pattern";
return {};
}
2018-03-02 08:56:36 +00:00
2018-07-09 02:45:26 +00:00
QUrl mxcUri{id};
2018-03-02 08:56:36 +00:00
QUrl tempfilePath = QUrl::fromLocalFile(
QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/" +
2018-08-28 03:12:49 +00:00
mxcUri.fileName() + "-" + QString::number(requestedSize.width()) + "x" +
QString::number(requestedSize.height()) + ".png");
QImage cachedImage;
2018-08-28 03:12:49 +00:00
if (cachedImage.load(tempfilePath.toLocalFile())) {
if (pSize != nullptr) *pSize = cachedImage.size();
return cachedImage;
}
2018-07-09 02:45:26 +00:00
MediaThumbnailJob* job = nullptr;
QReadLocker locker(&m_lock);
2018-03-02 08:56:36 +00:00
#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
2018-07-09 02:45:26 +00:00
QMetaObject::invokeMethod(
m_connection,
2018-09-07 05:50:06 +00:00
[=] { return m_connection->getThumbnail(mxcUri, requestedSize); },
2018-07-09 02:45:26 +00:00
Qt::BlockingQueuedConnection, &job);
2018-03-02 08:56:36 +00:00
#else
2018-09-07 05:50:06 +00:00
QMetaObject::invokeMethod(m_connection, "getThumbnail",
2018-07-09 02:45:26 +00:00
Qt::BlockingQueuedConnection,
Q_RETURN_ARG(MediaThumbnailJob*, job),
Q_ARG(QUrl, mxcUri), Q_ARG(QSize, requestedSize));
2018-03-02 08:56:36 +00:00
#endif
2018-07-09 02:45:26 +00:00
if (!job) {
qDebug() << "ImageProvider: failed to send a request";
return {};
}
QImage result;
{
QWaitCondition condition; // The most compact way to block on a signal
job->connect(job, &MediaThumbnailJob::finished, job, [&] {
result = job->thumbnail();
condition.wakeAll();
});
condition.wait(&m_lock);
}
2018-03-02 08:56:36 +00:00
2018-07-09 02:45:26 +00:00
if (pSize != nullptr) *pSize = result.size();
2018-03-02 08:56:36 +00:00
result.save(tempfilePath.toLocalFile());
2018-07-09 02:45:26 +00:00
return result;
2018-03-02 08:56:36 +00:00
}