X-Git-Url: http://git.maemo.org/git/?p=qtrapids;a=blobdiff_plain;f=src%2Fgui%2FDownloadView.cpp;h=07c8e9726cc7bf50ae6d4f8cc4d7645b8f43b4ac;hp=2f91ff4f5dd11ab34a6e01ad21110818d614c0fb;hb=55732cd61b5d6c85a5e90aee584f12cbca70e116;hpb=08828f51a534f17235944d186b8f1b0c69696e1b diff --git a/src/gui/DownloadView.cpp b/src/gui/DownloadView.cpp index 2f91ff4..07c8e97 100644 --- a/src/gui/DownloadView.cpp +++ b/src/gui/DownloadView.cpp @@ -18,17 +18,26 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include +#include +#include +#include #include "DownloadView.h" -DownloadView::DownloadView(QWidget* parent) : - QTreeWidget(parent), - items_() + +DownloadView::DownloadView(QWidget* parent) : + QTreeWidget(parent), + items_(), + timer_(NULL) { setRootIsDecorated(false); // Hide branch lines, making one-level treeview (similar to list) setHeaderItem(DownloadViewItem::getHeaderItem()); - + connect(this, SIGNAL(itemPressed(QTreeWidgetItem*, int)), - this, SLOT(on_itemClicked(QTreeWidgetItem*, int))); + this, SLOT(on_itemClicked(QTreeWidgetItem*, int))); + + timer_ = new QTimer(this); + connect(timer_, SIGNAL(timeout()), this, SLOT(on_timeout())); + timer_->start(5000); } @@ -38,93 +47,197 @@ DownloadView::~DownloadView() } -void DownloadView::newItem(QTorrentHandle handle) +void DownloadView::newItem(qtrapids::QTorrentHandle handle) { +#ifdef QTRAPIDS_DEBUG qDebug() << "DownloadView::newItem() " << items_.count(handle); +#endif DownloadViewItem *item = new DownloadViewItem(QStringList() - << handle.name() - << QString::number(handle.getTotalSize()) - << handle.state() - << QString::number(handle.progress()) - << QString::number(handle.downloadRate()) - << QString::number(handle.uploadRate()) - << QString::number(handle.numSeeds()) + "/" - + QString::number(handle.numLeeches()) - << QString::number(handle.ratio()) - << "ETA" ); - + << handle.name() + << QString::number(handle.getTotalSize()) + << GetStatusString(handle.state()) + << QString::number(100*handle.progress()) + << QString::number(handle.downloadRate(), 'f', 2) + << QString::number(handle.uploadRate(), 'f', 2) + << QString::number(handle.numSeeds()) + "/" + + QString::number(handle.numLeeches()) + << QString::number(handle.ratio()) + << "ETA" ); + + // Set text color for status: + QBrush brushTmp(GetStatusColor(handle.state())); + item->setForeground(2, brushTmp); + addTopLevelItem(item); items_[handle] = item; } -void DownloadView::updateItem(QTorrentHandle handle) +void DownloadView::updateItem(qtrapids::QTorrentHandle handle) { - qDebug() << "DownloadView::updateItem() " << items_.count(handle); - + //qDebug() << "DownloadView::updateItem() " << items_.count(handle); + + static float lastProg = 0; + + // If there are items currently downloading, update: if (items_.count(handle) > 0) { + DownloadViewItem *item = items_[handle]; - item->setData(2, Qt::DisplayRole, QVariant(handle.state())); - item->setData(3, Qt::DisplayRole, - QVariant(QString::number(handle.progress()))); + + // Only the changing fields are being updated: + item->setData(2, Qt::DisplayRole, + QVariant(GetStatusString(handle.state()))); item->setData(4, Qt::DisplayRole, - QVariant(QString::number(handle.downloadRate()))); + QVariant(QString::number(handle.downloadRate(), 'f', 2))); item->setData(5, Qt::DisplayRole, - QVariant(QString::number(handle.uploadRate()))); - item->setData(6, Qt::DisplayRole, - QString::number(handle.numSeeds()) + "/" - + QString::number(handle.numLeeches())); + QVariant(QString::number(handle.uploadRate(), 'f', 2))); + item->setData(6, Qt::DisplayRole, + QString::number(handle.numSeeds()) + "/" + + QString::number(handle.numLeeches())); + + // Set progress if increment is 1 percent. + float prog = handle.progress(); + if ((prog-lastProg) >= 0.01 || prog >= 1.0) { + item->setData(3, Qt::DisplayRole, + QVariant(QString::number(100*prog))); + lastProg = prog; + } + + /// @TODO: ETA-counter adjusting,if ETA is to be implemented + + // Adjust color + QBrush brushTmp(GetStatusColor(handle.state())); + item->setForeground(2, brushTmp); } + } -QTorrentHandle DownloadView::removeSelected() +qtrapids::QTorrentHandle DownloadView::removeSelected() { +#ifdef QTRAPIDS_DEBUG qDebug() << "DownloadView::removeSelected() " << topLevelItemCount() ; +#endif DownloadViewItem *item = dynamic_cast (currentItem()); - - std::map::iterator listIter - = items_.begin(); - std::map::iterator listEnd - = items_.end(); - + + std::map::iterator listIter + = items_.begin(); + std::map::iterator listEnd + = items_.end(); + while (listIter != listEnd) { if (listIter->second == item) { break; } ++listIter; } - - QTorrentHandle handle = listIter->first; + + qtrapids::QTorrentHandle handle = listIter->first; items_.erase(listIter); - + int index = indexOfTopLevelItem(currentItem()); if (index >= 0) { takeTopLevelItem(index); } - + +#ifdef QTRAPIDS_DEBUG qDebug() << "DownloadView::removeSelected() " << topLevelItemCount() ; - +#endif + return handle; } -void DownloadView::removeItem(QTorrentHandle handle) +void DownloadView::removeItem(qtrapids::QTorrentHandle handle) { } +void DownloadView::setRefreshInterval(int msec) +{ + timer_->setInterval(msec); +} + + void DownloadView::on_itemClicked(QTreeWidgetItem * item, int column) -{/* +{ + /* qDebug() << "DownloadView::on_itemClicked(()" << item << "," << column; qDebug() << "current item" << currentItem(); - + if (item == currentItem() && item->isSelected()) { item->setSelected(false); } */ } +void DownloadView::on_timeout() +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << "DownloadView::on_timeout()"; +#endif + UpdateView(); +} + + + +QString DownloadView::GetStatusString(qtrapids::QTorrentHandle::State const& status) const +{ + switch (status) { + case qtrapids::QTorrentHandle::QUEUED_FOR_CHECKING : + return tr("Queued"); + case qtrapids::QTorrentHandle::CHECKING_FILES : + return tr("Checking"); + case qtrapids::QTorrentHandle::DOWNLOADING_METADATA : + return tr("DL meta"); + case qtrapids::QTorrentHandle::DOWNLOADING : + return tr("Downloading"); + case qtrapids::QTorrentHandle::FINISHED : + return tr("Finished"); + case qtrapids::QTorrentHandle::SEEDING : + return tr("Seeding"); + case qtrapids::QTorrentHandle::ALLOCATING : + return tr("Allocating"); + default: + return tr("N/A"); + } +} + + +QColor DownloadView::GetStatusColor(qtrapids::QTorrentHandle::State const& status) const +{ + QColor green(40,205,40); + QColor yellow(255,174,0); + + switch (status) { + case qtrapids::QTorrentHandle::QUEUED_FOR_CHECKING : + case qtrapids::QTorrentHandle::CHECKING_FILES : + case qtrapids::QTorrentHandle::DOWNLOADING_METADATA : + case qtrapids::QTorrentHandle::ALLOCATING : + return yellow; + case qtrapids::QTorrentHandle::DOWNLOADING : + case qtrapids::QTorrentHandle::FINISHED : + case qtrapids::QTorrentHandle::SEEDING : + return green; + default: + return QColor(); + } +} + +void DownloadView::UpdateView() +{ + DownloadViewItem *item = dynamic_cast (currentItem()); + + std::map::iterator listIter + = items_.begin(); + std::map::iterator listEnd + = items_.end(); + + while (listIter != listEnd) { + updateItem(listIter->first); + ++listIter; + } +}