3#include <QSGSimpleTextureNode>
10#include <simgear/package/Root.hxx>
11#include <simgear/package/Package.hxx>
12#include <simgear/package/Delegate.hxx>
13#include <simgear/package/Catalog.hxx>
14#include <simgear/package/Install.hxx>
31 size_t length,
const uint8_t* bytes)
override;
37 size_t length,
const uint8_t* bytes)
39 if (aThumbnailUrl !=
owner->url().toString().toStdString()) {
43 const auto iLength =
static_cast<int>(length);
44 QImage img = QImage::fromData(QByteArray::fromRawData(
reinterpret_cast<const char*
>(bytes), iLength));
48 qWarning() <<
"failed to load image data for URL:" << QString::fromStdString(aThumbnailUrl);
60 m_maximumSize(9999, 9999)
62 globals->packageRoot()->addDelegate(m_delegate.get());
63 setFlag(ItemHasContents);
70 globals->packageRoot()->removeDelegate(m_delegate.get());
75 if (m_image.isNull()) {
80 QSGSimpleTextureNode* textureNode =
static_cast<QSGSimpleTextureNode*
>(oldNode);
81 if (m_imageDirty || !textureNode) {
83 textureNode =
new QSGSimpleTextureNode;
84 textureNode->setOwnsTexture(
true);
86 QSGTexture* tex = window()->createTextureFromImage(m_image, QQuickWindow::TextureIsOpaque);
87 textureNode->setTexture(tex);
88 textureNode->markDirty(QSGBasicGeometryNode::DirtyMaterial);
92 textureNode->setRect(QRectF(0, 0, width(), height()));
103 return m_aircraftUri;
108 return m_image.size();
113 return m_maximumSize;
118 if (m_aircraftUri == uri)
123 if (uri.startsWith(
"package:")) {
124 const std::string packageId = m_aircraftUri.toStdString().substr(8);
125 pkg::Root* root =
globals->packageRoot();
126 pkg::PackageRef
package = root->getPackageById(packageId);
128 auto variant = package->indexOfVariant(packageId);
129 const auto thumbnail = package->thumbnailForVariant(variant);
130 m_imageUrl = QUrl(QString::fromStdString(thumbnail.url));
131 if (m_imageUrl.isValid()) {
132 globals->packageRoot()->requestThumbnailData(m_imageUrl.toString().toStdString());
138 QFileInfo aircraftSetPath(QUrl(uri).toLocalFile());
139 const QString thumbnailPath = aircraftSetPath.dir().filePath(
"thumbnail.jpg");
140 m_imageUrl = QUrl::fromLocalFile(thumbnailPath);
142 if (QFileInfo(thumbnailPath).exists()) {
144 if (img.load(thumbnailPath)) {
147 qWarning() << Q_FUNC_INFO <<
"failed to load thumbnail from:" << thumbnailPath;
164 if (!m_image.isNull()) {
165 setImplicitSize(qMin(m_maximumSize.width(), m_image.width()),
166 qMin(m_maximumSize.height(), m_image.height()));
170void ThumbnailImageItem::setImage(QImage image)
174 setImplicitSize(qMin(m_maximumSize.width(), m_image.width()),
175 qMin(m_maximumSize.height(), m_image.height()));
180void ThumbnailImageItem::clearImage()
184 setImplicitSize(m_maximumSize.width(), m_maximumSize.height());
const int STANDARD_THUMBNAIL_WIDTH
const int STANDARD_THUMBNAIL_HEIGHT
void finishInstall(pkg::InstallRef, StatusCode) override
ThumbnailPackageDelegate(ThumbnailImageItem *o)
void catalogRefreshed(pkg::CatalogRef, StatusCode) override
void installProgress(pkg::InstallRef, unsigned int, unsigned int) override
void startInstall(pkg::InstallRef) override
void dataForThumbnail(const std::string &aThumbnailUrl, size_t length, const uint8_t *bytes) override
ThumbnailImageItem * owner
void setAircraftUri(QString uri)
void aircraftUriChanged()
void maximumSizeChanged(QSize maximumSize)
void setMaximumSize(QSize maximumSize)
ThumbnailImageItem(QQuickItem *parent=nullptr)
QSGNode * updatePaintNode(QSGNode *, UpdatePaintNodeData *) override