diff options
Diffstat (limited to 'apps/gui/quickscreen.c')
-rw-r--r-- | apps/gui/quickscreen.c | 164 |
1 files changed, 156 insertions, 8 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 | |||