mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	The thumbnails were fetched in the background to achieve a snappier UI. The problem with that is that on LaTeX etc. export only placeholder thumbnails were shown. Therefore, implement a synchronous mode. This only tries to fetch cached thumbnails or calculate thumbnails for images. Videos and remote files are not supported. Fixes #1963 Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
		
			
				
	
	
		
			91 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
#ifndef IMAGEDOWNLOADER_H
 | 
						|
#define IMAGEDOWNLOADER_H
 | 
						|
 | 
						|
#include "metadata.h"
 | 
						|
#include <QImage>
 | 
						|
#include <QFuture>
 | 
						|
#include <QNetworkReply>
 | 
						|
#include <QThreadPool>
 | 
						|
 | 
						|
class ImageDownloader : public QObject {
 | 
						|
	Q_OBJECT
 | 
						|
public:
 | 
						|
	static ImageDownloader *instance();
 | 
						|
	ImageDownloader();
 | 
						|
public slots:
 | 
						|
	void load(QUrl url, QString filename);
 | 
						|
signals:
 | 
						|
	void loaded(QString filename);
 | 
						|
	void failed(QString filename);
 | 
						|
private:
 | 
						|
	QNetworkAccessManager manager;
 | 
						|
	void loadFromUrl(const QString &filename, const QUrl &);
 | 
						|
	void saveImage(QNetworkReply *reply);
 | 
						|
};
 | 
						|
 | 
						|
struct PictureEntry;
 | 
						|
class Thumbnailer : public QObject {
 | 
						|
	Q_OBJECT
 | 
						|
public:
 | 
						|
	static Thumbnailer *instance();
 | 
						|
 | 
						|
	// Schedule a thumbnail for fetching or calculation.
 | 
						|
	// If synchronous is false, returns a placeholder thumbnail.
 | 
						|
	// The actual thumbnail will be sent via a signal later.
 | 
						|
	// If synchronous is true, try to fetch the actual thumbnail.
 | 
						|
	// In this mode only precalculated thumbnails or thumbnails
 | 
						|
	// from pictures are returned. Video extraction and remote
 | 
						|
	// images are not supported.
 | 
						|
	QImage fetchThumbnail(const QString &filename, bool synchronous);
 | 
						|
 | 
						|
	// Schedule multiple thumbnails for forced recalculation
 | 
						|
	void calculateThumbnails(const QVector<QString> &filenames);
 | 
						|
 | 
						|
	// If we change dive, clear all unfinished thumbnail creations
 | 
						|
	void clearWorkQueue();
 | 
						|
	static int maxThumbnailSize();
 | 
						|
	static int defaultThumbnailSize();
 | 
						|
	static int thumbnailSize(double zoomLevel);
 | 
						|
public slots:
 | 
						|
	void imageDownloaded(QString filename);
 | 
						|
	void imageDownloadFailed(QString filename);
 | 
						|
	void frameExtracted(QString filename, QImage thumbnail, duration_t duration, duration_t offset);
 | 
						|
	void frameExtractionFailed(QString filename, duration_t duration);
 | 
						|
	void frameExtractionInvalid(QString filename, duration_t duration);
 | 
						|
signals:
 | 
						|
	void thumbnailChanged(QString filename, QImage thumbnail, duration_t duration);
 | 
						|
private:
 | 
						|
	struct Thumbnail {
 | 
						|
		QImage img;
 | 
						|
		mediatype_t type;
 | 
						|
		duration_t duration;
 | 
						|
	};
 | 
						|
 | 
						|
	Thumbnailer();
 | 
						|
	Thumbnail fetchVideoThumbnail(const QString &filename, const QString &originalFilename, duration_t duration);
 | 
						|
	Thumbnail extractVideoThumbnail(const QString &picture_filename, duration_t duration);
 | 
						|
	Thumbnail addPictureThumbnailToCache(const QString &picture_filename, const QImage &thumbnail);
 | 
						|
	Thumbnail addVideoThumbnailToCache(const QString &picture_filename, duration_t duration, const QImage &thumbnail, duration_t position);
 | 
						|
	Thumbnail addUnknownThumbnailToCache(const QString &picture_filename);
 | 
						|
	void recalculate(QString filename);
 | 
						|
	void processItem(QString filename, bool tryDownload);
 | 
						|
	Thumbnail getThumbnailFromCache(const QString &picture_filename);
 | 
						|
	Thumbnail getPictureThumbnailFromStream(QDataStream &stream);
 | 
						|
	Thumbnail getVideoThumbnailFromStream(QDataStream &stream, const QString &filename);
 | 
						|
	Thumbnail fetchImage(const QString &filename, const QString &originalFilename, bool tryDownload);
 | 
						|
	Thumbnail getHashedImage(const QString &filename, bool tryDownload);
 | 
						|
	void markVideoThumbnail(QImage &img);
 | 
						|
 | 
						|
	mutable QMutex lock;
 | 
						|
	QThreadPool pool;
 | 
						|
	QImage failImage;		// Shown when image-fetching fails
 | 
						|
	QImage dummyImage;		// Shown before thumbnail is fetched
 | 
						|
	QImage videoImage;		// Place holder for videos
 | 
						|
	QImage videoOverlayImage;	// Overlay for video thumbnails
 | 
						|
	QImage unknownImage;		// Place holder for files where we couldn't determine the type
 | 
						|
 | 
						|
	QMap<QString,QFuture<void>> workingOn;
 | 
						|
};
 | 
						|
 | 
						|
#endif // IMAGEDOWNLOADER_H
 |