rockbox/apps/plugins/text_viewer/tv_menu.c
Yoshihisa Uchida a784938b78 text viewer: can select the indent spaces when the line mode is reflow.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26763 a1c6a512-1295-4272-9138-f99709370657
2010-06-11 11:13:02 +00:00

400 lines
12 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2002 Gilles Roux
* 2003 Garrett Derner
* 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 "plugin.h"
#include "lib/playback_control.h"
#include "tv_bookmark.h"
#include "tv_menu.h"
#include "tv_settings.h"
/* settings helper functions */
static struct tv_preferences new_prefs;
/* */
/* horizontal scroll settings menu */
/* */
#ifdef HAVE_LCD_BITMAP
static bool tv_horizontal_scrollbar_setting(void)
{
static const struct opt_items names[] = {
{"No", -1},
{"Yes", -1},
};
return rb->set_option("Horizontal Scrollbar", &new_prefs.horizontal_scrollbar, INT,
names, 2, NULL);
}
#endif
static bool tv_horizontal_scroll_mode_setting(void)
{
static const struct opt_items names[] = {
{"Scroll by Screen", -1},
{"Scroll by Column", -1},
};
return rb->set_option("Scroll Mode", &new_prefs.horizontal_scroll_mode, INT,
names, 2, NULL);
}
#ifdef HAVE_LCD_BITMAP
MENUITEM_FUNCTION(horizontal_scrollbar_item, 0, "Scrollbar",
tv_horizontal_scrollbar_setting,
NULL, NULL, Icon_NOICON);
#endif
MENUITEM_FUNCTION(horizontal_scroll_mode_item, 0, "Scroll Mode",
tv_horizontal_scroll_mode_setting, NULL, NULL, Icon_NOICON);
MAKE_MENU(horizontal_scroll_menu, "Horizontal", NULL, Icon_NOICON,
#ifdef HAVE_LCD_BITMAP
&horizontal_scrollbar_item,
#endif
&horizontal_scroll_mode_item);
/* */
/* vertical scroll settings menu */
/* */
#ifdef HAVE_LCD_BITMAP
static bool tv_vertical_scrollbar_setting(void)
{
static const struct opt_items names[] = {
{"No", -1},
{"Yes", -1},
};
return rb->set_option("Vertical Scrollbar", &new_prefs.vertical_scrollbar, INT,
names, 2, NULL);
}
#endif
static bool tv_vertical_scroll_mode_setting(void)
{
static const struct opt_items names[] = {
{"Scroll by Page", -1},
{"Scroll by Line", -1},
};
return rb->set_option("Scroll Mode", &new_prefs.vertical_scroll_mode, INT,
names, 2, NULL);
}
static bool tv_page_mode_setting(void)
{
static const struct opt_items names[] = {
{"No", -1},
{"Yes", -1},
};
return rb->set_option("Overlap Pages", &new_prefs.page_mode, INT,
names, 2, NULL);
}
static bool tv_autoscroll_speed_setting(void)
{
return rb->set_int("Auto-scroll Speed", "", UNIT_INT,
&new_prefs.autoscroll_speed, NULL, 1, 1, 10, NULL);
}
static bool tv_narrow_mode_setting(void)
{
static const struct opt_items names[] = {
{"Previous/Next Page", -1},
{"Top/Bottom Page", -1},
};
return rb->set_option("Left/Right Key", &new_prefs.narrow_mode, INT,
names, 2, NULL);
}
#ifdef HAVE_LCD_BITMAP
MENUITEM_FUNCTION(vertical_scrollbar_item, 0, "Scrollbar",
tv_vertical_scrollbar_setting,
NULL, NULL, Icon_NOICON);
#endif
MENUITEM_FUNCTION(vertical_scroll_mode_item, 0, "Scroll Mode",
tv_vertical_scroll_mode_setting, NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(page_mode_item, 0, "Overlap Pages", tv_page_mode_setting,
NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(autoscroll_speed_item, 0, "Auto-Scroll Speed",
tv_autoscroll_speed_setting, NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(narrow_mode_item, 0, "Left/Right Key (Narrow mode)",
tv_narrow_mode_setting, NULL, NULL, Icon_NOICON);
MAKE_MENU(vertical_scroll_menu, "Vertical", NULL, Icon_NOICON,
#ifdef HAVE_LCD_BITMAP
&vertical_scrollbar_item,
#endif
&vertical_scroll_mode_item, &page_mode_item, &autoscroll_speed_item,
&narrow_mode_item);
/* */
/* scroll settings menu */
/* */
MAKE_MENU(scroll_menu, "Scroll Settings", NULL, Icon_NOICON,
&horizontal_scroll_menu, &vertical_scroll_menu);
/* */
/* main menu */
/* */
static bool tv_encoding_setting(void)
{
static struct opt_items names[NUM_CODEPAGES];
int idx;
for (idx = 0; idx < NUM_CODEPAGES; idx++)
{
names[idx].string = rb->get_codepage_name(idx);
names[idx].voice_id = -1;
}
return rb->set_option("Encoding", &new_prefs.encoding, INT, names,
sizeof(names) / sizeof(names[0]), NULL);
}
static bool tv_word_wrap_setting(void)
{
static const struct opt_items names[] = {
{"On", -1},
{"Off (Chop Words)", -1},
};
return rb->set_option("Word Wrap", &new_prefs.word_mode, INT,
names, 2, NULL);
}
static bool tv_line_mode_setting(void)
{
static const struct opt_items names[] = {
{"Normal", -1},
{"Join Lines", -1},
{"Expand Lines", -1},
{"Reflow Lines", -1},
};
return rb->set_option("Line Mode", &new_prefs.line_mode, INT, names,
sizeof(names) / sizeof(names[0]), NULL);
}
static bool tv_windows_setting(void)
{
return rb->set_int("Screens Per Page", "", UNIT_INT,
&new_prefs.windows, NULL, 1, 1, 5, NULL);
}
static bool tv_alignment_setting(void)
{
static const struct opt_items names[] = {
{"Left", -1},
{"Right", -1},
};
return rb->set_option("Alignment", &new_prefs.alignment, INT,
names , 2, NULL);
}
#ifdef HAVE_LCD_BITMAP
static bool tv_header_setting(void)
{
int len = (rb->global_settings->statusbar == STATUSBAR_TOP)? 4 : 2;
struct opt_items names[len];
names[0].string = "None";
names[0].voice_id = -1;
names[1].string = "File path";
names[1].voice_id = -1;
if (rb->global_settings->statusbar == STATUSBAR_TOP)
{
names[2].string = "Status bar";
names[2].voice_id = -1;
names[3].string = "Both";
names[3].voice_id = -1;
}
return rb->set_option("Show Header", &new_prefs.header_mode, INT,
names, len, NULL);
}
static bool tv_footer_setting(void)
{
int len = (rb->global_settings->statusbar == STATUSBAR_BOTTOM)? 4 : 2;
struct opt_items names[len];
names[0].string = "None";
names[0].voice_id = -1;
names[1].string = "Page Num";
names[1].voice_id = -1;
if (rb->global_settings->statusbar == STATUSBAR_BOTTOM)
{
names[2].string = "Status bar";
names[2].voice_id = -1;
names[3].string = "Both";
names[3].voice_id = -1;
}
return rb->set_option("Show Footer", &new_prefs.footer_mode, INT,
names, len, NULL);
}
static bool tv_font_setting(void)
{
int count = 0;
int i = 0;
int new_font = 0;
int old_font;
bool res;
unsigned char font_path[MAX_PATH];
struct tree_context *tree;
struct tree_context backup;
struct entry *dc;
int dirfilter = SHOW_FONT;
tree = rb->tree_get_context();
backup = *tree;
dc = tree->dircache;
rb->strlcat(backup.currdir, "/", MAX_PATH);
rb->strlcat(backup.currdir, dc[tree->selected_item].name, MAX_PATH);
tree->dirfilter = &dirfilter;
rb->snprintf(font_path, MAX_PATH, "%s/", FONT_DIR);
rb->set_current_file(font_path);
count = tree->filesindir;
struct opt_items names[count];
for (i = 0; i < count; i++)
{
char *p = rb->strrchr(dc[i].name, '.');
if (p) *p = 0;
if (!rb->strcmp(dc[i].name, new_prefs.font_name))
new_font = i;
names[i].string = dc[i].name;
names[i].voice_id = -1;
}
old_font = new_font;
res = rb->set_option("Select Font", &new_font, INT,
names, count, NULL);
if (new_font != old_font)
{
rb->memset(new_prefs.font_name, 0, MAX_PATH);
rb->strlcpy(new_prefs.font_name, names[new_font].string, MAX_PATH);
}
*tree = backup;
rb->set_current_file(backup.currdir);
return res;
}
#endif
static bool tv_indent_spaces_setting(void)
{
return rb->set_int("Indent Spaces", "", UNIT_INT,
&new_prefs.indent_spaces, NULL, 1, 0, 5, NULL);
}
MENUITEM_FUNCTION(encoding_item, 0, "Encoding", tv_encoding_setting,
NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(word_wrap_item, 0, "Word Wrap", tv_word_wrap_setting,
NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(line_mode_item, 0, "Line Mode", tv_line_mode_setting,
NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(windows_item, 0, "Screens Per Page", tv_windows_setting,
NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(alignment_item, 0, "Alignment", tv_alignment_setting,
NULL, NULL, Icon_NOICON);
#ifdef HAVE_LCD_BITMAP
MENUITEM_FUNCTION(header_item, 0, "Show Header", tv_header_setting,
NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(footer_item, 0, "Show Footer", tv_footer_setting,
NULL, NULL, Icon_NOICON);
MENUITEM_FUNCTION(font_item, 0, "Font", tv_font_setting,
NULL, NULL, Icon_NOICON);
#endif
MENUITEM_FUNCTION(indent_spaces_item, 0, "Indent Spaces", tv_indent_spaces_setting,
NULL, NULL, Icon_NOICON);
MAKE_MENU(option_menu, "Viewer Options", NULL, Icon_NOICON,
&encoding_item, &word_wrap_item, &line_mode_item, &windows_item,
&alignment_item,
#ifdef HAVE_LCD_BITMAP
&header_item, &footer_item, &font_item,
#endif
&scroll_menu, &indent_spaces_item);
static enum tv_menu_result tv_options_menu(void)
{
enum tv_menu_result result = TV_MENU_RESULT_EXIT_MENU;
if (rb->do_menu(&option_menu, NULL, NULL, false) == MENU_ATTACHED_USB)
result = TV_MENU_RESULT_ATTACHED_USB;
return result;
}
enum tv_menu_result tv_display_menu(void)
{
enum tv_menu_result result = TV_MENU_RESULT_EXIT_MENU;
MENUITEM_STRINGLIST(menu, "Viewer Menu", NULL,
"Return", "Viewer Options",
"Show Playback Menu", "Select Bookmark",
"Global Settings", "Quit");
switch (rb->do_menu(&menu, NULL, NULL, false))
{
case 0: /* return */
break;
case 1: /* change settings */
tv_copy_preferences(&new_prefs);
result = tv_options_menu();
tv_set_preferences(&new_prefs);
break;
case 2: /* playback control */
playback_control(NULL);
break;
case 3: /* select bookmark */
tv_select_bookmark();
result = TV_MENU_RESULT_MOVE_PAGE;
break;
case 4: /* change global settings */
if (!tv_load_global_settings(&new_prefs))
tv_set_default_preferences(&new_prefs);
result = tv_options_menu();
tv_save_global_settings(&new_prefs);
break;
case 5: /* quit */
result = TV_MENU_RESULT_EXIT_PLUGIN;
break;
}
return result;
}