mirror of
https://github.com/MultiMC/MultiMC5.git
synced 2024-11-20 08:10:11 +00:00
81 lines
2.2 KiB
C++
81 lines
2.2 KiB
C++
/*
|
|
* Copyright 2022 Petr Mrázek
|
|
*
|
|
* This source is subject to the Microsoft Permissive License (MS-PL).
|
|
* Please see the COPYING.md file for more information.
|
|
*/
|
|
|
|
#include "ModrinthDocument.h"
|
|
|
|
#include <HoeDown.h>
|
|
#include <QPixmapCache>
|
|
#include <QDebug>
|
|
#include <net/NetJob.h>
|
|
#include <Application.h>
|
|
|
|
Modrinth::ModrinthDocument::ModrinthDocument(const QString &markdown, QObject* parent) : QTextDocument(parent) {
|
|
HoeDown hoedown;
|
|
// 100 MiB
|
|
QPixmapCache::setCacheLimit(102400);
|
|
setHtml(hoedown.process(markdown.toUtf8()));
|
|
}
|
|
|
|
QVariant Modrinth::ModrinthDocument::loadResource(int type, const QUrl& name) {
|
|
if(type == QTextDocument::ResourceType::ImageResource) {
|
|
auto pixmap = QPixmapCache::find(name.toString());
|
|
if(!pixmap) {
|
|
requestResource(name);
|
|
return QVariant();
|
|
}
|
|
return QVariant(*pixmap);
|
|
}
|
|
return QTextDocument::loadResource(type, name);
|
|
}
|
|
|
|
void Modrinth::ModrinthDocument::downloadFinished(const QString& key, const QPixmap& out) {
|
|
m_loading.remove(key);
|
|
QPixmapCache::insert(key, out);
|
|
emit layoutUpdateRequired();
|
|
}
|
|
|
|
void Modrinth::ModrinthDocument::downloadFailed(const QString& key) {
|
|
m_failed.append(key);
|
|
m_loading.remove(key);
|
|
}
|
|
|
|
void Modrinth::ModrinthDocument::requestResource(const QUrl& url) {
|
|
QString key = url.toString();
|
|
if(m_loading.contains(key) || m_failed.contains(key))
|
|
{
|
|
return;
|
|
}
|
|
|
|
qDebug() << "Loading resource" << key;
|
|
|
|
ImageLoad *load = new ImageLoad;
|
|
load->job = new NetJob(QString("Modrinth Image Download %1").arg(key), APPLICATION->network());
|
|
load->job->addNetAction(Net::Download::makeByteArray(url, &load->output));
|
|
load->key = key;
|
|
|
|
QObject::connect(load->job.get(), &NetJob::succeeded, this, [this, load] {
|
|
QPixmap pixmap;
|
|
if(!pixmap.loadFromData(load->output)) {
|
|
qDebug() << load->output;
|
|
downloadFailed(load->key);
|
|
}
|
|
if(pixmap.width() > 800) {
|
|
pixmap = pixmap.scaledToWidth(800);
|
|
}
|
|
downloadFinished(load->key, pixmap);
|
|
});
|
|
|
|
QObject::connect(load->job.get(), &NetJob::failed, this, [this, load]
|
|
{
|
|
downloadFailed(load->key);
|
|
});
|
|
|
|
load->job->start();
|
|
|
|
m_loading[key] = load;
|
|
}
|