diff --git a/src/GUI.cpp b/src/GUI.cpp index 4131baacf..fc78d413b 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -80,23 +80,6 @@ enum TabIndex{TAB_TRANSFER, TAB_SEARCH, TAB_RSS}; GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), displaySpeedInTitle(false), force_exit(false) { setupUi(this); setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); - systrayIntegration = Preferences::systrayIntegration(); - systrayCreator = 0; - // Create tray icon - if (QSystemTrayIcon::isSystemTrayAvailable()) { - if(systrayIntegration) { - createTrayIcon(); - } - }else{ - if(systrayIntegration) { - // May be system startup, check again later - systrayCreator = new QTimer(this); - connect(systrayCreator, SIGNAL(timeout()), this, SLOT(createSystrayDelayed())); - systrayCreator->start(1000); - } - systrayIntegration = false; - qDebug("Info: System tray unavailable"); - } // Setting icons this->setWindowIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png"))); actionOpen->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/open.png"))); @@ -161,7 +144,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis connect(actionDecreasePriority, SIGNAL(triggered()), transferList, SLOT(decreasePrioSelectedTorrents())); // Search engine tab - searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration); + searchEngine = new SearchEngine(BTSession, systrayIcon); tabs->addTab(searchEngine, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png")), tr("Search")); // Configure BT session according to options @@ -225,8 +208,8 @@ GUI::~GUI() { if(systrayCreator) { delete systrayCreator; } - if(systrayIntegration) { - delete myTrayIcon; + if(systrayIcon) { + delete systrayIcon; delete myTrayIconMenu; } qDebug("2"); @@ -495,7 +478,7 @@ void GUI::closeEvent(QCloseEvent *e) { QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); bool goToSystrayOnExit = settings.value(QString::fromUtf8("Preferences/General/CloseToTray"), false).toBool(); - if(!force_exit && systrayIntegration && goToSystrayOnExit && !this->isHidden()) { + if(!force_exit && systrayIcon && goToSystrayOnExit && !this->isHidden()) { hide(); //e->ignore(); e->accept(); @@ -518,9 +501,9 @@ void GUI::closeEvent(QCloseEvent *e) { } } hide(); - if(systrayIntegration) { + if(systrayIcon) { // Hide tray icon - myTrayIcon->hide(); + systrayIcon->hide(); } // Save window size, columns size writeSettings(); @@ -542,7 +525,7 @@ bool GUI::event(QEvent * e) { if(isMinimized()) { qDebug("minimisation"); QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - if(systrayIntegration && settings.value(QString::fromUtf8("Preferences/General/MinimizeToTray"), false).toBool()) { + if(systrayIcon && settings.value(QString::fromUtf8("Preferences/General/MinimizeToTray"), false).toBool()) { hide(); } } @@ -682,16 +665,27 @@ void GUI::optionsSaved() { void GUI::loadPreferences(bool configure_session) { BTSession->addConsoleMessage(tr("Options were saved successfully.")); bool newSystrayIntegration = Preferences::systrayIntegration(); - if(newSystrayIntegration != systrayIntegration) { + if(newSystrayIntegration != (systrayIcon!=0)) { if(newSystrayIntegration) { // create the trayicon - createTrayIcon(); + if(!QSystemTrayIcon::isSystemTrayAvailable()) { + if(!configure_session) { // Program startup + systrayCreator = new QTimer(this); + connect(systrayCreator, SIGNAL(timeout()), this, SLOT(createSystrayDelayed())); + systrayCreator->setSingleShot(true); + systrayCreator->start(2000); + qDebug("Info: System tray is unavailable, trying again later."); + } else { + qDebug("Warning: System tray is unavailable."); + } + } else { + createTrayIcon(); + } } else { // Destroy trayicon - delete myTrayIcon; + delete systrayIcon; delete myTrayIconMenu; } - systrayIntegration = newSystrayIntegration; } // General bool new_displaySpeedInTitle = Preferences::speedInTitleBar(); @@ -765,7 +759,7 @@ void GUI::trackerAuthenticationRequired(QTorrentHandle& h) { // Check connection status and display right icon void GUI::updateGUI() { // update global informations - if(systrayIntegration) { + if(systrayIcon) { #ifdef Q_WS_WIN // Windows does not support html here QString html =tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); @@ -782,7 +776,7 @@ void GUI::updateGUI() { html += " "+tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); html += ""; #endif - myTrayIcon->setToolTip(html); // tray icon + systrayIcon->setToolTip(html); // tray icon } if(displaySpeedInTitle) { QString dl_rate = QByteArray::number(BTSession->getSessionStatus().payload_download_rate/1024, 'f', 1); @@ -793,8 +787,8 @@ void GUI::updateGUI() { void GUI::showNotificationBaloon(QString title, QString msg) const { QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - if(systrayIntegration && settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool()) { - myTrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON); + if(systrayIcon && settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool()) { + systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON); } } @@ -821,22 +815,24 @@ void GUI::downloadFromURLList(const QStringList& url_list) { *****************************************************/ void GUI::createSystrayDelayed() { - static int timeout = 10; + static int timeout = 20; if(QSystemTrayIcon::isSystemTrayAvailable()) { // Ok, systray integration is now supported // Create systray icon createTrayIcon(); - systrayIntegration = true; delete systrayCreator; } else { if(timeout) { // Retry a bit later - systrayCreator->start(1000); + systrayCreator->start(2000); --timeout; } else { // Timed out, apparently system really does not // support systray icon delete systrayCreator; + // Disable it in program preferences to + // avoid trying at earch startup + Preferences::setSystrayIntegration(false); } } } @@ -844,10 +840,10 @@ void GUI::createSystrayDelayed() { void GUI::createTrayIcon() { // Tray icon #ifdef Q_WS_WIN - myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this); + systrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this); #endif #ifndef Q_WS_WIN - myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")), this); + systrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")), this); #endif // Tray icon Menu myTrayIconMenu = new QMenu(this); @@ -861,11 +857,11 @@ void GUI::createTrayIcon() { myTrayIconMenu->addAction(actionPause_All); myTrayIconMenu->addSeparator(); myTrayIconMenu->addAction(actionExit); - myTrayIcon->setContextMenu(myTrayIconMenu); - connect(myTrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked())); + systrayIcon->setContextMenu(myTrayIconMenu); + connect(systrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked())); // End of Icon Menu - connect(myTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason))); - myTrayIcon->show(); + connect(systrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason))); + systrayIcon->show(); } // Display Program Options diff --git a/src/GUI.h b/src/GUI.h index 3edb23499..35e0ccdb1 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -66,13 +66,13 @@ class GUI : public QMainWindow, private Ui::MainWindow{ private: // Bittorrent bittorrent *BTSession; - QTimer *guiUpdater; - QList > unauthenticated_trackers; + QList > unauthenticated_trackers; // Still needed? // GUI related + QTimer *guiUpdater; QTabWidget *tabs; StatusBar *status_bar; QPointer options; - QSystemTrayIcon *myTrayIcon; + QPointer systrayIcon; QPointer systrayCreator; QMenu *myTrayIconMenu; TransferListWidget *transferList; @@ -80,7 +80,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{ PropertiesWidget *properties; QSplitter *hSplitter; QSplitter *vSplitter; - bool systrayIntegration; bool displaySpeedInTitle; bool force_exit; //unsigned int refreshInterval; diff --git a/src/preferences.h b/src/preferences.h index 82ce58fc4..b282ebda2 100644 --- a/src/preferences.h +++ b/src/preferences.h @@ -67,6 +67,11 @@ public: return settings.value(QString::fromUtf8("Preferences/General/SystrayEnabled"), true).toBool(); } + static void setSystrayIntegration(bool enabled) { + QSettings settings("qBittorrent", "qBittorrent"); + settings.setValue(QString::fromUtf8("Preferences/General/SystrayEnabled"), enabled); + } + static bool isToolbarDisplayed() { QSettings settings("qBittorrent", "qBittorrent"); return settings.value(QString::fromUtf8("Preferences/General/ToolbarDisplayed"), true).toBool(); diff --git a/src/searchEngine.cpp b/src/searchEngine.cpp index c370de23b..62b672f53 100644 --- a/src/searchEngine.cpp +++ b/src/searchEngine.cpp @@ -53,7 +53,7 @@ #define SEARCHHISTORY_MAXSIZE 50 /*SEARCH ENGINE START*/ -SearchEngine::SearchEngine(bittorrent *BTSession, QSystemTrayIcon *myTrayIcon, bool systrayIntegration) : QWidget(), BTSession(BTSession), myTrayIcon(myTrayIcon), systrayIntegration(systrayIntegration){ +SearchEngine::SearchEngine(bittorrent *BTSession, QSystemTrayIcon *systrayIcon) : QWidget(), BTSession(BTSession), systrayIcon(systrayIcon) { setupUi(this); // new qCompleter to the search pattern startSearchHistory(); @@ -428,8 +428,8 @@ void SearchEngine::updateNova() { void SearchEngine::searchFinished(int exitcode,QProcess::ExitStatus){ QSettings settings("qBittorrent", "qBittorrent"); bool useNotificationBalloons = settings.value("Preferences/General/NotificationBaloons", true).toBool(); - if(systrayIntegration && useNotificationBalloons) { - myTrayIcon->showMessage(tr("Search Engine"), tr("Search has finished"), QSystemTrayIcon::Information, TIME_TRAY_BALLOON); + if(systrayIcon && useNotificationBalloons) { + systrayIcon->showMessage(tr("Search Engine"), tr("Search has finished"), QSystemTrayIcon::Information, TIME_TRAY_BALLOON); } if(exitcode){ search_status->setText(tr("An error occured during search...")); diff --git a/src/searchEngine.h b/src/searchEngine.h index 57c5a5e82..c9d3af8e9 100644 --- a/src/searchEngine.h +++ b/src/searchEngine.h @@ -63,8 +63,7 @@ private: QPointer searchCompleter; QStringListModel searchHistory; bittorrent *BTSession; - QSystemTrayIcon *myTrayIcon; - bool systrayIntegration; + QSystemTrayIcon *systrayIcon; SupportedEngines *supported_engines; QTimer *searchTimeout; SearchTab *currentSearchTab; @@ -72,7 +71,7 @@ private: QList all_tab; // To store all tabs const SearchCategories full_cat_names; public: - SearchEngine(bittorrent *BTSession, QSystemTrayIcon *myTrayIcon, bool systrayIntegration); + SearchEngine(bittorrent *BTSession, QSystemTrayIcon *systrayIcon); ~SearchEngine(); float getPluginVersion(QString filePath) const; QString selectedCategory() const;