forked from len0rd/rockbox
text viewer:
-remove 1px gap at the top and bottom of the screen to maximize the draw erea, especially for small screens. -fix trashes on the vertical scrollbar when scrolled the column left/right. -fix bug that vertical scrllbar sometimes goes up while scrolling down. -don't chage displayed line after closing menu. -use simplelist to select bookmark to make it work better. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28213 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
90e8815673
commit
53a936ab83
6 changed files with 71 additions and 66 deletions
|
@ -60,7 +60,7 @@ enum plugin_status plugin_start(const void* file)
|
||||||
atexit(tv_exit);
|
atexit(tv_exit);
|
||||||
while (!done) {
|
while (!done) {
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
if (rb->global_settings->statusbar != STATUSBAR_OFF && preferences->statusbar)
|
if (preferences->statusbar)
|
||||||
rb->send_event(GUI_EVENT_ACTIONUPDATE, NULL);
|
rb->send_event(GUI_EVENT_ACTIONUPDATE, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -174,8 +174,6 @@ unsigned tv_menu(void)
|
||||||
if (res == TV_MENU_RESULT_EXIT_MENU)
|
if (res == TV_MENU_RESULT_EXIT_MENU)
|
||||||
{
|
{
|
||||||
tv_convert_fpos(cur_file_pos, &cur_pos);
|
tv_convert_fpos(cur_file_pos, &cur_pos);
|
||||||
if (preferences->vertical_scroll_mode == VS_PAGE)
|
|
||||||
cur_pos.line = 0;
|
|
||||||
|
|
||||||
tv_move_screen(cur_pos.page, cur_pos.line, SEEK_SET);
|
tv_move_screen(cur_pos.page, cur_pos.line, SEEK_SET);
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,30 @@ void tv_create_system_bookmark(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* get_bookmark_name(int selected, void * data,
|
||||||
|
char * buffer, size_t buffer_len)
|
||||||
|
{
|
||||||
|
(void)data;
|
||||||
|
struct tv_bookmark_info *bookmark = &bookmarks[selected];
|
||||||
|
rb->snprintf(buffer, buffer_len,
|
||||||
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
"%cPage: %d Line: %d",
|
||||||
|
#else
|
||||||
|
"%cP:%d L:%d",
|
||||||
|
#endif
|
||||||
|
(bookmark->flag & TV_BOOKMARK_SYSTEM)? '*' : ' ',
|
||||||
|
bookmark->pos.page + 1, bookmark->pos.line + 1);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int list_action_callback(int action, struct gui_synclist *lists)
|
||||||
|
{
|
||||||
|
(void) lists;
|
||||||
|
if (action == ACTION_STD_OK)
|
||||||
|
return ACTION_STD_CANCEL;
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
void tv_select_bookmark(void)
|
void tv_select_bookmark(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -185,32 +209,18 @@ void tv_select_bookmark(void)
|
||||||
select_pos = bookmarks[0].pos;
|
select_pos = bookmarks[0].pos;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int selected = -1;
|
struct simplelist_info info;
|
||||||
struct opt_items items[bookmark_count];
|
|
||||||
unsigned char names[bookmark_count][24];
|
|
||||||
|
|
||||||
rb->qsort(bookmarks, bookmark_count, sizeof(struct tv_bookmark_info), bm_comp);
|
rb->qsort(bookmarks, bookmark_count, sizeof(struct tv_bookmark_info), bm_comp);
|
||||||
|
|
||||||
for (i = 0; i < bookmark_count; i++)
|
rb->simplelist_info_init(&info, "Select bookmark",
|
||||||
{
|
bookmark_count, bookmarks);
|
||||||
rb->snprintf(names[i], sizeof(names[0]),
|
info.get_name = get_bookmark_name;
|
||||||
#if CONFIG_KEYPAD != PLAYER_PAD
|
info.action_callback = list_action_callback;
|
||||||
"%cPage: %d Line: %d",
|
rb->simplelist_show_list(&info);
|
||||||
#else
|
|
||||||
"%cP:%d L:%d",
|
|
||||||
#endif
|
|
||||||
(bookmarks[i].flag & TV_BOOKMARK_SYSTEM)? '*' : ' ',
|
|
||||||
bookmarks[i].pos.page + 1,
|
|
||||||
bookmarks[i].pos.line + 1);
|
|
||||||
items[i].string = names[i];
|
|
||||||
items[i].voice_id = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rb->set_option("Select bookmark", &selected, INT, items,
|
if (info.selection >= 0 && info.selection < bookmark_count)
|
||||||
bookmark_count, NULL);
|
select_pos = bookmarks[info.selection].pos;
|
||||||
|
|
||||||
if (selected >= 0 && selected < bookmark_count)
|
|
||||||
select_pos = bookmarks[selected].pos;
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* when does not select any bookmarks, move to the current page */
|
/* when does not select any bookmarks, move to the current page */
|
||||||
|
|
|
@ -81,14 +81,11 @@ struct tv_rect {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct viewport vp_info;
|
static struct viewport vp_info;
|
||||||
|
static struct viewport vp_text;
|
||||||
static bool is_initialized_vp = false;
|
static bool is_initialized_vp = false;
|
||||||
|
|
||||||
static struct screen* display;
|
static struct screen* display;
|
||||||
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
|
||||||
static int drawmode = DRMODE_SOLID;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* layout */
|
/* layout */
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
static struct tv_rect header;
|
static struct tv_rect header;
|
||||||
|
@ -98,7 +95,6 @@ static struct tv_rect vertical_scrollbar;
|
||||||
#else
|
#else
|
||||||
static struct tv_rect bookmark;
|
static struct tv_rect bookmark;
|
||||||
#endif
|
#endif
|
||||||
static struct tv_rect drawarea;
|
|
||||||
|
|
||||||
static bool show_horizontal_scrollbar;
|
static bool show_horizontal_scrollbar;
|
||||||
static bool show_vertical_scrollbar;
|
static bool show_vertical_scrollbar;
|
||||||
|
@ -176,18 +172,23 @@ void tv_init_scrollbar(off_t total, bool show_scrollbar)
|
||||||
void tv_show_bookmarks(const int *rows, int count)
|
void tv_show_bookmarks(const int *rows, int count)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
|
display->set_viewport(&vp_text);
|
||||||
|
display->set_drawmode(DRMODE_COMPLEMENT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (count--)
|
while (count--)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
display->fillrect(drawarea.x, drawarea.y + rows[count] * row_height,
|
display->fillrect(0, rows[count] * row_height,
|
||||||
drawarea.w, row_height);
|
vp_text.width, row_height);
|
||||||
#else
|
#else
|
||||||
display->putchar(bookmark.x, drawarea.y + rows[count], TV_BOOKMARK_ICON);
|
display->putchar(bookmark.x, bookmark.y + rows[count], TV_BOOKMARK_ICON);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef HAVE_LCD_BITMAP
|
||||||
|
display->set_drawmode(DRMODE_SOLID);
|
||||||
|
display->set_viewport(&vp_info);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void tv_update_extra(int window, int col, const struct tv_screen_pos *pos, int size)
|
void tv_update_extra(int window, int col, const struct tv_screen_pos *pos, int size)
|
||||||
|
@ -215,22 +216,23 @@ void tv_draw_text(int row, const unsigned char *text, int offset)
|
||||||
if (preferences->alignment == AL_RIGHT)
|
if (preferences->alignment == AL_RIGHT)
|
||||||
{
|
{
|
||||||
display->getstringsize(text, &text_width, NULL);
|
display->getstringsize(text, &text_width, NULL);
|
||||||
xpos += ((offset > 0)? drawarea.w * 2 : drawarea.w) - text_width;
|
xpos += ((offset > 0)? vp_text.width * 2 : vp_text.width) - text_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
display->set_viewport(&vp_text);
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
display->putsxy(drawarea.x + xpos, drawarea.y + row * row_height, text);
|
display->putsxy(xpos, row * row_height, text);
|
||||||
#else
|
#else
|
||||||
display->puts(drawarea.x + xpos, drawarea.y + row, text);
|
display->puts(xpos, row, text);
|
||||||
#endif
|
#endif
|
||||||
|
display->set_viewport(&vp_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tv_start_display(void)
|
void tv_start_display(void)
|
||||||
{
|
{
|
||||||
display->set_viewport(&vp_info);
|
display->set_viewport(&vp_info);
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
drawmode = rb->lcd_get_drawmode();
|
display->set_drawmode(DRMODE_SOLID);
|
||||||
rb->lcd_set_drawmode(DRMODE_SOLID);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LCD_DEPTH > 1
|
#if LCD_DEPTH > 1
|
||||||
|
@ -242,11 +244,6 @@ void tv_start_display(void)
|
||||||
void tv_end_display(void)
|
void tv_end_display(void)
|
||||||
{
|
{
|
||||||
display->update_viewport();
|
display->update_viewport();
|
||||||
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
|
||||||
rb->lcd_set_drawmode(drawmode);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
display->set_viewport(NULL);
|
display->set_viewport(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,29 +258,30 @@ void tv_set_layout(bool show_scrollbar)
|
||||||
row_height = preferences->font->height;
|
row_height = preferences->font->height;
|
||||||
|
|
||||||
header.x = 0;
|
header.x = 0;
|
||||||
header.y = 1;
|
header.y = 0;
|
||||||
header.w = vp_info.width;
|
header.w = vp_info.width;
|
||||||
header.h = (preferences->header_mode)? row_height + 1 : 0;
|
header.h = (preferences->header_mode)? row_height + 1 : 0;
|
||||||
|
|
||||||
footer.x = 0;
|
footer.x = 0;
|
||||||
footer.w = vp_info.width;
|
footer.w = vp_info.width;
|
||||||
footer.h = (preferences->footer_mode)? row_height + 1 : 0;
|
footer.h = (preferences->footer_mode)? row_height + 1 : 0;
|
||||||
footer.y = vp_info.height - 1 - footer.h;
|
footer.y = vp_info.height - footer.h;
|
||||||
|
|
||||||
drawarea.x = scrollbar_width;
|
horizontal_scrollbar.x = scrollbar_width;
|
||||||
drawarea.y = header.y + header.h;
|
|
||||||
drawarea.w = vp_info.width - scrollbar_width;
|
|
||||||
drawarea.h = footer.y - drawarea.y - scrollbar_height;
|
|
||||||
|
|
||||||
horizontal_scrollbar.x = drawarea.x;
|
|
||||||
horizontal_scrollbar.y = footer.y - scrollbar_height;
|
horizontal_scrollbar.y = footer.y - scrollbar_height;
|
||||||
horizontal_scrollbar.w = drawarea.w;
|
horizontal_scrollbar.w = vp_info.width - scrollbar_width;
|
||||||
horizontal_scrollbar.h = scrollbar_height;
|
horizontal_scrollbar.h = scrollbar_height;
|
||||||
|
|
||||||
vertical_scrollbar.x = 0;
|
vertical_scrollbar.x = 0;
|
||||||
vertical_scrollbar.y = drawarea.y;
|
vertical_scrollbar.y = header.y + header.h;
|
||||||
vertical_scrollbar.w = scrollbar_width;
|
vertical_scrollbar.w = scrollbar_width;
|
||||||
vertical_scrollbar.h = drawarea.h;
|
vertical_scrollbar.h = footer.y - vertical_scrollbar.y - scrollbar_height;
|
||||||
|
|
||||||
|
vp_text = vp_info;
|
||||||
|
vp_text.x += horizontal_scrollbar.x;
|
||||||
|
vp_text.y += vertical_scrollbar.y;
|
||||||
|
vp_text.width = horizontal_scrollbar.w;
|
||||||
|
vp_text.height = vertical_scrollbar.h;
|
||||||
#else
|
#else
|
||||||
(void) show_scrollbar;
|
(void) show_scrollbar;
|
||||||
|
|
||||||
|
@ -294,19 +292,18 @@ void tv_set_layout(bool show_scrollbar)
|
||||||
bookmark.w = 1;
|
bookmark.w = 1;
|
||||||
bookmark.h = vp_info.height;
|
bookmark.h = vp_info.height;
|
||||||
|
|
||||||
drawarea.x = 1;
|
vp_text = vp_info;
|
||||||
drawarea.y = 0;
|
vp_text.x += 1;
|
||||||
drawarea.w = vp_info.width - 1;
|
vp_text.width -= 1;
|
||||||
drawarea.h = vp_info.height;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
display_columns = drawarea.w / col_width;
|
display_columns = vp_text.width / col_width;
|
||||||
display_rows = drawarea.h / row_height;
|
display_rows = vp_text.height / row_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tv_get_drawarea_info(int *width, int *cols, int *rows)
|
void tv_get_drawarea_info(int *width, int *cols, int *rows)
|
||||||
{
|
{
|
||||||
*width = drawarea.w;
|
*width = vp_text.width;
|
||||||
*cols = display_columns;
|
*cols = display_columns;
|
||||||
*rows = display_rows;
|
*rows = display_rows;
|
||||||
}
|
}
|
||||||
|
@ -314,8 +311,7 @@ void tv_get_drawarea_info(int *width, int *cols, int *rows)
|
||||||
static void tv_change_viewport(void)
|
static void tv_change_viewport(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LCD_BITMAP
|
#ifdef HAVE_LCD_BITMAP
|
||||||
bool show_statusbar = (rb->global_settings->statusbar != STATUSBAR_OFF &&
|
bool show_statusbar = preferences->statusbar;
|
||||||
preferences->statusbar);
|
|
||||||
|
|
||||||
if (is_initialized_vp)
|
if (is_initialized_vp)
|
||||||
rb->viewportmanager_theme_undo(SCREEN_MAIN, false);
|
rb->viewportmanager_theme_undo(SCREEN_MAIN, false);
|
||||||
|
|
|
@ -220,7 +220,7 @@ void tv_convert_fpos(off_t fpos, struct tv_screen_pos *pos)
|
||||||
while (tv_create_line_positions() && cur_pos.file_pos < fpos)
|
while (tv_create_line_positions() && cur_pos.file_pos < fpos)
|
||||||
rb->splashf(0, "converting %ld%%...", 100 * cur_pos.file_pos / fpos);
|
rb->splashf(0, "converting %ld%%...", 100 * cur_pos.file_pos / fpos);
|
||||||
|
|
||||||
if (cur_pos.page < max_page)
|
if (i < max_page)
|
||||||
cur_pos.page--;
|
cur_pos.page--;
|
||||||
tv_seek_page(cur_pos.page, SEEK_SET);
|
tv_seek_page(cur_pos.page, SEEK_SET);
|
||||||
for (i = 0; i < lines_per_page; i++)
|
for (i = 0; i < lines_per_page; i++)
|
||||||
|
@ -296,6 +296,8 @@ void tv_move_screen(int page_offset, int line_offset, int whence)
|
||||||
if (cur_pos.page < max_page && new_pos.line == lines_per_page)
|
if (cur_pos.page < max_page && new_pos.line == lines_per_page)
|
||||||
{
|
{
|
||||||
tv_seek(line_pos[lines_per_page], SEEK_CUR);
|
tv_seek(line_pos[lines_per_page], SEEK_CUR);
|
||||||
|
cur_pos.file_pos += line_pos[lines_per_page];
|
||||||
|
|
||||||
for (i = 0; i < parse_lines; i++)
|
for (i = 0; i < parse_lines; i++)
|
||||||
line_pos[i] = line_pos[i + lines_per_page] - line_pos[lines_per_page];
|
line_pos[i] = line_pos[i + lines_per_page] - line_pos[lines_per_page];
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,6 @@ void tv_seek(off_t offset, int whence)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
file_pos += buf_pos;
|
file_pos += buf_pos;
|
||||||
whence = SEEK_SET;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue