diff --git a/gui/pdfworker.cpp b/gui/pdfworker.cpp deleted file mode 100644 index b300f21..0000000 --- a/gui/pdfworker.cpp +++ /dev/null @@ -1,107 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "pdfworker.h" - -static QMutex cacheMutex; -struct Renderer -{ - - typedef PdfPreview result_type; - double scaleX; - double scaleY; - QHash documentcache; - QVector wordsToHighlight; - Renderer(double scaleX, double scaleY, QVector wordsToHighlight) - { - this->scaleX = scaleX; - this->scaleY = scaleY; - this->wordsToHighlight = wordsToHighlight; - } - - ~Renderer() - { - qDeleteAll(documentcache); - } - - Poppler::Document *document(QString path) - { - if(documentcache.contains(path)) - { - return documentcache.value(path); - } - Poppler::Document *result = Poppler::Document::load(path); - if(result == nullptr) - { - // TODO: some kind of user feedback would be nice - return nullptr; - } - result->setRenderHint(Poppler::Document::TextAntialiasing); - QMutexLocker locker(&cacheMutex); - documentcache.insert(path, result); - locker.unlock(); - return result; - } - - PdfPreview operator()(const PdfPreview &preview) - { - PdfPreview result = preview; - Poppler::Document *doc = document(preview.documentPath); - if(doc == nullptr) - { - return preview; - } - if(doc->isLocked()) - { - return preview; - } - int p = (int)preview.page - 1; - if(p < 0) - { - p = 0; - } - Poppler::Page *pdfPage = doc->page(p); - QImage img = pdfPage->renderToImage(scaleX, scaleY); - for(QString &word : wordsToHighlight) - { - QList rects = pdfPage->search(word, Poppler::Page::SearchFlag::IgnoreCase); - for(QRectF &rect : rects) - { - QPainter painter(&img); - painter.scale(scaleX / 72.0, scaleY / 72.0); - painter.fillRect(rect, QColor(255, 255, 0, 64)); - } - } - result.previewImage = img; - return result; - } -}; - -QFuture PdfWorker::generatePreviews(const QVector paths, QVector wordsToHighlight, - double scalefactor) -{ - QVector previews; - - for(const SearchResult &sr : paths) - { - for(int page : sr.pages) - { - PdfPreview p; - p.documentPath = sr.fileData.absPath; - p.page = page; - previews.append(p); - } - } - - double scaleX = QGuiApplication::primaryScreen()->physicalDotsPerInchX() * scalefactor; - double scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * scalefactor; - - return QtConcurrent::mapped(previews, Renderer(scaleX, scaleY, wordsToHighlight)); -} diff --git a/gui/pdfworker.h b/gui/pdfworker.h deleted file mode 100644 index 434d4d6..0000000 --- a/gui/pdfworker.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef PDFWORKER_H -#define PDFWORKER_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "pdfpreview.h" -#include "searchresult.h" - -class PdfWorker : public QObject -{ - Q_OBJECT - public: - QFuture generatePreviews(const QVector paths, QVector wordsToHighlight, - double scalefactor); -}; - -#endif // PDFWORKER_H diff --git a/gui/previewworker.cpp b/gui/previewworker.cpp new file mode 100644 index 0000000..9b43c2e --- /dev/null +++ b/gui/previewworker.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include +#include "previewworker.h" + +PreviewWorker::PreviewWorker() +{ +} + +QFuture> PreviewWorker::generatePreviews(const QVector paths, + QVector wordsToHighlight, + double scalefactor) +{ + QVector> previews; + + for(const SearchResult &sr : paths) + { + for(unsigned int page : sr.pages) + { + QSharedPointer ptr = + QSharedPointer(new PreviewResult{sr.fileData.absPath, page}); + previews.append(ptr); + } + } + + RenderConfig renderConfig; + renderConfig.scaleX = QGuiApplication::primaryScreen()->physicalDotsPerInchX() * scalefactor; + renderConfig.scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * scalefactor; + renderConfig.wordsToHighlight = wordsToHighlight; + + auto mapFunctor = new PreviewGeneratorMapFunctor(); + mapFunctor->setRenderConfig(renderConfig); + + return QtConcurrent::mapped(previews, *mapFunctor); +} diff --git a/gui/previewworker.h b/gui/previewworker.h new file mode 100644 index 0000000..16125d2 --- /dev/null +++ b/gui/previewworker.h @@ -0,0 +1,29 @@ +#ifndef PREVIEWWORKER_H +#define PREVIEWWORKER_H +#include +#include +#include +#include +#include +#include +#include +#include +#include "previewresultpdf.h" +#include "searchresult.h" +#include "previewgenerator.h" +#include "previewworker.h" +#include "previewgeneratorpdf.h" +#include "previewgeneratormapfunctor.h" + +class PreviewWorker : public QObject +{ + Q_OBJECT + public: + PreviewWorker(); + QSharedPointer createGenerator(QString path); + + QFuture> generatePreviews(const QVector paths, + QVector wordsToHighlight, double scalefactor); +}; + +#endif // PREVIEWWORKER_H