From b3b4acaad88b0fadb7f7081063713a2f5d8f7e12 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Mon, 12 Jun 2006 22:34:41 +0000 Subject: [PATCH] * 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 --- rak/functional.h | 18 ++++++ src/display/window_download_chunks_seen.cc | 22 ++++--- src/display/window_download_transfer_list.cc | 63 +++++++++++++++++--- src/display/window_download_transfer_list.h | 24 +++++--- 4 files changed, 105 insertions(+), 22 deletions(-) diff --git a/rak/functional.h b/rak/functional.h index 43888ed8..584f9a10 100644 --- a/rak/functional.h +++ b/rak/functional.h @@ -169,6 +169,24 @@ less(Type t, Ftor f) { return less_t(t, f); } +template +struct less2_t : public std::binary_function { + 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 +inline less2_t +less2(FtorA f_a, FtorB f_b) { + return less2_t(f_a,f_b); +} + template struct _greater { typedef bool result_type; diff --git a/src/display/window_download_chunks_seen.cc b/src/display/window_download_chunks_seen.cc index 436be939..ab240f9e 100644 --- a/src/display/window_download_chunks_seen.cc +++ b/src/display/window_download_chunks_seen.cc @@ -38,9 +38,11 @@ #include #include +#include #include #include #include +#include #include #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 transferChunks(transfers->size(), 0); + std::vector 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::const_iterator itrTransfer = transferChunks.begin(); + std::vector::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; diff --git a/src/display/window_download_transfer_list.cc b/src/display/window_download_transfer_list.cc index 9922afc7..7f6d1912 100644 --- a/src/display/window_download_transfer_list.cc +++ b/src/display/window_download_transfer_list.cc @@ -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; + } +} + } diff --git a/src/display/window_download_transfer_list.h b/src/display/window_download_transfer_list.h index d5b802d5..619dabf9 100644 --- a/src/display/window_download_transfer_list.h +++ b/src/display/window_download_transfer_list.h @@ -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_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(rows() - get_height() + 1, 0); } + unsigned int rows() const; + unsigned int max_focus() const { return std::max(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; }; }