void PropListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { painter->save(); QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); switch(index.column()) { case PCSIZE: QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(index.data().toLongLong())); break; case REMAINING: QItemDelegate::drawBackground(painter, opt, index); if (index.sibling(index.row(), PRIORITY).data().toInt() == prio::IGNORED) { QItemDelegate::drawDisplay(painter, opt, option.rect, tr("N/A")); } else { QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(index.data().toLongLong())); } break; case PROGRESS: if (index.data().toDouble() >= 0) { QStyleOptionProgressBarV2 newopt; qreal progress = index.data().toDouble() * 100.; newopt.rect = opt.rect; newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + "%"); newopt.progress = (int)progress; newopt.maximum = 100; newopt.minimum = 0; newopt.state |= QStyle::State_Enabled; newopt.textVisible = true; #ifndef Q_OS_WIN QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); #else // XXX: To avoid having the progress text on the right of the bar #ifndef QBT_USES_QT5 QPlastiqueStyle st; #else QProxyStyle st("fusion"); #endif st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); #endif } else { // Do not display anything if the file is disabled (progress == 0) QItemDelegate::drawBackground(painter, opt, index); } break; case PRIORITY: { QItemDelegate::drawBackground(painter, opt, index); QString text = ""; switch (index.data().toInt()) { case prio::MIXED: text = tr("Mixed", "Mixed (priorities"); break; case prio::IGNORED: text = tr("Not downloaded"); break; case prio::HIGH: text = tr("High", "High (priority)"); break; case prio::MAXIMUM: text = tr("Maximum", "Maximum (priority)"); break; default: text = tr("Normal", "Normal (priority)"); break; } QItemDelegate::drawDisplay(painter, opt, option.rect, text); } break; default: QItemDelegate::paint(painter, option, index); break; } painter->restore(); }
void TransferListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); painter->save(); switch(index.column()) { case TorrentModel::TR_AMOUNT_DOWNLOADED: case TorrentModel::TR_AMOUNT_UPLOADED: case TorrentModel::TR_AMOUNT_DOWNLOADED_SESSION: case TorrentModel::TR_AMOUNT_UPLOADED_SESSION: case TorrentModel::TR_AMOUNT_LEFT: case TorrentModel::TR_COMPLETED: case TorrentModel::TR_SIZE: case TorrentModel::TR_TOTAL_SIZE: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(index.data().toLongLong())); break; } case TorrentModel::TR_ETA: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::userFriendlyDuration(index.data().toLongLong())); break; } case TorrentModel::TR_SEEDS: case TorrentModel::TR_PEERS: { QString display = QString::number(index.data().toLongLong()); qlonglong total = index.data(Qt::UserRole).toLongLong(); if (total > 0) { // Scrape was successful, we have total values display += " ("+QString::number(total)+")"; } QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; } case TorrentModel::TR_STATUS: { const int state = index.data().toInt(); QString display; switch(state) { case BitTorrent::TorrentState::Downloading: display = tr("Downloading"); break; case BitTorrent::TorrentState::StalledDownloading: display = tr("Stalled", "Torrent is waiting for download to begin"); break; case BitTorrent::TorrentState::DownloadingMetadata: display = tr("Downloading metadata", "used when loading a magnet link"); break; case BitTorrent::TorrentState::ForcedDownloading: display = tr("[F] Downloading", "used when the torrent is forced started. You probably shouldn't translate the F."); break; case BitTorrent::TorrentState::Allocating: display = tr("Allocating", "qBittorrent is allocating the files on disk"); break; case BitTorrent::TorrentState::Uploading: case BitTorrent::TorrentState::StalledUploading: display = tr("Seeding", "Torrent is complete and in upload-only mode"); break; case BitTorrent::TorrentState::ForcedUploading: display = tr("[F] Seeding", "used when the torrent is forced started. You probably shouldn't translate the F."); break; case BitTorrent::TorrentState::QueuedDownloading: case BitTorrent::TorrentState::QueuedUploading: display = tr("Queued", "i.e. torrent is queued"); break; case BitTorrent::TorrentState::CheckingDownloading: case BitTorrent::TorrentState::CheckingUploading: display = tr("Checking", "Torrent local data is being checked"); break; case BitTorrent::TorrentState::PausedDownloading: display = tr("Paused"); break; case BitTorrent::TorrentState::PausedUploading: display = tr("Completed"); break; case BitTorrent::TorrentState::Error: display = tr("Missing Files"); break; default: display = ""; } QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; } case TorrentModel::TR_UPSPEED: case TorrentModel::TR_DLSPEED: { QItemDelegate::drawBackground(painter, opt, index); const qulonglong speed = index.data().toULongLong(); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, opt.rect, Utils::Misc::friendlyUnit(speed)+tr("/s", "/second (.i.e per second)")); break; } case TorrentModel::TR_UPLIMIT: case TorrentModel::TR_DLLIMIT: { QItemDelegate::drawBackground(painter, opt, index); const qlonglong limit = index.data().toLongLong(); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, opt.rect, limit > 0 ? Utils::String::fromDouble(limit/1024., 1) + " " + tr("KiB/s", "KiB/second (.i.e per second)") : QString::fromUtf8("∞")); break; } case TorrentModel::TR_TIME_ELAPSED: { QItemDelegate::drawBackground(painter, opt, index); QString txt = Utils::Misc::userFriendlyDuration(index.data().toLongLong()); qlonglong seeding_time = index.data(Qt::UserRole).toLongLong(); if (seeding_time > 0) txt += " ("+tr("Seeded for %1", "e.g. Seeded for 3m10s").arg(Utils::Misc::userFriendlyDuration(seeding_time))+")"; QItemDelegate::drawDisplay(painter, opt, opt.rect, txt); break; } case TorrentModel::TR_ADD_DATE: case TorrentModel::TR_SEED_DATE: QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, index.data().toDateTime().toLocalTime().toString(Qt::DefaultLocaleShortDate)); break; case TorrentModel::TR_RATIO_LIMIT: case TorrentModel::TR_RATIO: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; const qreal ratio = index.data().toDouble(); QItemDelegate::drawDisplay(painter, opt, opt.rect, ((ratio == -1) || (ratio > BitTorrent::TorrentHandle::MAX_RATIO)) ? QString::fromUtf8("∞") : Utils::String::fromDouble(ratio, 2)); break; } case TorrentModel::TR_PRIORITY: { const int priority = index.data().toInt(); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; if (priority > 0) QItemDelegate::paint(painter, opt, index); else { QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, "*"); } break; } case TorrentModel::TR_PROGRESS: { QStyleOptionProgressBarV2 newopt; qreal progress = index.data().toDouble()*100.; newopt.rect = opt.rect; newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + "%"); newopt.progress = (int)progress; newopt.maximum = 100; newopt.minimum = 0; newopt.state |= QStyle::State_Enabled; newopt.textVisible = true; #ifndef Q_OS_WIN QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); #else // XXX: To avoid having the progress text on the right of the bar #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) QPlastiqueStyle st; #else QProxyStyle st("fusion"); #endif st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); #endif break; } case TorrentModel::TR_LAST_ACTIVITY: { QString elapsedString; long long elapsed = index.data().toLongLong(); QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; if (elapsed == 0) // Show '< 1m ago' when elapsed time is 0 elapsed = 1; if (elapsed < 0) elapsedString = Utils::Misc::userFriendlyDuration(elapsed); else elapsedString = tr("%1 ago", "e.g.: 1h 20m ago").arg(Utils::Misc::userFriendlyDuration(elapsed)); QItemDelegate::drawDisplay(painter, opt, option.rect, elapsedString); break; } default: QItemDelegate::paint(painter, option, index); } painter->restore(); }
void TransferListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); painter->save(); switch(index.column()) { case TorrentModelItem::TR_AMOUNT_DOWNLOADED: case TorrentModelItem::TR_AMOUNT_UPLOADED: case TorrentModelItem::TR_AMOUNT_LEFT: case TorrentModelItem::TR_COMPLETED: case TorrentModelItem::TR_SIZE: case TorrentModelItem::TR_TOTAL_SIZE: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); break; } case TorrentModelItem::TR_ETA: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, option.rect, misc::userFriendlyDuration(index.data().toLongLong())); break; } case TorrentModelItem::TR_SEEDS: case TorrentModelItem::TR_PEERS: { QString display = QString::number(index.data().toLongLong()); qlonglong total = index.data(Qt::UserRole).toLongLong(); if (total > 0) { // Scrape was successful, we have total values display += " ("+QString::number(total)+")"; } QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; } case TorrentModelItem::TR_STATUS: { const int state = index.data().toInt(); QString display; switch(state) { case TorrentModelItem::STATE_DOWNLOADING: display = tr("Downloading"); break; case TorrentModelItem::STATE_DOWNLOADING_META: display = tr("Downloading metadata", "used when loading a magnet link"); break; case TorrentModelItem::STATE_ALLOCATING: display = tr("Allocating", "qBittorrent is allocating the files on disk"); break; case TorrentModelItem::STATE_PAUSED_DL: case TorrentModelItem::STATE_PAUSED_UP: display = tr("Paused"); break; case TorrentModelItem::STATE_QUEUED_DL: case TorrentModelItem::STATE_QUEUED_UP: display = tr("Queued", "i.e. torrent is queued"); break; case TorrentModelItem::STATE_SEEDING: case TorrentModelItem::STATE_STALLED_UP: display = tr("Seeding", "Torrent is complete and in upload-only mode"); break; case TorrentModelItem::STATE_STALLED_DL: display = tr("Stalled", "Torrent is waiting for download to begin"); break; case TorrentModelItem::STATE_CHECKING_DL: case TorrentModelItem::STATE_CHECKING_UP: display = tr("Checking", "Torrent local data is being checked"); break; case TorrentModelItem::STATE_QUEUED_CHECK: display = tr("Queued for checking", "i.e. torrent is queued for hash checking"); break; case TorrentModelItem::STATE_QUEUED_FASTCHECK: display = tr("Checking resume data", "used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents."); break; default: display = ""; } QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; } case TorrentModelItem::TR_UPSPEED: case TorrentModelItem::TR_DLSPEED: { QItemDelegate::drawBackground(painter, opt, index); const qulonglong speed = index.data().toULongLong(); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, opt.rect, misc::friendlyUnit(speed)+tr("/s", "/second (.i.e per second)")); break; } case TorrentModelItem::TR_UPLIMIT: case TorrentModelItem::TR_DLLIMIT: { QItemDelegate::drawBackground(painter, opt, index); const qlonglong limit = index.data().toLongLong(); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, opt.rect, limit > 0 ? misc::accurateDoubleToString(limit/1024., 1) + " " + tr("KiB/s", "KiB/second (.i.e per second)") : QString::fromUtf8("∞")); break; } case TorrentModelItem::TR_TIME_ELAPSED: { QItemDelegate::drawBackground(painter, opt, index); QString txt = misc::userFriendlyDuration(index.data().toLongLong()); qlonglong seeding_time = index.data(Qt::UserRole).toLongLong(); if (seeding_time > 0) txt += " ("+tr("Seeded for %1", "e.g. Seeded for 3m10s").arg(misc::userFriendlyDuration(seeding_time))+")"; QItemDelegate::drawDisplay(painter, opt, opt.rect, txt); break; } case TorrentModelItem::TR_ADD_DATE: case TorrentModelItem::TR_SEED_DATE: QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, index.data().toDateTime().toLocalTime().toString(Qt::DefaultLocaleShortDate)); break; case TorrentModelItem::TR_RATIO_LIMIT: case TorrentModelItem::TR_RATIO: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; const qreal ratio = index.data().toDouble(); QItemDelegate::drawDisplay(painter, opt, opt.rect, (ratio == -1 || ratio > QBtSession::MAX_RATIO) ? QString::fromUtf8("∞") : misc::accurateDoubleToString(ratio, 2)); break; } case TorrentModelItem::TR_PRIORITY: { const int priority = index.data().toInt(); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; if (priority >= 0) QItemDelegate::paint(painter, opt, index); else { QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, "*"); } break; } case TorrentModelItem::TR_PROGRESS: { QStyleOptionProgressBarV2 newopt; qreal progress = index.data().toDouble()*100.; newopt.rect = opt.rect; newopt.text = misc::accurateDoubleToString(progress, 1) + "%"; newopt.progress = (int)progress; newopt.maximum = 100; newopt.minimum = 0; newopt.state |= QStyle::State_Enabled; newopt.textVisible = true; #ifndef Q_OS_WIN QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); #else // XXX: To avoid having the progress text on the right of the bar #if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) QPlastiqueStyle st; #else QProxyStyle st("fusion"); #endif st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); #endif break; } case TorrentModelItem::TR_LAST_ACTIVITY: { QString elapsedString; long long elapsed = index.data().toLongLong(); QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; if (elapsed == 0) // Show '< 1m ago' when elapsed time is 0 elapsed = 1; if (elapsed < 0) elapsedString = misc::userFriendlyDuration(elapsed); else elapsedString = tr("%1 ago", "e.g.: 1h 20m ago").arg(misc::userFriendlyDuration(elapsed)); QItemDelegate::drawDisplay(painter, opt, option.rect, elapsedString); break; } default: QItemDelegate::paint(painter, option, index); } painter->restore(); }
void TransferListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); painter->save(); switch(index.column()) { case TransferModelItem::TM_AMOUNT_DOWNLOADED: case TransferModelItem::TM_AMOUNT_LEFT: case TransferModelItem::TM_SIZE: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight; QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); break; } case TransferModelItem::TM_SEEDS: case TransferModelItem::TM_PEERS: { QString display = QString::number(index.data().toLongLong()); if (index.data(Qt::UserRole).toLongLong() > 0) { // Scrape was successful, we have total values display += " ("+QString::number(index.data(Qt::UserRole).toLongLong())+")"; } QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight; QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; } case TransferModelItem::TM_STATUS: { const int state = index.data().toInt(); QString display; switch(state) { case TransferModelItem::STATE_DOWNLOADING: display = tr("Downloading"); break; case TransferModelItem::STATE_PAUSED_DL: case TransferModelItem::STATE_PAUSED_UP: display = tr("Paused"); break; case TransferModelItem::STATE_SEEDING: display = tr("Seeding", "Torrent is complete and in upload-only mode"); break; case TransferModelItem::STATE_STALLED_UP: case TransferModelItem::STATE_STALLED_DL: display = tr("Stalled", "Torrent is waiting for download to begin"); break; default: display = ""; } QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; } case TransferModelItem::TM_UPSPEED: case TransferModelItem::TM_DLSPEED:{ QItemDelegate::drawBackground(painter, opt, index); const qulonglong speed = index.data().toULongLong(); opt.displayAlignment = Qt::AlignRight; QItemDelegate::drawDisplay(painter, opt, opt.rect, misc::friendlyUnit(speed)+tr("/s", "/second (.i.e per second)")); break; } case TransferModelItem::TM_TIME_ELAPSED: { QItemDelegate::drawBackground(painter, opt, index); QString txt = misc::userFriendlyDuration(index.data().toLongLong()); qlonglong seeding_time = index.data(Qt::UserRole).toLongLong(); if (seeding_time > 0) txt += " ("+tr("Seeded for %1", "e.g. Seeded for 3m10s").arg(misc::userFriendlyDuration(seeding_time))+")"; QItemDelegate::drawDisplay(painter, opt, opt.rect, txt); break; } case TransferModelItem::TM_ADD_DATE: QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, opt.rect, index.data().toDateTime().toLocalTime().toString(Qt::DefaultLocaleShortDate)); break; case TransferModelItem::TM_ETA: QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawDisplay(painter, opt, option.rect, misc::userFriendlyDuration(index.data().toLongLong())); break; case TransferModelItem::TM_RATIO: { QItemDelegate::drawBackground(painter, opt, index); opt.displayAlignment = Qt::AlignRight; const qreal ratio = index.data().toDouble(); if (ratio > Session::MAX_RATIO) QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); else QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::number(ratio, 'f', 2)); break; } case TransferModelItem::TM_PROGRESS: { QStyleOptionProgressBarV2 newopt; qreal progress = index.data().toDouble()*100.; // We don't want to display 100% unless // the torrent is really complete if (progress > 99.94 && progress < 100.) progress = 99.9; newopt.rect = opt.rect; newopt.text = QString::number(progress, 'f', 1)+"%"; newopt.progress = (int)progress; newopt.maximum = 100; newopt.minimum = 0; newopt.state |= QStyle::State_Enabled; newopt.textVisible = true; #ifndef Q_WS_WIN QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); #else // XXX: To avoid having the progress text on the right of the bar QPlastiqueStyle st; st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); #endif break; } default: QItemDelegate::paint(painter, option, index); } painter->restore(); }