diff --git a/gui/main.cpp b/gui/main.cpp index a02c1ea..5b77bce 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -116,9 +116,10 @@ int main(int argc, char *argv[]) qRegisterMetaType>("QVector"); qRegisterMetaType("PreviewResultPdf"); qRegisterMetaType("FileScanResult"); - - IPCClient client{socketPath}; - MainWindow w{0, client}; + qRegisterMetaType("RenderConfig"); + qRegisterMetaType>("QVector"); + qRegisterMetaType>("QSharedPointer"); + MainWindow w{0, socketPath}; w.showMaximized(); return a.exec(); } diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index a0733b0..ba06eda 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -13,18 +13,33 @@ #include #include #include +#include #include "mainwindow.h" #include "ui_mainwindow.h" #include "clicklabel.h" #include "../shared/sqlitesearch.h" #include "../shared/looqsgeneralexception.h" #include "../shared/common.h" +#include "ipcpreviewclient.h" +#include "previewgenerator.h" -MainWindow::MainWindow(QWidget *parent, IPCClient &client) : QMainWindow(parent), ui(new Ui::MainWindow) +MainWindow::MainWindow(QWidget *parent, QString socketPath) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setWindowTitle(QCoreApplication::applicationName()); - this->ipcClient = &client; + this->ipcPreviewClient.moveToThread(&this->ipcClientThread); + this->ipcPreviewClient.setSocketPath(socketPath); + + connect(&ipcPreviewClient, &IPCPreviewClient::previewReceived, this, &MainWindow::previewReceived, + Qt::QueuedConnection); + connect(&ipcPreviewClient, &IPCPreviewClient::finished, this, + [&] { this->ui->previewProcessBar->setValue(this->ui->previewProcessBar->maximum()); }); + + connect(this, &MainWindow::startIpcPreviews, &ipcPreviewClient, &IPCPreviewClient::startGeneration, + Qt::QueuedConnection); + connect(this, &MainWindow::stopIpcPreviews, &ipcPreviewClient, &IPCPreviewClient::stopGeneration, + Qt::QueuedConnection); + this->ipcClientThread.start(); QSettings settings; this->dbFactory = new DatabaseFactory(Common::databasePath()); @@ -82,16 +97,6 @@ void MainWindow::connectSignals() handleSearchError(e.message); } }); - connect(&previewWorkerWatcher, &QFutureWatcher>::resultReadyAt, this, - [&](int index) { previewReceived(previewWorkerWatcher.resultAt(index)); }); - connect(&previewWorkerWatcher, &QFutureWatcher>::progressValueChanged, - ui->previewProcessBar, &QProgressBar::setValue); - connect(&previewWorkerWatcher, &QFutureWatcher>::started, this, - [&] { ui->indexerTab->setEnabled(false); }); - - connect(&previewWorkerWatcher, &QFutureWatcher>::finished, this, - [&] { ui->indexerTab->setEnabled(true); }); - connect(ui->treeResultsList, &QTreeWidget::itemActivated, this, &MainWindow::treeSearchItemActivated); connect(ui->treeResultsList, &QTreeWidget::customContextMenuRequested, this, &MainWindow::showSearchResultsContextMenu); @@ -261,9 +266,14 @@ void MainWindow::tabChanged() } } -void MainWindow::previewReceived(QSharedPointer preview) +void MainWindow::previewReceived(QSharedPointer preview, unsigned int previewGeneration) { - if(preview->hasPreview()) + if(previewGeneration < this->currentPreviewGeneration) + { + return; + } + this->ui->previewProcessBar->setValue(this->ui->previewProcessBar->value() + 1); + if(!preview.isNull() && preview->hasPreview()) { QString docPath = preview->getDocumentPath(); auto previewPage = preview->getPage(); @@ -376,12 +386,10 @@ void MainWindow::handleSearchResults(const QVector &results) void MainWindow::makePreviews(int page) { - - this->previewWorkerWatcher.cancel(); - this->previewWorkerWatcher.waitForFinished(); - - QCoreApplication::processEvents(); // Maybe not necessary anymore, depends on whether it's possible that a slot is - // still to be fired. + if(this->previewableSearchResults.empty()) + { + return; + } qDeleteAll(ui->scrollAreaWidgetContents->children()); ui->scrollAreaWidgetContents->setLayout(new QHBoxLayout()); @@ -409,14 +417,32 @@ void MainWindow::makePreviews(int page) } } } - PreviewWorker worker; int end = previewsPerPage; int begin = page * previewsPerPage - previewsPerPage; - this->previewWorkerWatcher.setFuture(worker.generatePreviews(this->previewableSearchResults.mid(begin, end), - wordsToHighlight, scaleText.toInt() / 100.)); - ui->previewProcessBar->setMaximum(this->previewWorkerWatcher.progressMaximum()); - ui->previewProcessBar->setMinimum(this->previewWorkerWatcher.progressMinimum()); + + RenderConfig renderConfig; + renderConfig.scaleX = QGuiApplication::primaryScreen()->physicalDotsPerInchX() * (scaleText.toInt() / 100.); + renderConfig.scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * (scaleText.toInt() / 100.); + renderConfig.wordsToHighlight = wordsToHighlight; + + QVector targets; + for(SearchResult &sr : this->previewableSearchResults.mid(begin, end)) + { + RenderTarget renderTarget; + renderTarget.path = sr.fileData.absPath; + + for(unsigned int pagenum : sr.pages) + { + renderTarget.page = (int)pagenum; + targets.append(renderTarget); + } + } + ui->previewProcessBar->setMaximum(targets.count()); + ui->previewProcessBar->setMinimum(0); + ui->previewProcessBar->setValue(0); ui->previewProcessBar->setVisible(this->previewableSearchResults.size() > 0); + ++this->currentPreviewGeneration; + emit startIpcPreviews(renderConfig, targets); } void MainWindow::handleSearchError(QString error) @@ -438,14 +464,14 @@ void MainWindow::ipcDocOpen(QString path, int num) QStringList args; args << path; args << QString::number(num); - this->ipcClient->sendCommand(DocOpen, args); + // this->ipcClient->sendCommand(DocOpen, args); } void MainWindow::ipcFileOpen(QString path) { QStringList args; args << path; - this->ipcClient->sendCommand(FileOpen, args); + // this->ipcClient->sendCommand(FileOpen, args); } void MainWindow::treeSearchItemActivated(QTreeWidgetItem *item, int i) diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 1693ac8..9b47d77 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -9,9 +9,8 @@ #include #include #include -#include "previewworker.h" #include "../shared/looqsquery.h" -#include "ipcclient.h" +#include "ipcpreviewclient.h" #include "indexer.h" namespace Ui { @@ -23,7 +22,7 @@ class MainWindow : public QMainWindow Q_OBJECT public: - explicit MainWindow(QWidget *parent, IPCClient &client); + explicit MainWindow(QWidget *parent, QString socketPath); ~MainWindow(); signals: void beginSearch(const QString &query); @@ -33,13 +32,14 @@ class MainWindow : public QMainWindow DatabaseFactory *dbFactory; SqliteDbService *dbService; Ui::MainWindow *ui; - IPCClient *ipcClient; + IPCPreviewClient ipcPreviewClient; + QThread ipcClientThread; + Indexer *indexer; QFileIconProvider iconProvider; bool previewDirty; QSqlDatabase db; QFutureWatcher> searchWatcher; - QFutureWatcher> previewWorkerWatcher; void add(QString path, unsigned int page); QVector previewableSearchResults; void connectSignals(); @@ -55,18 +55,22 @@ class MainWindow : public QMainWindow void createSearchResutlMenu(QMenu &menu, const QFileInfo &fileInfo); void ipcDocOpen(QString path, int num); void ipcFileOpen(QString path); - + unsigned int currentPreviewGeneration = 1; private slots: void lineEditReturnPressed(); void treeSearchItemActivated(QTreeWidgetItem *item, int i); void showSearchResultsContextMenu(const QPoint &point); void tabChanged(); - void previewReceived(QSharedPointer preview); + void previewReceived(QSharedPointer preview, unsigned int previewGeneration); void comboScaleChanged(int i); void spinPreviewPageValueChanged(int val); void startIndexing(); void finishIndexing(); void addPathToIndex(); + + signals: + void startIpcPreviews(RenderConfig config, const QVector &targets); + void stopIpcPreviews(); }; #endif // MAINWINDOW_H