summaryrefslogtreecommitdiff
path: root/apps/gui/quickscreen.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/gui/quickscreen.c')
-rw-r--r--apps/gui/quickscreen.c164
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
41static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; 43static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT];
42static struct viewport vp_icons[NB_SCREENS]; 44static 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 325static bool is_setting_quickscreenable(const struct settings_list *setting);
326static 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}
324bool quick_screen_quick(int button_enter) 334bool 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 */
397static 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
414const 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}
428static 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}
437static 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}
443static 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}
471int 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