gui: mainwindow: Refactor to use new PreviewCoordinator
This commit is contained in:
父節點
8485a25b21
當前提交
889725033a
@ -22,7 +22,6 @@
|
|||||||
#include "../shared/sqlitesearch.h"
|
#include "../shared/sqlitesearch.h"
|
||||||
#include "../shared/looqsgeneralexception.h"
|
#include "../shared/looqsgeneralexception.h"
|
||||||
#include "../shared/common.h"
|
#include "../shared/common.h"
|
||||||
#include "ipcpreviewclient.h"
|
|
||||||
#include "previewgenerator.h"
|
#include "previewgenerator.h"
|
||||||
#include "aboutdialog.h"
|
#include "aboutdialog.h"
|
||||||
|
|
||||||
@ -32,8 +31,7 @@ MainWindow::MainWindow(QWidget *parent, QString socketPath)
|
|||||||
this->progressDialog.cancel(); // because constructing it shows it, quite weird
|
this->progressDialog.cancel(); // because constructing it shows it, quite weird
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setWindowTitle(QCoreApplication::applicationName());
|
setWindowTitle(QCoreApplication::applicationName());
|
||||||
this->ipcPreviewClient.moveToThread(&this->ipcClientThread);
|
|
||||||
this->ipcPreviewClient.setSocketPath(socketPath);
|
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
|
|
||||||
this->dbFactory = new DatabaseFactory(Common::databasePath());
|
this->dbFactory = new DatabaseFactory(Common::databasePath());
|
||||||
@ -78,7 +76,7 @@ MainWindow::MainWindow(QWidget *parent, QString socketPath)
|
|||||||
ui->txtSearch->installEventFilter(this);
|
ui->txtSearch->installEventFilter(this);
|
||||||
ui->scrollArea->viewport()->installEventFilter(this);
|
ui->scrollArea->viewport()->installEventFilter(this);
|
||||||
|
|
||||||
this->ipcClientThread.start();
|
this->previewCoordinator.setSocketPath(socketPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::addPathToIndex()
|
void MainWindow::addPathToIndex()
|
||||||
@ -208,9 +206,9 @@ void MainWindow::connectSignals()
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
connect(&ipcPreviewClient, &IPCPreviewClient::previewReceived, this, &MainWindow::previewReceived,
|
connect(&previewCoordinator, &PreviewCoordinator::previewReady, this, &MainWindow::previewReceived,
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
connect(&ipcPreviewClient, &IPCPreviewClient::finished, this,
|
connect(&previewCoordinator, &PreviewCoordinator::completedGeneration, this,
|
||||||
[&]
|
[&]
|
||||||
{
|
{
|
||||||
this->ui->previewProcessBar->setValue(this->ui->previewProcessBar->maximum());
|
this->ui->previewProcessBar->setValue(this->ui->previewProcessBar->maximum());
|
||||||
@ -218,17 +216,17 @@ void MainWindow::connectSignals()
|
|||||||
this->ui->comboPreviewFiles->setEnabled(true);
|
this->ui->comboPreviewFiles->setEnabled(true);
|
||||||
ui->txtSearch->setEnabled(true);
|
ui->txtSearch->setEnabled(true);
|
||||||
});
|
});
|
||||||
connect(&ipcPreviewClient, &IPCPreviewClient::error, this,
|
connect(&previewCoordinator, &PreviewCoordinator::error, this,
|
||||||
[this](QString msg)
|
[this](QString msg)
|
||||||
{
|
{
|
||||||
qCritical() << msg << Qt::endl;
|
qCritical() << msg << Qt::endl;
|
||||||
QMessageBox::critical(this, "IPC error", msg);
|
QMessageBox::critical(this, "IPC error", msg);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(this, &MainWindow::startIpcPreviews, &ipcPreviewClient, &IPCPreviewClient::startGeneration,
|
/*connect(this, &MainWindow::startIpcPreviews, &previewCoordinator, &IPCPreviewClient::startGeneration,
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
connect(this, &MainWindow::stopIpcPreviews, &ipcPreviewClient, &IPCPreviewClient::stopGeneration,
|
connect(this, &MainWindow::stopIpcPreviews, &ipcPreviewClient, &IPCPreviewClient::stopGeneration,
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection); */
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::exportFailedPaths()
|
void MainWindow::exportFailedPaths()
|
||||||
@ -632,13 +630,17 @@ void MainWindow::saveSettings()
|
|||||||
qApp->quit();
|
qApp->quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::previewReceived(QSharedPointer<PreviewResult> preview, unsigned int previewGeneration)
|
void MainWindow::previewReceived()
|
||||||
{
|
{
|
||||||
if(previewGeneration < this->currentPreviewGeneration)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this->ui->previewProcessBar->setValue(this->ui->previewProcessBar->value() + 1);
|
this->ui->previewProcessBar->setValue(this->ui->previewProcessBar->value() + 1);
|
||||||
|
QBoxLayout *layout = static_cast<QBoxLayout *>(ui->scrollAreaWidgetContents->layout());
|
||||||
|
int index = layout->count();
|
||||||
|
if(index > 0)
|
||||||
|
{
|
||||||
|
--index;
|
||||||
|
}
|
||||||
|
QSharedPointer<PreviewResult> preview = this->previewCoordinator.resultAt(index);
|
||||||
|
|
||||||
if(!preview.isNull() && preview->hasPreview())
|
if(!preview.isNull() && preview->hasPreview())
|
||||||
{
|
{
|
||||||
QString docPath = preview->getDocumentPath();
|
QString docPath = preview->getDocumentPath();
|
||||||
@ -684,24 +686,7 @@ void MainWindow::previewReceived(QSharedPointer<PreviewResult> preview, unsigned
|
|||||||
|
|
||||||
previewWidget->setLayout(previewLayout);
|
previewWidget->setLayout(previewLayout);
|
||||||
|
|
||||||
QBoxLayout *layout = static_cast<QBoxLayout *>(ui->scrollAreaWidgetContents->layout());
|
layout->insertWidget(index, previewWidget);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -818,7 +803,6 @@ void MainWindow::lineEditReturnPressed()
|
|||||||
|
|
||||||
void MainWindow::handleSearchResults(const QVector<SearchResult> &results)
|
void MainWindow::handleSearchResults(const QVector<SearchResult> &results)
|
||||||
{
|
{
|
||||||
this->previewableSearchResults.clear();
|
|
||||||
qDeleteAll(ui->scrollAreaWidgetContents->children());
|
qDeleteAll(ui->scrollAreaWidgetContents->children());
|
||||||
|
|
||||||
ui->treeResultsList->clear();
|
ui->treeResultsList->clear();
|
||||||
@ -827,6 +811,8 @@ void MainWindow::handleSearchResults(const QVector<SearchResult> &results)
|
|||||||
ui->comboPreviewFiles->setVisible(true);
|
ui->comboPreviewFiles->setVisible(true);
|
||||||
ui->lblTotalPreviewPagesCount->setText("");
|
ui->lblTotalPreviewPagesCount->setText("");
|
||||||
|
|
||||||
|
this->previewCoordinator.init(results);
|
||||||
|
|
||||||
bool hasDeleted = false;
|
bool hasDeleted = false;
|
||||||
QHash<QString, bool> seenMap;
|
QHash<QString, bool> seenMap;
|
||||||
for(const SearchResult &result : results)
|
for(const SearchResult &result : results)
|
||||||
@ -847,34 +833,29 @@ void MainWindow::handleSearchResults(const QVector<SearchResult> &results)
|
|||||||
item->setText(3, this->locale().formattedDataSize(result.fileData.size));
|
item->setText(3, this->locale().formattedDataSize(result.fileData.size));
|
||||||
}
|
}
|
||||||
bool exists = pathInfo.exists();
|
bool exists = pathInfo.exists();
|
||||||
if(exists)
|
if(!exists)
|
||||||
{
|
|
||||||
if(result.wasContentSearch)
|
|
||||||
{
|
|
||||||
if(!pathInfo.suffix().contains("htm")) // hack until we can preview them properly...
|
|
||||||
{
|
|
||||||
if(PreviewGenerator::get(pathInfo) != nullptr)
|
|
||||||
{
|
|
||||||
this->previewableSearchResults.append(result);
|
|
||||||
if(!seenMap.contains(result.fileData.absPath))
|
|
||||||
{
|
|
||||||
ui->comboPreviewFiles->addItem(result.fileData.absPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
hasDeleted = true;
|
hasDeleted = true;
|
||||||
}
|
}
|
||||||
seenMap[absPath] = true;
|
seenMap[absPath] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
seenMap.clear();
|
||||||
|
for(const SearchResult &result : this->previewCoordinator.getPreviewableSearchResults())
|
||||||
|
{
|
||||||
|
const QString &absPath = result.fileData.absPath;
|
||||||
|
if(!seenMap.contains(absPath))
|
||||||
|
{
|
||||||
|
ui->comboPreviewFiles->addItem(absPath);
|
||||||
|
}
|
||||||
|
seenMap[absPath] = true;
|
||||||
|
}
|
||||||
|
|
||||||
ui->treeResultsList->resizeColumnToContents(0);
|
ui->treeResultsList->resizeColumnToContents(0);
|
||||||
ui->treeResultsList->resizeColumnToContents(1);
|
ui->treeResultsList->resizeColumnToContents(1);
|
||||||
ui->treeResultsList->resizeColumnToContents(2);
|
ui->treeResultsList->resizeColumnToContents(2);
|
||||||
previewDirty = !this->previewableSearchResults.empty();
|
|
||||||
|
previewDirty = this->previewCoordinator.previewableCount() > 0;
|
||||||
|
|
||||||
ui->spinPreviewPage->setValue(1);
|
ui->spinPreviewPage->setValue(1);
|
||||||
|
|
||||||
@ -884,7 +865,7 @@ void MainWindow::handleSearchResults(const QVector<SearchResult> &results)
|
|||||||
}
|
}
|
||||||
|
|
||||||
QString statusText = "Results: " + QString::number(results.size()) + " files";
|
QString statusText = "Results: " + QString::number(results.size()) + " files";
|
||||||
statusText += ", previewable: " + QString::number(this->previewableSearchResults.count());
|
statusText += ", previewable: " + QString::number(this->previewCoordinator.previewableCount());
|
||||||
if(hasDeleted)
|
if(hasDeleted)
|
||||||
{
|
{
|
||||||
statusText += " WARNING: Some files are inaccessible. No preview available for those. Index may be out of sync";
|
statusText += " WARNING: Some files are inaccessible. No preview available for those. Index may be out of sync";
|
||||||
@ -901,7 +882,7 @@ int MainWindow::currentSelectedScale()
|
|||||||
|
|
||||||
void MainWindow::makePreviews(int page)
|
void MainWindow::makePreviews(int page)
|
||||||
{
|
{
|
||||||
if(this->previewableSearchResults.empty())
|
if(this->previewCoordinator.previewableCount() == 0)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -918,8 +899,7 @@ void MainWindow::makePreviews(int page)
|
|||||||
ui->scrollAreaWidgetContents->setLayout(new QVBoxLayout());
|
ui->scrollAreaWidgetContents->setLayout(new QVBoxLayout());
|
||||||
ui->scrollAreaWidgetContents->layout()->setAlignment(Qt::AlignCenter);
|
ui->scrollAreaWidgetContents->layout()->setAlignment(Qt::AlignCenter);
|
||||||
}
|
}
|
||||||
ui->previewProcessBar->setMaximum(this->previewableSearchResults.size());
|
ui->previewProcessBar->setMaximum(this->previewCoordinator.previewableCount());
|
||||||
processedPdfPreviews = 0;
|
|
||||||
|
|
||||||
QVector<QString> wordsToHighlight;
|
QVector<QString> wordsToHighlight;
|
||||||
QRegularExpression extractor(R"#("([^"]*)"|([^\s]+))#");
|
QRegularExpression extractor(R"#("([^"]*)"|([^\s]+))#");
|
||||||
@ -954,12 +934,9 @@ void MainWindow::makePreviews(int page)
|
|||||||
renderConfig.scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * (currentScale / 100.);
|
renderConfig.scaleY = QGuiApplication::primaryScreen()->physicalDotsPerInchY() * (currentScale / 100.);
|
||||||
renderConfig.wordsToHighlight = wordsToHighlight;
|
renderConfig.wordsToHighlight = wordsToHighlight;
|
||||||
|
|
||||||
this->previewOrder.clear();
|
|
||||||
this->previewWidgetOrderCache.clear();
|
|
||||||
|
|
||||||
int previewPos = 0;
|
int previewPos = 0;
|
||||||
QVector<RenderTarget> targets;
|
QVector<RenderTarget> targets;
|
||||||
for(SearchResult &sr : this->previewableSearchResults)
|
for(const SearchResult &sr : this->previewCoordinator.getPreviewableSearchResults())
|
||||||
{
|
{
|
||||||
if(ui->comboPreviewFiles->currentIndex() != 0)
|
if(ui->comboPreviewFiles->currentIndex() != 0)
|
||||||
{
|
{
|
||||||
@ -971,11 +948,8 @@ void MainWindow::makePreviews(int page)
|
|||||||
RenderTarget renderTarget;
|
RenderTarget renderTarget;
|
||||||
renderTarget.path = sr.fileData.absPath;
|
renderTarget.path = sr.fileData.absPath;
|
||||||
renderTarget.page = (int)sr.page;
|
renderTarget.page = (int)sr.page;
|
||||||
targets.append(renderTarget);
|
|
||||||
|
|
||||||
int pos = previewPos - beginOffset;
|
targets.append(renderTarget);
|
||||||
this->previewOrder[renderTarget.path + QString::number(renderTarget.page)] = pos;
|
|
||||||
++previewPos;
|
|
||||||
}
|
}
|
||||||
int numpages = ceil(static_cast<double>(targets.size()) / previewsPerPage);
|
int numpages = ceil(static_cast<double>(targets.size()) / previewsPerPage);
|
||||||
ui->spinPreviewPage->setMaximum(numpages);
|
ui->spinPreviewPage->setMaximum(numpages);
|
||||||
@ -985,12 +959,12 @@ void MainWindow::makePreviews(int page)
|
|||||||
ui->previewProcessBar->setMaximum(targets.count());
|
ui->previewProcessBar->setMaximum(targets.count());
|
||||||
ui->previewProcessBar->setMinimum(0);
|
ui->previewProcessBar->setMinimum(0);
|
||||||
ui->previewProcessBar->setValue(0);
|
ui->previewProcessBar->setValue(0);
|
||||||
ui->previewProcessBar->setVisible(this->previewableSearchResults.size() > 0);
|
ui->previewProcessBar->setVisible(this->previewCoordinator.previewableCount() > 0);
|
||||||
++this->currentPreviewGeneration;
|
|
||||||
this->ui->spinPreviewPage->setEnabled(false);
|
this->ui->spinPreviewPage->setEnabled(false);
|
||||||
this->ui->comboPreviewFiles->setEnabled(false);
|
this->ui->comboPreviewFiles->setEnabled(false);
|
||||||
this->ui->txtSearch->setEnabled(false);
|
this->ui->txtSearch->setEnabled(false);
|
||||||
emit startIpcPreviews(renderConfig, targets);
|
|
||||||
|
this->previewCoordinator.startGeneration(renderConfig, targets);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::handleSearchError(QString error)
|
void MainWindow::handleSearchError(QString error)
|
||||||
@ -1006,11 +980,12 @@ void MainWindow::createSearchResultMenu(QMenu &menu, const QFileInfo &fileInfo)
|
|||||||
[&fileInfo] { QGuiApplication::clipboard()->setText(fileInfo.absoluteFilePath()); });
|
[&fileInfo] { QGuiApplication::clipboard()->setText(fileInfo.absoluteFilePath()); });
|
||||||
menu.addAction("Open containing folder", [this, &fileInfo] { this->openFile(fileInfo.absolutePath()); });
|
menu.addAction("Open containing folder", [this, &fileInfo] { this->openFile(fileInfo.absolutePath()); });
|
||||||
|
|
||||||
|
auto previewables = this->previewCoordinator.getPreviewableSearchResults();
|
||||||
auto result =
|
auto result =
|
||||||
std::find_if(this->previewableSearchResults.begin(), this->previewableSearchResults.end(),
|
std::find_if(previewables.begin(), previewables.end(),
|
||||||
[this, &fileInfo](SearchResult &a) { return fileInfo.absoluteFilePath() == a.fileData.absPath; });
|
[this, &fileInfo](SearchResult &a) { return fileInfo.absoluteFilePath() == a.fileData.absPath; });
|
||||||
|
|
||||||
if(result != this->previewableSearchResults.end())
|
if(result != previewables.end())
|
||||||
{
|
{
|
||||||
menu.addAction("Show previews for this file",
|
menu.addAction("Show previews for this file",
|
||||||
[this, &fileInfo]
|
[this, &fileInfo]
|
||||||
@ -1069,7 +1044,6 @@ void MainWindow::showSearchResultsContextMenu(const QPoint &point)
|
|||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
{
|
{
|
||||||
syncerThread.terminate();
|
syncerThread.terminate();
|
||||||
ipcClientThread.terminate();
|
|
||||||
delete this->indexSyncer;
|
delete this->indexSyncer;
|
||||||
delete this->dbService;
|
delete this->dbService;
|
||||||
delete this->dbFactory;
|
delete this->dbFactory;
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <QProgressDialog>
|
#include <QProgressDialog>
|
||||||
#include "../shared/looqsquery.h"
|
#include "../shared/looqsquery.h"
|
||||||
#include "../shared/indexsyncer.h"
|
#include "../shared/indexsyncer.h"
|
||||||
#include "ipcpreviewclient.h"
|
#include "previewcoordinator.h"
|
||||||
#include "indexer.h"
|
#include "indexer.h"
|
||||||
namespace Ui
|
namespace Ui
|
||||||
{
|
{
|
||||||
@ -27,8 +27,9 @@ class MainWindow : public QMainWindow
|
|||||||
DatabaseFactory *dbFactory;
|
DatabaseFactory *dbFactory;
|
||||||
SqliteDbService *dbService;
|
SqliteDbService *dbService;
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
IPCPreviewClient ipcPreviewClient;
|
|
||||||
QThread ipcClientThread;
|
PreviewCoordinator previewCoordinator;
|
||||||
|
|
||||||
QThread syncerThread;
|
QThread syncerThread;
|
||||||
Indexer *indexer;
|
Indexer *indexer;
|
||||||
IndexSyncer *indexSyncer;
|
IndexSyncer *indexSyncer;
|
||||||
@ -36,18 +37,12 @@ class MainWindow : public QMainWindow
|
|||||||
QFileIconProvider iconProvider;
|
QFileIconProvider iconProvider;
|
||||||
QSqlDatabase db;
|
QSqlDatabase db;
|
||||||
QFutureWatcher<QVector<SearchResult>> searchWatcher;
|
QFutureWatcher<QVector<SearchResult>> searchWatcher;
|
||||||
QVector<SearchResult> previewableSearchResults;
|
|
||||||
LooqsQuery contentSearchQuery;
|
LooqsQuery contentSearchQuery;
|
||||||
QVector<QString> searchHistory;
|
QVector<QString> searchHistory;
|
||||||
int currentSearchHistoryIndex = 0;
|
int currentSearchHistoryIndex = 0;
|
||||||
QString currentSavedSearchText;
|
QString currentSavedSearchText;
|
||||||
QHash<QString, int> previewOrder; /* Quick lookup for the order a preview should have */
|
|
||||||
QMap<int, QWidget *>
|
|
||||||
previewWidgetOrderCache /* Saves those that arrived out of order to be inserted later at the correct pos */;
|
|
||||||
bool previewDirty = false;
|
bool previewDirty = false;
|
||||||
int previewsPerPage = 20;
|
int previewsPerPage = 20;
|
||||||
unsigned int processedPdfPreviews = 0;
|
|
||||||
unsigned int currentPreviewGeneration = 1;
|
|
||||||
|
|
||||||
void connectSignals();
|
void connectSignals();
|
||||||
void makePreviews(int page);
|
void makePreviews(int page);
|
||||||
@ -69,7 +64,7 @@ class MainWindow : public QMainWindow
|
|||||||
void treeSearchItemActivated(QTreeWidgetItem *item, int i);
|
void treeSearchItemActivated(QTreeWidgetItem *item, int i);
|
||||||
void showSearchResultsContextMenu(const QPoint &point);
|
void showSearchResultsContextMenu(const QPoint &point);
|
||||||
void tabChanged();
|
void tabChanged();
|
||||||
void previewReceived(QSharedPointer<PreviewResult> preview, unsigned int previewGeneration);
|
void previewReceived();
|
||||||
void comboScaleChanged(int i);
|
void comboScaleChanged(int i);
|
||||||
void spinPreviewPageValueChanged(int val);
|
void spinPreviewPageValueChanged(int val);
|
||||||
void startIndexing();
|
void startIndexing();
|
||||||
|
載入中…
新增問題並參考
Block a user