1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Gilles Roux
12 * 2010 Yoshihisa Uchida
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
22 ****************************************************************************/
24 #include "lib/playback_control.h"
25 #include "tv_bookmark.h"
27 #include "tv_settings.h"
29 /* settings helper functions */
31 static struct tv_preferences new_prefs
;
34 /* horizontal scroll settings menu */
37 #ifdef HAVE_LCD_BITMAP
38 static bool tv_horizontal_scrollbar_setting(void)
40 return rb
->set_bool("Horizontal Scrollbar", &new_prefs
.horizontal_scrollbar
);
44 static bool tv_horizontal_scroll_mode_setting(void)
46 static const struct opt_items names
[] = {
47 {"Scroll by Screen", -1},
48 {"Scroll by Column", -1},
51 return rb
->set_option("Scroll Mode", &new_prefs
.horizontal_scroll_mode
, INT
,
55 #ifdef HAVE_LCD_BITMAP
56 MENUITEM_FUNCTION(horizontal_scrollbar_item
, 0, "Scrollbar",
57 tv_horizontal_scrollbar_setting
,
58 NULL
, NULL
, Icon_NOICON
);
60 MENUITEM_FUNCTION(horizontal_scroll_mode_item
, 0, "Scroll Mode",
61 tv_horizontal_scroll_mode_setting
, NULL
, NULL
, Icon_NOICON
);
63 MAKE_MENU(horizontal_scroll_menu
, "Horizontal", NULL
, Icon_NOICON
,
64 #ifdef HAVE_LCD_BITMAP
65 &horizontal_scrollbar_item
,
67 &horizontal_scroll_mode_item
);
70 /* vertical scroll settings menu */
73 #ifdef HAVE_LCD_BITMAP
74 static bool tv_vertical_scrollbar_setting(void)
76 return rb
->set_bool("Vertical Scrollbar", &new_prefs
.vertical_scrollbar
);
80 static bool tv_vertical_scroll_mode_setting(void)
82 static const struct opt_items names
[] = {
83 {"Scroll by Page", -1},
84 {"Scroll by Line", -1},
87 return rb
->set_option("Scroll Mode", &new_prefs
.vertical_scroll_mode
, INT
,
91 static bool tv_overlap_page_mode_setting(void)
93 return rb
->set_bool("Overlap Pages", &new_prefs
.overlap_page_mode
);
96 static bool tv_autoscroll_speed_setting(void)
98 return rb
->set_int("Auto-scroll Speed", "", UNIT_INT
,
99 &new_prefs
.autoscroll_speed
, NULL
, 1, 1, 10, NULL
);
102 static bool tv_narrow_mode_setting(void)
104 static const struct opt_items names
[] = {
105 {"Previous/Next Page", -1},
106 {"Top/Bottom Page", -1},
109 return rb
->set_option("Left/Right Key", &new_prefs
.narrow_mode
, INT
,
113 #ifdef HAVE_LCD_BITMAP
114 MENUITEM_FUNCTION(vertical_scrollbar_item
, 0, "Scrollbar",
115 tv_vertical_scrollbar_setting
,
116 NULL
, NULL
, Icon_NOICON
);
118 MENUITEM_FUNCTION(vertical_scroll_mode_item
, 0, "Scroll Mode",
119 tv_vertical_scroll_mode_setting
, NULL
, NULL
, Icon_NOICON
);
120 MENUITEM_FUNCTION(overlap_page_mode_item
, 0, "Overlap Pages", tv_overlap_page_mode_setting
,
121 NULL
, NULL
, Icon_NOICON
);
122 MENUITEM_FUNCTION(autoscroll_speed_item
, 0, "Auto-Scroll Speed",
123 tv_autoscroll_speed_setting
, NULL
, NULL
, Icon_NOICON
);
124 MENUITEM_FUNCTION(narrow_mode_item
, 0, "Left/Right Key (Narrow mode)",
125 tv_narrow_mode_setting
, NULL
, NULL
, Icon_NOICON
);
127 MAKE_MENU(vertical_scroll_menu
, "Vertical", NULL
, Icon_NOICON
,
128 #ifdef HAVE_LCD_BITMAP
129 &vertical_scrollbar_item
,
131 &vertical_scroll_mode_item
, &overlap_page_mode_item
, &autoscroll_speed_item
,
135 /* scroll settings menu */
138 MAKE_MENU(scroll_menu
, "Scroll Settings", NULL
, Icon_NOICON
,
139 &horizontal_scroll_menu
, &vertical_scroll_menu
);
145 static bool tv_encoding_setting(void)
147 static struct opt_items names
[NUM_CODEPAGES
];
150 for (idx
= 0; idx
< NUM_CODEPAGES
; idx
++)
152 names
[idx
].string
= rb
->get_codepage_name(idx
);
153 names
[idx
].voice_id
= -1;
156 return rb
->set_option("Encoding", &new_prefs
.encoding
, INT
, names
,
157 sizeof(names
) / sizeof(names
[0]), NULL
);
160 static bool tv_word_wrap_setting(void)
162 static const struct opt_items names
[] = {
164 {"Off (Chop Words)", -1},
167 return rb
->set_option("Word Wrap", &new_prefs
.word_mode
, INT
,
171 static bool tv_line_mode_setting(void)
173 static const struct opt_items names
[] = {
176 {"Expand Lines", -1},
177 {"Reflow Lines", -1},
180 return rb
->set_option("Line Mode", &new_prefs
.line_mode
, INT
, names
,
181 sizeof(names
) / sizeof(names
[0]), NULL
);
184 static bool tv_windows_setting(void)
186 return rb
->set_int("Screens Per Page", "", UNIT_INT
,
187 &new_prefs
.windows
, NULL
, 1, 1, 5, NULL
);
190 static bool tv_alignment_setting(void)
192 static const struct opt_items names
[] = {
197 return rb
->set_option("Alignment", &new_prefs
.alignment
, INT
,
201 #ifdef HAVE_LCD_BITMAP
202 static bool tv_header_setting(void)
204 return rb
->set_bool("Show Header", &new_prefs
.header_mode
);
207 static bool tv_footer_setting(void)
209 return rb
->set_bool("Show Footer", &new_prefs
.footer_mode
);
212 static bool tv_statusbar_setting(void)
214 return rb
->set_bool("Show Statusbar", &new_prefs
.statusbar
);
217 static bool tv_font_setting(void)
219 struct browse_context browse
;
220 char font
[MAX_PATH
], name
[MAX_FILENAME
+10];
222 rb
->snprintf(name
, sizeof(name
), "%s.fnt", new_prefs
.font_name
);
223 rb
->browse_context_init(&browse
, SHOW_FONT
,
224 BROWSE_SELECTONLY
|BROWSE_NO_CONTEXT_MENU
,
225 "Font", Icon_Menu_setting
, FONT_DIR
, name
);
228 browse
.bufsize
= sizeof(font
);
230 rb
->rockbox_browse(&browse
);
232 if (browse
.flags
& BROWSE_SELECTED
)
234 char *name
= rb
->strrchr(font
, '/')+1;
235 char *p
= rb
->strrchr(name
, '.');
237 rb
->strlcpy(new_prefs
.font_name
, name
, MAX_PATH
);
244 static bool tv_indent_spaces_setting(void)
246 return rb
->set_int("Indent Spaces", "", UNIT_INT
,
247 &new_prefs
.indent_spaces
, NULL
, 1, 0, 5, NULL
);
250 MENUITEM_FUNCTION(encoding_item
, 0, "Encoding", tv_encoding_setting
,
251 NULL
, NULL
, Icon_NOICON
);
252 MENUITEM_FUNCTION(word_wrap_item
, 0, "Word Wrap", tv_word_wrap_setting
,
253 NULL
, NULL
, Icon_NOICON
);
254 MENUITEM_FUNCTION(line_mode_item
, 0, "Line Mode", tv_line_mode_setting
,
255 NULL
, NULL
, Icon_NOICON
);
256 MENUITEM_FUNCTION(windows_item
, 0, "Screens Per Page", tv_windows_setting
,
257 NULL
, NULL
, Icon_NOICON
);
258 MENUITEM_FUNCTION(alignment_item
, 0, "Alignment", tv_alignment_setting
,
259 NULL
, NULL
, Icon_NOICON
);
260 #ifdef HAVE_LCD_BITMAP
261 MENUITEM_FUNCTION(header_item
, 0, "Show Header", tv_header_setting
,
262 NULL
, NULL
, Icon_NOICON
);
263 MENUITEM_FUNCTION(footer_item
, 0, "Show Footer", tv_footer_setting
,
264 NULL
, NULL
, Icon_NOICON
);
265 MENUITEM_FUNCTION(statusbar_item
, 0, "Show Statusbar", tv_statusbar_setting
,
266 NULL
, NULL
, Icon_NOICON
);
267 MENUITEM_FUNCTION(font_item
, 0, "Font", tv_font_setting
,
268 NULL
, NULL
, Icon_NOICON
);
270 MENUITEM_FUNCTION(indent_spaces_item
, 0, "Indent Spaces", tv_indent_spaces_setting
,
271 NULL
, NULL
, Icon_NOICON
);
273 MAKE_MENU(option_menu
, "Viewer Options", NULL
, Icon_NOICON
,
274 &encoding_item
, &word_wrap_item
, &line_mode_item
, &windows_item
,
276 #ifdef HAVE_LCD_BITMAP
277 &header_item
, &footer_item
, &font_item
, &statusbar_item
,
279 &scroll_menu
, &indent_spaces_item
);
281 static unsigned tv_options_menu(void)
283 unsigned result
= TV_MENU_RESULT_EXIT_MENU
;
285 if (rb
->do_menu(&option_menu
, NULL
, NULL
, false) == MENU_ATTACHED_USB
)
286 result
= TV_MENU_RESULT_ATTACHED_USB
;
291 unsigned tv_display_menu(void)
293 unsigned result
= TV_MENU_RESULT_EXIT_MENU
;
295 MENUITEM_STRINGLIST(menu
, "Viewer Menu", NULL
,
296 "Return", "Viewer Options",
297 "Show Playback Menu", "Select Bookmark",
298 "Global Settings", "Quit");
300 switch (rb
->do_menu(&menu
, NULL
, NULL
, false))
304 case 1: /* change settings */
305 tv_copy_preferences(&new_prefs
);
306 result
= tv_options_menu();
307 if (tv_compare_preferences(&new_prefs
))
308 preferences_changed
= true;
309 if (!tv_set_preferences(&new_prefs
))
310 result
= TV_MENU_RESULT_ERROR
;
312 case 2: /* playback control */
313 playback_control(NULL
);
315 case 3: /* select bookmark */
316 tv_select_bookmark();
317 result
= TV_MENU_RESULT_MOVE_PAGE
;
319 case 4: /* change global settings */
320 if (!tv_load_global_settings(&new_prefs
))
321 tv_set_default_preferences(&new_prefs
);
323 result
= tv_options_menu();
324 tv_save_global_settings(&new_prefs
);
327 result
= TV_MENU_RESULT_EXIT_PLUGIN
;