Browse Source

"Downloaded pieces" bar now displays in yellow the pieces being downloaded

adaptive-webui-19844
Christophe Dumez 15 years ago
parent
commit
af3755bf91
  1. 42
      src/downloadedpiecesbar.h
  2. 4
      src/propertieswidget.cpp
  3. 10
      src/qtorrenthandle.cpp
  4. 1
      src/qtorrenthandle.h

42
src/downloadedpiecesbar.h

@ -53,34 +53,49 @@ public:
setFixedHeight(BAR_HEIGHT); setFixedHeight(BAR_HEIGHT);
} }
void setProgress(bitfield pieces) { void setProgress(const bitfield &pieces, const bitfield &downloading_pieces) {
if(pieces.empty()) { if(pieces.empty()) {
// Empty bar // Empty bar
QPixmap pix = QPixmap(1, 1); QPixmap pix = QPixmap(1, 1);
pix.fill(); pix.fill();
pixmap = pix; pixmap = pix;
} else { } else {
int nb_pieces = pieces.size(); const int nb_pieces = pieces.size();
// Reduce the number of pieces before creating the pixmap // Reduce the number of pieces before creating the pixmap
// otherwise it can crash when there are too many pieces // otherwise it can crash when there are too many pieces
if(nb_pieces > width()) { if(nb_pieces > width()) {
int ratio = floor(nb_pieces/(double)width()); int ratio = floor(nb_pieces/(double)width());
QVector<bool> scaled_pieces; std::vector<bool> scaled_pieces;
std::vector<bool> scaled_downloading;
for(int i=0; i<nb_pieces; i+= ratio) { for(int i=0; i<nb_pieces; i+= ratio) {
bool have = true; bool have = true;
for(int j=i; j<qMin(i+ratio, nb_pieces); ++j) { for(int j=i; j<qMin(i+ratio, nb_pieces); ++j) {
if(!pieces[i]) { have = false; break; } if(!pieces[i]) { have = false; break; }
} }
scaled_pieces << have; scaled_pieces.push_back(have);
if(have) {
scaled_downloading.push_back(false);
} else {
bool downloading = false;
for(int j=i; j<qMin(i+ratio, nb_pieces); ++j) {
if(downloading_pieces[i]) { downloading = true; break; }
}
scaled_downloading.push_back(downloading);
}
} }
QPixmap pix = QPixmap(scaled_pieces.size(), 1); QPixmap pix = QPixmap(scaled_pieces.size(), 1);
pix.fill(); pix.fill();
QPainter painter(&pix); QPainter painter(&pix);
for(int i=0; i<scaled_pieces.size(); ++i) { for(uint i=0; i<scaled_pieces.size(); ++i) {
if(scaled_pieces[i]) if(scaled_pieces[i]) {
painter.setPen(Qt::blue); painter.setPen(Qt::blue);
else } else {
painter.setPen(Qt::white); if(scaled_downloading[i]) {
painter.setPen(Qt::yellow);
} else {
painter.setPen(Qt::white);
}
}
painter.drawPoint(i,0); painter.drawPoint(i,0);
} }
pixmap = pix; pixmap = pix;
@ -89,10 +104,15 @@ public:
pix.fill(); pix.fill();
QPainter painter(&pix); QPainter painter(&pix);
for(uint i=0; i<pieces.size(); ++i) { for(uint i=0; i<pieces.size(); ++i) {
if(pieces[i]) if(pieces[i]) {
painter.setPen(Qt::blue); painter.setPen(Qt::blue);
else } else {
painter.setPen(Qt::white); if(downloading_pieces[i]) {
painter.setPen(Qt::yellow);
} else {
painter.setPen(Qt::white);
}
}
painter.drawPoint(i,0); painter.drawPoint(i,0);
} }
pixmap = pix; pixmap = pix;

4
src/propertieswidget.cpp

@ -338,7 +338,9 @@ void PropertiesWidget::loadDynamicData() {
if(!h.is_seed()) { if(!h.is_seed()) {
showPiecesDownloaded(true); showPiecesDownloaded(true);
// Downloaded pieces // Downloaded pieces
downloaded_pieces->setProgress(h.pieces()); bitfield bf(h.get_torrent_info().num_pieces(), 0);
h.downloading_pieces(bf);
downloaded_pieces->setProgress(h.pieces(), bf);
// Pieces availability // Pieces availability
if(h.has_metadata() && !h.is_paused() && !h.is_queued() && !h.is_checking()) { if(h.has_metadata() && !h.is_paused() && !h.is_queued() && !h.is_checking()) {
showPiecesAvailability(true); showPiecesAvailability(true);

10
src/qtorrenthandle.cpp

@ -451,6 +451,16 @@ bool QTorrentHandle::has_error() const {
return h.status().error.empty(); return h.status().error.empty();
} }
void QTorrentHandle::downloading_pieces(bitfield &bf) const {
Q_ASSERT(h.is_valid());
std::vector<partial_piece_info> queue;
h.get_download_queue(queue);
for(std::vector<partial_piece_info>::iterator it=queue.begin(); it!= queue.end(); it++) {
bf.set_bit(it->piece_index);
}
return;
}
// //
// Setters // Setters
// //

1
src/qtorrenthandle.h

@ -129,6 +129,7 @@ class QTorrentHandle {
bool first_last_piece_first() const; bool first_last_piece_first() const;
QString root_path() const; QString root_path() const;
bool has_error() const; bool has_error() const;
void downloading_pieces(bitfield &bf) const;
// //
// Setters // Setters

Loading…
Cancel
Save