Bump version numbers for 3.13
[maemo-rb.git] / apps / menus / theme_menu.c
blob93511f8197a381f9ab43d03fce420146b2219e97
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2007 Jonathan Gordon
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include <stdio.h>
23 #include <stdbool.h>
24 #include <stddef.h>
25 #include <limits.h>
26 #include "config.h"
27 #include "lang.h"
28 #include "action.h"
29 #include "settings.h"
30 #include "menu.h"
31 #include "tree.h"
32 #include "list.h"
33 #include "color_picker.h"
34 #include "lcd.h"
35 #ifdef HAVE_REMOTE_LCD
36 #include "lcd-remote.h"
37 #endif
38 #include "backdrop.h"
39 #include "exported_menus.h"
40 #include "appevents.h"
41 #include "viewport.h"
42 #include "statusbar-skinned.h"
43 #include "skin_engine/skin_engine.h"
44 #include "icons.h"
46 #ifdef HAVE_BACKDROP_IMAGE
47 /**
48 * Menu to clear the backdrop image
50 static int clear_main_backdrop(void)
52 global_settings.backdrop_file[0] = '-';
53 global_settings.backdrop_file[1] = '\0';
54 skin_backdrop_load_setting();
55 viewportmanager_theme_enable(SCREEN_MAIN, false, NULL);
56 viewportmanager_theme_undo(SCREEN_MAIN, true);
57 settings_save();
58 return 0;
60 MENUITEM_FUNCTION(clear_main_bd, 0, ID2P(LANG_CLEAR_BACKDROP),
61 clear_main_backdrop, NULL, NULL, Icon_NOICON);
62 #endif
63 #ifdef HAVE_LCD_COLOR
65 enum Colors {
66 COLOR_FG = 0,
67 COLOR_BG,
68 COLOR_LSS,
69 COLOR_LSE,
70 COLOR_LST,
71 COLOR_COUNT
73 static struct colour_info
75 int *setting;
76 int lang_id;
77 } colors[COLOR_COUNT] = {
78 [COLOR_FG] = {&global_settings.fg_color, LANG_FOREGROUND_COLOR},
79 [COLOR_BG] = {&global_settings.bg_color, LANG_BACKGROUND_COLOR},
80 [COLOR_LSS] = {&global_settings.lss_color, LANG_SELECTOR_START_COLOR},
81 [COLOR_LSE] = {&global_settings.lse_color, LANG_SELECTOR_END_COLOR},
82 [COLOR_LST] = {&global_settings.lst_color, LANG_SELECTOR_TEXT_COLOR},
85 /**
86 * Menu for fore/back/selection colors
88 static int set_color_func(void* color)
90 int res, c = (intptr_t)color, banned_color=-1, old_color;
91 /* Don't let foreground be set the same as background and vice-versa */
92 if (c == COLOR_BG)
93 banned_color = *colors[COLOR_FG].setting;
94 else if (c == COLOR_FG)
95 banned_color = *colors[COLOR_BG].setting;
97 old_color = *colors[c].setting;
98 res = (int)set_color(&screens[SCREEN_MAIN],str(colors[c].lang_id),
99 colors[c].setting, banned_color);
100 if (old_color != *colors[c].setting)
102 settings_save();
103 settings_apply(false);
104 settings_apply_skins();
106 return res;
109 static int reset_color(void)
111 global_settings.fg_color = LCD_DEFAULT_FG;
112 global_settings.bg_color = LCD_DEFAULT_BG;
113 global_settings.lss_color = LCD_DEFAULT_LS;
114 global_settings.lse_color = LCD_DEFAULT_BG;
115 global_settings.lst_color = LCD_DEFAULT_FG;
117 settings_save();
118 settings_apply(false);
119 settings_apply_skins();
120 return 0;
122 MENUITEM_FUNCTION(set_bg_col, MENU_FUNC_USEPARAM, ID2P(LANG_BACKGROUND_COLOR),
123 set_color_func, (void*)COLOR_BG, NULL, Icon_NOICON);
124 MENUITEM_FUNCTION(set_fg_col, MENU_FUNC_USEPARAM, ID2P(LANG_FOREGROUND_COLOR),
125 set_color_func, (void*)COLOR_FG, NULL, Icon_NOICON);
126 MENUITEM_FUNCTION(set_lss_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_START_COLOR),
127 set_color_func, (void*)COLOR_LSS, NULL, Icon_NOICON);
128 MENUITEM_FUNCTION(set_lse_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_END_COLOR),
129 set_color_func, (void*)COLOR_LSE, NULL, Icon_NOICON);
130 MENUITEM_FUNCTION(set_lst_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_TEXT_COLOR),
131 set_color_func, (void*)COLOR_LST, NULL, Icon_NOICON);
132 MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS),
133 reset_color, NULL, NULL, Icon_NOICON);
135 MAKE_MENU(lss_settings, ID2P(LANG_SELECTOR_COLOR_MENU),
136 NULL, Icon_NOICON,
137 &set_lss_col, &set_lse_col, &set_lst_col
140 /* now the actual menu */
141 MAKE_MENU(colors_settings, ID2P(LANG_COLORS_MENU),
142 NULL, Icon_Display_menu,
143 &lss_settings,
144 &set_bg_col, &set_fg_col, &reset_colors
147 #endif /* HAVE_LCD_COLOR */
148 /* LCD MENU */
149 /***********************************/
152 /************************************/
153 /* BARS MENU */
154 /* */
157 #ifdef HAVE_LCD_BITMAP
158 static int statusbar_callback_ex(int action,const struct menu_item_ex *this_item,
159 enum screen_type screen)
161 (void)this_item;
162 /* we save the old statusbar value here, so the old statusbars can get
163 * removed and cleared from the display properly on exiting
164 * (in gui_statusbar_changed() ) */
165 static enum statusbar_values old_bar[NB_SCREENS];
166 switch (action)
168 case ACTION_ENTER_MENUITEM:
169 old_bar[screen] = statusbar_position(screen);
170 break;
171 case ACTION_EXIT_MENUITEM:
172 if (old_bar[screen] != statusbar_position(screen))
173 settings_apply_skins();
174 break;
176 return ACTION_REDRAW;
179 #ifdef HAVE_REMOTE_LCD
180 static int statusbar_callback_remote(int action,const struct menu_item_ex *this_item)
182 return statusbar_callback_ex(action, this_item, SCREEN_REMOTE);
184 #endif
185 static int statusbar_callback(int action,const struct menu_item_ex *this_item)
187 return statusbar_callback_ex(action, this_item, SCREEN_MAIN);
190 #ifdef HAVE_BUTTONBAR
191 static int buttonbar_callback(int action, const struct menu_item_ex *this_item)
193 (void)this_item;
194 switch (action)
196 case ACTION_EXIT_MENUITEM:
197 viewportmanager_theme_changed(THEME_BUTTONBAR);
198 break;
200 return ACTION_REDRAW;
202 #endif
203 MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL);
204 MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL);
205 MENUITEM_SETTING(statusbar, &global_settings.statusbar,
206 statusbar_callback);
207 #ifdef HAVE_REMOTE_LCD
208 MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar,
209 statusbar_callback_remote);
210 #endif
211 #ifdef HAVE_BUTTONBAR
212 MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, buttonbar_callback);
213 #endif
214 MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL);
215 MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL);
216 MAKE_MENU(bars_menu, ID2P(LANG_BARS_MENU), 0, Icon_NOICON,
217 &scrollbar_item, &scrollbar_width, &statusbar,
218 #ifdef HAVE_REMOTE_LCD
219 &remote_statusbar,
220 #endif
221 #if CONFIG_KEYPAD == RECORDER_PAD
222 &buttonbar,
223 #endif
224 &volume_type
225 #if (CONFIG_BATTERY_MEASURE != 0)
226 , &battery_display
227 #endif
229 #endif /* HAVE_LCD_BITMAP */
231 /* */
232 /* BARS MENU */
233 /************************************/
235 #ifdef HAVE_LCD_BITMAP
236 static struct browse_folder_info fonts = {FONT_DIR, SHOW_FONT};
237 static struct browse_folder_info sbs = {SBS_DIR, SHOW_SBS};
238 #if CONFIG_TUNER
239 static struct browse_folder_info fms = {WPS_DIR, SHOW_FMS};
240 #endif
241 #endif
242 static struct browse_folder_info wps = {WPS_DIR, SHOW_WPS};
243 #ifdef HAVE_REMOTE_LCD
244 static struct browse_folder_info rwps = {WPS_DIR, SHOW_RWPS};
245 static struct browse_folder_info rsbs = {SBS_DIR, SHOW_RSBS};
246 #if CONFIG_TUNER
247 static struct browse_folder_info rfms = {WPS_DIR, SHOW_RFMS};
248 #endif
249 #endif
250 static struct browse_folder_info themes = {THEME_DIR, SHOW_CFG};
252 int browse_folder(void *param)
254 const char *ext, *setting;
255 int lang_id = -1;
256 char selected[MAX_FILENAME+10];
257 const struct browse_folder_info *info =
258 (const struct browse_folder_info*)param;
259 struct browse_context browse;
260 browse_context_init(&browse, info->show_options, 0,
261 NULL, NOICON, info->dir, NULL);
263 /* if we are in a special settings folder, center the current setting */
264 switch(info->show_options)
266 case SHOW_LNG:
267 ext = "lng";
268 if (global_settings.lang_file[0])
269 setting = global_settings.lang_file;
270 else
271 setting = "english";
272 lang_id = LANG_LANGUAGE;
273 break;
274 case SHOW_WPS:
275 ext = "wps";
276 setting = global_settings.wps_file;
277 lang_id = LANG_WHILE_PLAYING;
278 break;
279 #ifdef HAVE_LCD_BITMAP
280 case SHOW_FONT:
281 ext = "fnt";
282 setting = global_settings.font_file;
283 lang_id = LANG_CUSTOM_FONT;
284 break;
285 case SHOW_SBS:
286 ext = "sbs";
287 setting = global_settings.sbs_file;
288 lang_id = LANG_BASE_SKIN;
289 break;
290 #if CONFIG_TUNER
291 case SHOW_FMS:
292 ext = "fms";
293 setting = global_settings.fms_file;
294 lang_id = LANG_RADIOSCREEN;
295 break;
296 #endif /* CONFIG_TUNER */
297 #endif
298 #ifdef HAVE_REMOTE_LCD
299 case SHOW_RWPS:
300 ext = "rwps";
301 setting = global_settings.rwps_file;
302 lang_id = LANG_REMOTE_WHILE_PLAYING;
303 break;
304 case SHOW_RSBS:
305 ext = "rsbs";
306 setting = global_settings.rsbs_file;
307 lang_id = LANG_REMOTE_BASE_SKIN;
308 break;
309 #if CONFIG_TUNER
310 case SHOW_RFMS:
311 ext = "rfms";
312 setting = global_settings.rfms_file;
313 lang_id = LANG_REMOTE_RADIOSCREEN;
314 break;
315 #endif /* CONFIG_TUNER */
316 #endif
317 default:
318 ext = setting = NULL;
319 break;
322 /* If we've found a file to center on, do it */
323 if (setting)
325 /* if setting != NULL, ext is initialized */
326 snprintf(selected, sizeof(selected), "%s.%s", setting, ext);
327 browse.selected = selected;
328 browse.icon = Icon_Questionmark;
329 browse.title = str(lang_id);
332 return rockbox_browse(&browse);
335 #ifdef HAVE_LCD_BITMAP
336 MENUITEM_FUNCTION(browse_fonts, MENU_FUNC_USEPARAM,
337 ID2P(LANG_CUSTOM_FONT),
338 browse_folder, (void*)&fonts, NULL, Icon_Font);
340 MENUITEM_FUNCTION(browse_sbs, MENU_FUNC_USEPARAM,
341 ID2P(LANG_BASE_SKIN),
342 browse_folder, (void*)&sbs, NULL, Icon_Wps);
343 #if CONFIG_TUNER
344 MENUITEM_FUNCTION(browse_fms, MENU_FUNC_USEPARAM,
345 ID2P(LANG_RADIOSCREEN),
346 browse_folder, (void*)&fms, NULL, Icon_Wps);
347 #endif
348 #endif
349 MENUITEM_FUNCTION(browse_wps, MENU_FUNC_USEPARAM,
350 ID2P(LANG_WHILE_PLAYING),
351 browse_folder, (void*)&wps, NULL, Icon_Wps);
352 #ifdef HAVE_REMOTE_LCD
353 MENUITEM_FUNCTION(browse_rwps, MENU_FUNC_USEPARAM,
354 ID2P(LANG_REMOTE_WHILE_PLAYING),
355 browse_folder, (void*)&rwps, NULL, Icon_Wps);
356 MENUITEM_FUNCTION(browse_rsbs, MENU_FUNC_USEPARAM,
357 ID2P(LANG_REMOTE_BASE_SKIN),
358 browse_folder, (void*)&rsbs, NULL, Icon_Wps);
359 #if CONFIG_TUNER
360 MENUITEM_FUNCTION(browse_rfms, MENU_FUNC_USEPARAM,
361 ID2P(LANG_REMOTE_RADIOSCREEN),
362 browse_folder, (void*)&rfms, NULL, Icon_Wps);
363 #endif
364 #endif
367 static int showicons_callback(int action, const struct menu_item_ex *this_item)
369 (void)this_item;
370 static bool old_icons;
371 switch (action)
373 case ACTION_ENTER_MENUITEM:
374 old_icons = global_settings.show_icons;
375 break;
376 case ACTION_EXIT_MENUITEM:
377 if (old_icons != global_settings.show_icons)
378 icons_init();
379 break;
381 return ACTION_REDRAW;
384 MENUITEM_SETTING(show_icons, &global_settings.show_icons, showicons_callback);
385 MENUITEM_FUNCTION(browse_themes, MENU_FUNC_USEPARAM,
386 ID2P(LANG_CUSTOM_THEME),
387 browse_folder, (void*)&themes, NULL, Icon_Config);
388 #ifdef HAVE_LCD_BITMAP
389 MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL);
390 #endif
392 MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU),
393 NULL, Icon_Wps,
394 &browse_themes,
395 #ifdef HAVE_LCD_BITMAP
396 &browse_fonts,
397 #endif
398 &browse_wps,
399 #ifdef HAVE_REMOTE_LCD
400 &browse_rwps,
401 #endif
402 #if CONFIG_TUNER
403 &browse_fms,
404 #ifdef HAVE_REMOTE_LCD
405 &browse_rfms,
406 #endif
407 #endif
408 #ifdef HAVE_LCD_BITMAP
409 &browse_sbs,
410 #endif
411 #ifdef HAVE_REMOTE_LCD
412 &browse_rsbs,
413 #endif
414 &show_icons,
415 #ifdef HAVE_BACKDROP_IMAGE
416 &clear_main_bd,
417 #endif
418 #ifdef HAVE_LCD_BITMAP
419 &bars_menu,
420 &cursor_style,
421 #endif
422 #ifdef HAVE_LCD_COLOR
423 &colors_settings,
424 #endif