diff --git a/YACReaderLibrary/db/comic_model.cpp b/YACReaderLibrary/db/comic_model.cpp index abfa2aff..ea03a617 100644 --- a/YACReaderLibrary/db/comic_model.cpp +++ b/YACReaderLibrary/db/comic_model.cpp @@ -596,61 +596,25 @@ void ComicModel::setupReadingModelData(const QString &databasePath) endResetModel(); } -void ComicModel::setupModelData(const SearchModifiers modifier, const QString &filter, const QString &databasePath) +void ComicModel::setModelData(QList *data, const QString &databasePath) { - beginResetModel(); - qDeleteAll(_data); - _data.clear(); _databasePath = databasePath; - QString connectionName = ""; - { - QSqlDatabase db = DataBaseManagement::loadDatabase(databasePath); - QSqlQuery selectQuery(db); + beginResetModel(); - std::string queryString("SELECT ci.number,ci.title,c.fileName,ci.numPages,c.id,c.parentId,c.path,ci.hash,ci.read,ci.isBis,ci.currentPage,ci.rating,ci.hasBeenOpened " - "FROM comic c INNER JOIN comic_info ci ON (c.comicInfoId = ci.id) LEFT JOIN folder f ON (f.id == c.parentId) WHERE "); + qDeleteAll(_data); - try { - QueryParser parser; - auto result = parser.parse(filter.toStdString()); - result.buildSqlString(queryString); + _data.clear(); - switch (modifier) { - case YACReader::NoModifiers: - queryString += " LIMIT :limit"; - break; + QLOG_ERROR() << "-d2>" << data->size(); - case YACReader::OnlyRead: - queryString += " AND ci.read = 1 LIMIT :limit"; - break; + _data.append(*data); - case YACReader::OnlyUnread: - queryString += " AND ci.read = 0 LIMIT :limit"; - break; - - default: - queryString += " LIMIT :limit"; - QLOG_ERROR() << "not implemented"; - break; - } - selectQuery.prepare(queryString.c_str()); - selectQuery.bindValue(":limit", 500); //TODO, load this value from settings - result.bindValues(selectQuery); - - selectQuery.exec(); - - setupModelData(selectQuery); - } catch (const std::exception &e) { - QLOG_ERROR() << "Unable to parse query: " << e.what(); - } - - connectionName = db.connectionName(); - } - QSqlDatabase::removeDatabase(connectionName); endResetModel(); emit searchNumResults(_data.length()); + + delete data; } QString ComicModel::getComicPath(QModelIndex mi) diff --git a/YACReaderLibrary/db/comic_model.h b/YACReaderLibrary/db/comic_model.h index 263eaa43..b15e50e7 100644 --- a/YACReaderLibrary/db/comic_model.h +++ b/YACReaderLibrary/db/comic_model.h @@ -89,8 +89,6 @@ public: void setupReadingListModelData(unsigned long long int parentReadingList, const QString &databasePath); void setupFavoritesModelData(const QString &databasePath); void setupReadingModelData(const QString &databasePath); - //configures the model for showing the comics matching the filter criteria. - void setupModelData(const SearchModifiers modifier, const QString &filter, const QString &databasePath); //Métodos de conveniencia QStringList getPaths(const QString &_source); @@ -142,6 +140,8 @@ public slots: void addComicsToLabel(const QList &comicIds, qulonglong labelId); void addComicsToReadingList(const QList &comicIds, qulonglong readingListId); + void setModelData(QList *data, const QString &databasePath); + protected: private: void setupModelData(QSqlQuery &sqlquery); diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 8da72b0c..aad471a7 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -92,7 +92,7 @@ using namespace YACReader; LibraryWindow::LibraryWindow() - : QMainWindow(), fullscreen(false), previousFilter(""), fetching(false), status(LibraryWindow::Normal), removeError(false) + : QMainWindow(), fullscreen(false), previousFilter(""), fetching(false), status(LibraryWindow::Normal), removeError(false), comicQueryResultProcesor() { setupUI(); @@ -1053,10 +1053,9 @@ void LibraryWindow::createConnections() connect(optionsDialog, SIGNAL(optionsChanged()), this, SLOT(reloadOptions())); connect(optionsDialog, SIGNAL(editShortcuts()), editShortcutsDialog, SLOT(show())); - //Folders filter - //connect(clearFoldersFilter,SIGNAL(clicked()),foldersFilter,SLOT(clear())); + //Search filter connect(searchEdit, SIGNAL(filterChanged(YACReader::SearchModifiers, QString)), this, SLOT(setSearchFilter(YACReader::SearchModifiers, QString))); - //connect(includeComicsCheckBox,SIGNAL(stateChanged(int)),this,SLOT(searchInFiles(int))); + connect(&comicQueryResultProcesor, &ComicQueryResultProcesor::newData, this, &LibraryWindow::setComicSearchFilterData); //ContextMenus connect(openContainingFolderComicAction, SIGNAL(triggered()), this, SLOT(openContainingFolderComic())); @@ -2070,23 +2069,30 @@ void LibraryWindow::toNormal() void LibraryWindow::setSearchFilter(const YACReader::SearchModifiers modifier, QString filter) { if (!filter.isEmpty()) { - status = LibraryWindow::Searching; + //TODO move search query for folders to its own async processor foldersModelProxy->setFilter(modifier, filter, true); //includeComicsCheckBox->isChecked()); - comicsModel->setupModelData(modifier, filter, foldersModel->getDatabase()); - comicsViewsManager->comicsView->enableFilterMode(true); - comicsViewsManager->comicsView->setModel(comicsModel); //TODO, columns are messed up after ResetModel some times, this shouldn't be necesary - foldersView->expandAll(); - - if (comicsModel->rowCount() == 0) - comicsViewsManager->showNoSearchResultsView(); - else - comicsViewsManager->showComicsView(); + comicQueryResultProcesor.createModelData(modifier, filter, foldersModel->getDatabase()); } else if (status == LibraryWindow::Searching) { //if no searching, then ignore this clearSearchFilter(); navigationController->loadPreviousStatus(); } } +void LibraryWindow::setComicSearchFilterData(QList *data, const QString &databasePath) +{ + status = LibraryWindow::Searching; + + comicsModel->setModelData(data, databasePath); + comicsViewsManager->comicsView->enableFilterMode(true); + comicsViewsManager->comicsView->setModel(comicsModel); //TODO, columns are messed up after ResetModel some times, this shouldn't be necesary + foldersView->expandAll(); + + if (comicsModel->rowCount() == 0) + comicsViewsManager->showNoSearchResultsView(); + else + comicsViewsManager->showComicsView(); +} + void LibraryWindow::clearSearchFilter() { foldersModelProxy->clear(); diff --git a/YACReaderLibrary/library_window.h b/YACReaderLibrary/library_window.h index 993b58b9..e4ebeda7 100644 --- a/YACReaderLibrary/library_window.h +++ b/YACReaderLibrary/library_window.h @@ -10,6 +10,7 @@ #include "yacreader_libraries.h" #include "yacreader_navigation_controller.h" +#include "comic_query_result_procesor.h" #include @@ -327,6 +328,7 @@ public slots: void toNormal(); void toFullScreen(); void setSearchFilter(const YACReader::SearchModifiers modifier, QString filter); + void setComicSearchFilterData(QList *, const QString &); void clearSearchFilter(); void showProperties(); void exportLibrary(QString destPath); @@ -399,6 +401,7 @@ private: std::future upgradeLibraryFuture; TrayIconController *trayIconController; + ComicQueryResultProcesor comicQueryResultProcesor; }; #endif