forked from premiere/premiere-libtorrent
client_test fixes
This commit is contained in:
parent
9696082355
commit
0221f6e8a6
|
@ -881,6 +881,10 @@ bool handle_alert(torrent_view& view, session_view& ses_view
|
|||
view.update_torrents(std::move(p->status));
|
||||
return true;
|
||||
}
|
||||
else if (torrent_removed_alert* p = alert_cast<torrent_removed_alert>(a))
|
||||
{
|
||||
view.remove_torrent(std::move(p->handle));
|
||||
}
|
||||
return false;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
@ -1298,9 +1302,14 @@ MAGNETURL is a magnet link
|
|||
|
||||
int terminal_width = 80;
|
||||
int terminal_height = 50;
|
||||
terminal_size(&terminal_width, &terminal_height);
|
||||
view.set_size(terminal_width, terminal_height / 3);
|
||||
ses_view.set_pos(terminal_height / 3);
|
||||
std::tie(terminal_width, terminal_height) = terminal_size();
|
||||
|
||||
// the ratio of torrent-list and details below depend on the number of
|
||||
// torrents we have in the session
|
||||
int const height = std::min(terminal_height / 2
|
||||
, std::max(5, view.num_visible_torrents() + 2));
|
||||
view.set_size(terminal_width, height);
|
||||
ses_view.set_pos(height);
|
||||
|
||||
int c = 0;
|
||||
if (sleep_and_input(&c, refresh_delay))
|
||||
|
|
|
@ -340,42 +340,45 @@ void clear_rows(int y1, int y2)
|
|||
#endif
|
||||
}
|
||||
|
||||
void terminal_size(int* terminal_width, int* terminal_height)
|
||||
std::pair<int, int> terminal_size()
|
||||
{
|
||||
int width = 80;
|
||||
int height = 50;
|
||||
#ifdef _WIN32
|
||||
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
CONSOLE_SCREEN_BUFFER_INFO coninfo;
|
||||
if (GetConsoleScreenBufferInfo(out, &coninfo))
|
||||
{
|
||||
*terminal_width = coninfo.dwSize.X;
|
||||
*terminal_height = coninfo.srWindow.Bottom - coninfo.srWindow.Top;
|
||||
width = coninfo.dwSize.X;
|
||||
height = coninfo.srWindow.Bottom - coninfo.srWindow.Top;
|
||||
#else
|
||||
int tty = open("/dev/tty", O_RDONLY);
|
||||
if (tty < 0)
|
||||
{
|
||||
*terminal_width = 190;
|
||||
*terminal_height = 100;
|
||||
return;
|
||||
width = 190;
|
||||
height = 100;
|
||||
return {width, height};
|
||||
}
|
||||
winsize size;
|
||||
int ret = ioctl(tty, TIOCGWINSZ, reinterpret_cast<char*>(&size));
|
||||
close(tty);
|
||||
if (ret == 0)
|
||||
{
|
||||
*terminal_width = size.ws_col;
|
||||
*terminal_height = size.ws_row;
|
||||
width = size.ws_col;
|
||||
height = size.ws_row;
|
||||
#endif
|
||||
|
||||
if (*terminal_width < 64)
|
||||
*terminal_width = 64;
|
||||
if (*terminal_height < 25)
|
||||
*terminal_height = 25;
|
||||
if (width < 64)
|
||||
width = 64;
|
||||
if (height < 25)
|
||||
height = 25;
|
||||
}
|
||||
else
|
||||
{
|
||||
*terminal_width = 190;
|
||||
*terminal_height = 100;
|
||||
width = 190;
|
||||
height = 100;
|
||||
}
|
||||
return {width, height};
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
|
|
@ -44,7 +44,7 @@ void clear_screen();
|
|||
|
||||
void clear_rows(int y1, int y2);
|
||||
|
||||
void terminal_size(int* terminal_width, int* terminal_height);
|
||||
std::pair<int, int> terminal_size();
|
||||
std::string piece_matrix(lt::bitfield const& p, int width, int* height);
|
||||
|
||||
void print(char const* str);
|
||||
|
|
|
@ -144,31 +144,51 @@ lt::torrent_handle torrent_view::get_active_handle() const
|
|||
return m_filtered_handles[m_active_torrent]->handle;
|
||||
}
|
||||
|
||||
void torrent_view::remove_torrent(lt::torrent_handle h)
|
||||
{
|
||||
auto i = m_all_handles.find(h);
|
||||
if (i == m_all_handles.end()) return;
|
||||
bool need_rerender = false;
|
||||
if (show_torrent(i->second))
|
||||
{
|
||||
auto j = std::find(m_filtered_handles.begin(), m_filtered_handles.end()
|
||||
, &i->second);
|
||||
if (j != m_filtered_handles.end())
|
||||
{
|
||||
m_filtered_handles.erase(j);
|
||||
need_rerender = true;
|
||||
}
|
||||
}
|
||||
m_all_handles.erase(i);
|
||||
if (need_rerender) render();
|
||||
}
|
||||
|
||||
void torrent_view::update_torrents(std::vector<lt::torrent_status> st)
|
||||
{
|
||||
std::set<lt::torrent_handle> updates;
|
||||
bool need_filter_update = false;
|
||||
for (lt::torrent_status& t : st)
|
||||
{
|
||||
auto j = m_all_handles.find(t);
|
||||
auto j = m_all_handles.find(t.handle);
|
||||
// add new entries here
|
||||
if (j == m_all_handles.end())
|
||||
{
|
||||
j = m_all_handles.insert(std::move(t)).first;
|
||||
if (show_torrent(*j))
|
||||
auto handle = t.handle;
|
||||
j = m_all_handles.emplace(handle, std::move(t)).first;
|
||||
if (show_torrent(j->second))
|
||||
{
|
||||
m_filtered_handles.push_back(&*j);
|
||||
m_filtered_handles.push_back(&j->second);
|
||||
need_filter_update = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bool const prev_show = show_torrent(*j);
|
||||
const_cast<lt::torrent_status&>(*j) = std::move(t);
|
||||
if (prev_show != show_torrent(*j))
|
||||
bool const prev_show = show_torrent(j->second);
|
||||
j->second = std::move(t);
|
||||
if (prev_show != show_torrent(j->second))
|
||||
need_filter_update = true;
|
||||
else
|
||||
updates.insert(j->handle);
|
||||
updates.insert(j->second.handle);
|
||||
}
|
||||
}
|
||||
if (need_filter_update)
|
||||
|
@ -180,11 +200,12 @@ void torrent_view::update_torrents(std::vector<lt::torrent_status> st)
|
|||
{
|
||||
int torrent_index = 0;
|
||||
for (auto i = m_filtered_handles.begin();
|
||||
i != m_filtered_handles.end(); ++torrent_index, ++i)
|
||||
i != m_filtered_handles.end(); ++i)
|
||||
{
|
||||
if (torrent_index < m_scroll_position
|
||||
|| torrent_index >= m_scroll_position + m_height - header_size)
|
||||
{
|
||||
++torrent_index;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -194,10 +215,14 @@ void torrent_view::update_torrents(std::vector<lt::torrent_status> st)
|
|||
continue;
|
||||
|
||||
if (updates.count(s.handle) == 0)
|
||||
{
|
||||
++torrent_index;
|
||||
continue;
|
||||
}
|
||||
|
||||
set_cursor_pos(0, header_size + torrent_index - m_scroll_position);
|
||||
print_torrent(s, torrent_index == m_active_torrent);
|
||||
++torrent_index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -265,11 +290,12 @@ void torrent_view::render()
|
|||
int torrent_index = 0;
|
||||
|
||||
for (std::vector<lt::torrent_status const*>::iterator i = m_filtered_handles.begin();
|
||||
i != m_filtered_handles.end(); ++torrent_index)
|
||||
i != m_filtered_handles.end();)
|
||||
{
|
||||
if (torrent_index < m_scroll_position)
|
||||
{
|
||||
++i;
|
||||
++torrent_index;
|
||||
continue;
|
||||
}
|
||||
if (lines_printed >= m_height)
|
||||
|
@ -286,6 +312,7 @@ void torrent_view::render()
|
|||
set_cursor_pos(0, torrent_index + header_size - m_scroll_position);
|
||||
print_torrent(s, torrent_index == m_active_torrent);
|
||||
++lines_printed;
|
||||
++torrent_index;
|
||||
}
|
||||
|
||||
clear_rows(torrent_index + header_size, m_height);
|
||||
|
@ -419,8 +446,8 @@ void torrent_view::update_filtered_torrents()
|
|||
m_filtered_handles.clear();
|
||||
for (auto const& h : m_all_handles)
|
||||
{
|
||||
if (!show_torrent(h)) continue;
|
||||
m_filtered_handles.push_back(&h);
|
||||
if (!show_torrent(h.second)) continue;
|
||||
m_filtered_handles.push_back(&h.second);
|
||||
}
|
||||
if (m_active_torrent >= int(m_filtered_handles.size())) m_active_torrent = int(m_filtered_handles.size()) - 1;
|
||||
if (m_active_torrent < 0) m_active_torrent = 0;
|
||||
|
|
|
@ -35,7 +35,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <unordered_set>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "libtorrent/fwd.hpp"
|
||||
#include "libtorrent/torrent_status.hpp"
|
||||
|
@ -67,7 +67,9 @@ struct torrent_view
|
|||
lt::torrent_status const& get_active_torrent() const;
|
||||
lt::torrent_handle get_active_handle() const;
|
||||
|
||||
void remove_torrent(lt::torrent_handle st);
|
||||
void update_torrents(std::vector<lt::torrent_status> st);
|
||||
int num_visible_torrents() const { return int(m_filtered_handles.size()); }
|
||||
|
||||
int height() const;
|
||||
|
||||
|
@ -93,7 +95,7 @@ private:
|
|||
void update_filtered_torrents();
|
||||
|
||||
// all torrents
|
||||
std::unordered_set<lt::torrent_status> m_all_handles;
|
||||
std::unordered_map<lt::torrent_handle, lt::torrent_status> m_all_handles;
|
||||
|
||||
// pointers into m_all_handles of the remaining torrents after filtering
|
||||
std::vector<lt::torrent_status const*> m_filtered_handles;
|
||||
|
|
Loading…
Reference in New Issue