diff options
-rw-r--r-- | apps/gui/quickscreen.c | 164 | ||||
-rw-r--r-- | apps/gui/quickscreen.h | 2 | ||||
-rw-r--r-- | apps/lang/english.lang | 68 | ||||
-rw-r--r-- | apps/menus/settings_menu.c | 22 | ||||
-rw-r--r-- | apps/settings.h | 6 | ||||
-rw-r--r-- | apps/settings_list.c | 53 | ||||
-rw-r--r-- | apps/settings_list.h | 4 |
7 files changed, 309 insertions, 10 deletions
diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c index 0bfe746661..189a1e5989 100644 --- a/apps/gui/quickscreen.c +++ b/apps/gui/quickscreen.c | |||
@@ -37,6 +37,8 @@ | |||
37 | #include "audio.h" | 37 | #include "audio.h" |
38 | #include "quickscreen.h" | 38 | #include "quickscreen.h" |
39 | #include "talk.h" | 39 | #include "talk.h" |
40 | #include "list.h" | ||
41 | #include "splash.h" | ||
40 | 42 | ||
41 | static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; | 43 | static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; |
42 | static struct viewport vp_icons[NB_SCREENS]; | 44 | static struct viewport vp_icons[NB_SCREENS]; |
@@ -113,7 +115,7 @@ static void quickscreen_fix_viewports(struct gui_quickscreen *qs, | |||
113 | vps[screen][QUICKSCREEN_RIGHT].width = width; | 115 | vps[screen][QUICKSCREEN_RIGHT].width = width; |
114 | 116 | ||
115 | /* shrink the icons vp by a few pixels if there is room so the arrows | 117 | /* shrink the icons vp by a few pixels if there is room so the arrows |
116 | arnt' drawn right next to the text */ | 118 | aren't drawn right next to the text */ |
117 | if (vp_icons[screen].width > CENTER_ICONAREA_WIDTH+8) | 119 | if (vp_icons[screen].width > CENTER_ICONAREA_WIDTH+8) |
118 | { | 120 | { |
119 | vp_icons[screen].width -= 8; | 121 | vp_icons[screen].width -= 8; |
@@ -320,18 +322,31 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter) | |||
320 | cond_talk_ids_fq(VOICE_OK); | 322 | cond_talk_ids_fq(VOICE_OK); |
321 | return changed; | 323 | return changed; |
322 | } | 324 | } |
323 | 325 | static bool is_setting_quickscreenable(const struct settings_list *setting); | |
326 | static inline const struct settings_list *get_setting(int gs_value, | ||
327 | const struct settings_list *defaultval) | ||
328 | { | ||
329 | if (gs_value != -1 && gs_value < nb_settings && | ||
330 | is_setting_quickscreenable(&settings[gs_value])) | ||
331 | return &settings[gs_value]; | ||
332 | return defaultval; | ||
333 | } | ||
324 | bool quick_screen_quick(int button_enter) | 334 | bool quick_screen_quick(int button_enter) |
325 | { | 335 | { |
326 | struct gui_quickscreen qs; | 336 | struct gui_quickscreen qs; |
327 | bool oldshuffle = global_settings.playlist_shuffle; | 337 | bool oldshuffle = global_settings.playlist_shuffle; |
328 | int oldrepeat = global_settings.repeat_mode; | 338 | int oldrepeat = global_settings.repeat_mode; |
329 | qs.items[QUICKSCREEN_LEFT] = | 339 | |
330 | find_setting(&global_settings.playlist_shuffle, NULL); | 340 | qs.items[QUICKSCREEN_LEFT] = |
331 | qs.items[QUICKSCREEN_RIGHT] = | 341 | get_setting(global_settings.qs_item_left, |
332 | find_setting(&global_settings.repeat_mode, NULL); | 342 | find_setting(&global_settings.playlist_shuffle, NULL)); |
333 | qs.items[QUICKSCREEN_BOTTOM] = | 343 | qs.items[QUICKSCREEN_RIGHT] = |
334 | find_setting(&global_settings.dirfilter, NULL); | 344 | get_setting(global_settings.qs_item_right, |
345 | find_setting(&global_settings.repeat_mode, NULL)); | ||
346 | qs.items[QUICKSCREEN_BOTTOM] = | ||
347 | get_setting(global_settings.qs_item_bottom, | ||
348 | find_setting(&global_settings.dirfilter, NULL)); | ||
349 | |||
335 | qs.callback = NULL; | 350 | qs.callback = NULL; |
336 | if (gui_syncquickscreen_run(&qs, button_enter)) | 351 | if (gui_syncquickscreen_run(&qs, button_enter)) |
337 | { | 352 | { |
@@ -378,3 +393,136 @@ bool quick_screen_f3(int button_enter) | |||
378 | } | 393 | } |
379 | #endif /* BUTTON_F3 */ | 394 | #endif /* BUTTON_F3 */ |
380 | 395 | ||
396 | /* stuff to make the quickscreen configurable */ | ||
397 | static bool is_setting_quickscreenable(const struct settings_list *setting) | ||
398 | { | ||
399 | /* to keep things simple, only settings which have a lang_id set are ok */ | ||
400 | if (setting->lang_id < 0 || (setting->flags&F_BANFROMQS)) | ||
401 | return false; | ||
402 | switch (setting->flags&F_T_MASK) | ||
403 | { | ||
404 | case F_T_BOOL: | ||
405 | return true; | ||
406 | case F_T_INT: | ||
407 | case F_T_UINT: | ||
408 | return (setting->RESERVED != NULL); | ||
409 | default: | ||
410 | return false; | ||
411 | } | ||
412 | } | ||
413 | |||
414 | const struct settings_list *find_setting_from_index(int index) | ||
415 | { | ||
416 | int count = -1, i; | ||
417 | const struct settings_list *setting = &settings[0]; | ||
418 | for(i=0;i<nb_settings;i++) | ||
419 | { | ||
420 | setting = &settings[i]; | ||
421 | if (is_setting_quickscreenable(setting)) | ||
422 | count++; | ||
423 | if (count == index) | ||
424 | return setting; | ||
425 | } | ||
426 | return NULL; | ||
427 | } | ||
428 | static char* quickscreen_setter_getname(int selected_item, void *data, | ||
429 | char *buffer, size_t buffer_len) | ||
430 | { | ||
431 | (void)data; | ||
432 | const struct settings_list *setting = find_setting_from_index(selected_item); | ||
433 | snprintf(buffer, buffer_len, "%s (%s)", | ||
434 | str(setting->lang_id), setting->cfg_name); | ||
435 | return buffer; | ||
436 | } | ||
437 | static int quickscreen_setter_speak_item(int selected_item, void * data) | ||
438 | { | ||
439 | (void)data; | ||
440 | talk_id(find_setting_from_index(selected_item)->lang_id, true); | ||
441 | return 0; | ||
442 | } | ||
443 | static int quickscreen_setter_action_callback(int action, | ||
444 | struct gui_synclist *lists) | ||
445 | { | ||
446 | const struct settings_list *temp = lists->data; | ||
447 | switch (action) | ||
448 | { | ||
449 | case ACTION_STD_OK: | ||
450 | /* ok, quit */ | ||
451 | return ACTION_STD_CANCEL; | ||
452 | case ACTION_STD_CONTEXT: /* real settings use this to reset to default */ | ||
453 | { | ||
454 | int i=0, count=0; | ||
455 | reset_setting(temp, temp->setting); | ||
456 | for(i=0;i<nb_settings;i++) | ||
457 | { | ||
458 | if (is_setting_quickscreenable(&settings[i])) | ||
459 | count++; | ||
460 | if (*(int*)temp->setting == i) | ||
461 | { | ||
462 | gui_synclist_select_item(lists, count-1); | ||
463 | break; | ||
464 | } | ||
465 | } | ||
466 | return ACTION_REDRAW; | ||
467 | } | ||
468 | } | ||
469 | return action; | ||
470 | } | ||
471 | int quickscreen_set_option(void *data) | ||
472 | { | ||
473 | int valid_settings_count = 0; | ||
474 | int i, newval = 0, oldval, *setting = NULL; | ||
475 | struct simplelist_info info; | ||
476 | switch ((intptr_t)data) | ||
477 | { | ||
478 | case QUICKSCREEN_LEFT: | ||
479 | setting = &global_settings.qs_item_left; | ||
480 | break; | ||
481 | case QUICKSCREEN_RIGHT: | ||
482 | setting = &global_settings.qs_item_right; | ||
483 | break; | ||
484 | case QUICKSCREEN_BOTTOM: | ||
485 | setting = &global_settings.qs_item_bottom; | ||
486 | break; | ||
487 | } | ||
488 | oldval = *setting; | ||
489 | for(i=0;i<nb_settings;i++) | ||
490 | { | ||
491 | if (is_setting_quickscreenable(&settings[i])) | ||
492 | valid_settings_count++; | ||
493 | if (oldval == i) | ||
494 | newval = valid_settings_count - 1; | ||
495 | } | ||
496 | |||
497 | simplelist_info_init(&info, str(LANG_QS_ITEMS), | ||
498 | valid_settings_count, | ||
499 | (void*)find_setting(setting, NULL)); /* find the qs item being changed */ | ||
500 | info.get_name = quickscreen_setter_getname; | ||
501 | if(global_settings.talk_menu) | ||
502 | info.get_talk = quickscreen_setter_speak_item; | ||
503 | info.action_callback = quickscreen_setter_action_callback; | ||
504 | info.selection = newval; | ||
505 | simplelist_show_list(&info); | ||
506 | if (info.selection != oldval) | ||
507 | { | ||
508 | if (info.selection != -1) | ||
509 | { | ||
510 | const struct settings_list *temp = find_setting_from_index(info.selection); | ||
511 | int i = 0; | ||
512 | for(i=0;i<nb_settings;i++) | ||
513 | { | ||
514 | if (&settings[i] == temp) | ||
515 | break; | ||
516 | } | ||
517 | *setting = i; | ||
518 | settings_save(); | ||
519 | } | ||
520 | /* probably should splash LANG_CANCEL here but right now | ||
521 | we cant find out the selection when the cancel button was | ||
522 | pressed, (without hacks)so we cant know if the | ||
523 | selection was changed, or just viewed */ | ||
524 | } | ||
525 | return 0; | ||
526 | } | ||
527 | |||
528 | |||
diff --git a/apps/gui/quickscreen.h b/apps/gui/quickscreen.h index 1d2ed18c97..f084d83b61 100644 --- a/apps/gui/quickscreen.h +++ b/apps/gui/quickscreen.h | |||
@@ -50,7 +50,7 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter); | |||
50 | extern bool quick_screen_f3(int button_enter); | 50 | extern bool quick_screen_f3(int button_enter); |
51 | #endif | 51 | #endif |
52 | extern bool quick_screen_quick(int button_enter); | 52 | extern bool quick_screen_quick(int button_enter); |
53 | 53 | int quickscreen_set_option(void *data); | |
54 | 54 | ||
55 | #endif /*_GUI_QUICK_SCREEN_H_*/ | 55 | #endif /*_GUI_QUICK_SCREEN_H_*/ |
56 | #endif /* HAVE_QUICKSCREEN */ | 56 | #endif /* HAVE_QUICKSCREEN */ |
diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 8cb1007ad5..7e638f3a5c 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang | |||
@@ -12109,3 +12109,71 @@ | |||
12109 | *: "Search Results" | 12109 | *: "Search Results" |
12110 | </voice> | 12110 | </voice> |
12111 | </phrase> | 12111 | </phrase> |
12112 | <phrase> | ||
12113 | id: LANG_QS_ITEMS | ||
12114 | desc: used for the submenu name for the quickscreen items | ||
12115 | user: | ||
12116 | <source> | ||
12117 | *: none | ||
12118 | quickscreen: "Quickscreen Items" | ||
12119 | </source> | ||
12120 | <dest> | ||
12121 | *: none | ||
12122 | quickscreen: "Quickscreen Items" | ||
12123 | </dest> | ||
12124 | <voice> | ||
12125 | *: none | ||
12126 | quickscreen: "Quickscreen Items" | ||
12127 | </voice> | ||
12128 | </phrase> | ||
12129 | <phrase> | ||
12130 | id: LANG_LEFT | ||
12131 | desc: used for the submenu name for the quickscreen items | ||
12132 | user: | ||
12133 | <source> | ||
12134 | *: none | ||
12135 | quickscreen: "Left" | ||
12136 | </source> | ||
12137 | <dest> | ||
12138 | *: none | ||
12139 | quickscreen: "Left" | ||
12140 | </dest> | ||
12141 | <voice> | ||
12142 | *: none | ||
12143 | quickscreen: "Left" | ||
12144 | </voice> | ||
12145 | </phrase> | ||
12146 | <phrase> | ||
12147 | id: LANG_RIGHT | ||
12148 | desc: used for the submenu name for the quickscreen items | ||
12149 | user: | ||
12150 | <source> | ||
12151 | *: none | ||
12152 | quickscreen: "Right" | ||
12153 | </source> | ||
12154 | <dest> | ||
12155 | *: none | ||
12156 | quickscreen: "Right" | ||
12157 | </dest> | ||
12158 | <voice> | ||
12159 | *: none | ||
12160 | quickscreen: "Right" | ||
12161 | </voice> | ||
12162 | </phrase> | ||
12163 | <phrase> | ||
12164 | id: LANG_BOTTOM | ||
12165 | desc: used for the submenu name for the quickscreen items | ||
12166 | user: | ||
12167 | <source> | ||
12168 | *: none | ||
12169 | quickscreen: "Bottom" | ||
12170 | </source> | ||
12171 | <dest> | ||
12172 | *: none | ||
12173 | quickscreen: "Bottom" | ||
12174 | </dest> | ||
12175 | <voice> | ||
12176 | *: none | ||
12177 | quickscreen: "Bottom" | ||
12178 | </voice> | ||
12179 | </phrase> | ||
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 60fc9c0cc0..1610cfbef1 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #if CONFIG_RTC | 49 | #if CONFIG_RTC |
50 | #include "screens.h" | 50 | #include "screens.h" |
51 | #endif | 51 | #endif |
52 | #include "quickscreen.h" | ||
52 | 53 | ||
53 | /***********************************/ | 54 | /***********************************/ |
54 | /* TAGCACHE MENU */ | 55 | /* TAGCACHE MENU */ |
@@ -486,7 +487,25 @@ MAKE_MENU(voice_settings_menu, ID2P(LANG_VOICE), 0, Icon_Voice, | |||
486 | /* VOICE MENU */ | 487 | /* VOICE MENU */ |
487 | /***********************************/ | 488 | /***********************************/ |
488 | 489 | ||
490 | #ifdef HAVE_QUICKSCREEN | ||
489 | /***********************************/ | 491 | /***********************************/ |
492 | /* CUSTOMISABLE QUICKSCREEN CODE */ | ||
493 | |||
494 | MENUITEM_FUNCTION(qs_left_item, MENU_FUNC_USEPARAM, ID2P(LANG_LEFT), | ||
495 | (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_LEFT, NULL, | ||
496 | Icon_Menu_setting); | ||
497 | MENUITEM_FUNCTION(qs_right_item, MENU_FUNC_USEPARAM, ID2P(LANG_RIGHT), | ||
498 | (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_RIGHT, NULL, | ||
499 | Icon_Menu_setting); | ||
500 | MENUITEM_FUNCTION(qs_bottom_item, MENU_FUNC_USEPARAM, ID2P(LANG_BOTTOM), | ||
501 | (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_BOTTOM, NULL, | ||
502 | Icon_Menu_setting); | ||
503 | |||
504 | MAKE_MENU(quickscreen_settings, ID2P(LANG_QS_ITEMS), NULL, Icon_Config, | ||
505 | &qs_left_item, &qs_right_item, &qs_bottom_item); | ||
506 | /* CUSTOMISABLE QUICKSCREEN CODE */ | ||
507 | /***********************************/ | ||
508 | #endif | ||
490 | 509 | ||
491 | /***********************************/ | 510 | /***********************************/ |
492 | /* SETTINGS MENU */ | 511 | /* SETTINGS MENU */ |
@@ -500,6 +519,9 @@ MENUITEM_FUNCTION(browse_langs, 0, ID2P(LANG_LANGUAGE), language_browse, | |||
500 | MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0, | 519 | MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0, |
501 | Icon_General_settings_menu, | 520 | Icon_General_settings_menu, |
502 | &playlist_settings, &file_menu, | 521 | &playlist_settings, &file_menu, |
522 | #ifdef HAVE_QUICKSCREEN | ||
523 | &quickscreen_settings, | ||
524 | #endif | ||
503 | #ifdef HAVE_TAGCACHE | 525 | #ifdef HAVE_TAGCACHE |
504 | &tagcache_menu, | 526 | &tagcache_menu, |
505 | #endif | 527 | #endif |
diff --git a/apps/settings.h b/apps/settings.h index 8c206053aa..8448059308 100644 --- a/apps/settings.h +++ b/apps/settings.h | |||
@@ -751,6 +751,12 @@ struct user_settings | |||
751 | #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING | 751 | #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING |
752 | int touchpad_sensitivity; | 752 | int touchpad_sensitivity; |
753 | #endif | 753 | #endif |
754 | #ifdef HAVE_QUICKSCREEN | ||
755 | /* these are split because settings_list cant handle arrays */ | ||
756 | int qs_item_left; | ||
757 | int qs_item_right; | ||
758 | int qs_item_bottom; | ||
759 | #endif | ||
754 | }; | 760 | }; |
755 | 761 | ||
756 | /** global variables **/ | 762 | /** global variables **/ |
diff --git a/apps/settings_list.c b/apps/settings_list.c index 99a4601a3f..7bdf4f4ce9 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c | |||
@@ -409,6 +409,45 @@ static int32_t jumpscroll_getlang(int value, int unit) | |||
409 | } | 409 | } |
410 | #endif /* HAVE_LCD_CHARCELLS */ | 410 | #endif /* HAVE_LCD_CHARCELLS */ |
411 | 411 | ||
412 | #ifdef HAVE_QUICKSCREEN | ||
413 | int find_setting_by_name(char*name) | ||
414 | { | ||
415 | int i = 0; | ||
416 | const struct settings_list *setting; | ||
417 | while (i<nb_settings) | ||
418 | { | ||
419 | setting = &settings[i]; | ||
420 | if (setting->cfg_name && !strcmp(setting->cfg_name, name)) | ||
421 | { | ||
422 | return i; | ||
423 | } | ||
424 | i++; | ||
425 | } | ||
426 | return -1; | ||
427 | } | ||
428 | void qs_load_from_cfg(void* var, char*value) | ||
429 | { | ||
430 | *(int*)var = find_setting_by_name(value); | ||
431 | } | ||
432 | char* qs_write_to_cfg(void* setting, char*buf, int buf_len) | ||
433 | { | ||
434 | const struct settings_list *var = &settings[*(int*)setting]; | ||
435 | strncpy(buf, var->cfg_name, buf_len); | ||
436 | return buf; | ||
437 | } | ||
438 | bool qs_is_changed(void* setting, void* defaultval) | ||
439 | { | ||
440 | int i = *(int*)setting; | ||
441 | if (i < 0 || i >= nb_settings) | ||
442 | return false; | ||
443 | const struct settings_list *var = &settings[i]; | ||
444 | return var != find_setting(defaultval, NULL); | ||
445 | } | ||
446 | void qs_set_default(void* setting, void* defaultval) | ||
447 | { | ||
448 | find_setting(defaultval, (int*)setting); | ||
449 | } | ||
450 | #endif | ||
412 | const struct settings_list settings[] = { | 451 | const struct settings_list settings[] = { |
413 | /* sound settings */ | 452 | /* sound settings */ |
414 | SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME), | 453 | SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME), |
@@ -1372,6 +1411,20 @@ const struct settings_list settings[] = { | |||
1372 | "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2, | 1411 | "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2, |
1373 | ID2P(LANG_NORMAL), ID2P(LANG_HIGH)), | 1412 | ID2P(LANG_NORMAL), ID2P(LANG_HIGH)), |
1374 | #endif | 1413 | #endif |
1414 | #ifdef HAVE_QUICKSCREEN | ||
1415 | CUSTOM_SETTING(0, qs_item_left, LANG_LEFT, | ||
1416 | &global_settings.playlist_shuffle, "qs left", | ||
1417 | qs_load_from_cfg, qs_write_to_cfg, | ||
1418 | qs_is_changed, qs_set_default), | ||
1419 | CUSTOM_SETTING(0, qs_item_right, LANG_RIGHT, | ||
1420 | &global_settings.repeat_mode, "qs right", | ||
1421 | qs_load_from_cfg, qs_write_to_cfg, | ||
1422 | qs_is_changed, qs_set_default), | ||
1423 | CUSTOM_SETTING(0, qs_item_bottom, LANG_BOTTOM, | ||
1424 | &global_settings.dirfilter, "qs bottom", | ||
1425 | qs_load_from_cfg, qs_write_to_cfg, | ||
1426 | qs_is_changed, qs_set_default), | ||
1427 | #endif | ||
1375 | }; | 1428 | }; |
1376 | 1429 | ||
1377 | const int nb_settings = sizeof(settings)/sizeof(*settings); | 1430 | const int nb_settings = sizeof(settings)/sizeof(*settings); |
diff --git a/apps/settings_list.h b/apps/settings_list.h index 60e3f7f0c7..1bc529c7d9 100644 --- a/apps/settings_list.h +++ b/apps/settings_list.h | |||
@@ -152,8 +152,10 @@ struct custom_setting { | |||
152 | #define F_PADTITLE 0x800 /* pad the title with spaces to force it to scroll */ | 152 | #define F_PADTITLE 0x800 /* pad the title with spaces to force it to scroll */ |
153 | #define F_NO_WRAP 0x1000 /* used if the list should not wrap */ | 153 | #define F_NO_WRAP 0x1000 /* used if the list should not wrap */ |
154 | 154 | ||
155 | #define F_BANFROMQS 0x80000000 /* ban the setting from the quickscreen items */ | ||
156 | |||
155 | struct settings_list { | 157 | struct settings_list { |
156 | uint32_t flags; /* ____ _SER TFFF NNN_ _ATW PTVC IFRB STTT */ | 158 | uint32_t flags; /* B___ _SER TFFF NNN_ _ATW PTVC IFRB STTT */ |
157 | void *setting; | 159 | void *setting; |
158 | int lang_id; /* -1 for none */ | 160 | int lang_id; /* -1 for none */ |
159 | union storage_type default_val; | 161 | union storage_type default_val; |