diff --git a/src/searchengine/search.ui b/src/searchengine/search.ui index fb59f6938..2b1ce6f6a 100644 --- a/src/searchengine/search.ui +++ b/src/searchengine/search.ui @@ -19,6 +19,9 @@ + + + diff --git a/src/searchengine/searchengine.cpp b/src/searchengine/searchengine.cpp index d4ccadf31..36eec7313 100644 --- a/src/searchengine/searchengine.cpp +++ b/src/searchengine/searchengine.cpp @@ -65,253 +65,277 @@ SearchEngine::SearchEngine(MainWindow* parent) , search_pattern(new LineEdit) , mp_mainWindow(parent) { - setupUi(this); - searchBarLayout->insertWidget(0, search_pattern); - connect(search_pattern, SIGNAL(returnPressed()), search_button, SLOT(click())); - // Icons - search_button->setIcon(IconProvider::instance()->getIcon("edit-find")); - download_button->setIcon(IconProvider::instance()->getIcon("download")); - goToDescBtn->setIcon(IconProvider::instance()->getIcon("application-x-mswinurl")); - enginesButton->setIcon(IconProvider::instance()->getIcon("preferences-system-network")); - tabWidget->setTabsClosable(true); - connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int))); - // Boolean initialization - search_stopped = false; - // Creating Search Process - searchProcess = new QProcess(this); - searchProcess->setEnvironment(QProcess::systemEnvironment()); - connect(searchProcess, SIGNAL(started()), this, SLOT(searchStarted())); - connect(searchProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readSearchOutput())); - connect(searchProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(searchFinished(int,QProcess::ExitStatus))); - connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int))); - searchTimeout = new QTimer(this); - searchTimeout->setSingleShot(true); - connect(searchTimeout, SIGNAL(timeout()), this, SLOT(on_search_button_clicked())); - // Update nova.py search plugin if necessary - updateNova(); - supported_engines = new SupportedEngines(); - // Fill in category combobox - fillCatCombobox(); - - connect(search_pattern, SIGNAL(textEdited(QString)), this, SLOT(searchTextEdited(QString))); + setupUi(this); + searchBarLayout->insertWidget(0, search_pattern); + connect(search_pattern, SIGNAL(returnPressed()), search_button, SLOT(click())); + // Icons + search_button->setIcon(IconProvider::instance()->getIcon("edit-find")); + download_button->setIcon(IconProvider::instance()->getIcon("download")); + goToDescBtn->setIcon(IconProvider::instance()->getIcon("application-x-mswinurl")); + enginesButton->setIcon(IconProvider::instance()->getIcon("preferences-system-network")); + tabWidget->setTabsClosable(true); + connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int))); + // Boolean initialization + search_stopped = false; + // Creating Search Process + searchProcess = new QProcess(this); + searchProcess->setEnvironment(QProcess::systemEnvironment()); + connect(searchProcess, SIGNAL(started()), this, SLOT(searchStarted())); + connect(searchProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readSearchOutput())); + connect(searchProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(searchFinished(int,QProcess::ExitStatus))); + connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int))); + searchTimeout = new QTimer(this); + searchTimeout->setSingleShot(true); + connect(searchTimeout, SIGNAL(timeout()), this, SLOT(on_search_button_clicked())); + // Update nova.py search plugin if necessary + updateNova(); + supported_engines = new SupportedEngines(); + // Fill in category combobox + fillCatCombobox(); + fillEngineComboBox(); + + connect(search_pattern, SIGNAL(textEdited(QString)), this, SLOT(searchTextEdited(QString))); + connect(selectEngine, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(selectMultipleBox(const QString&))); } void SearchEngine::fillCatCombobox() { - comboCategory->clear(); - comboCategory->addItem(full_cat_names["all"], QVariant("all")); - QStringList supported_cat = supported_engines->supportedCategories(); - foreach (QString cat, supported_cat) { - qDebug("Supported category: %s", qPrintable(cat)); - comboCategory->addItem(full_cat_names[cat], QVariant(cat)); + comboCategory->clear(); + comboCategory->addItem(full_cat_names["all"], QVariant("all")); + QStringList supported_cat = supported_engines->supportedCategories(); + foreach (QString cat, supported_cat) { + qDebug("Supported category: %s", qPrintable(cat)); + comboCategory->addItem(full_cat_names[cat], QVariant(cat)); } } +void SearchEngine::fillEngineComboBox() { + selectEngine->clear(); + selectEngine->addItem("All enabled", QVariant("enabled")); + selectEngine->addItem("All engines", QVariant("all")); + foreach (QString engi, supported_engines->enginesEnabled()) + selectEngine->addItem(engi, QVariant(engi)); + selectEngine->addItem("Multiple...", QVariant("multi")); +} + QString SearchEngine::selectedCategory() const { - return comboCategory->itemData(comboCategory->currentIndex()).toString(); + return comboCategory->itemData(comboCategory->currentIndex()).toString(); +} + +QString SearchEngine::selectedEngine() const { + return selectEngine->itemData(selectEngine->currentIndex()).toString(); } SearchEngine::~SearchEngine() { - qDebug("Search destruction"); - searchProcess->kill(); - searchProcess->waitForFinished(); - foreach (QProcess *downloader, downloaders) { - // Make sure we disconnect the SIGNAL/SLOT first - // To avoid qreal free - downloader->disconnect(); - downloader->kill(); - downloader->waitForFinished(); - delete downloader; - } - delete search_pattern; - delete searchTimeout; - delete searchProcess; - delete supported_engines; + qDebug("Search destruction"); + searchProcess->kill(); + searchProcess->waitForFinished(); + foreach (QProcess *downloader, downloaders) { + // Make sure we disconnect the SIGNAL/SLOT first + // To avoid qreal free + downloader->disconnect(); + downloader->kill(); + downloader->waitForFinished(); + delete downloader; + } + delete search_pattern; + delete searchTimeout; + delete searchProcess; + delete supported_engines; } 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()) { - download_button->setEnabled(true); - goToDescBtn->setEnabled(true); - } else { - download_button->setEnabled(false); - goToDescBtn->setEnabled(false); + if (t>-1) {//-1 = no more tab + if (all_tab.at(tabWidget->currentIndex())->getCurrentSearchListModel()->rowCount()) { + download_button->setEnabled(true); + goToDescBtn->setEnabled(true); + } + else { + download_button->setEnabled(false); + goToDescBtn->setEnabled(false); + } } - } +} + +void SearchEngine::selectMultipleBox(const QString &text) { + if (text == "Multiple...") on_enginesButton_clicked(); } void SearchEngine::on_enginesButton_clicked() { - engineSelectDlg *dlg = new engineSelectDlg(this, supported_engines); - connect(dlg, SIGNAL(enginesChanged()), this, SLOT(fillCatCombobox())); + engineSelectDlg *dlg = new engineSelectDlg(this, supported_engines); + connect(dlg, SIGNAL(enginesChanged()), this, SLOT(fillCatCombobox())); + connect(dlg, SIGNAL(enginesChanged()), this, SLOT(fillEngineComboBox())); } void SearchEngine::searchTextEdited(QString) { - // Enable search button - search_button->setText(tr("Search")); + // Enable search button + search_button->setText(tr("Search")); } void SearchEngine::giveFocusToSearchInput() { - search_pattern->setFocus(); + search_pattern->setFocus(); } // Function called when we click on search button void SearchEngine::on_search_button_clicked() { - if (searchProcess->state() != QProcess::NotRunning) { + if (searchProcess->state() != QProcess::NotRunning) { #ifdef Q_OS_WIN - searchProcess->kill(); + searchProcess->kill(); #else - searchProcess->terminate(); + searchProcess->terminate(); #endif - search_stopped = true; - if (searchTimeout->isActive()) { - searchTimeout->stop(); + search_stopped = true; + if (searchTimeout->isActive()) { + searchTimeout->stop(); + } + if (search_button->text() != tr("Search")) { + search_button->setText(tr("Search")); + return; + } } - if (search_button->text() != tr("Search")) { - search_button->setText(tr("Search")); - return; + searchProcess->waitForFinished(); + // Reload environment variables (proxy) + searchProcess->setEnvironment(QProcess::systemEnvironment()); + + const QString pattern = search_pattern->text().trimmed(); + // No search pattern entered + if (pattern.isEmpty()) { + QMessageBox::critical(0, tr("Empty search pattern"), tr("Please type a search pattern first")); + return; } - } - searchProcess->waitForFinished(); - // Reload environment variables (proxy) - searchProcess->setEnvironment(QProcess::systemEnvironment()); - - const QString pattern = search_pattern->text().trimmed(); - // No search pattern entered - if (pattern.isEmpty()) { - QMessageBox::critical(0, tr("Empty search pattern"), tr("Please type a search pattern first")); - return; - } - // Tab Addition - currentSearchTab=new SearchTab(this); - connect(currentSearchTab->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(propagateSectionResized(int,int,int))); - all_tab.append(currentSearchTab); - QString tabName = pattern; - tabName.replace(QRegExp("&{1}"), "&&"); - tabWidget->addTab(currentSearchTab, tabName); - tabWidget->setCurrentWidget(currentSearchTab); - - // Getting checked search engines - QStringList params; - search_stopped = false; - params << fsutils::toNativePath(fsutils::searchEngineLocation() + "/nova2.py"); - params << supported_engines->enginesEnabled().join(","); - qDebug("Search with category: %s", qPrintable(selectedCategory())); - params << selectedCategory(); - params << pattern.split(" "); - // Update SearchEngine widgets - no_search_results = true; - nb_search_results = 0; - search_result_line_truncated.clear(); - //on change le texte du label courrant - currentSearchTab->getCurrentLabel()->setText(tr("Results")+" (0):"); - // Launch search - searchProcess->start("python", params, QIODevice::ReadOnly); - searchTimeout->start(180000); // 3min + // Tab Addition + currentSearchTab = new SearchTab(this); + connect(currentSearchTab->header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(propagateSectionResized(int,int,int))); + all_tab.append(currentSearchTab); + QString tabName = pattern; + tabName.replace(QRegExp("&{1}"), "&&"); + tabWidget->addTab(currentSearchTab, tabName); + tabWidget->setCurrentWidget(currentSearchTab); + + // Getting checked search engines + QStringList params; + search_stopped = false; + params << fsutils::toNativePath(fsutils::searchEngineLocation() + "/nova2.py"); + if (selectedEngine() == "all") params << supported_engines->enginesAll().join(","); + else if (selectedEngine() == "enabled") params << supported_engines->enginesEnabled().join(","); + else if (selectedEngine() == "multi") params << supported_engines->enginesEnabled().join(","); + else params << selectedEngine(); + qDebug("Search with category: %s", qPrintable(selectedCategory())); + params << selectedCategory(); + params << pattern.split(" "); + // Update SearchEngine widgets + no_search_results = true; + nb_search_results = 0; + search_result_line_truncated.clear(); + //on change le texte du label courrant + currentSearchTab->getCurrentLabel()->setText(tr("Results")+" (0):"); + // Launch search + searchProcess->start("python", params, QIODevice::ReadOnly); + searchTimeout->start(180000); // 3min } void SearchEngine::propagateSectionResized(int index, int , int newsize) { - foreach (SearchTab * tab, all_tab) { - tab->getCurrentTreeView()->setColumnWidth(index, newsize); - } - saveResultsColumnsWidth(); + foreach (SearchTab * tab, all_tab) { + tab->getCurrentTreeView()->setColumnWidth(index, newsize); + } + saveResultsColumnsWidth(); } void SearchEngine::saveResultsColumnsWidth() { - if (all_tab.size() > 0) { - QTreeView* treeview = all_tab.first()->getCurrentTreeView(); - Preferences* const pref = Preferences::instance(); - QStringList width_list; - QStringList new_width_list; - short nbColumns = all_tab.first()->getCurrentSearchListModel()->columnCount(); - - QString line = pref->getSearchColsWidth(); - if (!line.isEmpty()) { - width_list = line.split(' '); - } - for (short i=0; icolumnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { - // load the former width - new_width_list << width_list.at(i); - } else if (treeview->columnWidth(i)>=1) { - // usual case, save the current width - new_width_list << QString::number(treeview->columnWidth(i)); - } else { - // default width - treeview->resizeColumnToContents(i); - new_width_list << QString::number(treeview->columnWidth(i)); - } + if (all_tab.size() > 0) { + QTreeView* treeview = all_tab.first()->getCurrentTreeView(); + Preferences* const pref = Preferences::instance(); + QStringList width_list; + QStringList new_width_list; + short nbColumns = all_tab.first()->getCurrentSearchListModel()->columnCount(); + + QString line = pref->getSearchColsWidth(); + if (!line.isEmpty()) { + width_list = line.split(' '); + } + + for (short i=0; icolumnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { + // load the former width + new_width_list << width_list.at(i); + } else if (treeview->columnWidth(i)>=1) { + // usual case, save the current width + new_width_list << QString::number(treeview->columnWidth(i)); + } else { + // default width + treeview->resizeColumnToContents(i); + new_width_list << QString::number(treeview->columnWidth(i)); + } + } + pref->setSearchColsWidth(new_width_list.join(" ")); } - pref->setSearchColsWidth(new_width_list.join(" ")); - } } void SearchEngine::downloadTorrent(QString engine_url, QString torrent_url) { - if (torrent_url.startsWith("bc://bt/", Qt::CaseInsensitive)) { - qDebug("Converting bc link to magnet link"); - torrent_url = misc::bcLinkToMagnet(torrent_url); - } - qDebug() << Q_FUNC_INFO << torrent_url; - if (torrent_url.startsWith("magnet:")) { - QStringList urls; - urls << torrent_url; - mp_mainWindow->downloadFromURLList(urls); - } else { - QProcess *downloadProcess = new QProcess(this); - downloadProcess->setEnvironment(QProcess::systemEnvironment()); - connect(downloadProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(downloadFinished(int,QProcess::ExitStatus))); - downloaders << downloadProcess; - QStringList params; - params << fsutils::toNativePath(fsutils::searchEngineLocation() + "/nova2dl.py"); - params << engine_url; - params << torrent_url; - // Launch search - downloadProcess->start("python", params, QIODevice::ReadOnly); - } + if (torrent_url.startsWith("bc://bt/", Qt::CaseInsensitive)) { + qDebug("Converting bc link to magnet link"); + torrent_url = misc::bcLinkToMagnet(torrent_url); + } + qDebug() << Q_FUNC_INFO << torrent_url; + if (torrent_url.startsWith("magnet:")) { + QStringList urls; + urls << torrent_url; + mp_mainWindow->downloadFromURLList(urls); + } else { + QProcess *downloadProcess = new QProcess(this); + downloadProcess->setEnvironment(QProcess::systemEnvironment()); + connect(downloadProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(downloadFinished(int,QProcess::ExitStatus))); + downloaders << downloadProcess; + QStringList params; + params << fsutils::toNativePath(fsutils::searchEngineLocation() + "/nova2dl.py"); + params << engine_url; + params << torrent_url; + // Launch search + downloadProcess->start("python", params, QIODevice::ReadOnly); + } } void SearchEngine::searchStarted() { - // Update SearchEngine widgets - search_status->setText(tr("Searching...")); - search_status->repaint(); - search_button->setText(tr("Stop")); + // Update SearchEngine widgets + search_status->setText(tr("Searching...")); + search_status->repaint(); + search_button->setText(tr("Stop")); } // 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(). void SearchEngine::readSearchOutput() { - QByteArray output = searchProcess->readAllStandardOutput(); - output.replace("\r", ""); - QList lines_list = output.split('\n'); - if (!search_result_line_truncated.isEmpty()) { - QByteArray end_of_line = lines_list.takeFirst(); - lines_list.prepend(search_result_line_truncated+end_of_line); - } - search_result_line_truncated = lines_list.takeLast().trimmed(); - 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("):")); + QByteArray output = searchProcess->readAllStandardOutput(); + output.replace("\r", ""); + QList lines_list = output.split('\n'); + if (!search_result_line_truncated.isEmpty()) { + QByteArray end_of_line = lines_list.takeFirst(); + lines_list.prepend(search_result_line_truncated+end_of_line); + } + search_result_line_truncated = lines_list.takeLast().trimmed(); + 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("):")); } void SearchEngine::downloadFinished(int exitcode, QProcess::ExitStatus) { - QProcess *downloadProcess = (QProcess*)sender(); - if (exitcode == 0) { - QString line = QString::fromUtf8(downloadProcess->readAllStandardOutput()).trimmed(); - QStringList parts = line.split(' '); - if (parts.size() == 2) { - QString path = parts[0]; - QString url = parts[1]; - QBtSession::instance()->processDownloadedFile(url, path); + QProcess *downloadProcess = (QProcess*)sender(); + if (exitcode == 0) { + QString line = QString::fromUtf8(downloadProcess->readAllStandardOutput()).trimmed(); + QStringList parts = line.split(' '); + if (parts.size() == 2) { + QString path = parts[0]; + QString url = parts[1]; + QBtSession::instance()->processDownloadedFile(url, path); + } } - } - qDebug("Deleting downloadProcess"); - downloaders.removeOne(downloadProcess); - delete downloadProcess; + qDebug("Deleting downloadProcess"); + downloaders.removeOne(downloadProcess); + delete downloadProcess; } static void removePythonScriptIfExists(const QString& script_path) @@ -322,215 +346,216 @@ static void removePythonScriptIfExists(const QString& script_path) // Update nova.py search plugin if necessary void SearchEngine::updateNova() { - qDebug("Updating nova"); - // create nova directory if necessary - QDir search_dir(fsutils::searchEngineLocation()); - QString nova_folder = misc::pythonVersion() >= 3 ? "nova3" : "nova"; - QFile package_file(search_dir.absoluteFilePath("__init__.py")); - package_file.open(QIODevice::WriteOnly | QIODevice::Text); - package_file.close(); - if (!search_dir.exists("engines")) { - search_dir.mkdir("engines"); - } - QFile package_file2(search_dir.absolutePath() + "/engines/__init__.py"); - package_file2.open(QIODevice::WriteOnly | QIODevice::Text); - package_file2.close(); - // Copy search plugin files (if necessary) - QString filePath = search_dir.absoluteFilePath("nova2.py"); - if (getPluginVersion(":/"+nova_folder+"/nova2.py") > getPluginVersion(filePath)) { - removePythonScriptIfExists(filePath); - QFile::copy(":/"+nova_folder+"/nova2.py", filePath); - } - - filePath = search_dir.absoluteFilePath("nova2dl.py"); - if (getPluginVersion(":/"+nova_folder+"/nova2dl.py") > getPluginVersion(filePath)) { - removePythonScriptIfExists(filePath); - QFile::copy(":/"+nova_folder+"/nova2dl.py", filePath); - } + qDebug("Updating nova"); + // create nova directory if necessary + QDir search_dir(fsutils::searchEngineLocation()); + QString nova_folder = misc::pythonVersion() >= 3 ? "nova3" : "nova"; + QFile package_file(search_dir.absoluteFilePath("__init__.py")); + package_file.open(QIODevice::WriteOnly | QIODevice::Text); + package_file.close(); + if (!search_dir.exists("engines")) { + search_dir.mkdir("engines"); + } + QFile package_file2(search_dir.absolutePath() + "/engines/__init__.py"); + package_file2.open(QIODevice::WriteOnly | QIODevice::Text); + package_file2.close(); + // Copy search plugin files (if necessary) + QString filePath = search_dir.absoluteFilePath("nova2.py"); + if (getPluginVersion(":/"+nova_folder+"/nova2.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/"+nova_folder+"/nova2.py", filePath); + } - filePath = search_dir.absoluteFilePath("novaprinter.py"); - if (getPluginVersion(":/"+nova_folder+"/novaprinter.py") > getPluginVersion(filePath)) { - removePythonScriptIfExists(filePath); - QFile::copy(":/"+nova_folder+"/novaprinter.py", filePath); - } + filePath = search_dir.absoluteFilePath("nova2dl.py"); + if (getPluginVersion(":/"+nova_folder+"/nova2dl.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/"+nova_folder+"/nova2dl.py", filePath); + } - filePath = search_dir.absoluteFilePath("helpers.py"); - if (getPluginVersion(":/"+nova_folder+"/helpers.py") > getPluginVersion(filePath)) { - removePythonScriptIfExists(filePath); - QFile::copy(":/"+nova_folder+"/helpers.py", filePath); - } + filePath = search_dir.absoluteFilePath("novaprinter.py"); + if (getPluginVersion(":/"+nova_folder+"/novaprinter.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/"+nova_folder+"/novaprinter.py", filePath); + } - filePath = search_dir.absoluteFilePath("socks.py"); - removePythonScriptIfExists(filePath); - QFile::copy(":/"+nova_folder+"/socks.py", filePath); + filePath = search_dir.absoluteFilePath("helpers.py"); + if (getPluginVersion(":/"+nova_folder+"/helpers.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/"+nova_folder+"/helpers.py", filePath); + } - if (nova_folder == "nova") { - filePath = search_dir.absoluteFilePath("fix_encoding.py"); + filePath = search_dir.absoluteFilePath("socks.py"); removePythonScriptIfExists(filePath); - QFile::copy(":/"+nova_folder+"/fix_encoding.py", filePath); - } + QFile::copy(":/"+nova_folder+"/socks.py", filePath); - if (nova_folder == "nova3") { - filePath = search_dir.absoluteFilePath("sgmllib3.py"); - removePythonScriptIfExists(filePath); - QFile::copy(":/"+nova_folder+"/sgmllib3.py", filePath); - } - QDir destDir(QDir(fsutils::searchEngineLocation()).absoluteFilePath("engines")); - QDir shipped_subDir(":/"+nova_folder+"/engines/"); - QStringList files = shipped_subDir.entryList(); - foreach (const QString &file, files) { - QString shipped_file = shipped_subDir.absoluteFilePath(file); - // Copy python classes - if (file.endsWith(".py")) { - const QString dest_file = destDir.absoluteFilePath(file); - if (getPluginVersion(shipped_file) > getPluginVersion(dest_file) ) { - qDebug("shipped %s is more recent then local plugin, updating...", qPrintable(file)); - removePythonScriptIfExists(dest_file); - qDebug("%s copied to %s", qPrintable(shipped_file), qPrintable(dest_file)); - QFile::copy(shipped_file, dest_file); - } - } else { - // Copy icons - if (file.endsWith(".png")) { - if (!QFile::exists(destDir.absoluteFilePath(file))) { - QFile::copy(shipped_file, destDir.absoluteFilePath(file)); + if (nova_folder == "nova") { + filePath = search_dir.absoluteFilePath("fix_encoding.py"); + removePythonScriptIfExists(filePath); + QFile::copy(":/"+nova_folder+"/fix_encoding.py", filePath); + } + + if (nova_folder == "nova3") { + filePath = search_dir.absoluteFilePath("sgmllib3.py"); + removePythonScriptIfExists(filePath); + QFile::copy(":/"+nova_folder+"/sgmllib3.py", filePath); + } + QDir destDir(QDir(fsutils::searchEngineLocation()).absoluteFilePath("engines")); + QDir shipped_subDir(":/"+nova_folder+"/engines/"); + QStringList files = shipped_subDir.entryList(); + foreach (const QString &file, files) { + QString shipped_file = shipped_subDir.absoluteFilePath(file); + // Copy python classes + if (file.endsWith(".py")) { + const QString dest_file = destDir.absoluteFilePath(file); + if (getPluginVersion(shipped_file) > getPluginVersion(dest_file) ) { + qDebug("shipped %s is more recent then local plugin, updating...", qPrintable(file)); + removePythonScriptIfExists(dest_file); + qDebug("%s copied to %s", qPrintable(shipped_file), qPrintable(dest_file)); + QFile::copy(shipped_file, dest_file); + } + } else { + // Copy icons + if (file.endsWith(".png")) { + if (!QFile::exists(destDir.absoluteFilePath(file))) { + QFile::copy(shipped_file, destDir.absoluteFilePath(file)); + } + } } - } } - } } // 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) { - if (searchTimeout->isActive()) { - searchTimeout->stop(); - } - bool useNotificationBalloons = Preferences::instance()->useProgramNotification(); - if (useNotificationBalloons && mp_mainWindow->getCurrentTabWidget() != this) { - mp_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Search has finished")); - } - if (exitcode) { + if (searchTimeout->isActive()) { + searchTimeout->stop(); + } + bool useNotificationBalloons = Preferences::instance()->useProgramNotification(); + if (useNotificationBalloons && mp_mainWindow->getCurrentTabWidget() != this) { + mp_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Search has finished")); + } + if (exitcode) { #ifdef Q_OS_WIN - search_status->setText(tr("Search aborted")); + search_status->setText(tr("Search aborted")); #else - search_status->setText(tr("An error occurred during search...")); + search_status->setText(tr("An error occurred during search...")); #endif - }else{ - if (search_stopped) { - search_status->setText(tr("Search aborted")); }else{ - if (no_search_results) { - search_status->setText(tr("Search returned no results")); - }else{ - search_status->setText(tr("Search has finished")); - } + if (search_stopped) { + search_status->setText(tr("Search aborted")); + }else{ + if (no_search_results) { + search_status->setText(tr("Search returned no results")); + }else{ + search_status->setText(tr("Search has finished")); + } + } } - } - if (currentSearchTab) - currentSearchTab->getCurrentLabel()->setText(tr("Results", "i.e: Search results")+QString::fromUtf8(" (")+QString::number(nb_search_results)+QString::fromUtf8("):")); - search_button->setText(tr("Search")); + + if (currentSearchTab) + currentSearchTab->getCurrentLabel()->setText(tr("Results", "i.e: Search results")+QString::fromUtf8(" (")+QString::number(nb_search_results)+QString::fromUtf8("):")); + search_button->setText(tr("Search")); } // SLOT to append one line to search results list // 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 (searchProcess->state() != QProcess::NotRunning) { - searchProcess->terminate(); + if (!currentSearchTab) { + if (searchProcess->state() != QProcess::NotRunning) { + searchProcess->terminate(); + } + if (searchTimeout->isActive()) { + searchTimeout->stop(); + } + search_stopped = true; + return; } - if (searchTimeout->isActive()) { - searchTimeout->stop(); + const QStringList parts = line.split("|"); + const int nb_fields = parts.size(); + if (nb_fields < NB_PLUGIN_COLUMNS-1) { //-1 because desc_link is optional + return; } - search_stopped = true; - return; - } - const QStringList parts = line.split("|"); - const int nb_fields = parts.size(); - if (nb_fields < NB_PLUGIN_COLUMNS-1) { //-1 because desc_link is optional - return; - } - Q_ASSERT(currentSearchTab); - // Add item to search result list - QStandardItemModel* cur_model = currentSearchTab->getCurrentSearchListModel(); - Q_ASSERT(cur_model); - int row = cur_model->rowCount(); - cur_model->insertRow(row); - - cur_model->setData(cur_model->index(row, SearchSortModel::DL_LINK), parts.at(PL_DL_LINK).trimmed()); // download URL - cur_model->setData(cur_model->index(row, SearchSortModel::NAME), parts.at(PL_NAME).trimmed()); // Name - cur_model->setData(cur_model->index(row, SearchSortModel::SIZE), parts.at(PL_SIZE).trimmed().toLongLong()); // Size - bool ok = false; - qlonglong nb_seeders = parts.at(PL_SEEDS).trimmed().toLongLong(&ok); - if (!ok || nb_seeders < 0) { - cur_model->setData(cur_model->index(row, SearchSortModel::SEEDS), tr("Unknown")); // Seeders - } else { - cur_model->setData(cur_model->index(row, SearchSortModel::SEEDS), nb_seeders); // Seeders - } - qlonglong nb_leechers = parts.at(PL_LEECHS).trimmed().toLongLong(&ok); - if (!ok || nb_leechers < 0) { - cur_model->setData(cur_model->index(row, SearchSortModel::LEECHS), tr("Unknown")); // Leechers - } else { - cur_model->setData(cur_model->index(row, SearchSortModel::LEECHS), nb_leechers); // Leechers - } - cur_model->setData(cur_model->index(row, SearchSortModel::ENGINE_URL), parts.at(PL_ENGINE_URL).trimmed()); // Engine URL - // Description Link - if (nb_fields == NB_PLUGIN_COLUMNS) - cur_model->setData(cur_model->index(row, SearchSortModel::DESC_LINK), parts.at(PL_DESC_LINK).trimmed()); - - no_search_results = false; - ++nb_search_results; - // Enable clear & download buttons - download_button->setEnabled(true); - goToDescBtn->setEnabled(true); + Q_ASSERT(currentSearchTab); + // Add item to search result list + QStandardItemModel* cur_model = currentSearchTab->getCurrentSearchListModel(); + Q_ASSERT(cur_model); + int row = cur_model->rowCount(); + cur_model->insertRow(row); + + cur_model->setData(cur_model->index(row, SearchSortModel::DL_LINK), parts.at(PL_DL_LINK).trimmed()); // download URL + cur_model->setData(cur_model->index(row, SearchSortModel::NAME), parts.at(PL_NAME).trimmed()); // Name + cur_model->setData(cur_model->index(row, SearchSortModel::SIZE), parts.at(PL_SIZE).trimmed().toLongLong()); // Size + bool ok = false; + qlonglong nb_seeders = parts.at(PL_SEEDS).trimmed().toLongLong(&ok); + if (!ok || nb_seeders < 0) { + cur_model->setData(cur_model->index(row, SearchSortModel::SEEDS), tr("Unknown")); // Seeders + } else { + cur_model->setData(cur_model->index(row, SearchSortModel::SEEDS), nb_seeders); // Seeders + } + qlonglong nb_leechers = parts.at(PL_LEECHS).trimmed().toLongLong(&ok); + if (!ok || nb_leechers < 0) { + cur_model->setData(cur_model->index(row, SearchSortModel::LEECHS), tr("Unknown")); // Leechers + } else { + cur_model->setData(cur_model->index(row, SearchSortModel::LEECHS), nb_leechers); // Leechers + } + cur_model->setData(cur_model->index(row, SearchSortModel::ENGINE_URL), parts.at(PL_ENGINE_URL).trimmed()); // Engine URL + // Description Link + if (nb_fields == NB_PLUGIN_COLUMNS) + cur_model->setData(cur_model->index(row, SearchSortModel::DESC_LINK), parts.at(PL_DESC_LINK).trimmed()); + + no_search_results = false; + ++nb_search_results; + // Enable clear & download buttons + download_button->setEnabled(true); + goToDescBtn->setEnabled(true); } void SearchEngine::closeTab(int index) { - if (index == tabWidget->indexOf(currentSearchTab)) { - qDebug("Deleted current search Tab"); - if (searchProcess->state() != QProcess::NotRunning) { - searchProcess->terminate(); + if (index == tabWidget->indexOf(currentSearchTab)) { + qDebug("Deleted current search Tab"); + if (searchProcess->state() != QProcess::NotRunning) { + searchProcess->terminate(); + } + if (searchTimeout->isActive()) { + searchTimeout->stop(); + } + search_stopped = true; + currentSearchTab = 0; } - if (searchTimeout->isActive()) { - searchTimeout->stop(); + delete all_tab.takeAt(index); + if (!all_tab.size()) { + download_button->setEnabled(false); + goToDescBtn->setEnabled(false); } - search_stopped = true; - currentSearchTab = 0; - } - delete all_tab.takeAt(index); - if (!all_tab.size()) { - download_button->setEnabled(false); - goToDescBtn->setEnabled(false); - } } // Download selected items in search results list void SearchEngine::on_download_button_clicked() { - //QModelIndexList selectedIndexes = currentSearchTab->getCurrentTreeView()->selectionModel()->selectedIndexes(); - QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); - foreach (const QModelIndex &index, selectedIndexes) { - if (index.column() == SearchSortModel::NAME) { - // Get Item url - QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy(); - QString torrent_url = model->data(model->index(index.row(), URL_COLUMN)).toString(); - QString engine_url = model->data(model->index(index.row(), ENGINE_URL_COLUMN)).toString(); - downloadTorrent(engine_url, torrent_url); - all_tab.at(tabWidget->currentIndex())->setRowColor(index.row(), "red"); + //QModelIndexList selectedIndexes = currentSearchTab->getCurrentTreeView()->selectionModel()->selectedIndexes(); + QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); + foreach (const QModelIndex &index, selectedIndexes) { + if (index.column() == SearchSortModel::NAME) { + // Get Item url + QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy(); + QString torrent_url = model->data(model->index(index.row(), URL_COLUMN)).toString(); + QString engine_url = model->data(model->index(index.row(), ENGINE_URL_COLUMN)).toString(); + downloadTorrent(engine_url, torrent_url); + all_tab.at(tabWidget->currentIndex())->setRowColor(index.row(), "red"); + } } - } } void SearchEngine::on_goToDescBtn_clicked() { - QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); - foreach (const QModelIndex &index, selectedIndexes) { - if (index.column() == SearchSortModel::NAME) { - QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy(); - const QString desc_url = model->data(model->index(index.row(), SearchSortModel::DESC_LINK)).toString(); - if (!desc_url.isEmpty()) - QDesktopServices::openUrl(QUrl::fromEncoded(desc_url.toUtf8())); + QModelIndexList selectedIndexes = all_tab.at(tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); + foreach (const QModelIndex &index, selectedIndexes) { + if (index.column() == SearchSortModel::NAME) { + QSortFilterProxyModel* model = all_tab.at(tabWidget->currentIndex())->getCurrentSearchListProxy(); + const QString desc_url = model->data(model->index(index.row(), SearchSortModel::DESC_LINK)).toString(); + if (!desc_url.isEmpty()) + QDesktopServices::openUrl(QUrl::fromEncoded(desc_url.toUtf8())); + } } - } } diff --git a/src/searchengine/searchengine.h b/src/searchengine/searchengine.h index c53d9f8bc..a56e41ea5 100644 --- a/src/searchengine/searchengine.h +++ b/src/searchengine/searchengine.h @@ -60,6 +60,7 @@ public: SearchEngine(MainWindow *mp_mainWindow); ~SearchEngine(); QString selectedCategory() const; + QString selectedEngine() const; static qreal getPluginVersion(QString filePath) { QFile plugin(filePath); @@ -98,11 +99,13 @@ protected slots: void readSearchOutput(); void searchStarted(); void updateNova(); + void selectMultipleBox(const QString &text); void on_enginesButton_clicked(); void propagateSectionResized(int index, int oldsize , int newsize); void saveResultsColumnsWidth(); void downloadFinished(int exitcode, QProcess::ExitStatus); void fillCatCombobox(); + void fillEngineComboBox(); void searchTextEdited(QString); private slots: diff --git a/src/searchengine/supportedengines.h b/src/searchengine/supportedengines.h index 80c3b3369..62c568d3b 100644 --- a/src/searchengine/supportedengines.h +++ b/src/searchengine/supportedengines.h @@ -113,6 +113,12 @@ public: qDeleteAll(this->values()); } + QStringList enginesAll() const { + QStringList engines; + foreach (const SupportedEngine *engine, values()) engines << engine->getName(); + return engines; + } + QStringList enginesEnabled() const { QStringList engines; foreach (const SupportedEngine *engine, values()) {