From fb6b40ccd19c6ae2c49b4b849bdab88546c55f5f Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sat, 21 Nov 2009 18:36:12 +0000 Subject: [PATCH] - Rewrote the bar to display the downloaded piece as the one we had was overly complicated --- src/downloadedpiecesbar.h | 60 ++++++++++++ src/propertieswidget.cpp | 29 ++---- src/propertieswidget.h | 6 +- src/qrealarray.cpp | 33 ------- src/qrealarray.h | 41 -------- src/realprogressbar.cpp | 115 ----------------------- src/realprogressbar.h | 79 ---------------- src/realprogressbarthread.cpp | 170 ---------------------------------- src/realprogressbarthread.h | 79 ---------------- src/src.pro | 9 +- src/ui/propertieswidget.ui | 18 ++-- 11 files changed, 82 insertions(+), 557 deletions(-) create mode 100644 src/downloadedpiecesbar.h delete mode 100644 src/qrealarray.cpp delete mode 100644 src/qrealarray.h delete mode 100644 src/realprogressbar.cpp delete mode 100644 src/realprogressbar.h delete mode 100644 src/realprogressbarthread.cpp delete mode 100644 src/realprogressbarthread.h diff --git a/src/downloadedpiecesbar.h b/src/downloadedpiecesbar.h new file mode 100644 index 000000000..d4318d375 --- /dev/null +++ b/src/downloadedpiecesbar.h @@ -0,0 +1,60 @@ +#ifndef DOWNLOADEDPIECESBAR_H +#define DOWNLOADEDPIECESBAR_H + +#include +#include +#include +#include +#include + +using namespace libtorrent; +#define BAR_HEIGHT 18 + +class DownloadedPiecesBar: public QWidget { + Q_OBJECT + +private: + QPixmap pixmap; + + +public: + DownloadedPiecesBar(QWidget *parent): QWidget(parent) { + setFixedHeight(BAR_HEIGHT); + } + + void setProgress(bitfield pieces) { + if(pieces.empty()) { + // Empty bar + pixmap = QPixmap(1, 1); + QPainter painter(&pixmap); + painter.setPen(Qt::white); + painter.drawPoint(0,0); + } else { + pixmap = QPixmap(pieces.size(), 1); + QPainter painter(&pixmap); + for(uint i=0; isetForegroundColor(Qt::blue); - ProgressHLayout->insertWidget(1, progressBar); + downloaded_pieces = new DownloadedPiecesBar(this); + //progressBar = new RealProgressBar(this); + //progressBar->setForegroundColor(Qt::blue); + ProgressHLayout->insertWidget(1, downloaded_pieces); // Tracker list trackerList = new TrackerList(this); verticalLayout_trackers->addWidget(trackerList); // Peers list peersList = new PeerListWidget(this); peerpage_layout->addWidget(peersList); - // Pointers init - progressBarUpdater = 0; // Dynamic data refresher refreshTimer = new QTimer(this); connect(refreshTimer, SIGNAL(timeout()), this, SLOT(loadDynamicData())); @@ -119,11 +117,9 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, GUI* main_window, TransferLi PropertiesWidget::~PropertiesWidget() { saveSettings(); delete refreshTimer; - if(progressBarUpdater) - delete progressBarUpdater; delete trackerList; delete peersList; - delete progressBar; + delete downloaded_pieces; delete PropListModel; delete PropDelegate; // Delete QActions @@ -166,8 +162,9 @@ void PropertiesWidget::clear() { lbl_creationDate->clear(); hash_lbl->clear(); comment_text->clear(); + progress_lbl->clear(); trackerList->clear(); - progressBar->setProgress(QRealArray()); + downloaded_pieces->clear(); wasted->clear(); upTotal->clear(); dlTotal->clear(); @@ -197,10 +194,6 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { return; } setEnabled(true); - if(progressBarUpdater) { - delete progressBarUpdater; - progressBarUpdater = 0; - } try { // Save path @@ -213,9 +206,6 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { comment_text->setHtml(h.comment()); // URL seeds loadUrlSeeds(); - // downloaded pieces updater - progressBarUpdater = new RealProgressBarThread(progressBar, h); - progressBarUpdater->start(); // List files in torrent PropListModel->clear(); PropListModel->setupModelData(h.get_torrent_info()); @@ -316,8 +306,7 @@ void PropertiesWidget::loadDynamicData() { } shareRatio->setText(QString(QByteArray::number(ratio, 'f', 1))); // Downloaded pieces - if(progressBarUpdater) - progressBarUpdater->refresh(); + downloaded_pieces->setProgress(h.pieces()); // Progress progress_lbl->setText(QString::number(h.progress()*100., 'f', 1)+"%"); return; diff --git a/src/propertieswidget.h b/src/propertieswidget.h index 068d39435..c2e204d73 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -38,8 +38,6 @@ class TransferListWidget; class QTimer; -class RealProgressBar; -class RealProgressBarThread; class Bittorrent; class TorrentFilesModel; class PropListDelegate; @@ -48,6 +46,7 @@ class torrent_file; class PeerListWidget; class TrackerList; class GUI; +class DownloadedPiecesBar; enum Tab {MAIN_TAB, TRACKERS_TAB, PEERS_TAB, URLSEEDS_TAB, FILES_TAB}; enum SlideState {REDUCED, VISIBLE}; @@ -60,8 +59,6 @@ private: GUI *main_window; QTorrentHandle h; QTimer *refreshTimer; - RealProgressBar *progressBar; - RealProgressBarThread *progressBarUpdater; Bittorrent* BTSession; SlideState state; TorrentFilesModel *PropListModel; @@ -73,6 +70,7 @@ private: QAction *actionMaximum; QAction *actionHigh; QList slideSizes; + DownloadedPiecesBar *downloaded_pieces; protected: QPushButton* getButtonFromIndex(int index); diff --git a/src/qrealarray.cpp b/src/qrealarray.cpp deleted file mode 100644 index 1e580da6e..000000000 --- a/src/qrealarray.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere - * - * 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, arnaud@qbittorrent.org - */ - -#include "qrealarray.h" - -int id = qRegisterMetaType(); diff --git a/src/qrealarray.h b/src/qrealarray.h deleted file mode 100644 index 23007e0c0..000000000 --- a/src/qrealarray.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere - * - * 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, arnaud@qbittorrent.org - */ - -#ifndef QREALARRAY_H -#define QREALARRAY_H - -#include -#include - -typedef QVarLengthArray QRealArray; - -Q_DECLARE_METATYPE(QRealArray) - -#endif diff --git a/src/realprogressbar.cpp b/src/realprogressbar.cpp deleted file mode 100644 index 7479064e4..000000000 --- a/src/realprogressbar.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere - * - * 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, arnaud@qbittorrent.org - */ - -#include "realprogressbar.h" -#include -#include -#include - -RealProgressBar::RealProgressBar(QWidget *parent): QWidget(parent), array(1) { - background = Qt::white; - foreground = Qt::black; - setFixedHeight(18); - active = false; - array[0] = 0.; - drawPixmap(); -} - -RealProgressBar::~RealProgressBar() -{ - qDebug("RealProgressBar destruction"); -} - -void RealProgressBar::setBackgroundColor(const QColor &newColor) -{ - background = newColor; - drawPixmap(); -} - -void RealProgressBar::setForegroundColor(const QColor &newColor) -{ - foreground = newColor; - drawPixmap(); -} -/* -void RealProgressBar::setThread(const RealProgressBarThread *newThread) -{ - thread = newThread; -} -*/ -void RealProgressBar::paintEvent(QPaintEvent *) -{ - QPainter painter(this); - painter.drawPixmap(rect(), pixmap); -} - -void RealProgressBar::resizeEvent(QResizeEvent *event) -{ - if(width() != event->oldSize().width()) - emit widthChanged(width()); -} - -void RealProgressBar::setProgress(QRealArray progress) -{ - qDebug("setProgress called"); - array = progress; - drawPixmap(); -} - -void RealProgressBar::drawPixmap() -{ - if(pixmap.width() != array.size()) - pixmap = QPixmap(array.size(), 1); - QPainter painter(&pixmap); - for(int i=0; i 1.) - x = 1.; - qreal y = 1. - x; - // Q_ASSERT(x >= 0.); - // Q_ASSERT(y >= 0.); - qreal r1, g1, b1, a1, r2, g2, b2, a2; - foreground.getRgbF(&r1, &g1, &b1, &a1); - background.getRgbF(&r2, &g2, &b2, &a2); - QColor color; - color.setRgbF(x*r1+y*r2, x*g1+y*g2, x*b1+y*b2, x*a1+y*a2); - return color; -} diff --git a/src/realprogressbar.h b/src/realprogressbar.h deleted file mode 100644 index 85d6c9f1a..000000000 --- a/src/realprogressbar.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere - * - * 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, arnaud@qbittorrent.org - */ - -#ifndef REALPROGRESSBAR_H -#define REALPROGRESSBAR_H - -#include "qrealarray.h" -#include -#include - -class RealProgressBar : public QWidget -{ - Q_OBJECT - Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) - Q_PROPERTY(QColor foregroundColor READ foregroundColor WRITE setForegroundColor) - - private: - QColor foreground; - QColor background; - bool active; - QPixmap pixmap; -// RealProgressBarThread *thread; - QRealArray array; - - public: - RealProgressBar(QWidget *parent = 0); - ~RealProgressBar(); - - void setBackgroundColor(const QColor &newColor); - QColor backgroundColor() const {return background;} - void setForegroundColor(const QColor &newColor); - QColor foregroundColor() const {return foreground;} -// void setThread(const RealProgressBarThread *newThread); -// RealProgressBarThread *thread() const {return thread;} - - public slots: - void setProgress(QRealArray progress); - - signals: - void widthChanged(int width); - - protected: - void paintEvent(QPaintEvent *event); - void resizeEvent(QResizeEvent *event); - - private: - void drawPixmap(); - QColor penColor(qreal f); - -}; - -#endif diff --git a/src/realprogressbarthread.cpp b/src/realprogressbarthread.cpp deleted file mode 100644 index 79ca4ea1e..000000000 --- a/src/realprogressbarthread.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Bittorrent Client using Qt4 and libtorrent. - * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere - * - * 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, arnaud@qbittorrent.org - */ - -#include "realprogressbarthread.h" -#include "realprogressbar.h" -#include -#include - -RealProgressBarThread::RealProgressBarThread(RealProgressBar *pb, QTorrentHandle &handle) : QThread(pb), thandle(handle), array(pb->width()){ - size = pb->width(); - abort = false; - connect(pb, SIGNAL(widthChanged(int)), this, SLOT(resize(int)), Qt::DirectConnection); - connect(this, SIGNAL(refreshed(QRealArray)), pb, SLOT(setProgress(QRealArray))); -} - -RealProgressBarThread::~RealProgressBarThread(){ - qDebug("RealProgressBarThread destruction"); - resize(-1); - qDebug("RealProgressBarThread waiting"); - wait(); - qDebug("RealProgressBarThread destroyed"); -} - -void RealProgressBarThread::resize(int width) -{ - QMutexLocker locker(&mutex); - size = width; - abort = true; - condition.wakeOne(); -} - -void RealProgressBarThread::refresh() -{ - QMutexLocker locker(&mutex); - condition.wakeOne(); -} - -void RealProgressBarThread::run(){ - forever - { - //start checking the torrent information - if(ifInterrupted() == stop) - { - qDebug("RealProgressBarThread stop"); - return; - } - size_type total_size = thandle.total_size(); - size_type piece_length = thandle.piece_length(); - int num_pieces = thandle.num_pieces(); - bitfield pieces = thandle.pieces(); - //pieces not returned - if (pieces.empty()) - { - qDebug("pieces vector not returned"); - return; - } - //empty the array - mutex.lock(); - for(int i=0; i array.size()) - end = array.size(); - int start_int, end_int; - qreal start_frac, end_frac; - double temp; - start_frac = modf(start, &temp); - start_int = (int) temp; - end_frac = modf(end, &temp); - end_int = (int) temp; - if(start_int == end_int) - { - array[start_int] += progress * (end - start); - return; - } - if (start_frac > 0.) - array[start_int] += progress * (1 - start_frac); - if (end_frac > 0.) - array[end_int] += progress * end_frac; - for(int i=start_int+1; i -#include -#include - -class RealProgressBar; - -enum Interrupt -{ - ignore, - restart, - stop -}; - -class RealProgressBarThread : public QThread { - Q_OBJECT - private: - bool abort; - int size; - QTorrentHandle thandle; - QMutex mutex; - QWaitCondition condition; - QRealArray array; - - public: - RealProgressBarThread(RealProgressBar *pb, QTorrentHandle &handle); - ~RealProgressBarThread(); - - public slots: - void resize(int width); - void refresh(); - - signals: - void refreshed(QRealArray progress); - - protected: - void run(); - - private: - Interrupt ifInterrupted(); - void mark(qreal start, qreal end, qreal progress = 1.); -}; - -#endif diff --git a/src/src.pro b/src/src.pro index da36c35b9..63919b332 100644 --- a/src/src.pro +++ b/src/src.pro @@ -163,9 +163,6 @@ HEADERS += GUI.h \ engineselectdlg.h \ pluginsource.h \ qgnomelook.h \ - realprogressbar.h \ - realprogressbarthread.h \ - qrealarray.h \ httpserver.h \ httpconnection.h \ httprequestparser.h \ @@ -196,7 +193,8 @@ HEADERS += GUI.h \ peeraddition.h \ deletionconfirmationdlg.h \ statusbar.h \ - trackerlist.h + trackerlist.h \ + downloadedpiecesbar.h FORMS += ui/mainwindow.ui \ ui/options.ui \ ui/about.ui \ @@ -226,9 +224,6 @@ SOURCES += GUI.cpp \ qtorrenthandle.cpp \ engineselectdlg.cpp \ downloadthread.cpp \ - realprogressbar.cpp \ - realprogressbarthread.cpp \ - qrealarray.cpp \ httpserver.cpp \ httpconnection.cpp \ httprequestparser.cpp \ diff --git a/src/ui/propertieswidget.ui b/src/ui/propertieswidget.ui index 06e848b86..8096290ca 100644 --- a/src/ui/propertieswidget.ui +++ b/src/ui/propertieswidget.ui @@ -53,7 +53,7 @@ 0 - -59 + 0 518 348 @@ -93,7 +93,7 @@ - 44 + 50 16777215 @@ -580,7 +580,7 @@ p, li { white-space: pre-wrap; } - + :/Icons/oxygen/list-remove.png:/Icons/oxygen/list-remove.png @@ -597,7 +597,7 @@ p, li { white-space: pre-wrap; } - + :/Icons/oxygen/list-add.png:/Icons/oxygen/list-add.png @@ -712,7 +712,7 @@ p, li { white-space: pre-wrap; } General - + :/Icons/oxygen/help-about.png:/Icons/oxygen/help-about.png @@ -729,7 +729,7 @@ p, li { white-space: pre-wrap; } Trackers - + :/Icons/oxygen/network-server.png:/Icons/oxygen/network-server.png @@ -752,7 +752,7 @@ p, li { white-space: pre-wrap; } Peers - + :/Icons/oxygen/peer.png:/Icons/oxygen/peer.png @@ -769,7 +769,7 @@ p, li { white-space: pre-wrap; } URL seeds - + :/Icons/oxygen/urlseed.png:/Icons/oxygen/urlseed.png @@ -786,7 +786,7 @@ p, li { white-space: pre-wrap; } Files - + :/Icons/oxygen/folder.png:/Icons/oxygen/folder.png