Show video channel name column when viewing virtual channels
This commit is contained in:
parent
c3bb1156b5
commit
5c43b08b03
44
main.cpp
44
main.cpp
|
@ -40,7 +40,7 @@ static termpaint_attr* get_attr(const AttributeSetType type, const bool highligh
|
||||||
return highlight ? attributes[type].highlight : attributes[type].normal;
|
return highlight ? attributes[type].highlight : attributes[type].normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_channel_list(const std::vector<Video> &videos)
|
void draw_channel_list(const std::vector<Video> &videos, bool show_channel_name=false)
|
||||||
{
|
{
|
||||||
const size_t cols = termpaint_surface_width(surface);
|
const size_t cols = termpaint_surface_width(surface);
|
||||||
const size_t rows = termpaint_surface_height(surface);
|
const size_t rows = termpaint_surface_height(surface);
|
||||||
|
@ -49,16 +49,39 @@ void draw_channel_list(const std::vector<Video> &videos)
|
||||||
|
|
||||||
const size_t date_column = 0;
|
const size_t date_column = 0;
|
||||||
const size_t date_width = std::string("xxxx-xx-xx xx:xx").size();
|
const size_t date_width = std::string("xxxx-xx-xx xx:xx").size();
|
||||||
const size_t first_name_column = date_column + date_width + column_spacing;
|
|
||||||
const size_t last_name_column = cols;
|
|
||||||
const size_t name_quater = (last_name_column - first_name_column) / 4;
|
|
||||||
|
|
||||||
const size_t start_row = 2;
|
const size_t start_row = 2;
|
||||||
const size_t available_rows = rows - 2;
|
const size_t available_rows = rows - 2;
|
||||||
videos_per_page = available_rows;
|
videos_per_page = available_rows;
|
||||||
|
const int cur_page = selected_video / available_rows;
|
||||||
|
|
||||||
|
size_t cur_entry = 0;
|
||||||
|
|
||||||
|
std::map<std::string, std::string> channel_name_lookup;
|
||||||
|
|
||||||
|
const size_t channel_name_column = date_column + date_width + column_spacing;
|
||||||
|
size_t channel_name_width = show_channel_name * std::string("Channel").size();
|
||||||
|
if(show_channel_name) {
|
||||||
|
for(size_t i = cur_page*available_rows; i < videos.size(); i++) {
|
||||||
|
const Video &video = videos.at(i);
|
||||||
|
for(size_t c = 0; c<channels.size(); c++) {
|
||||||
|
const Channel &channel = channels.at(c);
|
||||||
|
if(video.channel_id == channel.id) {
|
||||||
|
channel_name_lookup[channel.id] = channel.name;
|
||||||
|
channel_name_width = std::max(channel_name_width, channel.tui_name_width);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(++cur_entry > available_rows)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t first_name_column = date_column + date_width + column_spacing + channel_name_width + (channel_name_width > 0) * column_spacing;
|
||||||
|
const size_t last_name_column = cols;
|
||||||
|
const size_t name_quater = (last_name_column - first_name_column) / 4;
|
||||||
|
|
||||||
const int pages = videos.size() / available_rows;
|
const int pages = videos.size() / available_rows;
|
||||||
const int cur_page = selected_video / available_rows;
|
|
||||||
|
|
||||||
const std::string channel_name = std::string("Channel: ") + channels[selected_channel].name.c_str();
|
const std::string channel_name = std::string("Channel: ") + channels[selected_channel].name.c_str();
|
||||||
termpaint_surface_write_with_attr(surface, 0, 0, channel_name.c_str(), get_attr(ASNormal));
|
termpaint_surface_write_with_attr(surface, 0, 0, channel_name.c_str(), get_attr(ASNormal));
|
||||||
|
@ -70,11 +93,13 @@ void draw_channel_list(const std::vector<Video> &videos)
|
||||||
}
|
}
|
||||||
|
|
||||||
termpaint_surface_write_with_attr(surface, date_column, 1, "Date", get_attr(ASNormal));
|
termpaint_surface_write_with_attr(surface, date_column, 1, "Date", get_attr(ASNormal));
|
||||||
|
if(show_channel_name)
|
||||||
|
termpaint_surface_write_with_attr(surface, channel_name_column, 1, "Channel", get_attr(ASNormal));
|
||||||
termpaint_surface_write_with_attr(surface, first_name_column, 1, "Title", get_attr(ASNormal));
|
termpaint_surface_write_with_attr(surface, first_name_column, 1, "Title", get_attr(ASNormal));
|
||||||
|
|
||||||
any_title_in_next_half = false;
|
any_title_in_next_half = false;
|
||||||
|
|
||||||
size_t cur_entry = 0;
|
cur_entry = 0;
|
||||||
for(size_t i = cur_page*available_rows; i < videos.size(); i++) {
|
for(size_t i = cur_page*available_rows; i < videos.size(); i++) {
|
||||||
const size_t row = start_row + cur_entry;
|
const size_t row = start_row + cur_entry;
|
||||||
const bool selected = i == selected_video;
|
const bool selected = i == selected_video;
|
||||||
|
@ -92,6 +117,9 @@ void draw_channel_list(const std::vector<Video> &videos)
|
||||||
}
|
}
|
||||||
|
|
||||||
termpaint_surface_write_with_attr(surface, date_column, row, dt.data(), attr);
|
termpaint_surface_write_with_attr(surface, date_column, row, dt.data(), attr);
|
||||||
|
if(show_channel_name) {
|
||||||
|
termpaint_surface_write_with_attr(surface, channel_name_column, row, channel_name_lookup[video.channel_id].c_str(), attr);
|
||||||
|
}
|
||||||
|
|
||||||
bool in_this_quater = title_offset * name_quater < video.tui_title_width;
|
bool in_this_quater = title_offset * name_quater < video.tui_title_width;
|
||||||
any_title_in_next_half = any_title_in_next_half || ((title_offset + 2) * name_quater) < video.tui_title_width;
|
any_title_in_next_half = any_title_in_next_half || ((title_offset + 2) * name_quater) < video.tui_title_width;
|
||||||
|
@ -216,6 +244,7 @@ void select_channel_by_id(const std::string &channel_id) {
|
||||||
void add_channel_to_list(Channel &channel)
|
void add_channel_to_list(Channel &channel)
|
||||||
{
|
{
|
||||||
channel.load_info(db);
|
channel.load_info(db);
|
||||||
|
channel.tui_name_width = string_width(channel.name);
|
||||||
|
|
||||||
std::string selected_channel_id;
|
std::string selected_channel_id;
|
||||||
if(selected_channel < channels.size())
|
if(selected_channel < channels.size())
|
||||||
|
@ -611,8 +640,9 @@ int main()
|
||||||
bool draw = true;
|
bool draw = true;
|
||||||
do {
|
do {
|
||||||
if(draw) {
|
if(draw) {
|
||||||
|
Channel &channel = channels.at(selected_channel);
|
||||||
termpaint_surface_clear(surface, TERMPAINT_DEFAULT_COLOR, TERMPAINT_DEFAULT_COLOR);
|
termpaint_surface_clear(surface, TERMPAINT_DEFAULT_COLOR, TERMPAINT_DEFAULT_COLOR);
|
||||||
draw_channel_list(videos[channels.at(selected_channel).id]);
|
draw_channel_list(videos[channel.id], channel.is_virtual);
|
||||||
tp_flush(force_repaint);
|
tp_flush(force_repaint);
|
||||||
force_repaint = false;
|
force_repaint = false;
|
||||||
}
|
}
|
||||||
|
|
9
yt.cpp
9
yt.cpp
|
@ -68,11 +68,11 @@ static json api_request(const std::string &url, std::map<std::string, std::strin
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel::Channel(sqlite3_stmt *row): id(get_string(row, 0)), name(get_string(row, 1)), is_virtual(false), virtual_flag(kNone), virtual_flag_value(false)
|
Channel::Channel(sqlite3_stmt *row): id(get_string(row, 0)), name(get_string(row, 1)), is_virtual(false), virtual_flag(kNone), virtual_flag_value(false), unwatched(0), tui_name_width(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel::Channel(const std::string &id, const std::string &name): id(id), name(name), is_virtual(false), virtual_flag(kNone), virtual_flag_value(false)
|
Channel::Channel(const std::string &id, const std::string &name): id(id), name(name), is_virtual(false), virtual_flag(kNone), virtual_flag_value(false), unwatched(0), tui_name_width(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,8 +272,9 @@ bool Channel::is_valid() const
|
||||||
return !id.empty() && !name.empty();
|
return !id.empty() && !name.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
Video::Video(sqlite3_stmt *row): id(get_string(row, 0)), title(get_string(row, 2)), description(get_string(row, 3)),
|
Video::Video(sqlite3_stmt *row): id(get_string(row, 0)), channel_id(get_string(row, 1)), title(get_string(row, 2)),
|
||||||
flags(sqlite3_column_int(row, 4)), published(get_string(row, 5)), tui_title_width(0)
|
description(get_string(row, 3)), flags(sqlite3_column_int(row, 4)), published(get_string(row, 5)),
|
||||||
|
tui_title_width(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
yt.h
2
yt.h
|
@ -41,6 +41,7 @@ public:
|
||||||
bool is_valid() const;
|
bool is_valid() const;
|
||||||
|
|
||||||
unsigned int unwatched;
|
unsigned int unwatched;
|
||||||
|
size_t tui_name_width;
|
||||||
private:
|
private:
|
||||||
Channel(const std::string &id, const std::string &name);
|
Channel(const std::string &id, const std::string &name);
|
||||||
};
|
};
|
||||||
|
@ -48,6 +49,7 @@ private:
|
||||||
struct Video
|
struct Video
|
||||||
{
|
{
|
||||||
std::string id;
|
std::string id;
|
||||||
|
std::string channel_id;
|
||||||
std::string title;
|
std::string title;
|
||||||
std::string description;
|
std::string description;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
Loading…
Reference in New Issue