gui: stop generating preview images after a memory limit has been reached.
This commit is contained in:
parent
8d6ee157a7
commit
a4f2612071
@ -113,6 +113,8 @@ void MainWindow::tabChanged()
|
||||
}
|
||||
|
||||
void MainWindow::pdfPreviewReceived(PdfPreview preview)
|
||||
{
|
||||
if(preview.hasPreviewImage())
|
||||
{
|
||||
ClickLabel *label = new ClickLabel();
|
||||
label->setPixmap(QPixmap::fromImage(preview.previewImage));
|
||||
@ -139,6 +141,7 @@ void MainWindow::pdfPreviewReceived(PdfPreview preview)
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::lineEditReturnPressed()
|
||||
{
|
||||
@ -174,16 +177,11 @@ void MainWindow::handleSearchResults(const QVector<SearchResult> &results)
|
||||
item->setText(0, fileName);
|
||||
item->setText(1, result.fileData.absPath);
|
||||
item->setText(2, dt.toString(Qt::ISODate));
|
||||
|
||||
//TODO: this must be user defined or done more intelligently
|
||||
if(this->pdfSearchResults.size() < 300)
|
||||
{
|
||||
if(result.fileData.absPath.endsWith(".pdf"))
|
||||
{
|
||||
this->pdfSearchResults.append(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
ui->treeResultsList->resizeColumnToContents(0);
|
||||
ui->treeResultsList->resizeColumnToContents(1);
|
||||
pdfDirty = ! this->pdfSearchResults.empty();
|
||||
|
@ -9,6 +9,11 @@ public:
|
||||
QImage previewImage;
|
||||
QString documentPath;
|
||||
unsigned int page;
|
||||
|
||||
bool hasPreviewImage()
|
||||
{
|
||||
return ! previewImage.isNull();
|
||||
}
|
||||
};
|
||||
|
||||
#endif // PDFPREVIEW_H
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <QMutexLocker>
|
||||
#include <QtConcurrent/QtConcurrent>
|
||||
#include <QtConcurrent/QtConcurrentMap>
|
||||
#include <atomic>
|
||||
#include "pdfworker.h"
|
||||
|
||||
|
||||
@ -17,13 +18,25 @@ struct Renderer
|
||||
double scaleX;
|
||||
double scaleY;
|
||||
QHash<QString, Poppler::Document *> documentcache;
|
||||
Renderer(double scaleX, double scaleY)
|
||||
qsizetype maxTotalPreviewImageMemUsage;
|
||||
std::atomic<qsizetype> currentTotalPreviewImageMemUsage { 0 };
|
||||
|
||||
Renderer(double scaleX, double scaleY, qsizetype maxPreviewImageMemUsage)
|
||||
{
|
||||
this->scaleX = scaleX;
|
||||
this->scaleY = scaleY;
|
||||
this->maxTotalPreviewImageMemUsage = maxPreviewImageMemUsage;
|
||||
|
||||
}
|
||||
|
||||
/*we need this one because std::atomic has none, but this is only a functor for
|
||||
concurrentmap, thus, it's ok for it to be half-broken*/
|
||||
Renderer(const Renderer &o)
|
||||
{
|
||||
this->scaleX = o.scaleX;
|
||||
this->scaleY = o.scaleY;
|
||||
}
|
||||
|
||||
~Renderer()
|
||||
{
|
||||
qDeleteAll(documentcache);
|
||||
@ -38,7 +51,7 @@ struct Renderer
|
||||
Poppler::Document *result = Poppler::Document::load(path);
|
||||
if(result == nullptr)
|
||||
{
|
||||
//TODO: some kind of user feedback would be nicec
|
||||
//TODO: some kind of user feedback would be nice
|
||||
return nullptr;
|
||||
}
|
||||
result->setRenderHint(Poppler::Document::TextAntialiasing);
|
||||
@ -50,6 +63,9 @@ struct Renderer
|
||||
|
||||
|
||||
PdfPreview operator()(const PdfPreview &preview)
|
||||
{
|
||||
PdfPreview result = preview;
|
||||
if(currentTotalPreviewImageMemUsage.load() < maxTotalPreviewImageMemUsage)
|
||||
{
|
||||
Poppler::Document *doc = document(preview.documentPath);
|
||||
if(doc == nullptr)
|
||||
@ -66,8 +82,10 @@ struct Renderer
|
||||
p = 0;
|
||||
}
|
||||
Poppler::Page *pdfPage = doc->page(p);
|
||||
PdfPreview result = preview;
|
||||
result.previewImage = pdfPage->renderToImage(scaleX, scaleY);
|
||||
QImage img = pdfPage->renderToImage(scaleX, scaleY);
|
||||
result.previewImage = img;
|
||||
currentTotalPreviewImageMemUsage += img.sizeInBytes();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
@ -94,7 +112,9 @@ QFuture<PdfPreview> PdfWorker::generatePreviews(const QVector<SearchResult> path
|
||||
double scaleX = QGuiApplication::primaryScreen()->physicalDotsPerInchX() * scalefactor;
|
||||
double scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * scalefactor;
|
||||
|
||||
QSettings setting;
|
||||
qsizetype maxPreviewImageMemUsage = setting.value("maxpreviewimagesmemory", 1024 * 1024 * 1024).toLongLong();
|
||||
|
||||
return QtConcurrent::mapped(previews, Renderer(scaleX, scaleY));
|
||||
return QtConcurrent::mapped(previews, Renderer(scaleX, scaleY, maxPreviewImageMemUsage));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user