mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-12 06:32:34 -05:00
text viewer: reworks screen access logics and some bugs fix.
- screen access logics separte from tv_window. (new tv_display.[ch]) - using multi screen api. - (bug fix) the head of the each line is not normally displayed when the alignment is RIGHT. - (bug fix) unnecessary blank line is not displayed. (a part of FS#11400). - (bug fix) the order by which callback functions were called was not correct. (FIFO->FILO) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27138 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
be70fd89be
commit
ac622c6d67
6 changed files with 567 additions and 156 deletions
344
apps/plugins/text_viewer/tv_display.c
Normal file
344
apps/plugins/text_viewer/tv_display.c
Normal file
|
|
@ -0,0 +1,344 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2010 Yoshihisa Uchida
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "tv_display.h"
|
||||
#include "tv_preferences.h"
|
||||
|
||||
/*
|
||||
* display layout
|
||||
*
|
||||
* when is defined HAVE_LCD_BITMAP
|
||||
* +-------------------------+
|
||||
* |statusbar (1) |
|
||||
* +-------------------------+
|
||||
* |filename (2) |
|
||||
* +---+---------------------+
|
||||
* |s | |
|
||||
* |c | |
|
||||
* |r | draw area |
|
||||
* |o | |
|
||||
* |l | |
|
||||
* |l | |
|
||||
* |b | |
|
||||
* |a | |
|
||||
* |r | |
|
||||
* |(3)| |
|
||||
* +---+---------------------+
|
||||
* | |scrollbar (4) |
|
||||
* +---+---------------------+
|
||||
* |page (5) |
|
||||
* +-------------------------+
|
||||
* |statusbar (6) |
|
||||
* +-------------------------+
|
||||
*
|
||||
* (1) displays when rb->global_settings->statusbar == STATUSBAR_TOP
|
||||
* and preferences->header_mode is HD_SBAR or HD_BOTH.
|
||||
* (2) displays when preferences->header_mode is HD_PATH or HD_BOTH.
|
||||
* (3) displays when preferences->vertical_scrollbar is SB_ON.
|
||||
* (4) displays when preferences->horizontal_scrollbar is SB_ON.
|
||||
* (5) displays when preferences->footer_mode is FT_PAGE or FT_BOTH.
|
||||
* (6) displays when rb->global_settings->statusbar == STATUSBAR_BOTTOM
|
||||
* and preferences->footer_mode is FT_SBAR or FT_BOTH.
|
||||
*
|
||||
*
|
||||
* when isn't defined HAVE_LCD_BITMAP
|
||||
* +---+---------------------+
|
||||
* | | |
|
||||
* |(7)| draw area |
|
||||
* | | |
|
||||
* +---+---------------------+
|
||||
* (7) bookmark
|
||||
*/
|
||||
|
||||
#define TV_SCROLLBAR_WIDTH rb->global_settings->scrollbar_width
|
||||
#define TV_SCROLLBAR_HEIGHT 4
|
||||
|
||||
#ifndef HAVE_LCD_BITMAP
|
||||
#define TV_BOOKMARK_ICON 0xe101
|
||||
#endif
|
||||
|
||||
struct tv_rect {
|
||||
int x;
|
||||
int y;
|
||||
int w;
|
||||
int h;
|
||||
};
|
||||
|
||||
static struct viewport vp_info;
|
||||
static bool is_initialized_vp = false;
|
||||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
static int drawmode = DRMODE_SOLID;
|
||||
static int totalsize;
|
||||
static bool show_vertical_scrollbar;
|
||||
#endif
|
||||
|
||||
static struct screen* display;
|
||||
|
||||
/* layout */
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
static struct tv_rect header;
|
||||
static struct tv_rect footer;
|
||||
static struct tv_rect horizontal_scrollbar;
|
||||
static struct tv_rect vertical_scrollbar;
|
||||
#else
|
||||
static struct tv_rect bookmark;
|
||||
#endif
|
||||
static struct tv_rect drawarea;
|
||||
|
||||
static int display_columns;
|
||||
static int display_rows;
|
||||
|
||||
static int col_width;
|
||||
static int row_height;
|
||||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
|
||||
void tv_show_header(void)
|
||||
{
|
||||
unsigned header_mode = header_mode;
|
||||
|
||||
if (preferences->header_mode == HD_PATH || preferences->header_mode == HD_BOTH)
|
||||
display->putsxy(header.x, header.y, preferences->file_name);
|
||||
}
|
||||
|
||||
void tv_show_footer(const struct tv_screen_pos *pos)
|
||||
{
|
||||
unsigned char buf[12];
|
||||
unsigned footer_mode = preferences->footer_mode;
|
||||
|
||||
if (footer_mode == FT_PAGE || footer_mode == FT_BOTH)
|
||||
{
|
||||
if (pos->line == 0)
|
||||
rb->snprintf(buf, sizeof(buf), "%d", pos->page + 1);
|
||||
else
|
||||
rb->snprintf(buf, sizeof(buf), "%d - %d", pos->page + 1, pos->page + 2);
|
||||
display->putsxy(footer.x, footer.y, buf);
|
||||
}
|
||||
}
|
||||
|
||||
void tv_init_scrollbar(off_t total, bool show_scrollbar)
|
||||
{
|
||||
totalsize = total;
|
||||
show_vertical_scrollbar = show_scrollbar;
|
||||
}
|
||||
|
||||
void tv_show_scrollbar(int window, int col, off_t cur_pos, int size)
|
||||
{
|
||||
int items;
|
||||
int min_shown;
|
||||
int max_shown;
|
||||
|
||||
if (preferences->horizontal_scrollbar)
|
||||
{
|
||||
items = preferences->windows * display_columns;
|
||||
min_shown = window * display_columns + col;
|
||||
max_shown = min_shown + display_columns;
|
||||
|
||||
rb->gui_scrollbar_draw(display,
|
||||
horizontal_scrollbar.x, horizontal_scrollbar.y,
|
||||
horizontal_scrollbar.w, TV_SCROLLBAR_HEIGHT,
|
||||
items, min_shown, max_shown, HORIZONTAL);
|
||||
}
|
||||
|
||||
if (show_vertical_scrollbar)
|
||||
{
|
||||
items = (int) totalsize;
|
||||
min_shown = (int) cur_pos;
|
||||
max_shown = min_shown + size;
|
||||
|
||||
rb->gui_scrollbar_draw(display,
|
||||
vertical_scrollbar.x, vertical_scrollbar.y,
|
||||
TV_SCROLLBAR_WIDTH-1, vertical_scrollbar.h,
|
||||
items, min_shown, max_shown, VERTICAL);
|
||||
}
|
||||
}
|
||||
|
||||
void tv_fillrect(int col, int row, int rows)
|
||||
{
|
||||
display->fillrect(drawarea.x + col * col_width, drawarea.y + row * row_height,
|
||||
drawarea.w - col * col_width, rows * row_height);
|
||||
}
|
||||
|
||||
void tv_set_drawmode(int mode)
|
||||
{
|
||||
rb->lcd_set_drawmode(mode);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void tv_draw_text(int row, const unsigned char *text, int offset)
|
||||
{
|
||||
int xpos = -offset * col_width;
|
||||
int text_width;
|
||||
|
||||
if (row < 0 || row >= display_rows)
|
||||
return;
|
||||
|
||||
if (preferences->alignment == AL_RIGHT)
|
||||
{
|
||||
display->getstringsize(text, &text_width, NULL);
|
||||
xpos += ((offset > 0)? drawarea.w * 2 : drawarea.w) - text_width;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
display->putsxy(drawarea.x + xpos, drawarea.y + row * row_height, text);
|
||||
#else
|
||||
display->puts(drawarea.x + xpos, drawarea.y + row, text);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef HAVE_LCD_BITMAP
|
||||
void tv_put_bookmark_icon(int row)
|
||||
{
|
||||
display->putchar(bookmark.x, drawarea.y + row, TV_BOOKMARK_ICON);
|
||||
}
|
||||
#endif
|
||||
|
||||
void tv_init_display(void)
|
||||
{
|
||||
display = rb->screens[SCREEN_MAIN];
|
||||
display->clear_viewport();
|
||||
}
|
||||
|
||||
void tv_start_display(void)
|
||||
{
|
||||
display->set_viewport(&vp_info);
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
drawmode = rb->lcd_get_drawmode();
|
||||
#endif
|
||||
}
|
||||
|
||||
void tv_end_display(void)
|
||||
{
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
rb->lcd_set_drawmode(drawmode);
|
||||
#endif
|
||||
display->set_viewport(NULL);
|
||||
}
|
||||
|
||||
void tv_clear_display(void)
|
||||
{
|
||||
display->clear_viewport();
|
||||
}
|
||||
|
||||
void tv_update_display(void)
|
||||
{
|
||||
display->update_viewport();
|
||||
}
|
||||
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
void tv_set_layout(int col_w, bool show_scrollbar)
|
||||
#else
|
||||
void tv_set_layout(int col_w)
|
||||
#endif
|
||||
{
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
int scrollbar_width = (show_scrollbar)? TV_SCROLLBAR_WIDTH : 0;
|
||||
int scrollbar_height = (preferences->horizontal_scrollbar)? TV_SCROLLBAR_HEIGHT : 0;
|
||||
unsigned header_mode = preferences->header_mode;
|
||||
unsigned footer_mode = preferences->footer_mode;
|
||||
|
||||
row_height = preferences->font->height;
|
||||
|
||||
header.x = 0;
|
||||
header.y = 0;
|
||||
header.w = vp_info.width;
|
||||
header.h = (header_mode == HD_PATH || header_mode == HD_BOTH)? row_height : 0;
|
||||
|
||||
footer.x = 0;
|
||||
footer.w = vp_info.width;
|
||||
footer.h = (footer_mode == FT_PAGE || footer_mode == FT_BOTH)? row_height : 0;
|
||||
footer.y = vp_info.height - footer.h;
|
||||
|
||||
drawarea.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.w = drawarea.w;
|
||||
horizontal_scrollbar.h = scrollbar_height;
|
||||
|
||||
vertical_scrollbar.x = 0;
|
||||
vertical_scrollbar.y = drawarea.y;
|
||||
vertical_scrollbar.w = scrollbar_width;
|
||||
vertical_scrollbar.h = drawarea.h;
|
||||
#else
|
||||
row_height = 1;
|
||||
|
||||
bookmark.x = 0;
|
||||
bookmark.y = 0;
|
||||
bookmark.w = 1;
|
||||
bookmark.h = vp_info.height;
|
||||
|
||||
drawarea.x = 1;
|
||||
drawarea.y = 0;
|
||||
drawarea.w = vp_info.width - 1;
|
||||
drawarea.h = vp_info.height;
|
||||
#endif
|
||||
col_width = col_w;
|
||||
|
||||
display_columns = drawarea.w / col_width;
|
||||
display_rows = drawarea.h / row_height;
|
||||
}
|
||||
|
||||
void tv_get_drawarea_info(int *width, int *cols, int *rows)
|
||||
{
|
||||
*width = drawarea.w;
|
||||
*cols = display_columns;
|
||||
*rows = display_rows;
|
||||
}
|
||||
|
||||
void tv_change_viewport(void)
|
||||
{
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
struct viewport vp;
|
||||
bool show_statusbar = (preferences->header_mode == HD_SBAR ||
|
||||
preferences->header_mode == HD_BOTH ||
|
||||
preferences->footer_mode == FT_SBAR ||
|
||||
preferences->footer_mode == FT_BOTH);
|
||||
|
||||
if (is_initialized_vp)
|
||||
tv_undo_viewport();
|
||||
else
|
||||
is_initialized_vp = true;
|
||||
|
||||
rb->viewportmanager_theme_enable(SCREEN_MAIN, show_statusbar, &vp);
|
||||
vp_info = vp;
|
||||
vp_info.flags &= ~VP_FLAG_ALIGNMENT_MASK;
|
||||
|
||||
#else
|
||||
if (!is_initialized_vp)
|
||||
{
|
||||
rb->viewport_set_defaults(&vp_info, SCREEN_MAIN);
|
||||
is_initialized_vp = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void tv_undo_viewport(void)
|
||||
{
|
||||
#ifdef HAVE_LCD_BITMAP
|
||||
if (is_initialized_vp)
|
||||
rb->viewportmanager_theme_undo(SCREEN_MAIN, false);
|
||||
#endif
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue