3#include <QSGSimpleTextureNode>
7#include <QNetworkAccessManager>
8#include <QNetworkReply>
14QNetworkAccessManager* global_previewNetAccess =
nullptr;
21 setFlag(ItemHasContents);
25 Q_ASSERT(global_previewNetAccess);
34 if (m_image.isNull()) {
39 QSGSimpleTextureNode* textureNode =
static_cast<QSGSimpleTextureNode*
>(oldNode);
40 if (m_imageDirty || !textureNode) {
42 textureNode =
new QSGSimpleTextureNode;
43 textureNode->setOwnsTexture(
true);
46 QSGTexture* tex = window()->createTextureFromImage(m_image);
47 textureNode->setTexture(tex);
48 textureNode->markDirty(QSGBasicGeometryNode::DirtyMaterial);
52 textureNode->setRect(QRectF(0, 0, width(), height()));
63 return m_image.size();
68 global_previewNetAccess = netAccess;
73 return m_requestActive;
78 return static_cast<float>(m_image.width()) / m_image.height();
86 m_requestActive =
false;
94 if (m_imageUrl == url)
98 m_downloadRetryCount = 0;
103void PreviewImageItem::startDownload()
105 if (m_imageUrl.isEmpty())
108 QNetworkRequest request(m_imageUrl);
109 QNetworkReply* reply = global_previewNetAccess->get(request);
110 connect(reply, &QNetworkReply::finished,
this, &PreviewImageItem::onFinished);
112#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
113 connect(reply, &QNetworkReply::errorOccurred,
114 this, &PreviewImageItem::onDownloadError);
116 connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
117 this, SLOT(onDownloadError(QNetworkReply::NetworkError)));
119 m_requestActive =
true;
123void PreviewImageItem::setImage(QImage image)
127 setImplicitSize(m_image.width(), m_image.height());
132void PreviewImageItem::onFinished()
134 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
135 if (reply->url() != m_imageUrl) {
141 if (!img.load(reply,
nullptr)) {
142 qWarning() << Q_FUNC_INFO <<
"failed to read image data from" << reply->url();
146 m_requestActive =
false;
150void PreviewImageItem::onDownloadError(QNetworkReply::NetworkError errorCode)
152 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
153 if (errorCode == 403) {
154 if (m_downloadRetryCount++ < 4) {
160 qWarning() << Q_FUNC_INFO <<
"failed to download:" << reply->url();
161 qWarning() <<
"\t" << reply->errorString();
162 m_requestActive =
false;
static void setGlobalNetworkAccess(QNetworkAccessManager *netAccess)
QSGNode * updatePaintNode(QSGNode *, UpdatePaintNodeData *) override
void setImageUrl(QUrl url)
PreviewImageItem(QQuickItem *parent=nullptr)
Q_INVOKABLE void clear()
clear the image immediately, so we don't see a stale / expired one while attemtping to load the next ...