From 42e9ac5f413c6a1a43281d1fc07f4f95b154939d Mon Sep 17 00:00:00 2001 From: Albert S Date: Wed, 19 Oct 2022 11:11:24 +0200 Subject: [PATCH] gui: previews: Ensure order matches relevance ranking Previously, the order of previews would depend simply on which generator would finish first. Fix this by caching out of order previews. This may cause a small delay but should overall be hardly noticable. --- gui/mainwindow.cpp | 25 +++++++++++++++++++++++-- gui/mainwindow.h | 4 ++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 6a3402e..216ffac 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -643,7 +643,6 @@ void MainWindow::previewReceived(QSharedPointer preview, unsigned { QString docPath = preview->getDocumentPath(); auto previewPage = preview->getPage(); - ClickLabel *headerLabel = new ClickLabel(); headerLabel->setText(QString("Path: ") + preview->getDocumentPath()); @@ -685,7 +684,24 @@ void MainWindow::previewReceived(QSharedPointer preview, unsigned previewWidget->setLayout(previewLayout); - ui->scrollAreaWidgetContents->layout()->addWidget(previewWidget); + QBoxLayout *layout = static_cast(ui->scrollAreaWidgetContents->layout()); + int pos = previewOrder[docPath + QString::number(previewPage)]; + if(pos <= layout->count()) + { + layout->insertWidget(pos, previewWidget); + for(auto it = previewWidgetOrderCache.constKeyValueBegin(); + it != previewWidgetOrderCache.constKeyValueEnd(); it++) + { + if(it->first <= layout->count()) + { + layout->insertWidget(it->first, it->second); + } + } + } + else + { + previewWidgetOrderCache[pos] = previewWidget; + } } } @@ -938,6 +954,10 @@ void MainWindow::makePreviews(int page) renderConfig.scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * (currentScale / 100.); renderConfig.wordsToHighlight = wordsToHighlight; + this->previewOrder.clear(); + this->previewWidgetOrderCache.clear(); + + int previewPos = 0; QVector targets; for(SearchResult &sr : this->previewableSearchResults) { @@ -952,6 +972,7 @@ void MainWindow::makePreviews(int page) renderTarget.path = sr.fileData.absPath; renderTarget.page = (int)sr.page; targets.append(renderTarget); + this->previewOrder[renderTarget.path + QString::number(renderTarget.page)] = previewPos++; } int numpages = ceil(static_cast(targets.size()) / previewsPerPage); ui->spinPreviewPage->setMaximum(numpages); diff --git a/gui/mainwindow.h b/gui/mainwindow.h index a9fb9a8..37f7da9 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -71,6 +71,10 @@ class MainWindow : public QMainWindow QVector searchHistory; int currentSearchHistoryIndex = 0; QString currentSavedSearchText; + QHash previewOrder; /* Quick lookup for the order a preview should have */ + QMap + previewWidgetOrderCache /* Saves those that arrived out of order to be inserted later at the correct pos */; + private slots: void lineEditReturnPressed(); void treeSearchItemActivated(QTreeWidgetItem *item, int i);