diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 41130512e..78b1bac53 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -85,6 +85,9 @@ void qt_mac_set_dock_menu(QMenu *menu); #include "programupdater.h" #endif #include "powermanagement.h" +#ifdef Q_OS_WIN +#include "downloadthread.h" +#endif using namespace libtorrent; @@ -98,7 +101,11 @@ using namespace libtorrent; *****************************************************/ // Constructor -MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine) : QMainWindow(parent), m_posInitialized(false), force_exit(false) { +MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine) : QMainWindow(parent), m_posInitialized(false), force_exit(false) +#ifdef Q_OS_WIN +, has_python(false) +#endif +{ setupUi(this); Preferences* const pref = Preferences::instance(); @@ -249,9 +256,10 @@ MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine) : QMa actionRSS_Reader->setChecked(pref->isRSSEnabled()); actionSearch_engine->setChecked(pref->isSearchEnabled()); actionExecution_Logs->setChecked(pref->isExecutionLogEnabled()); - displaySearchTab(actionSearch_engine->isChecked()); displayRSSTab(actionRSS_Reader->isChecked()); on_actionExecution_Logs_triggered(actionExecution_Logs->isChecked()); + if (actionSearch_engine->isChecked()) + QTimer::singleShot(0, this, SLOT(on_actionSearch_engine_triggered())); // Auto shutdown actions QActionGroup * autoShutdownGroup = new QActionGroup(this); @@ -1317,7 +1325,27 @@ void MainWindow::on_actionRSS_Reader_triggered() { } void MainWindow::on_actionSearch_engine_triggered() { - Preferences::instance()->setSearchEnabled(actionSearch_engine->isChecked()); +#ifdef Q_OS_WIN + if (!has_python && actionSearch_engine->isChecked()) { + bool res = addPythonPathToEnv(); + if (res) + has_python = true; + else if (QMessageBox::question(this, tr("Missing Python Interpreter"), + tr("Python 2.x is required to use the search engine but it does not seem to be installed.\nDo you want to install it now?"), + QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { + // Download and Install Python + installPython(); + actionSearch_engine->setChecked(false); + Preferences::instance()->setSearchEnabled(false); + return; + } + else { + actionSearch_engine->setChecked(false); + Preferences::instance()->setSearchEnabled(false); + return; + } + } +#endif displaySearchTab(actionSearch_engine->isChecked()); } @@ -1467,3 +1495,65 @@ void MainWindow::checkProgramUpdate() { updater->checkForUpdates(); } #endif + +#ifdef Q_OS_WIN +bool MainWindow::addPythonPathToEnv() { + if (has_python) + return true; + QString python_path = Preferences::getPythonPath(); + if (!python_path.isEmpty()) { + // Add it to PATH envvar + QString path_envar = QString::fromLocal8Bit(qgetenv("PATH").constData()); + if (path_envar.isNull()) { + path_envar = ""; + } + path_envar = python_path+";"+path_envar; + qDebug("New PATH envvar is: %s", qPrintable(path_envar)); + qputenv("PATH", fsutils::toNativePath(path_envar).toLocal8Bit()); + return true; + } + return false; +} + +void MainWindow::installPython() { + setCursor(QCursor(Qt::WaitCursor)); + // Download python + DownloadThread *pydownloader = new DownloadThread(this); + connect(pydownloader, SIGNAL(downloadFinished(QString,QString)), this, SLOT(pythonDownloadSuccess(QString,QString))); + connect(pydownloader, SIGNAL(downloadFailure(QString,QString)), this, SLOT(pythonDownloadFailure(QString,QString))); + pydownloader->downloadUrl("http://python.org/ftp/python/2.7.3/python-2.7.3.msi"); +} + +void MainWindow::pythonDownloadSuccess(QString url, QString file_path) { + setCursor(QCursor(Qt::ArrowCursor)); + Q_UNUSED(url); + QFile::rename(file_path, file_path+".msi"); + QProcess installer; + qDebug("Launching Python installer in passive mode..."); + + installer.start("msiexec.exe /passive /i " + fsutils::toNativePath(file_path) + ".msi"); + // Wait for setup to complete + installer.waitForFinished(); + + qDebug("Installer stdout: %s", installer.readAllStandardOutput().data()); + qDebug("Installer stderr: %s", installer.readAllStandardError().data()); + qDebug("Setup should be complete!"); + // Delete temp file + fsutils::forceRemove(file_path); + // Reload search engine + has_python = addPythonPathToEnv(); + if (has_python) { + actionSearch_engine->setChecked(true); + Preferences::instance()->setSearchEnabled(true); + displaySearchTab(true); + } + sender()->deleteLater(); +} + +void MainWindow::pythonDownloadFailure(QString url, QString error) { + Q_UNUSED(url); + setCursor(QCursor(Qt::ArrowCursor)); + QMessageBox::warning(this, tr("Download error"), tr("Python setup could not be downloaded, reason: %1.\nPlease install it manually.").arg(error)); + sender()->deleteLater(); +} +#endif diff --git a/src/mainwindow.h b/src/mainwindow.h index 5b8f35033..7e05f3f58 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -152,6 +152,12 @@ protected: private: QIcon getSystrayIcon() const; +#ifdef Q_OS_WIN + bool addPythonPathToEnv(); + void installPython(); + void pythonDownloadSuccess(QString url, QString file_path); + void pythonDownloadFailure(QString url, QString error); +#endif private: QFileSystemWatcher *executable_watcher; @@ -200,6 +206,9 @@ private: #if defined(Q_OS_WIN) || defined(Q_OS_MAC) QTimer programUpdateTimer; #endif +#ifdef Q_OS_WIN + bool has_python; +#endif private slots: void on_actionSearch_engine_triggered(); diff --git a/src/searchengine/searchengine.cpp b/src/searchengine/searchengine.cpp index b35305404..d4ccadf31 100644 --- a/src/searchengine/searchengine.cpp +++ b/src/searchengine/searchengine.cpp @@ -49,7 +49,6 @@ #include "searchengine.h" #include "qbtsession.h" -#include "downloadthread.h" #include "fs_utils.h" #include "misc.h" #include "preferences.h" @@ -79,9 +78,6 @@ SearchEngine::SearchEngine(MainWindow* parent) // Boolean initialization search_stopped = false; // Creating Search Process -#ifdef Q_OS_WIN - has_python = addPythonPathToEnv(); -#endif searchProcess = new QProcess(this); searchProcess->setEnvironment(QProcess::systemEnvironment()); connect(searchProcess, SIGNAL(started()), this, SLOT(searchStarted())); @@ -93,11 +89,7 @@ SearchEngine::SearchEngine(MainWindow* parent) connect(searchTimeout, SIGNAL(timeout()), this, SLOT(on_search_button_clicked())); // Update nova.py search plugin if necessary updateNova(); - supported_engines = new SupportedEngines( - #ifdef Q_OS_WIN - has_python - #endif - ); + supported_engines = new SupportedEngines(); // Fill in category combobox fillCatCombobox(); @@ -114,65 +106,6 @@ void SearchEngine::fillCatCombobox() { } } -#ifdef Q_OS_WIN -bool SearchEngine::addPythonPathToEnv() { - QString python_path = Preferences::getPythonPath(); - if (!python_path.isEmpty()) { - // Add it to PATH envvar - QString path_envar = QString::fromLocal8Bit(qgetenv("PATH").constData()); - if (path_envar.isNull()) { - path_envar = ""; - } - path_envar = python_path+";"+path_envar; - qDebug("New PATH envvar is: %s", qPrintable(path_envar)); - qputenv("PATH", fsutils::toNativePath(path_envar).toLocal8Bit()); - return true; - } - return false; -} - -void SearchEngine::installPython() { - setCursor(QCursor(Qt::WaitCursor)); - // Download python - DownloadThread *pydownloader = new DownloadThread(this); - connect(pydownloader, SIGNAL(downloadFinished(QString,QString)), this, SLOT(pythonDownloadSuccess(QString,QString))); - connect(pydownloader, SIGNAL(downloadFailure(QString,QString)), this, SLOT(pythonDownloadFailure(QString,QString))); - pydownloader->downloadUrl("http://python.org/ftp/python/2.7.3/python-2.7.3.msi"); -} - -void SearchEngine::pythonDownloadSuccess(QString url, QString file_path) { - setCursor(QCursor(Qt::ArrowCursor)); - Q_UNUSED(url); - QFile::rename(file_path, file_path+".msi"); - QProcess installer; - qDebug("Launching Python installer in passive mode..."); - - installer.start("msiexec.exe /passive /i " + fsutils::toNativePath(file_path) + ".msi"); - // Wait for setup to complete - installer.waitForFinished(); - - qDebug("Installer stdout: %s", installer.readAllStandardOutput().data()); - qDebug("Installer stderr: %s", installer.readAllStandardError().data()); - qDebug("Setup should be complete!"); - // Reload search engine - has_python = addPythonPathToEnv(); - if (has_python) { - supported_engines->update(); - // Launch the search again - on_search_button_clicked(); - } - // Delete temp file - fsutils::forceRemove(file_path); -} - -void SearchEngine::pythonDownloadFailure(QString url, QString error) { - Q_UNUSED(url); - setCursor(QCursor(Qt::ArrowCursor)); - QMessageBox::warning(this, tr("Download error"), tr("Python setup could not be downloaded, reason: %1.\nPlease install it manually.").arg(error)); -} - -#endif - QString SearchEngine::selectedCategory() const { return comboCategory->itemData(comboCategory->currentIndex()).toString(); } @@ -226,17 +159,6 @@ void SearchEngine::giveFocusToSearchInput() { // Function called when we click on search button void SearchEngine::on_search_button_clicked() { -#ifdef Q_OS_WIN - if (!has_python) { - if (QMessageBox::question(this, tr("Missing Python Interpreter"), - tr("Python 2.x is required to use the search engine but it does not seem to be installed.\nDo you want to install it now?"), - QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { - // Download and Install Python - installPython(); - } - return; - } -#endif if (searchProcess->state() != QProcess::NotRunning) { #ifdef Q_OS_WIN searchProcess->kill(); diff --git a/src/searchengine/searchengine.h b/src/searchengine/searchengine.h index 668cf5db0..c53d9f8bc 100644 --- a/src/searchengine/searchengine.h +++ b/src/searchengine/searchengine.h @@ -41,7 +41,6 @@ #include "searchtab.h" #include "supportedengines.h" -class DownloadThread; class SearchEngine; class MainWindow; class LineEdit; @@ -105,12 +104,6 @@ protected slots: void downloadFinished(int exitcode, QProcess::ExitStatus); void fillCatCombobox(); void searchTextEdited(QString); -#ifdef Q_OS_WIN - bool addPythonPathToEnv(); - void installPython(); - void pythonDownloadSuccess(QString url, QString file_path); - void pythonDownloadFailure(QString url, QString error); -#endif private slots: void on_goToDescBtn_clicked(); @@ -130,9 +123,6 @@ private: QList > all_tab; // To store all tabs const SearchCategories full_cat_names; MainWindow *mp_mainWindow; -#ifdef Q_OS_WIN - bool has_python; -#endif }; #endif diff --git a/src/searchengine/supportedengines.h b/src/searchengine/supportedengines.h index 92753f759..80c3b3369 100644 --- a/src/searchengine/supportedengines.h +++ b/src/searchengine/supportedengines.h @@ -105,9 +105,8 @@ signals: void newSupportedEngine(QString name); public: - SupportedEngines(bool has_python = true) { - if (has_python) - update(); + SupportedEngines() { + update(); } ~SupportedEngines() {