* Added view of blocks in transfer list view.

* Show chunks with only queued transfers with an underscore in chunks
seen view. Patch by Josef Drexler, public domain.


git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@719 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
rakshasa
2006-06-12 22:34:41 +00:00
parent 38f0cdbce2
commit b3b4acaad8
4 changed files with 105 additions and 22 deletions
+18
View File
@@ -169,6 +169,24 @@ less(Type t, Ftor f) {
return less_t<Type, Ftor>(t, f);
}
template <typename FtorA, typename FtorB>
struct less2_t : public std::binary_function<typename FtorA::argument_type, typename FtorB::argument_type, bool> {
less2_t(FtorA f_a, FtorB f_b) : m_f_a(f_a), m_f_b(f_b) {}
bool operator () (typename FtorA::argument_type a, typename FtorB::argument_type b) {
return m_f_a(a) < m_f_b(b);
}
FtorA m_f_a;
FtorB m_f_b;
};
template <typename FtorA, typename FtorB>
inline less2_t<FtorA, FtorB>
less2(FtorA f_a, FtorB f_b) {
return less2_t<FtorA,FtorB>(f_a,f_b);
}
template <typename Type, typename Ftor>
struct _greater {
typedef bool result_type;
+14 -8
View File
@@ -38,9 +38,11 @@
#include <cmath>
#include <stdexcept>
#include <rak/functional.h>
#include <rak/string_manip.h>
#include <torrent/bitfield.h>
#include <torrent/transfer_list.h>
#include <torrent/block.h>
#include <torrent/block_list.h>
#include "core/download.h"
@@ -77,9 +79,10 @@ WindowDownloadChunksSeen::redraw() {
}
if (!m_download->is_done()) {
m_canvas->print(36, 0, "X downloaded missing downloading");
m_canvas->print(36, 0, "X downloaded missing queued downloading");
m_canvas->print_char(50, 0, 'X' | A_BOLD);
m_canvas->print_char(61, 0, 'X' | A_REVERSE);
m_canvas->print_char(61, 0, 'X' | A_BOLD | A_UNDERLINE);
m_canvas->print_char(71, 0, 'X' | A_REVERSE);
}
*m_focus = std::min(*m_focus, max_focus());
@@ -89,12 +92,12 @@ WindowDownloadChunksSeen::redraw() {
const torrent::Bitfield* bitfield = m_download->download()->bitfield();
const torrent::TransferList* transfers = m_download->download()->transfer_list();
std::vector<uint32_t> transferChunks(transfers->size(), 0);
std::vector<torrent::BlockList*> transferChunks(transfers->size(), 0);
std::transform(transfers->begin(), transfers->end(), transferChunks.begin(), std::mem_fun(&torrent::BlockList::index));
std::sort(transferChunks.begin(), transferChunks.end());
std::copy(transfers->begin(), transfers->end(), transferChunks.begin());
std::sort(transferChunks.begin(), transferChunks.end(), rak::less2(std::mem_fun(&torrent::BlockList::index), std::mem_fun(&torrent::BlockList::index)));
std::vector<uint32_t>::const_iterator itrTransfer = transferChunks.begin();
std::vector<torrent::BlockList*>::const_iterator itrTransfer = transferChunks.begin();
for (int y = 1; y < m_canvas->get_height() && chunk < last; ++y) {
m_canvas->print(0, y, "%5u ", (int)(chunk - seen));
@@ -104,8 +107,11 @@ WindowDownloadChunksSeen::redraw() {
if (bitfield->get(chunk - seen)) {
attr = A_NORMAL;
} else if (itrTransfer != transferChunks.end() && (uint32_t)(chunk - seen) == *itrTransfer) {
attr = A_REVERSE;
} else if (itrTransfer != transferChunks.end() && (uint32_t)(chunk - seen) == (*itrTransfer)->index()) {
if (std::find_if((*itrTransfer)->begin(), (*itrTransfer)->end(), std::mem_fun_ref(&torrent::Block::is_transfering)) != (*itrTransfer)->end())
attr = A_REVERSE;
else
attr = A_BOLD | A_UNDERLINE;
itrTransfer++;
} else {
attr = A_BOLD;
+56 -7
View File
@@ -78,16 +78,31 @@ WindowDownloadTransferList::redraw() {
// Handle window size.
for (torrent::BlockList::const_iterator bItr = (*itr)->begin(), bLast = (*itr)->end(); bItr != bLast; ++bItr) {
chtype attr;
char id;
chtype attr = A_NORMAL;
// Add is_transfering.
if (bItr->is_finished())
attr = A_NORMAL;
else
if (bItr->transfers()->size() >= 1) {
attr = A_BOLD;
id = key_id(bItr->transfers()->back()->const_peer_info());
m_canvas->print_char(attr | 'X');
if (bItr->transfers()->size() > 1)
id = std::tolower(id);
} else if (bItr->queued()->size() >= 1) {
id = key_id(bItr->queued()->back()->const_peer_info());
if (bItr->queued()->size() > 1)
id = std::tolower(id);
} else if (bItr->is_finished()) {
// Temporary until
id = '*';
} else {
id = '.';
}
m_canvas->print_char(attr | id);
}
}
}
@@ -101,4 +116,38 @@ WindowDownloadTransferList::rows() const {
return 0;
}
char
WindowDownloadTransferList::key_id(torrent::BlockTransfer::key_type key) {
uint32_t oldestTime = cachedTime.seconds();
assigned_vector::iterator oldestItr = m_assigned.begin();
for (assigned_vector::iterator itr = m_assigned.begin(), last = m_assigned.end(); itr != last; ++itr) {
if (itr->m_key == key) {
itr->m_last = cachedTime.seconds();
return itr->m_id;
}
if (itr->m_last < oldestTime) {
oldestTime = itr->m_last;
oldestItr = itr;
}
}
if (oldestItr == m_assigned.end() || cachedTime.seconds() - oldestTime <= 60) {
// We didn't find any previously used id's to take over.
// Return 'f' when we run out of characters.
if (m_assigned.size() >= ('Z' - 'A'))
return 'Z';
char id = 'A' + m_assigned.size();
m_assigned.push_back(assigned_type(key, cachedTime.seconds(), id));
return id;
} else {
return oldestItr->m_id;
}
}
}
+17 -7
View File
@@ -50,20 +50,30 @@ namespace display {
class WindowDownloadTransferList : public Window {
public:
struct assigned_type {
assigned_type(torrent::BlockTransfer::key_type key, uint32_t last, char id) : m_key(key), m_last(last), m_id(id) { }
torrent::BlockTransfer::key_type m_key;
uint32_t m_last;
char m_id;
};
typedef std::vector<assigned_type> assigned_vector;
WindowDownloadTransferList(core::Download* d, unsigned int* focus);
virtual void redraw();
virtual void redraw();
unsigned int rows() const;
unsigned int max_focus() const { return std::max<int>(rows() - get_height() + 1, 0); }
unsigned int rows() const;
unsigned int max_focus() const { return std::max<int>(rows() - get_height() + 1, 0); }
private:
char peer_id(torrent::BlockTransfer::key_type key);
char key_id(torrent::BlockTransfer::key_type key);
core::Download* m_download;
core::Download* m_download;
unsigned int* m_focus;
unsigned int* m_focus;
assigned_vector m_assigned;
};
}