mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2024-11-26 19:26:59 +03:00
- Make torrent status filters behave as in µTorrent
This commit is contained in:
parent
46f081d888
commit
d6e1dc9020
4 changed files with 85 additions and 39 deletions
|
@ -41,7 +41,7 @@
|
|||
#include "misc.h"
|
||||
|
||||
// Defines for download list list columns
|
||||
enum TorrentState {STATE_STALLED, STATE_DOWNLOADING, STATE_SEEDING, STATE_PAUSED, STATE_QUEUED, STATE_CHECKING, STATE_INVALID};
|
||||
enum TorrentState {STATE_DOWNLOADING, STATE_STALLED_DL, STATE_STALLED_UP, STATE_SEEDING, STATE_PAUSED_DL, STATE_PAUSED_UP, STATE_QUEUED_DL, STATE_QUEUED_UP, STATE_CHECKING_UP, STATE_CHECKING_DL, STATE_INVALID};
|
||||
enum Column {TR_NAME, TR_PRIORITY, TR_SIZE, TR_PROGRESS, TR_STATUS, TR_SEEDS, TR_PEERS, TR_DLSPEED, TR_UPSPEED, TR_ETA, TR_RATIO, TR_HASH};
|
||||
|
||||
class TransferListDelegate: public QItemDelegate {
|
||||
|
@ -86,19 +86,23 @@ public:
|
|||
case STATE_DOWNLOADING:
|
||||
display = tr("Downloading");
|
||||
break;
|
||||
case STATE_PAUSED:
|
||||
case STATE_PAUSED_DL:
|
||||
case STATE_PAUSED_UP:
|
||||
display = tr("Paused");
|
||||
break;
|
||||
case STATE_QUEUED:
|
||||
case STATE_QUEUED_DL:
|
||||
case STATE_QUEUED_UP:
|
||||
display = tr("Queued", "i.e. torrent is queued");
|
||||
break;
|
||||
case STATE_SEEDING:
|
||||
case STATE_STALLED_UP:
|
||||
display = tr("Seeding", "Torrent is complete and in upload-only mode");
|
||||
break;
|
||||
case STATE_STALLED:
|
||||
case STATE_STALLED_DL:
|
||||
display = tr("Stalled", "Torrent is waiting for download to begin");
|
||||
break;
|
||||
case STATE_CHECKING:
|
||||
case STATE_CHECKING_DL:
|
||||
case STATE_CHECKING_UP:
|
||||
display = tr("Checking", "Torrent local data is being checked");
|
||||
}
|
||||
QItemDelegate::drawBackground(painter, opt, index);
|
||||
|
|
|
@ -65,7 +65,7 @@ public:
|
|||
|
||||
// SIGNAL/SLOT
|
||||
connect(this, SIGNAL(currentRowChanged(int)), transferList, SLOT(applyFilter(int)));
|
||||
connect(transferList, SIGNAL(torrentStatusUpdate(uint,uint,uint)), this, SLOT(updateTorrentNumbers(uint, uint, uint)));
|
||||
connect(transferList, SIGNAL(torrentStatusUpdate(uint,uint,uint,uint)), this, SLOT(updateTorrentNumbers(uint, uint, uint, uint)));
|
||||
|
||||
// Load settings
|
||||
loadSettings();
|
||||
|
@ -88,8 +88,7 @@ public:
|
|||
}
|
||||
|
||||
protected slots:
|
||||
void updateTorrentNumbers(uint nb_downloading, uint nb_seeding, uint nb_inactive) {
|
||||
uint nb_active = nb_downloading+nb_seeding;
|
||||
void updateTorrentNumbers(uint nb_downloading, uint nb_seeding, uint nb_active, uint nb_inactive) {
|
||||
item(FILTER_ALL)->setData(Qt::DisplayRole, tr("All")+" ("+QString::number(nb_active+nb_inactive)+")");
|
||||
item(FILTER_DOWNLOADING)->setData(Qt::DisplayRole, tr("Downloading")+" ("+QString::number(nb_downloading)+")");
|
||||
item(FILTER_COMPLETED)->setData(Qt::DisplayRole, tr("Completed")+" ("+QString::number(nb_seeding)+")");
|
||||
|
|
|
@ -152,11 +152,19 @@ void TransferListWidget::addTorrent(QTorrentHandle& h) {
|
|||
// Pause torrent if it is
|
||||
if(h.is_paused()) {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/paused.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED);
|
||||
if(h.is_seed())
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED_UP);
|
||||
else
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED_DL);
|
||||
//setRowColor(row, QString::fromUtf8("red"));
|
||||
}else{
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED);
|
||||
if(h.is_seed()) {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED_UP);
|
||||
} else {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED_DL);
|
||||
}
|
||||
//setRowColor(row, QString::fromUtf8("grey"));
|
||||
}
|
||||
// Select first torrent to be added
|
||||
|
@ -188,11 +196,16 @@ void TransferListWidget::pauseTorrent(QTorrentHandle &h) {
|
|||
}
|
||||
|
||||
void TransferListWidget::pauseTorrent(int row, bool refresh_list) {
|
||||
QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(row));
|
||||
listModel->setData(listModel->index(row, TR_DLSPEED), QVariant((double)0.0));
|
||||
listModel->setData(listModel->index(row, TR_UPSPEED), QVariant((double)0.0));
|
||||
listModel->setData(listModel->index(row, TR_ETA), QVariant((qlonglong)-1));
|
||||
listModel->setData(listModel->index(row, TR_NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED);
|
||||
if(h.is_seed()) {
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED_UP);
|
||||
} else {
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED_DL);
|
||||
}
|
||||
listModel->setData(listModel->index(row, TR_SEEDS), QVariant(0.0));
|
||||
listModel->setData(listModel->index(row, TR_PEERS), QVariant(0.0));
|
||||
//setRowColor(row, QString::fromUtf8("red"));
|
||||
|
@ -210,10 +223,10 @@ void TransferListWidget::resumeTorrent(int row, bool refresh_list) {
|
|||
if(!h.is_valid()) return;
|
||||
if(h.is_seed()) {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_SEEDING);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED_UP);
|
||||
} else {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(":/Icons/skin/stalled.png")), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED_DL);
|
||||
}
|
||||
if(refresh_list)
|
||||
refreshList();
|
||||
|
@ -246,12 +259,18 @@ int TransferListWidget::updateTorrent(int row) {
|
|||
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/run-build.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_PROGRESS), QVariant((double)h.progress()));
|
||||
s = STATE_CHECKING;
|
||||
if(h.is_seed())
|
||||
s = STATE_CHECKING_UP;
|
||||
else
|
||||
s = STATE_CHECKING_DL;
|
||||
listModel->setData(listModel->index(row, TR_STATUS), s);
|
||||
}else {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/mail-queue.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_ETA), QVariant((qlonglong)-1));
|
||||
s = STATE_QUEUED;
|
||||
if(h.is_seed())
|
||||
s = STATE_QUEUED_UP;
|
||||
else
|
||||
s =STATE_QUEUED_DL;
|
||||
listModel->setData(listModel->index(row, TR_STATUS), s);
|
||||
}
|
||||
// Reset speeds and seeds/leech
|
||||
|
@ -263,7 +282,11 @@ int TransferListWidget::updateTorrent(int row) {
|
|||
return s;
|
||||
}
|
||||
}
|
||||
if(h.is_paused()) return STATE_PAUSED;
|
||||
if(h.is_paused()) {
|
||||
if(h.is_seed())
|
||||
return STATE_PAUSED_UP;
|
||||
return STATE_PAUSED_DL;
|
||||
}
|
||||
|
||||
// Parse download state
|
||||
switch(h.state()) {
|
||||
|
@ -272,8 +295,11 @@ int TransferListWidget::updateTorrent(int row) {
|
|||
case torrent_status::queued_for_checking:
|
||||
case torrent_status::checking_resume_data:
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/run-build.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_CHECKING);
|
||||
s = STATE_CHECKING;
|
||||
if(h.is_seed())
|
||||
s = STATE_CHECKING_UP;
|
||||
else
|
||||
s = STATE_CHECKING_DL;
|
||||
listModel->setData(listModel->index(row, TR_STATUS), s);
|
||||
listModel->setData(listModel->index(row, TR_ETA), QVariant((qlonglong)-1));
|
||||
//setRowColor(row, QString::fromUtf8("grey"));
|
||||
break;
|
||||
|
@ -282,24 +308,27 @@ int TransferListWidget::updateTorrent(int row) {
|
|||
if(h.download_payload_rate() > 0) {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_ETA), QVariant((qlonglong)BTSession->getETA(hash)));
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_DOWNLOADING);
|
||||
s = STATE_DOWNLOADING;
|
||||
//setRowColor(row, QString::fromUtf8("green"));
|
||||
}else{
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_ETA), QVariant((qlonglong)-1));
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED);
|
||||
s = STATE_STALLED;
|
||||
s = STATE_STALLED_DL;
|
||||
//setRowColor(row, QApplication::palette().color(QPalette::WindowText));
|
||||
}
|
||||
listModel->setData(listModel->index(row, TR_STATUS), s);
|
||||
listModel->setData(listModel->index(row, TR_UPSPEED), QVariant((double)h.upload_payload_rate()));
|
||||
break;
|
||||
case torrent_status::finished:
|
||||
case torrent_status::seeding:
|
||||
listModel->setData(listModel->index(row, TR_ETA), QVariant((qlonglong)-1));
|
||||
listModel->setData(listModel->index(row, TR_UPSPEED), QVariant((double)h.upload_payload_rate()));
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_SEEDING);
|
||||
s = STATE_SEEDING;
|
||||
if(h.upload_payload_rate() > 0) {
|
||||
s = STATE_SEEDING;
|
||||
} else {
|
||||
s = STATE_STALLED_UP;
|
||||
}
|
||||
listModel->setData(listModel->index(row, TR_STATUS), s);
|
||||
}
|
||||
// Common to both downloads and uploads
|
||||
listModel->setData(listModel->index(row, TR_PROGRESS), QVariant((double)h.progress()));
|
||||
|
@ -335,11 +364,11 @@ void TransferListWidget::setFinished(QTorrentHandle &h) {
|
|||
if(row >= 0) {
|
||||
if(h.is_paused()) {
|
||||
listModel->setData(listModel->index(row, TR_NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_PAUSED_UP);
|
||||
//setRowColor(row, "red");
|
||||
}else{
|
||||
listModel->setData(listModel->index(row, TR_NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_SEEDING);
|
||||
listModel->setData(listModel->index(row, TR_STATUS), STATE_STALLED_UP);
|
||||
//setRowColor(row, "orange");
|
||||
}
|
||||
listModel->setData(listModel->index(row, TR_ETA), QVariant((qlonglong)-1));
|
||||
|
@ -357,27 +386,37 @@ void TransferListWidget::setRefreshInterval(int t) {
|
|||
}
|
||||
|
||||
void TransferListWidget::refreshList() {
|
||||
unsigned int nb_downloading = 0, nb_seeding=0, nb_inactive = 0;
|
||||
unsigned int nb_downloading = 0, nb_seeding=0, nb_active=0, nb_inactive = 0;
|
||||
for(int i=0; i<listModel->rowCount(); ++i) {
|
||||
int s = updateTorrent(i);
|
||||
switch(s) {
|
||||
case STATE_DOWNLOADING:
|
||||
case STATE_STALLED:
|
||||
++nb_active;
|
||||
++nb_downloading;
|
||||
break;
|
||||
case STATE_STALLED_DL:
|
||||
case STATE_CHECKING_DL:
|
||||
case STATE_PAUSED_DL:
|
||||
case STATE_QUEUED_DL:
|
||||
++nb_inactive;
|
||||
++nb_downloading;
|
||||
break;
|
||||
case STATE_SEEDING:
|
||||
++nb_active;
|
||||
++nb_seeding;
|
||||
break;
|
||||
case STATE_CHECKING:
|
||||
case STATE_PAUSED:
|
||||
case STATE_QUEUED:
|
||||
case STATE_STALLED_UP:
|
||||
case STATE_CHECKING_UP:
|
||||
case STATE_PAUSED_UP:
|
||||
case STATE_QUEUED_UP:
|
||||
++nb_seeding;
|
||||
++nb_inactive;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
emit torrentStatusUpdate(nb_downloading, nb_seeding, nb_inactive);
|
||||
emit torrentStatusUpdate(nb_downloading, nb_seeding, nb_active, nb_inactive);
|
||||
}
|
||||
|
||||
int TransferListWidget::getRowFromHash(QString hash) const{
|
||||
|
@ -881,8 +920,8 @@ void TransferListWidget::displayListMenu(const QPoint&) {
|
|||
added_preview_action = true;
|
||||
}
|
||||
}
|
||||
if(added_preview_action)
|
||||
listMenu.addSeparator();
|
||||
if(added_preview_action)
|
||||
listMenu.addSeparator();
|
||||
if(one_has_metadata) {
|
||||
listMenu.addAction(&actionForce_recheck);
|
||||
listMenu.addSeparator();
|
||||
|
@ -1010,16 +1049,20 @@ void TransferListWidget::currentChanged(const QModelIndex& current, const QModel
|
|||
void TransferListWidget::applyFilter(int f) {
|
||||
switch(f) {
|
||||
case FILTER_DOWNLOADING:
|
||||
proxyModel->setFilterRegExp(QRegExp(QString::number(STATE_DOWNLOADING)+"|"+QString::number(STATE_STALLED), Qt::CaseSensitive));
|
||||
proxyModel->setFilterRegExp(QRegExp(QString::number(STATE_DOWNLOADING)+"|"+QString::number(STATE_STALLED_DL)+"|"+
|
||||
QString::number(STATE_PAUSED_DL)+"|"+QString::number(STATE_CHECKING_DL)+"|"+
|
||||
QString::number(STATE_QUEUED_DL), Qt::CaseSensitive));
|
||||
break;
|
||||
case FILTER_COMPLETED:
|
||||
proxyModel->setFilterRegExp(QRegExp(QString::number(STATE_SEEDING), Qt::CaseSensitive, QRegExp::FixedString));
|
||||
proxyModel->setFilterRegExp(QRegExp(QString::number(STATE_SEEDING)+"|"+QString::number(STATE_STALLED_UP)+"|"+
|
||||
QString::number(STATE_PAUSED_UP)+"|"+QString::number(STATE_CHECKING_UP)+"|"+
|
||||
QString::number(STATE_QUEUED_UP), Qt::CaseSensitive));
|
||||
break;
|
||||
case FILTER_ACTIVE:
|
||||
proxyModel->setFilterRegExp(QRegExp(QString::number(STATE_DOWNLOADING)+"|"+QString::number(STATE_SEEDING)+"|"+QString::number(STATE_STALLED), Qt::CaseSensitive));
|
||||
proxyModel->setFilterRegExp(QRegExp(QString::number(STATE_DOWNLOADING)+"|"+QString::number(STATE_SEEDING), Qt::CaseSensitive));
|
||||
break;
|
||||
case FILTER_INACTIVE:
|
||||
proxyModel->setFilterRegExp(QRegExp(QString::number(STATE_CHECKING)+"|"+QString::number(STATE_PAUSED)+"|"+QString::number(STATE_QUEUED), Qt::CaseSensitive));
|
||||
proxyModel->setFilterRegExp(QRegExp("[^"+QString::number(STATE_DOWNLOADING)+QString::number(STATE_SEEDING)+"]", Qt::CaseSensitive));
|
||||
break;
|
||||
default:
|
||||
proxyModel->setFilterRegExp(QRegExp());
|
||||
|
|
|
@ -110,7 +110,7 @@ public slots:
|
|||
|
||||
signals:
|
||||
void currentTorrentChanged(QTorrentHandle &h);
|
||||
void torrentStatusUpdate(unsigned int, unsigned int, unsigned int);
|
||||
void torrentStatusUpdate(unsigned int nb_downloading, unsigned int nb_seeding, unsigned int nb_active, unsigned int nb_inactive);
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue