From 54d7c6dc5443045b9a042891a682f2a0adf7c4e0 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Wed, 18 Nov 2009 13:18:55 +0000 Subject: [PATCH] - Moved status bar code from the GUI to its own class for make GUI more readable - Fix "Display current speed in title" feature - Fix Up/Down speed labels update in status bar --- src/GUI.cpp | 122 ++++++--------------------------------------- src/GUI.h | 16 ++---- src/src.pro | 3 +- src/statusbar.h | 128 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 148 insertions(+), 121 deletions(-) create mode 100644 src/statusbar.h diff --git a/src/GUI.cpp b/src/GUI.cpp index f05d33917..220fbd798 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -66,6 +66,7 @@ #include "torrentPersistentData.h" #include "TransferListFiltersWidget.h" #include "propertieswidget.h" +#include "statusbar.h" using namespace libtorrent; enum TabIndex{TAB_TRANSFER, TAB_SEARCH, TAB_RSS}; @@ -189,41 +190,14 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis } connect(localServer, SIGNAL(newConnection()), this, SLOT(acceptConnection())); // Start connection checking timer - checkConnect = new QTimer(this); - connect(checkConnect, SIGNAL(timeout()), this, SLOT(checkConnectionStatus())); - checkConnect->start(5000); + guiUpdater = new QTimer(this); + connect(guiUpdater, SIGNAL(timeout()), this, SLOT(updateGUI())); + guiUpdater->start(2000); // Accept drag 'n drops setAcceptDrops(true); createKeyboardShortcuts(); - connecStatusLblIcon = new QLabel(); - connecStatusLblIcon->setFrameShape(QFrame::NoFrame); - connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); - connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); - dlSpeedLbl = new QLabel(tr("DL: %1 KiB/s").arg("0.0")); - upSpeedLbl = new QLabel(tr("UP: %1 KiB/s").arg("0.0")); - ratioLbl = new QLabel(tr("Ratio: %1").arg("1.0")); - DHTLbl = new QLabel(tr("DHT: %1 nodes").arg(0)); - statusSep1 = new QFrame(); - statusSep1->setFixedWidth(1); - statusSep1->setFrameStyle(QFrame::Box); - statusSep2 = new QFrame(); - statusSep2->setFixedWidth(1); - statusSep2->setFrameStyle(QFrame::Box); - statusSep3 = new QFrame(); - statusSep3->setFixedWidth(1); - statusSep3->setFrameStyle(QFrame::Box); - statusSep4 = new QFrame(); - statusSep4->setFixedWidth(1); - statusSep4->setFrameStyle(QFrame::Box); - QMainWindow::statusBar()->addPermanentWidget(DHTLbl); - QMainWindow::statusBar()->addPermanentWidget(statusSep1); - QMainWindow::statusBar()->addPermanentWidget(connecStatusLblIcon); - QMainWindow::statusBar()->addPermanentWidget(statusSep2); - QMainWindow::statusBar()->addPermanentWidget(dlSpeedLbl); - QMainWindow::statusBar()->addPermanentWidget(statusSep3); - QMainWindow::statusBar()->addPermanentWidget(upSpeedLbl); - QMainWindow::statusBar()->addPermanentWidget(statusSep4); - QMainWindow::statusBar()->addPermanentWidget(ratioLbl); + // Create status bar + status_bar = new StatusBar(QMainWindow::statusBar(), BTSession); show(); @@ -242,14 +216,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis GUI::~GUI() { qDebug("GUI destruction"); hide(); - delete dlSpeedLbl; - delete upSpeedLbl; - delete ratioLbl; - delete DHTLbl; - delete statusSep1; - delete statusSep2; - delete statusSep3; - delete statusSep4; + delete status_bar; if(rssWidget) delete rssWidget; delete searchEngine; @@ -258,7 +225,7 @@ GUI::~GUI() { delete transferList; delete hSplitter; delete vSplitter; - delete checkConnect; + delete guiUpdater; qDebug("1"); if(systrayCreator) { delete systrayCreator; @@ -270,7 +237,6 @@ GUI::~GUI() { qDebug("2"); localServer->close(); delete localServer; - delete connecStatusLblIcon; delete tabs; // HTTP Server if(httpServer) @@ -302,25 +268,6 @@ void GUI::displayRSSTab(bool enable) { } } -void GUI::updateRatio() { - // Update ratio info - float ratio = 1.; - session_status sessionStatus = BTSession->getSessionStatus(); - if(sessionStatus.total_payload_download == 0) { - if(sessionStatus.total_payload_upload == 0) - ratio = 1.; - else - ratio = 10.; - }else{ - ratio = (double)sessionStatus.total_payload_upload / (double)sessionStatus.total_payload_download; - if(ratio > 10.) - ratio = 10.; - } - ratioLbl->setText(tr("Ratio: %1").arg(QString(QByteArray::number(ratio, 'f', 1)))); - // Update DHT nodes - DHTLbl->setText(tr("DHT: %1 nodes").arg(QString::number(sessionStatus.dht_nodes))); -} - void GUI::on_actionWebsite_triggered() const { QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://www.qbittorrent.org"))); } @@ -769,7 +716,7 @@ void GUI::loadPreferences(bool configure_session) { bool new_displaySpeedInTitle = Preferences::speedInTitleBar(); if(!new_displaySpeedInTitle && new_displaySpeedInTitle != displaySpeedInTitle) { // Reset title - setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); + setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent vx.x").arg(QString::fromUtf8(VERSION))); } displaySpeedInTitle = new_displaySpeedInTitle; if(Preferences::isToolbarDisplayed()) { @@ -826,40 +773,6 @@ void GUI::addUnauthenticatedTracker(QPair tracker) { } } -/*void GUI::updateLists(bool force) { - if(isVisible() || force) { - // update global informations - dlSpeedLbl->setText(tr("DL: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1)))); - upSpeedLbl->setText(tr("UP: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1)))); - std::vector torrents = BTSession->getTorrents(); - std::vector::iterator torrentIT; - for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { - QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid()) continue; - try { - if(h.is_seed()) { - // Update in finished list - finishedTorrentTab->updateTorrent(h); - } else { - // Update in download list - if(downloadingTorrentTab->updateTorrent(h)) { - // Torrent was added, we may need to remove it from finished tab - finishedTorrentTab->deleteTorrent(h.hash()); - TorrentPersistentData::saveSeedStatus(h); - } - } - } catch(invalid_handle e) { - qDebug("Caught Invalid handle exception, lucky us."); - } - } - } - if(displaySpeedInTitle) { - QString dl_rate = QByteArray::number(BTSession->getSessionStatus().payload_download_rate/1024, 'f', 1); - QString up_rate = QByteArray::number(BTSession->getSessionStatus().payload_upload_rate/1024, 'f', 1); - setWindowTitle(tr("qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(dl_rate).arg(up_rate)); - } -}*/ - // Called when a tracker requires authentication void GUI::trackerAuthenticationRequired(QTorrentHandle& h) { if(unauthenticated_trackers.indexOf(QPair(h, h.current_tracker())) < 0) { @@ -869,10 +782,7 @@ void GUI::trackerAuthenticationRequired(QTorrentHandle& h) { } // Check connection status and display right icon -void GUI::checkConnectionStatus() { - // qDebug("Checking connection status"); - // Update Ratio - updateRatio(); +void GUI::updateGUI() { // update global informations if(systrayIntegration) { #ifdef Q_WS_WIN @@ -893,14 +803,10 @@ void GUI::checkConnectionStatus() { #endif myTrayIcon->setToolTip(html); // tray icon } - session_status sessionStatus = BTSession->getSessionStatus(); - if(sessionStatus.has_incoming_connections) { - // Connection OK - connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/connected.png"))); - connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection Status:")+QString::fromUtf8("
")+tr("Online")); - }else{ - connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); - connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); + if(displaySpeedInTitle) { + QString dl_rate = QByteArray::number(BTSession->getSessionStatus().payload_download_rate/1024, 'f', 1); + QString up_rate = QByteArray::number(BTSession->getSessionStatus().payload_upload_rate/1024, 'f', 1); + setWindowTitle(tr("qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(dl_rate).arg(up_rate)); } } diff --git a/src/GUI.h b/src/GUI.h index 587bf70a6..84cc77164 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -59,6 +59,7 @@ class TransferListWidget; class TransferListFiltersWidget; class QSplitter; class PropertiesWidget; +class StatusBar; class GUI : public QMainWindow, private Ui::MainWindow{ Q_OBJECT @@ -66,10 +67,11 @@ class GUI : public QMainWindow, private Ui::MainWindow{ private: // Bittorrent bittorrent *BTSession; - QTimer *checkConnect; + QTimer *guiUpdater; QList > unauthenticated_trackers; // GUI related QTabWidget *tabs; + StatusBar *status_bar; QPointer options; QSystemTrayIcon *myTrayIcon; QPointer systrayCreator; @@ -79,19 +81,10 @@ class GUI : public QMainWindow, private Ui::MainWindow{ PropertiesWidget *properties; QSplitter *hSplitter; QSplitter *vSplitter; - QLabel *connecStatusLblIcon; bool systrayIntegration; bool displaySpeedInTitle; bool force_exit; //unsigned int refreshInterval; - QLabel *dlSpeedLbl; - QLabel *upSpeedLbl; - QLabel *ratioLbl; - QLabel *DHTLbl; - QFrame *statusSep1; - QFrame *statusSep2; - QFrame *statusSep3; - QFrame *statusSep4; // Keyboard shortcuts QShortcut *switchSearchShortcut; QShortcut *switchSearchShortcut2; @@ -141,7 +134,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{ void on_actionSet_global_download_limit_triggered(); void on_actionDocumentation_triggered() const; void on_actionOpen_triggered(); - void checkConnectionStatus(); + void updateGUI(); void loadPreferences(bool configure_session=true); void processParams(const QStringList& params); void addTorrent(QString path); @@ -161,7 +154,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{ public slots: void trackerAuthenticationRequired(QTorrentHandle& h); void setTabText(int index, QString text) const; - void updateRatio(); void showNotificationBaloon(QString title, QString msg) const; protected: diff --git a/src/src.pro b/src/src.pro index dba121432..db5f33e77 100644 --- a/src/src.pro +++ b/src/src.pro @@ -194,7 +194,8 @@ HEADERS += GUI.h \ preferences.h \ geoip.h \ peeraddition.h \ - deletionconfirmationdlg.h + deletionconfirmationdlg.h \ + statusbar.h FORMS += MainWindow.ui \ options.ui \ about.ui \ diff --git a/src/statusbar.h b/src/statusbar.h new file mode 100644 index 000000000..88f326abb --- /dev/null +++ b/src/statusbar.h @@ -0,0 +1,128 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef STATUSBAR_H +#define STATUSBAR_H + +#include +#include +#include +#include +#include "bittorrent.h" +#include "misc.h" + +class StatusBar: public QObject { + Q_OBJECT + +private: + QStatusBar *bar; + QLabel *dlSpeedLbl; + QLabel *upSpeedLbl; + QLabel *DHTLbl; + QFrame *statusSep1; + QFrame *statusSep2; + QFrame *statusSep3; + QFrame *statusSep4; + QLabel *connecStatusLblIcon; + QTimer *refreshTimer; + bittorrent *BTSession; + +public: + StatusBar(QStatusBar *bar, bittorrent *BTSession): bar(bar), BTSession(BTSession) { + connecStatusLblIcon = new QLabel(); + connecStatusLblIcon->setFrameShape(QFrame::NoFrame); + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); + dlSpeedLbl = new QLabel(tr("Down: %1 KiB/s", "Download speed: x KiB/s").arg("0.0")); + upSpeedLbl = new QLabel(tr("Up: %1 KiB/s", "Upload speed: x KiB/s").arg("0.0")); + DHTLbl = new QLabel(tr("DHT: %1 nodes").arg(0)); + statusSep1 = new QFrame(); + statusSep1->setFixedWidth(1); + statusSep1->setFrameStyle(QFrame::Box); + statusSep2 = new QFrame(); + statusSep2->setFixedWidth(1); + statusSep2->setFrameStyle(QFrame::Box); + statusSep3 = new QFrame(); + statusSep3->setFixedWidth(1); + statusSep3->setFrameStyle(QFrame::Box); + statusSep4 = new QFrame(); + bar->addPermanentWidget(DHTLbl); + bar->addPermanentWidget(statusSep1); + bar->addPermanentWidget(connecStatusLblIcon); + bar->addPermanentWidget(statusSep2); + bar->addPermanentWidget(dlSpeedLbl); + bar->addPermanentWidget(statusSep3); + bar->addPermanentWidget(upSpeedLbl); + + refreshTimer = new QTimer(bar); + connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshStatusBar())); + refreshTimer->start(1500); + } + + ~StatusBar() { + delete refreshTimer; + delete dlSpeedLbl; + delete upSpeedLbl; + delete DHTLbl; + delete statusSep1; + delete statusSep2; + delete statusSep3; + delete connecStatusLblIcon; + } + +public slots: + void refreshStatusBar() { + // Update connection status + session_status sessionStatus = BTSession->getSessionStatus(); + if(sessionStatus.has_incoming_connections) { + // Connection OK + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/connected.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection Status:")+QString::fromUtf8("
")+tr("Online")); + }else{ + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); + } + // Update Number of DHT nodes + if(BTSession->isDHTEnabled()) { + DHTLbl->setVisible(true); + statusSep1->setVisible(true); + DHTLbl->setText(tr("DHT: %1 nodes").arg(QString::number(sessionStatus.dht_nodes))); + } else { + DHTLbl->setVisible(false); + statusSep1->setVisible(false); + } + // Update speed labels + dlSpeedLbl->setText(tr("Down: %1 KiB/s", "i.e. Download speed:").arg(QString::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); + upSpeedLbl->setText(tr("Up: %1 KiB/s", "i.e. Upload speed:").arg(QString::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); + } + +}; + +#endif // STATUSBAR_H