From 4fe22dbc57b44062a4ddad6139f66fdfa007e727 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Thu, 27 Aug 2009 12:37:39 +0000 Subject: [PATCH] - Rewrote Column sorting code in search result lists --- src/SearchTab.cpp | 154 ++++++++++++++++--------------------------- src/SearchTab.h | 50 +++++++------- src/searchEngine.cpp | 46 +++++++------ src/searchEngine.h | 3 +- src/src.pro | 2 +- 5 files changed, 107 insertions(+), 148 deletions(-) diff --git a/src/SearchTab.cpp b/src/SearchTab.cpp index 8d487da8f..e542f10db 100644 --- a/src/SearchTab.cpp +++ b/src/SearchTab.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "SearchTab.h" #include "SearchListDelegate.h" @@ -45,45 +46,60 @@ #define SEARCH_LEECHERS 3 #define SEARCH_ENGINE 4 -SearchTab::SearchTab(SearchEngine *parent) : QWidget() +SearchTab::SearchTab(SearchEngine *parent) : QWidget(), parent(parent) { - box=new QVBoxLayout(); - results_lbl=new QLabel(); - resultsBrowser = new QTreeView(); - resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection); - box->addWidget(results_lbl); - box->addWidget(resultsBrowser); - - setLayout(box); - // Set Search results list model - SearchListModel = new QStandardItemModel(0,6); - SearchListModel->setHeaderData(SEARCH_NAME, Qt::Horizontal, tr("Name", "i.e: file name")); - SearchListModel->setHeaderData(SEARCH_SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); - SearchListModel->setHeaderData(SEARCH_SEEDERS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources")); - SearchListModel->setHeaderData(SEARCH_LEECHERS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources")); - SearchListModel->setHeaderData(SEARCH_ENGINE, Qt::Horizontal, tr("Search engine")); - resultsBrowser->setModel(SearchListModel); - resultsBrowser->hideColumn(URL_COLUMN); // Hide url column - SearchDelegate = new SearchListDelegate(); - resultsBrowser->setItemDelegate(SearchDelegate); - // Make search list header clickable for sorting - resultsBrowser->header()->setClickable(true); - resultsBrowser->header()->setSortIndicatorShown(true); - - // Connect signals to slots (search part) - connect(resultsBrowser, SIGNAL(doubleClicked(const QModelIndex&)), parent, SLOT(downloadSelectedItem(const QModelIndex&))); - connect(resultsBrowser->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortSearchList(int))); - - // Load last columns width for search results list - if(!loadColWidthResultsList()){ - resultsBrowser->header()->resizeSection(0, 275); - } + box=new QVBoxLayout(); + results_lbl=new QLabel(); + resultsBrowser = new QTreeView(); + resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection); + box->addWidget(results_lbl); + box->addWidget(resultsBrowser); + + setLayout(box); + // Set Search results list model + SearchListModel = new QStandardItemModel(0,6); + SearchListModel->setHeaderData(SEARCH_NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + SearchListModel->setHeaderData(SEARCH_SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + SearchListModel->setHeaderData(SEARCH_SEEDERS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources")); + SearchListModel->setHeaderData(SEARCH_LEECHERS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources")); + SearchListModel->setHeaderData(SEARCH_ENGINE, Qt::Horizontal, tr("Search engine")); + resultsBrowser->hideColumn(URL_COLUMN); // Hide url column + + proxyModel = new QSortFilterProxyModel(); + proxyModel->setDynamicSortFilter(true); + proxyModel->setSourceModel(SearchListModel); + resultsBrowser->setModel(proxyModel); + + SearchDelegate = new SearchListDelegate(); + resultsBrowser->setItemDelegate(SearchDelegate); + + resultsBrowser->setRootIsDecorated(false); + resultsBrowser->setAllColumnsShowFocus(true); + resultsBrowser->setSortingEnabled(true); + + // Connect signals to slots (search part) + connect(resultsBrowser, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(downloadSelectedItem(const QModelIndex&))); + + // Load last columns width for search results list + if(!loadColWidthResultsList()){ + resultsBrowser->header()->resizeSection(0, 275); + } +} + +void SearchTab::downloadSelectedItem(const QModelIndex& index) { + QString engine_url = proxyModel->data(proxyModel->index(index.row(), ENGINE_URL_COLUMN)).toString(); + QString torrent_url = proxyModel->data(proxyModel->index(index.row(), URL_COLUMN)).toString(); + setRowColor(index.row(), "red"); + parent->downloadTorrent(engine_url, torrent_url); } SearchTab::~SearchTab() { - delete resultsBrowser; - delete SearchListModel; - delete SearchDelegate; + delete box; + delete results_lbl; + delete resultsBrowser; + delete SearchListModel; + delete proxyModel; + delete SearchDelegate; } QHeaderView* SearchTab::header() const { @@ -100,87 +116,31 @@ bool SearchTab::loadColWidthResultsList() { return false; unsigned int listSize = width_list.size(); for(unsigned int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); + resultsBrowser->header()->resizeSection(i, width_list.at(i).toInt()); } return true; } QLabel* SearchTab::getCurrentLabel() { - return results_lbl; + return results_lbl; } QTreeView* SearchTab::getCurrentTreeView() { - return resultsBrowser; + return resultsBrowser; } QStandardItemModel* SearchTab::getCurrentSearchListModel() { - return SearchListModel; + return SearchListModel; } // Set the color of a row in data model void SearchTab::setRowColor(int row, QString color){ - for(int i=0; icolumnCount(); ++i){ - SearchListModel->setData(SearchListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole); + for(int i=0; icolumnCount(); ++i){ + proxyModel->setData(proxyModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole); } } -void SearchTab::sortSearchList(int index){ - static Qt::SortOrder sortOrder = Qt::AscendingOrder; - if(resultsBrowser->header()->sortIndicatorSection() == index){ - sortOrder = (sortOrder == Qt::DescendingOrder) ? Qt::AscendingOrder : Qt::DescendingOrder; ; - } - resultsBrowser->header()->setSortIndicator(index, sortOrder); - switch(index){ - case SEEDERS: - case LEECHERS: - case SIZE: - sortSearchListInt(index, sortOrder); - break; - default: - sortSearchListString(index, sortOrder); - } -} - -void SearchTab::sortSearchListInt(int index, Qt::SortOrder sortOrder){ - QList > lines; - // Insertion sorting - for(int i=0; irowCount(); ++i){ - misc::insertSort(lines, QPair(i, SearchListModel->data(SearchListModel->index(i, index)).toLongLong()), sortOrder); - } - // Insert items in new model, in correct order - int nbRows_old = lines.size(); - for(int row=0; rowinsertRow(SearchListModel->rowCount()); - int sourceRow = lines[row].first; - for(int col=0; col<6; ++col){ - SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col))); - SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole); - } - } - // Remove old rows - SearchListModel->removeRows(0, nbRows_old); -} - -void SearchTab::sortSearchListString(int index, Qt::SortOrder sortOrder){ - QList > lines; - // Insetion sorting - for(int i=0; irowCount(); ++i){ - misc::insertSortString(lines, QPair(i, SearchListModel->data(SearchListModel->index(i, index)).toString()), sortOrder); - } - // Insert items in new model, in correct order - int nbRows_old = lines.size(); - for(int row=0; rowinsertRow(SearchListModel->rowCount()); - int sourceRow = lines[row].first; - for(int col=0; col<6; ++col){ - SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col))); - SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole); - } - } - // Remove old rows - SearchListModel->removeRows(0, nbRows_old); -} diff --git a/src/SearchTab.h b/src/SearchTab.h index d5d014f62..6762c257a 100644 --- a/src/SearchTab.h +++ b/src/SearchTab.h @@ -41,32 +41,34 @@ class SearchEngine; class QTreeView; class QHeaderView; class QStandardItemModel; +class QSortFilterProxyModel; + +class SearchTab: public QWidget, public Ui::search_engine { + Q_OBJECT + +private: + QVBoxLayout *box; + QLabel *results_lbl; + QTreeView *resultsBrowser; + QStandardItemModel *SearchListModel; + QSortFilterProxyModel *proxyModel; + SearchListDelegate *SearchDelegate; + SearchEngine *parent; + +protected slots: + void downloadSelectedItem(const QModelIndex& index); + +public: + SearchTab(SearchEngine *parent); + ~SearchTab(); + bool loadColWidthResultsList(); + QLabel * getCurrentLabel(); + QStandardItemModel * getCurrentSearchListModel(); + QTreeView * getCurrentTreeView(); + void setRowColor(int row, QString color); + QHeaderView* header() const; -class SearchTab : public QWidget, public Ui::search_engine -{ - Q_OBJECT - - private: - QVBoxLayout *box; - QLabel *results_lbl; - QTreeView *resultsBrowser; - QStandardItemModel *SearchListModel; - SearchListDelegate *SearchDelegate; - public: - SearchTab(SearchEngine *parent); - ~SearchTab(); - bool loadColWidthResultsList(); - QLabel * getCurrentLabel(); - QStandardItemModel * getCurrentSearchListModel(); - QTreeView * getCurrentTreeView(); - void setRowColor(int row, QString color); - QHeaderView* header() const; - protected slots: - void sortSearchList(int index); - void sortSearchListInt(int index, Qt::SortOrder sortOrder); - void sortSearchListString(int index, Qt::SortOrder sortOrder); - }; #endif diff --git a/src/searchEngine.cpp b/src/searchEngine.cpp index 029b3404f..94333406c 100644 --- a/src/searchEngine.cpp +++ b/src/searchEngine.cpp @@ -311,19 +311,6 @@ void SearchEngine::searchStarted(){ search_button->setText("Stop"); } -// Download the given item from search results list -void SearchEngine::downloadSelectedItem(const QModelIndex& index){ - int row = index.row(); - // Get Item url - QStandardItemModel *model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListModel(); - QString engine_url = model->data(model->index(index.row(), ENGINE_URL_COLUMN)).toString(); - QString torrent_url = model->data(model->index(index.row(), URL_COLUMN)).toString(); - // Download from url - downloadTorrent(engine_url, torrent_url); - // Set item color to RED - all_tab.at(tabWidget->currentIndex())->setRowColor(row, "red"); -} - // search Qprocess return output as soon as it gets new // stuff to read. We split it into lines and add each // line to search results calling appendSearchResult(). @@ -475,19 +462,30 @@ void SearchEngine::appendSearchResult(QString line){ if(parts.size() != 6){ return; } - QString url = parts.takeFirst().trimmed(); - QString filename = parts.first().trimmed(); - parts << url; + // Add item to search result list - int row = currentSearchTab->getCurrentSearchListModel()->rowCount(); - currentSearchTab->getCurrentSearchListModel()->insertRow(row); - for(int i=0; i<6; ++i){ - if(parts.at(i).trimmed().toFloat() == -1 && i != SIZE) - currentSearchTab->getCurrentSearchListModel()->setData(currentSearchTab->getCurrentSearchListModel()->index(row, i), tr("Unknown")); - else - currentSearchTab->getCurrentSearchListModel()->setData(currentSearchTab->getCurrentSearchListModel()->index(row, i), QVariant(parts.at(i).trimmed())); + QStandardItemModel *cur_model = currentSearchTab->getCurrentSearchListModel(); + int row = cur_model->rowCount(); + cur_model->insertRow(row); + + cur_model->setData(cur_model->index(row, 5), parts.at(0).trimmed()); // download URL + cur_model->setData(cur_model->index(row, 0), parts.at(1).trimmed()); // Name + cur_model->setData(cur_model->index(row, 1), parts.at(2).trimmed().toLongLong()); // Size + bool ok = false; + qlonglong nb_seeders = parts.at(3).trimmed().toLongLong(&ok); + if(!ok || nb_seeders < 0) { + cur_model->setData(cur_model->index(row, 2), tr("Unknown")); // Seeders + } else { + cur_model->setData(cur_model->index(row, 2), nb_seeders); // Seeders } - // Add url to searchResultsUrls associative array + qlonglong nb_leechers = parts.at(4).trimmed().toLongLong(&ok); + if(!ok || nb_leechers < 0) { + cur_model->setData(cur_model->index(row, 3), tr("Unknown")); // Leechers + } else { + cur_model->setData(cur_model->index(row, 3), nb_leechers); // Leechers + } + cur_model->setData(cur_model->index(row, 4), parts.at(5).trimmed()); // Engine URL + no_search_results = false; ++nb_search_results; // Enable clear & download buttons diff --git a/src/searchEngine.h b/src/searchEngine.h index a3f96bc27..bb30a64b4 100644 --- a/src/searchEngine.h +++ b/src/searchEngine.h @@ -78,7 +78,7 @@ public: public slots: void on_download_button_clicked(); - void downloadSelectedItem(const QModelIndex& index); + void downloadTorrent(QString engine_url, QString torrent_url); protected slots: // Search slots @@ -96,7 +96,6 @@ protected slots: void propagateSectionResized(int index, int oldsize , int newsize); void saveResultsColumnsWidth(); void downloadFinished(int exitcode, QProcess::ExitStatus); - void downloadTorrent(QString engine_url, QString torrent_url); void displayPatternContextMenu(QPoint); void createCompleter(); void fillCatCombobox(); diff --git a/src/src.pro b/src/src.pro index f48c536cd..f23ae081e 100644 --- a/src/src.pro +++ b/src/src.pro @@ -14,7 +14,7 @@ CONFIG += qt \ network # Update this VERSION for each release -DEFINES += VERSION=\\\"v1.5.0rc2\\\" +DEFINES += VERSION=\\\"v1.5.0rc3\\\" DEFINES += VERSION_MAJOR=1 DEFINES += VERSION_MINOR=5 DEFINES += VERSION_BUGFIX=0