diff --git a/src/searchengine/searchengine.cpp b/src/searchengine/searchengine.cpp index fca7318df..cd287afe2 100644 --- a/src/searchengine/searchengine.cpp +++ b/src/searchengine/searchengine.cpp @@ -148,7 +148,8 @@ void SearchEngine::tab_changed(int t) {//when we switch from a tab that is not empty to another that is empty the download button //doesn't have to be available if (t>-1) {//-1 = no more tab - if (all_tab.at(tabWidget->currentIndex())->getCurrentSearchListModel()->rowCount()) { + currentSearchTab = all_tab.at(tabWidget->currentIndex()); + if (currentSearchTab->getCurrentSearchListModel()->rowCount()) { download_button->setEnabled(true); goToDescBtn->setEnabled(true); } @@ -156,6 +157,7 @@ void SearchEngine::tab_changed(int t) download_button->setEnabled(false); goToDescBtn->setEnabled(false); } + search_status->setText(currentSearchTab->status); } } @@ -194,6 +196,7 @@ void SearchEngine::on_search_button_clicked() { search_button->setText(tr("Search")); return; } + allTabsSetActiveState(false); } searchProcess->waitForFinished(); // Reload environment variables (proxy) @@ -207,6 +210,7 @@ void SearchEngine::on_search_button_clicked() { } // Tab Addition currentSearchTab = new SearchTab(this); + activeSearchTab = currentSearchTab; connect(currentSearchTab->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(saveResultsColumnsWidth())); all_tab.append(currentSearchTab); QString tabName = pattern; @@ -278,7 +282,8 @@ void SearchEngine::downloadTorrent(QString engine_url, QString torrent_url) { void SearchEngine::searchStarted() { // Update SearchEngine widgets - search_status->setText(tr("Searching...")); + activeSearchTab->status = tr("Searching..."); + search_status->setText(activeSearchTab->status); search_status->repaint(); search_button->setText(tr("Stop")); } @@ -298,8 +303,8 @@ void SearchEngine::readSearchOutput() { foreach (const QByteArray &line, lines_list) { appendSearchResult(QString::fromUtf8(line)); } - if (currentSearchTab) - currentSearchTab->getCurrentLabel()->setText(tr("Results")+QString::fromUtf8(" (")+QString::number(nb_search_results)+QString::fromUtf8("):")); + if (activeSearchTab) + activeSearchTab->getCurrentLabel()->setText(tr("Results")+QString::fromUtf8(" (")+QString::number(nb_search_results)+QString::fromUtf8("):")); } void SearchEngine::downloadFinished(int exitcode, QProcess::ExitStatus) { @@ -412,7 +417,7 @@ void SearchEngine::updateNova() { // Slot called when search is Finished // Search can be finished for 3 reasons : // Error | Stopped by user | Finished normally -void SearchEngine::searchFinished(int exitcode,QProcess::ExitStatus) { +void SearchEngine::searchFinished(int exitcode, QProcess::ExitStatus) { if (searchTimeout->isActive()) { searchTimeout->stop(); } @@ -422,24 +427,28 @@ void SearchEngine::searchFinished(int exitcode,QProcess::ExitStatus) { } if (exitcode) { #ifdef Q_OS_WIN - search_status->setText(tr("Search aborted")); + activeSearchTab->status = tr("Search aborted"); #else - search_status->setText(tr("An error occurred during search...")); + activeSearchTab->status = tr("An error occurred during search..."); #endif - }else{ + } else { if (search_stopped) { - search_status->setText(tr("Search aborted")); - }else{ + activeSearchTab->status = tr("Search aborted"); + } else { if (no_search_results) { - search_status->setText(tr("Search returned no results")); - }else{ - search_status->setText(tr("Search has finished")); + activeSearchTab->status = tr("Search returned no results"); + } else { + activeSearchTab->status = tr("Search has finished"); } } } - if (currentSearchTab) - currentSearchTab->getCurrentLabel()->setText(tr("Results", "i.e: Search results")+QString::fromUtf8(" (")+QString::number(nb_search_results)+QString::fromUtf8("):")); + if (activeSearchTab) + if (currentSearchTab == activeSearchTab) search_status->setText(activeSearchTab->status); + activeSearchTab->getCurrentLabel()->setText(tr("Results", "i.e: Search results")+QString::fromUtf8(" (")+QString::number(nb_search_results)+QString::fromUtf8("):")); + activeSearchTab->isActive = false; + activeSearchTab = 0; + search_button->setText(tr("Search")); } @@ -447,7 +456,7 @@ void SearchEngine::searchFinished(int exitcode,QProcess::ExitStatus) { // Line is in the following form : // file url | file name | file size | nb seeds | nb leechers | Search engine url void SearchEngine::appendSearchResult(const QString &line) { - if (!currentSearchTab) { + if (!activeSearchTab) { if (searchProcess->state() != QProcess::NotRunning) { searchProcess->terminate(); } @@ -462,9 +471,9 @@ void SearchEngine::appendSearchResult(const QString &line) { if (nb_fields < NB_PLUGIN_COLUMNS-1) { //-1 because desc_link is optional return; } - Q_ASSERT(currentSearchTab); + Q_ASSERT(activeSearchTab); // Add item to search result list - QStandardItemModel* cur_model = currentSearchTab->getCurrentSearchListModel(); + QStandardItemModel* cur_model = activeSearchTab->getCurrentSearchListModel(); Q_ASSERT(cur_model); int row = cur_model->rowCount(); cur_model->insertRow(row); @@ -498,8 +507,9 @@ void SearchEngine::appendSearchResult(const QString &line) { } void SearchEngine::closeTab(int index) { - if (index == tabWidget->indexOf(currentSearchTab)) { - qDebug("Deleted current search Tab"); + // Search is run for active tab so if user decided to close it, then stop search + if (activeSearchTab && index == tabWidget->indexOf(activeSearchTab)) { + qDebug("Closed active search Tab"); if (searchProcess->state() != QProcess::NotRunning) { searchProcess->terminate(); } @@ -507,7 +517,8 @@ void SearchEngine::closeTab(int index) { searchTimeout->stop(); } search_stopped = true; - currentSearchTab = 0; + if (currentSearchTab == activeSearchTab) currentSearchTab = 0; + activeSearchTab = 0; } delete all_tab.takeAt(index); if (!all_tab.size()) { @@ -544,3 +555,10 @@ void SearchEngine::on_goToDescBtn_clicked() } } } + +inline void SearchEngine::allTabsSetActiveState(bool newState) +{ + foreach(SearchTab *tab, all_tab) { + tab->isActive = newState; + } +} diff --git a/src/searchengine/searchengine.h b/src/searchengine/searchengine.h index d8803a101..861ff8f39 100644 --- a/src/searchengine/searchengine.h +++ b/src/searchengine/searchengine.h @@ -50,81 +50,83 @@ class QTimer; QT_END_NAMESPACE class SearchEngine : public QWidget, public Ui::search_engine{ - Q_OBJECT - Q_DISABLE_COPY(SearchEngine) + Q_OBJECT + Q_DISABLE_COPY(SearchEngine) private: - enum PluginColumn { PL_DL_LINK, PL_NAME, PL_SIZE, PL_SEEDS, PL_LEECHS, PL_ENGINE_URL, PL_DESC_LINK, NB_PLUGIN_COLUMNS }; + enum PluginColumn { PL_DL_LINK, PL_NAME, PL_SIZE, PL_SEEDS, PL_LEECHS, PL_ENGINE_URL, PL_DESC_LINK, NB_PLUGIN_COLUMNS }; public: - SearchEngine(MainWindow *mp_mainWindow); - ~SearchEngine(); - QString selectedCategory() const; - QString selectedEngine() const; + SearchEngine(MainWindow *mp_mainWindow); + ~SearchEngine(); + QString selectedCategory() const; + QString selectedEngine() const; - static qreal getPluginVersion(QString filePath) { - QFile plugin(filePath); - if (!plugin.exists()) { - qDebug("%s plugin does not exist, returning 0.0", qPrintable(filePath)); - return 0.0; + static qreal getPluginVersion(QString filePath) { + QFile plugin(filePath); + if (!plugin.exists()) { + qDebug("%s plugin does not exist, returning 0.0", qPrintable(filePath)); + return 0.0; + } + if (!plugin.open(QIODevice::ReadOnly | QIODevice::Text)) { + return 0.0; + } + qreal version = 0.0; + while (!plugin.atEnd()) { + QByteArray line = plugin.readLine(); + if (line.startsWith("#VERSION: ")) { + line = line.split(' ').last().trimmed(); + version = line.toFloat(); + qDebug("plugin %s version: %.2f", qPrintable(filePath), version); + break; + } + } + return version; } - if (!plugin.open(QIODevice::ReadOnly | QIODevice::Text)) { - return 0.0; - } - qreal version = 0.0; - while (!plugin.atEnd()) { - QByteArray line = plugin.readLine(); - if (line.startsWith("#VERSION: ")) { - line = line.split(' ').last().trimmed(); - version = line.toFloat(); - qDebug("plugin %s version: %.2f", qPrintable(filePath), version); - break; - } - } - return version; - } public slots: - void on_download_button_clicked(); - void downloadTorrent(QString engine_url, QString torrent_url); - void giveFocusToSearchInput(); + void on_download_button_clicked(); + void downloadTorrent(QString engine_url, QString torrent_url); + void giveFocusToSearchInput(); protected slots: - // Search slots - void tab_changed(int);//to prevent the use of the download button when the tab is empty - void on_search_button_clicked(); - void closeTab(int index); - void appendSearchResult(const QString &line); - void searchFinished(int exitcode,QProcess::ExitStatus); - void readSearchOutput(); - void searchStarted(); - void updateNova(); - void selectMultipleBox(const QString &text); - void on_enginesButton_clicked(); - void saveResultsColumnsWidth(); - void downloadFinished(int exitcode, QProcess::ExitStatus); - void fillCatCombobox(); - void fillEngineComboBox(); - void searchTextEdited(QString); + // Search slots + void tab_changed(int);//to prevent the use of the download button when the tab is empty + void on_search_button_clicked(); + void closeTab(int index); + void appendSearchResult(const QString &line); + void searchFinished(int exitcode,QProcess::ExitStatus); + void readSearchOutput(); + void searchStarted(); + void updateNova(); + void selectMultipleBox(const QString &text); + void on_enginesButton_clicked(); + void saveResultsColumnsWidth(); + void downloadFinished(int exitcode, QProcess::ExitStatus); + void fillCatCombobox(); + void fillEngineComboBox(); + void searchTextEdited(QString); private slots: - void on_goToDescBtn_clicked(); + void on_goToDescBtn_clicked(); private: - // Search related - LineEdit* search_pattern; - QProcess *searchProcess; - QList downloaders; - bool search_stopped; - bool no_search_results; - QByteArray search_result_line_truncated; - unsigned long nb_search_results; - SupportedEngines *supported_engines; - QTimer *searchTimeout; - QPointer currentSearchTab; - QList > all_tab; // To store all tabs - const SearchCategories full_cat_names; - MainWindow *mp_mainWindow; + // Search related + LineEdit* search_pattern; + QProcess *searchProcess; + QList downloaders; + bool search_stopped; + bool no_search_results; + QByteArray search_result_line_truncated; + unsigned long nb_search_results; + SupportedEngines *supported_engines; + QTimer *searchTimeout; + QPointer currentSearchTab; // Selected tab + QPointer activeSearchTab; // Tab with running search + QList > all_tab; // To store all tabs + const SearchCategories full_cat_names; + MainWindow *mp_mainWindow; + inline void allTabsSetActiveState(bool); }; #endif diff --git a/src/searchengine/searchtab.cpp b/src/searchengine/searchtab.cpp index d95043d46..2ddf645b3 100644 --- a/src/searchengine/searchtab.cpp +++ b/src/searchengine/searchtab.cpp @@ -42,101 +42,106 @@ 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, SearchSortModel::NB_SEARCH_COLUMNS); - SearchListModel->setHeaderData(SearchSortModel::NAME, Qt::Horizontal, tr("Name", "i.e: file name")); - SearchListModel->setHeaderData(SearchSortModel::SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); - SearchListModel->setHeaderData(SearchSortModel::SEEDS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources")); - SearchListModel->setHeaderData(SearchSortModel::LEECHS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources")); - SearchListModel->setHeaderData(SearchSortModel::ENGINE_URL, Qt::Horizontal, tr("Search engine")); - - proxyModel = new SearchSortModel(); - proxyModel->setDynamicSortFilter(true); - proxyModel->setSourceModel(SearchListModel); - resultsBrowser->setModel(proxyModel); - - SearchDelegate = new SearchListDelegate(); - resultsBrowser->setItemDelegate(SearchDelegate); - - resultsBrowser->hideColumn(SearchSortModel::DL_LINK); // Hide url column - resultsBrowser->hideColumn(SearchSortModel::DESC_LINK); - - 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); - } - - // Sort by Seeds - resultsBrowser->sortByColumn(SearchSortModel::SEEDS, Qt::DescendingOrder); + box = new QVBoxLayout(); + results_lbl = new QLabel(); + resultsBrowser = new QTreeView(); + resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection); + box->addWidget(results_lbl); + box->addWidget(resultsBrowser); + // New tab is created with new search + isActive = true; + + setLayout(box); + // Set Search results list model + SearchListModel = new QStandardItemModel(0, SearchSortModel::NB_SEARCH_COLUMNS); + SearchListModel->setHeaderData(SearchSortModel::NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + SearchListModel->setHeaderData(SearchSortModel::SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + SearchListModel->setHeaderData(SearchSortModel::SEEDS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources")); + SearchListModel->setHeaderData(SearchSortModel::LEECHS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources")); + SearchListModel->setHeaderData(SearchSortModel::ENGINE_URL, Qt::Horizontal, tr("Search engine")); + + proxyModel = new SearchSortModel(); + proxyModel->setDynamicSortFilter(true); + proxyModel->setSourceModel(SearchListModel); + resultsBrowser->setModel(proxyModel); + + SearchDelegate = new SearchListDelegate(); + resultsBrowser->setItemDelegate(SearchDelegate); + + resultsBrowser->hideColumn(SearchSortModel::DL_LINK); // Hide url column + resultsBrowser->hideColumn(SearchSortModel::DESC_LINK); + + 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); + } + + // Sort by Seeds + resultsBrowser->sortByColumn(SearchSortModel::SEEDS, Qt::DescendingOrder); } void SearchTab::downloadSelectedItem(const QModelIndex& index) { - QString engine_url = proxyModel->data(proxyModel->index(index.row(), SearchSortModel::ENGINE_URL)).toString(); - QString torrent_url = proxyModel->data(proxyModel->index(index.row(), SearchSortModel::DL_LINK)).toString(); - setRowColor(index.row(), "blue"); - parent->downloadTorrent(engine_url, torrent_url); + QString engine_url = proxyModel->data(proxyModel->index(index.row(), SearchSortModel::ENGINE_URL)).toString(); + QString torrent_url = proxyModel->data(proxyModel->index(index.row(), SearchSortModel::DL_LINK)).toString(); + setRowColor(index.row(), "blue"); + parent->downloadTorrent(engine_url, torrent_url); } SearchTab::~SearchTab() { - delete box; - delete results_lbl; - delete resultsBrowser; - delete SearchListModel; - delete proxyModel; - delete SearchDelegate; + delete box; + delete results_lbl; + delete resultsBrowser; + delete SearchListModel; + delete proxyModel; + delete SearchDelegate; } QHeaderView* SearchTab::header() const { - return resultsBrowser->header(); + return resultsBrowser->header(); } bool SearchTab::loadColWidthResultsList() { - QString line = Preferences::instance()->getSearchColsWidth(); - if (line.isEmpty()) - return false; - QStringList width_list = line.split(' '); - if (width_list.size() > SearchListModel->columnCount()) - return false; - unsigned int listSize = width_list.size(); - for (unsigned int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); - } - return true; + QString line = Preferences::instance()->getSearchColsWidth(); + if (line.isEmpty()) + return false; + + QStringList width_list = line.split(' '); + if (width_list.size() > SearchListModel->columnCount()) + return false; + + unsigned int listSize = width_list.size(); + for (unsigned int i=0; iheader()->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; } QSortFilterProxyModel* SearchTab::getCurrentSearchListProxy() const { - return proxyModel; + return proxyModel; } QStandardItemModel* SearchTab::getCurrentSearchListModel() const { - return SearchListModel; + return SearchListModel; } // Set the color of a row in data model diff --git a/src/searchengine/searchtab.h b/src/searchengine/searchtab.h index 3477258bb..7a8f27a64 100644 --- a/src/searchengine/searchtab.h +++ b/src/searchengine/searchtab.h @@ -47,32 +47,32 @@ class QStandardItemModel; QT_END_NAMESPACE class SearchTab: public QWidget, public Ui::search_engine { - Q_OBJECT + Q_OBJECT private: - QVBoxLayout *box; - QLabel *results_lbl; - QTreeView *resultsBrowser; - QStandardItemModel *SearchListModel; - SearchSortModel *proxyModel; - SearchListDelegate *SearchDelegate; - SearchEngine *parent; + QVBoxLayout *box; + QLabel *results_lbl; + QTreeView *resultsBrowser; + QStandardItemModel *SearchListModel; + SearchSortModel *proxyModel; + SearchListDelegate *SearchDelegate; + SearchEngine *parent; protected slots: - void downloadSelectedItem(const QModelIndex& index); + void downloadSelectedItem(const QModelIndex& index); public: - SearchTab(SearchEngine *parent); - ~SearchTab(); - bool loadColWidthResultsList(); - QLabel * getCurrentLabel(); - QStandardItemModel* getCurrentSearchListModel() const; - QSortFilterProxyModel* getCurrentSearchListProxy() const; - QTreeView * getCurrentTreeView(); - void setRowColor(int row, QString color); - QHeaderView* header() const; - - + SearchTab(SearchEngine *parent); + ~SearchTab(); + bool loadColWidthResultsList(); + QLabel * getCurrentLabel(); + QStandardItemModel* getCurrentSearchListModel() const; + QSortFilterProxyModel* getCurrentSearchListProxy() const; + QTreeView * getCurrentTreeView(); + void setRowColor(int row, QString color); + QHeaderView* header() const; + bool isActive; + QString status; }; #endif