1
0
Fork 0
forked from len0rd/rockbox

Text viewer: * Only show those options which really exist. * Basic button functions now available on all targets. * Implemented option setting in a more straightforward way (like the core options menus).

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9874 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jens Arnold 2006-05-03 23:16:53 +00:00
parent 542d9b5942
commit 2343a1935d
3 changed files with 128 additions and 120 deletions

View file

@ -75,20 +75,24 @@ PLUGIN_HEADER
/* Ondio keys */
#elif CONFIG_KEYPAD == ONDIO_PAD
#define VIEWER_QUIT BUTTON_OFF
#define VIEWER_PAGE_UP BUTTON_UP
#define VIEWER_PAGE_DOWN BUTTON_DOWN
#define VIEWER_SCREEN_LEFT BUTTON_LEFT
#define VIEWER_SCREEN_RIGHT BUTTON_RIGHT
#define VIEWER_MENU BUTTON_OFF
#define VIEWER_AUTOSCROLL BUTTON_MENU
#define VIEWER_MENU (BUTTON_MENU|BUTTON_REPEAT)
#define VIEWER_AUTOSCROLL_PRE BUTTON_MENU
#define VIEWER_AUTOSCROLL (BUTTON_MENU|BUTTON_REL)
/* Player keys */
#elif CONFIG_KEYPAD == PLAYER_PAD
#define VIEWER_QUIT BUTTON_STOP
#define VIEWER_PAGE_UP BUTTON_LEFT
#define VIEWER_PAGE_DOWN BUTTON_RIGHT
#define VIEWER_SCREEN_LEFT (BUTTON_ON|BUTTON_LEFT)
#define VIEWER_SCREEN_RIGHT (BUTTON_ON|BUTTON_RIGHT)
#define VIEWER_MENU BUTTON_MENU
#define VIEWER_AUTOSCROLL BUTTON_ON
#define VIEWER_AUTOSCROLL BUTTON_PLAY
/* iRiver H1x0 && H3x0 keys */
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
@ -102,18 +106,20 @@ PLUGIN_HEADER
#define VIEWER_AUTOSCROLL BUTTON_SELECT
#define VIEWER_LINE_UP (BUTTON_ON | BUTTON_UP)
#define VIEWER_LINE_DOWN (BUTTON_ON | BUTTON_DOWN)
#define VIEWER_COLUMN_LEFT (BUTTON_ON | BUTTON_LEFT)
#define VIEWER_COLUMN_RIGHT (BUTTON_ON | BUTTON_RIGHT)
/* iPods with the 4G pad */
#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
(CONFIG_KEYPAD == IPOD_3G_PAD)
#define VIEWER_QUIT_PRE BUTTON_SELECT
#define VIEWER_QUIT (BUTTON_SELECT | BUTTON_MENU)
#define VIEWER_MENU BUTTON_MENU
#define VIEWER_AUTOSCROLL BUTTON_PLAY
#define VIEWER_PAGE_UP BUTTON_SCROLL_BACK
#define VIEWER_PAGE_DOWN BUTTON_SCROLL_FWD
#define VIEWER_SCREEN_LEFT BUTTON_LEFT
#define VIEWER_SCREEN_RIGHT BUTTON_RIGHT
#define VIEWER_MENU BUTTON_MENU
#define VIEWER_AUTOSCROLL BUTTON_PLAY
/* iFP7xx keys */
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
@ -151,48 +157,36 @@ struct preferences {
enum {
WRAP=0,
CHOP,
WORD_MODES
} word_mode;
enum {
NORMAL=0,
JOIN,
#ifdef HAVE_LCD_BITMAP
REFLOW, /* Makes no sense for the player */
#endif
EXPAND,
LINE_MODES,
#ifndef HAVE_LCD_BITMAP
REFLOW /* Sorting it behind LINE_MODES effectively disables it. */
#endif
REFLOW, /* won't be set on charcell LCD, must be last */
} line_mode;
enum {
NARROW=0,
WIDE,
VIEW_MODES
} view_mode;
#ifdef HAVE_LCD_BITMAP
enum {
SB_OFF=0,
SB_ON,
SCROLLBAR_MODES
} scrollbar_mode;
bool need_scrollbar;
enum {
NO_OVERLAP=0,
OVERLAP,
PAGE_MODES
} page_mode;
#endif /* HAVE_LCD_BITMAP */
enum {
PAGE=0,
LINE,
SCROLL_MODES
} scroll_mode;
int autoscroll_speed;
@ -816,7 +810,6 @@ static void viewer_top(void)
fill_buffer(0, buffer, BUFFER_SIZE);
}
#ifdef HAVE_LCD_BITMAP
static void viewer_bottom(void)
{
/* Read bottom of file into buffer
@ -838,6 +831,7 @@ static void viewer_bottom(void)
fill_buffer(last_sectors, buffer, BUFFER_SIZE);
}
#ifdef HAVE_LCD_BITMAP
static void init_need_scrollbar(void) {
/* Call viewer_draw in quiet mode to initialize next_screen_ptr,
and thus ONE_SCREEN_FITS_ALL(), and thus NEED_SCROLLBAR() */
@ -911,6 +905,7 @@ static void viewer_reset_settings(void)
prefs.page_mode = NO_OVERLAP;
prefs.scrollbar_mode = SB_OFF;
#endif
prefs.autoscroll_speed = 1;
}
static void viewer_load_settings(void) /* same name as global, but not the same file.. */
@ -963,7 +958,6 @@ static void viewer_exit(void *parameter)
rb->close(fd);
}
#ifdef HAVE_LCD_BITMAP
static int col_limit(int col)
{
if (col < 0)
@ -974,114 +968,120 @@ static int col_limit(int col)
return col;
}
/* settings helper functions */
static bool word_wrap_setting(void)
{
static const struct opt_items names[] = {
{"On", NULL},
{"Off (Chop Words)", NULL},
};
return rb->set_option("Word Wrap", &prefs.word_mode, INT,
names, 2, NULL);
}
static bool line_mode_setting(void)
{
static const struct opt_items names[] = {
{"Normal", NULL},
{"Join Lines", NULL},
{"Expand Lines", NULL},
#ifdef HAVE_LCD_BITMAP
{"Reflow Lines", NULL},
#endif
};
return rb->set_option("Line Mode", &prefs.line_mode, INT, names,
sizeof(names) / sizeof(names[0]), NULL);
}
static bool view_mode_setting(void)
{
static const struct opt_items names[] = {
{"No (Narrow)", NULL},
{"Yes", NULL},
};
return rb->set_option("Wide View", &prefs.view_mode, INT,
names , 2, NULL);
}
static bool scroll_mode_setting(void)
{
static const struct opt_items names[] = {
{"Scroll by Page", NULL},
{"Scroll by Line", NULL},
};
return rb->set_option("Scroll Mode", &prefs.scroll_mode, INT,
names, 2, NULL);
}
#ifdef HAVE_LCD_BITMAP
static bool page_mode_setting(void)
{
static const struct opt_items names[] = {
{"No", NULL},
{"Yes", NULL},
};
return rb->set_option("Overlap Pages", &prefs.page_mode, INT,
names, 2, NULL);
}
static bool scrollbar_setting(void)
{
static const struct opt_items names[] = {
{"Off", NULL},
{"On", NULL}
};
return rb->set_option("Show Scrollbar", &prefs.scrollbar_mode, INT,
names, 2, NULL);
}
#endif
static void change_options_menu(void)
static bool autoscroll_speed_setting(void)
{
int m, result;
bool done = false;
return rb->set_int("Auto-scroll Speed", "", UNIT_INT,
&prefs.autoscroll_speed, NULL, 1, 1, 10, NULL);
}
static bool viewer_options_menu(void)
{
int m;
bool result;
static const struct menu_item items[] = {
{"Word Wrap", NULL },
{"Line Mode", NULL },
{"Wide View", NULL },
{"Overlap Pages", NULL },
{"Scroll Mode", NULL},
{"Word Wrap", word_wrap_setting },
{"Line Mode", line_mode_setting },
{"Wide View", view_mode_setting },
#ifdef HAVE_LCD_BITMAP
{"Show Scrollbar", NULL },
{"Show Scrollbar", scrollbar_setting },
{"Overlap Pages", page_mode_setting },
#endif
{"Auto-Scroll Speed", NULL },
};
static const struct opt_items opt_word_mode[2] = {
{"On",NULL},{"Off (Chop Words)",NULL},
};
#ifdef HAVE_LCD_BITMAP
static const struct opt_items opt_line_mode[4] = {
{"Normal",NULL},{"Join Lines",NULL},
{"Reflow Lines",NULL},{"Expand Lines",NULL},
#else
static const struct opt_items opt_line_mode[3] = {
{"Normal",NULL},{"Join Lines",NULL},
{"Expand Lines",NULL},
#endif
};
static const struct opt_items opt_view_mode[2] = {
{"No (Narrow)",NULL},{"Yes",NULL}
};
static const struct opt_items opt_scroll_mode[2] = {
{"Scroll by Page",NULL},{"Scroll by Line",NULL}
};
#ifdef HAVE_LCD_BITMAP
static const struct opt_items opt_scrollbar_mode[2] = {
{"Off",NULL},{"On",NULL}
};
static const struct opt_items opt_page_mode[2] = {
{"No",NULL},{"Yes",NULL}
};
#endif
static const struct opt_items opt_autoscroll_speed[10] = {
{ "1", NULL },{ "2", NULL },{ "3", NULL },{ "4", NULL },{ "5", NULL },
{ "6", NULL },{ "7", NULL },{ "8", NULL },{ "9", NULL },{ "10", NULL }
{"Scroll Mode", scroll_mode_setting},
{"Auto-Scroll Speed", autoscroll_speed_setting },
};
m = rb->menu_init(items, sizeof(items) / sizeof(*items),
NULL, NULL, NULL, NULL);
while(!done)
{
result=rb->menu_show(m);
switch (result)
{
case MENU_SELECTED_EXIT:
done = true;
break;
case 0: /* word mode */
rb->set_option("Word Wrap", &prefs.word_mode, INT,
opt_word_mode , 2, NULL);
break;
case 1: /* line mode */
rb->set_option("Line Mode", &prefs.line_mode, INT, opt_line_mode,
sizeof(opt_line_mode) / sizeof(*opt_line_mode), NULL);
break;
case 2: /* view mode */
rb->set_option("Wide View", &prefs.view_mode, INT,
opt_view_mode , 2, NULL);
break;
#ifdef HAVE_LCD_BITMAP
case 3:
rb->set_option("Overlap Pages", &prefs.page_mode, INT,
opt_page_mode , 2, NULL);
break;
#endif
case 4:
rb->set_option("Scroll Mode", &prefs.scroll_mode, INT,
opt_scroll_mode , 2, NULL);
break;
#ifdef HAVE_LCD_BITMAP
case 5:
rb->set_option("Show Scrollbar", &prefs.scrollbar_mode, INT,
opt_scrollbar_mode , 2, NULL);
/* Show-scrollbar mode for current view-width mode */
if (!(ONE_SCREEN_FITS_ALL())) {
if (prefs.scrollbar_mode == true)
init_need_scrollbar();
}
break;
#endif
case 6:
rb->set_option("Auto-Scroll Speed", &prefs.autoscroll_speed, INT,
opt_autoscroll_speed, sizeof(opt_autoscroll_speed) /
sizeof(*opt_autoscroll_speed), NULL);
break;
} /* switch() */
}
result = rb->menu_run(m);
rb->menu_exit(m);
#ifdef HAVE_LCD_BITMAP
rb->lcd_setmargins(0,0);
/* Show-scrollbar mode for current view-width mode */
if (!ONE_SCREEN_FITS_ALL())
if (prefs.scrollbar_mode == true)
init_need_scrollbar();
#endif
return result;
}
static void show_menu(void)
static void viewer_menu(void)
{
int m;
int result;
@ -1103,7 +1103,7 @@ static void show_menu(void)
done = true;
break;
case 1: /* change settings */
change_options_menu();
done = viewer_options_menu();
break;
case 2: /* playback control */
playback_control(rb);
@ -1121,6 +1121,7 @@ static void show_menu(void)
enum plugin_status plugin_start(struct plugin_api* api, void* file)
{
int button, i, ok;
int lastbutton = BUTTON_NONE;
bool autoscroll = false;
int old_tick = *rb->current_tick;
@ -1157,10 +1158,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
button = rb->button_get_w_tmo(HZ/10);
switch (button) {
case VIEWER_MENU:
show_menu();
viewer_menu();
break;
case VIEWER_AUTOSCROLL:
#ifdef VIEWER_AUTOSCROLL_PRE
if (lastbutton != VIEWER_AUTOSCROLL_PRE)
break;
#endif
autoscroll = !autoscroll;
break;
@ -1196,7 +1201,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
viewer_draw(col);
break;
#ifdef VIEWER_SCREEN_LEFT
case VIEWER_SCREEN_LEFT:
case VIEWER_SCREEN_LEFT | BUTTON_REPEAT:
if (prefs.view_mode == WIDE) {
@ -1211,9 +1215,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
viewer_draw(col);
break;
#endif
#ifdef VIEWER_SCREEN_LEFT
case VIEWER_SCREEN_RIGHT:
case VIEWER_SCREEN_RIGHT | BUTTON_REPEAT:
if (prefs.view_mode == WIDE) {
@ -1228,7 +1230,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
viewer_draw(col);
break;
#endif
#ifdef VIEWER_LINE_UP
case VIEWER_LINE_UP:
@ -1266,12 +1267,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
break;
#endif
#ifdef VIEWER_QUIT
case VIEWER_QUIT:
viewer_exit(NULL);
done = true;
break;
#endif
default:
if (rb->default_event_handler_ex(button, viewer_exit, NULL)
@ -1279,6 +1278,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file)
return PLUGIN_USB_CONNECTED;
break;
}
if (button != BUTTON_NONE)
lastbutton = button;
}
return PLUGIN_OK;
}