Fix FS#111395. Call settings_apply_skins() after changing theme colours.
[kugel-rb.git] / apps / menus / theme_menu.c
blobf8fb06b22f8e35da3af47445ddd258b110d40125
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 <stdbool.h>
23 #include <stddef.h>
24 #include <limits.h>
25 #include "config.h"
26 #include "lang.h"
27 #include "action.h"
28 #include "settings.h"
29 #include "menu.h"
30 #include "tree.h"
31 #include "list.h"
32 #ifdef HAVE_LCD_BITMAP
33 #include "peakmeter.h"
34 #endif
35 #include "color_picker.h"
36 #include "lcd.h"
37 #include "lcd-remote.h"
38 #include "backdrop.h"
39 #include "exported_menus.h"
40 #include "appevents.h"
41 #include "viewport.h"
42 #include "statusbar-skinned.h"
44 #if LCD_DEPTH > 1
45 /**
46 * Menu to clear the backdrop image
48 static int clear_main_backdrop(void)
50 global_settings.backdrop_file[0] = '-';
51 global_settings.backdrop_file[1] = '\0';
52 sb_set_backdrop(SCREEN_MAIN, NULL);
53 viewportmanager_theme_enable(SCREEN_MAIN, false, NULL);
54 viewportmanager_theme_undo(SCREEN_MAIN, true);
55 settings_save();
56 return 0;
58 MENUITEM_FUNCTION(clear_main_bd, 0, ID2P(LANG_CLEAR_BACKDROP),
59 clear_main_backdrop, NULL, NULL, Icon_NOICON);
60 #endif
61 #ifdef HAVE_LCD_COLOR
63 enum Colors {
64 COLOR_FG = 0,
65 COLOR_BG,
66 COLOR_LSS,
67 COLOR_LSE,
68 COLOR_LST,
69 COLOR_COUNT
71 static struct colour_info
73 int *setting;
74 int lang_id;
75 } colors[COLOR_COUNT] = {
76 [COLOR_FG] = {&global_settings.fg_color, LANG_FOREGROUND_COLOR},
77 [COLOR_BG] = {&global_settings.bg_color, LANG_BACKGROUND_COLOR},
78 [COLOR_LSS] = {&global_settings.lss_color, LANG_SELECTOR_START_COLOR},
79 [COLOR_LSE] = {&global_settings.lse_color, LANG_SELECTOR_END_COLOR},
80 [COLOR_LST] = {&global_settings.lst_color, LANG_SELECTOR_TEXT_COLOR},
83 /**
84 * Menu for fore/back/selection colors
86 static int set_color_func(void* color)
88 int res, c = (intptr_t)color, banned_color=-1;
90 /* Don't let foreground be set the same as background and vice-versa */
91 if (c == COLOR_BG)
92 banned_color = *colors[COLOR_FG].setting;
93 else if (c == COLOR_FG)
94 banned_color = *colors[COLOR_BG].setting;
96 res = (int)set_color(&screens[SCREEN_MAIN],str(colors[c].lang_id),
97 colors[c].setting, banned_color);
98 settings_save();
99 settings_apply(false);
100 settings_apply_skins();
101 return res;
104 static int reset_color(void)
106 global_settings.fg_color = LCD_DEFAULT_FG;
107 global_settings.bg_color = LCD_DEFAULT_BG;
108 global_settings.lss_color = LCD_DEFAULT_LS;
109 global_settings.lse_color = LCD_DEFAULT_BG;
110 global_settings.lst_color = LCD_DEFAULT_FG;
112 settings_save();
113 settings_apply(false);
114 return 0;
116 MENUITEM_FUNCTION(set_bg_col, MENU_FUNC_USEPARAM, ID2P(LANG_BACKGROUND_COLOR),
117 set_color_func, (void*)COLOR_BG, NULL, Icon_NOICON);
118 MENUITEM_FUNCTION(set_fg_col, MENU_FUNC_USEPARAM, ID2P(LANG_FOREGROUND_COLOR),
119 set_color_func, (void*)COLOR_FG, NULL, Icon_NOICON);
120 MENUITEM_FUNCTION(set_lss_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_START_COLOR),
121 set_color_func, (void*)COLOR_LSS, NULL, Icon_NOICON);
122 MENUITEM_FUNCTION(set_lse_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_END_COLOR),
123 set_color_func, (void*)COLOR_LSE, NULL, Icon_NOICON);
124 MENUITEM_FUNCTION(set_lst_col, MENU_FUNC_USEPARAM, ID2P(LANG_SELECTOR_TEXT_COLOR),
125 set_color_func, (void*)COLOR_LST, NULL, Icon_NOICON);
126 MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS),
127 reset_color, NULL, NULL, Icon_NOICON);
129 MAKE_MENU(lss_settings, ID2P(LANG_SELECTOR_COLOR_MENU),
130 NULL, Icon_NOICON,
131 &set_lss_col, &set_lse_col, &set_lst_col
134 /* now the actual menu */
135 MAKE_MENU(colors_settings, ID2P(LANG_COLORS_MENU),
136 NULL, Icon_Display_menu,
137 &lss_settings,
138 &set_bg_col, &set_fg_col, &reset_colors
141 #endif /* HAVE_LCD_COLOR */
142 /* LCD MENU */
143 /***********************************/
146 /************************************/
147 /* BARS MENU */
148 /* */
151 #ifdef HAVE_LCD_BITMAP
152 static int statusbar_callback_ex(int action,const struct menu_item_ex *this_item,
153 enum screen_type screen)
155 (void)this_item;
156 /* we save the old statusbar value here, so the old statusbars can get
157 * removed and cleared from the display properly on exiting
158 * (in gui_statusbar_changed() ) */
159 static enum statusbar_values old_bar[NB_SCREENS];
160 switch (action)
162 case ACTION_ENTER_MENUITEM:
163 old_bar[screen] = statusbar_position(screen);
164 break;
165 case ACTION_EXIT_MENUITEM:
166 if (old_bar[screen] != statusbar_position(screen))
167 settings_apply_skins();
168 break;
170 return ACTION_REDRAW;
173 #ifdef HAVE_REMOTE_LCD
174 static int statusbar_callback_remote(int action,const struct menu_item_ex *this_item)
176 return statusbar_callback_ex(action, this_item, SCREEN_REMOTE);
178 #endif
179 static int statusbar_callback(int action,const struct menu_item_ex *this_item)
181 return statusbar_callback_ex(action, this_item, SCREEN_MAIN);
184 #ifdef HAVE_BUTTONBAR
185 static int buttonbar_callback(int action, const struct menu_item_ex *this_item)
187 (void)this_item;
188 switch (action)
190 case ACTION_EXIT_MENUITEM:
191 viewportmanager_theme_changed(THEME_BUTTONBAR);
192 break;
194 return ACTION_REDRAW;
196 #endif
197 MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL);
198 MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL);
199 MENUITEM_SETTING(statusbar, &global_settings.statusbar,
200 statusbar_callback);
201 #ifdef HAVE_REMOTE_LCD
202 MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar,
203 statusbar_callback_remote);
204 #endif
205 #ifdef HAVE_BUTTONBAR
206 MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, buttonbar_callback);
207 #endif
208 MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL);
209 MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL);
210 MAKE_MENU(bars_menu, ID2P(LANG_BARS_MENU), 0, Icon_NOICON,
211 &scrollbar_item, &scrollbar_width, &statusbar,
212 #ifdef HAVE_REMOTE_LCD
213 &remote_statusbar,
214 #endif
215 #if CONFIG_KEYPAD == RECORDER_PAD
216 &buttonbar,
217 #endif
218 &volume_type, &battery_display);
219 #endif /* HAVE_LCD_BITMAP */
221 /* */
222 /* BARS MENU */
223 /************************************/
225 #ifdef HAVE_LCD_BITMAP
226 static struct browse_folder_info fonts = {FONT_DIR, SHOW_FONT};
227 static struct browse_folder_info sbs = {SBS_DIR, SHOW_SBS};
228 #if CONFIG_TUNER
229 static struct browse_folder_info fms = {WPS_DIR, SHOW_FMS};
230 #endif
231 #endif
232 static struct browse_folder_info wps = {WPS_DIR, SHOW_WPS};
233 #ifdef HAVE_REMOTE_LCD
234 static struct browse_folder_info rwps = {WPS_DIR, SHOW_RWPS};
235 static struct browse_folder_info rsbs = {SBS_DIR, SHOW_RSBS};
236 #if CONFIG_TUNER
237 static struct browse_folder_info rfms = {WPS_DIR, SHOW_RFMS};
238 #endif
239 #endif
240 static struct browse_folder_info themes = {THEME_DIR, SHOW_CFG};
242 int browse_folder(void *param)
244 const struct browse_folder_info *info =
245 (const struct browse_folder_info*)param;
246 return rockbox_browse(info->dir, info->show_options);
249 #ifdef HAVE_LCD_BITMAP
250 MENUITEM_FUNCTION(browse_fonts, MENU_FUNC_USEPARAM,
251 ID2P(LANG_CUSTOM_FONT),
252 browse_folder, (void*)&fonts, NULL, Icon_Font);
254 MENUITEM_FUNCTION(browse_sbs, MENU_FUNC_USEPARAM,
255 ID2P(LANG_BASE_SKIN),
256 browse_folder, (void*)&sbs, NULL, Icon_Wps);
257 #if CONFIG_TUNER
258 MENUITEM_FUNCTION(browse_fms, MENU_FUNC_USEPARAM,
259 ID2P(LANG_RADIOSCREEN),
260 browse_folder, (void*)&fms, NULL, Icon_Wps);
261 #endif
262 #endif
263 MENUITEM_FUNCTION(browse_wps, MENU_FUNC_USEPARAM,
264 ID2P(LANG_WHILE_PLAYING),
265 browse_folder, (void*)&wps, NULL, Icon_Wps);
266 #ifdef HAVE_REMOTE_LCD
267 MENUITEM_FUNCTION(browse_rwps, MENU_FUNC_USEPARAM,
268 ID2P(LANG_REMOTE_WHILE_PLAYING),
269 browse_folder, (void*)&rwps, NULL, Icon_Wps);
270 MENUITEM_FUNCTION(browse_rsbs, MENU_FUNC_USEPARAM,
271 ID2P(LANG_REMOTE_BASE_SKIN),
272 browse_folder, (void*)&rsbs, NULL, Icon_Wps);
273 #if CONFIG_TUNER
274 MENUITEM_FUNCTION(browse_rfms, MENU_FUNC_USEPARAM,
275 ID2P(LANG_REMOTE_RADIOSCREEN),
276 browse_folder, (void*)&rfms, NULL, Icon_Wps);
277 #endif
278 #endif
280 MENUITEM_SETTING(show_icons, &global_settings.show_icons, NULL);
281 MENUITEM_FUNCTION(browse_themes, MENU_FUNC_USEPARAM,
282 ID2P(LANG_CUSTOM_THEME),
283 browse_folder, (void*)&themes, NULL, Icon_Config);
284 #ifdef HAVE_LCD_BITMAP
285 MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL);
286 #endif
288 MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU),
289 NULL, Icon_Wps,
290 &browse_themes,
291 #ifdef HAVE_LCD_BITMAP
292 &browse_fonts,
293 #endif
294 &browse_wps,
295 #ifdef HAVE_REMOTE_LCD
296 &browse_rwps,
297 #endif
298 #if CONFIG_TUNER
299 &browse_fms,
300 #ifdef HAVE_REMOTE_LCD
301 &browse_rfms,
302 #endif
303 #endif
304 #ifdef HAVE_LCD_BITMAP
305 &browse_sbs,
306 #endif
307 #ifdef HAVE_REMOTE_LCD
308 &browse_rsbs,
309 #endif
310 &show_icons,
311 #if LCD_DEPTH > 1
312 &clear_main_bd,
313 #endif
314 #ifdef HAVE_LCD_BITMAP
315 &bars_menu,
316 &cursor_style,
317 #endif
318 #ifdef HAVE_LCD_COLOR
319 &colors_settings,
320 #endif