diff options
-rw-r--r-- | apps/menu.c | 270 |
1 files changed, 143 insertions, 127 deletions
diff --git a/apps/menu.c b/apps/menu.c index 39b7e0dc39..a66652b608 100644 --- a/apps/menu.c +++ b/apps/menu.c | |||
@@ -318,11 +318,11 @@ static char * get_menu_item_name(int selected_item,void * data, char *buffer) | |||
318 | } | 318 | } |
319 | 319 | ||
320 | menu = menu->submenus[selected_item]; | 320 | menu = menu->submenus[selected_item]; |
321 | 321 | ||
322 | if (menu->flags&MENU_DYNAMIC_DESC) | 322 | if (menu->flags&MENU_DYNAMIC_DESC) |
323 | return menu->menu_get_name_and_icon->list_get_name(selected_item, | 323 | return menu->menu_get_name_and_icon->list_get_name(selected_item, |
324 | menu->menu_get_name_and_icon->list_get_name_data, buffer); | 324 | menu->menu_get_name_and_icon->list_get_name_data, buffer); |
325 | 325 | ||
326 | type = (menu->flags&MENU_TYPE_MASK); | 326 | type = (menu->flags&MENU_TYPE_MASK); |
327 | if (type == MT_SETTING) | 327 | if (type == MT_SETTING) |
328 | { | 328 | { |
@@ -338,15 +338,15 @@ static char * get_menu_item_name(int selected_item,void * data, char *buffer) | |||
338 | static void menu_get_icon(int selected_item, void * data, ICON * icon) | 338 | static void menu_get_icon(int selected_item, void * data, ICON * icon) |
339 | { | 339 | { |
340 | const struct menu_item_ex *menu = (const struct menu_item_ex *)data; | 340 | const struct menu_item_ex *menu = (const struct menu_item_ex *)data; |
341 | ICON menu_icon = NOICON; | 341 | ICON menu_icon = NOICON; |
342 | selected_item = get_menu_selection(selected_item, menu); | 342 | selected_item = get_menu_selection(selected_item, menu); |
343 | 343 | ||
344 | menu = menu->submenus[selected_item]; | 344 | menu = menu->submenus[selected_item]; |
345 | if (menu->flags&MENU_HAS_DESC) | 345 | if (menu->flags&MENU_HAS_DESC) |
346 | menu_icon = menu->callback_and_desc->icon; | 346 | menu_icon = menu->callback_and_desc->icon; |
347 | else if (menu->flags&MENU_DYNAMIC_DESC) | 347 | else if (menu->flags&MENU_DYNAMIC_DESC) |
348 | menu_icon = menu->menu_get_name_and_icon->icon; | 348 | menu_icon = menu->menu_get_name_and_icon->icon; |
349 | 349 | ||
350 | switch (menu->flags&MENU_TYPE_MASK) | 350 | switch (menu->flags&MENU_TYPE_MASK) |
351 | { | 351 | { |
352 | case MT_SETTING: | 352 | case MT_SETTING: |
@@ -446,119 +446,119 @@ static void talk_menu_item(const struct menu_item_ex *menu, | |||
446 | /* returns true if the menu needs to be redrwan */ | 446 | /* returns true if the menu needs to be redrwan */ |
447 | bool do_setting_from_menu(const struct menu_item_ex *temp) | 447 | bool do_setting_from_menu(const struct menu_item_ex *temp) |
448 | { | 448 | { |
449 | int setting_id; | 449 | int setting_id; |
450 | const struct settings_list *setting = find_setting( | 450 | const struct settings_list *setting = find_setting( |
451 | temp->variable, | 451 | temp->variable, |
452 | &setting_id); | 452 | &setting_id); |
453 | bool ret_val = false; | 453 | bool ret_val = false; |
454 | if (setting) | 454 | if (setting) |
455 | { | 455 | { |
456 | if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING) | 456 | if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING) |
457 | { | 457 | { |
458 | bool temp_var, *var; | 458 | bool temp_var, *var; |
459 | bool show_icons = global_settings.show_icons; | 459 | bool show_icons = global_settings.show_icons; |
460 | if (setting->flags&F_TEMPVAR) | 460 | if (setting->flags&F_TEMPVAR) |
461 | { | 461 | { |
462 | temp_var = *(bool*)setting->setting; | 462 | temp_var = *(bool*)setting->setting; |
463 | var = &temp_var; | 463 | var = &temp_var; |
464 | } | 464 | } |
465 | else | 465 | else |
466 | { | 466 | { |
467 | var = (bool*)setting->setting; | 467 | var = (bool*)setting->setting; |
468 | } | 468 | } |
469 | set_bool_options(str(setting->lang_id),var, | 469 | set_bool_options(str(setting->lang_id),var, |
470 | STR(setting->bool_setting->lang_yes), | 470 | STR(setting->bool_setting->lang_yes), |
471 | STR(setting->bool_setting->lang_no), | 471 | STR(setting->bool_setting->lang_no), |
472 | setting->bool_setting->option_callback); | 472 | setting->bool_setting->option_callback); |
473 | if (setting->flags&F_TEMPVAR) | 473 | if (setting->flags&F_TEMPVAR) |
474 | *(bool*)setting->setting = temp_var; | 474 | *(bool*)setting->setting = temp_var; |
475 | if (show_icons != global_settings.show_icons) | 475 | if (show_icons != global_settings.show_icons) |
476 | ret_val = true; | 476 | ret_val = true; |
477 | } | 477 | } |
478 | else if (setting->flags&F_T_SOUND) | 478 | else if (setting->flags&F_T_SOUND) |
479 | { | 479 | { |
480 | set_sound(str(setting->lang_id), setting->setting, | 480 | set_sound(str(setting->lang_id), setting->setting, |
481 | setting->sound_setting->setting); | 481 | setting->sound_setting->setting); |
482 | } | 482 | } |
483 | else /* other setting, must be an INT type */ | 483 | else /* other setting, must be an INT type */ |
484 | { | 484 | { |
485 | int temp_var, *var; | 485 | int temp_var, *var; |
486 | if (setting->flags&F_TEMPVAR) | 486 | if (setting->flags&F_TEMPVAR) |
487 | { | 487 | { |
488 | temp_var = *(int*)setting->setting; | 488 | temp_var = *(int*)setting->setting; |
489 | var = &temp_var; | 489 | var = &temp_var; |
490 | } | 490 | } |
491 | else | 491 | else |
492 | { | 492 | { |
493 | var = (int*)setting->setting; | 493 | var = (int*)setting->setting; |
494 | } | 494 | } |
495 | if (setting->flags&F_INT_SETTING) | 495 | if (setting->flags&F_INT_SETTING) |
496 | { | 496 | { |
497 | int min, max, step; | 497 | int min, max, step; |
498 | if (setting->flags&F_FLIPLIST) | 498 | if (setting->flags&F_FLIPLIST) |
499 | { | 499 | { |
500 | min = setting->int_setting->max; | 500 | min = setting->int_setting->max; |
501 | max = setting->int_setting->min; | 501 | max = setting->int_setting->min; |
502 | step = -setting->int_setting->step; | 502 | step = -setting->int_setting->step; |
503 | } | 503 | } |
504 | else | 504 | else |
505 | { | 505 | { |
506 | max = setting->int_setting->max; | 506 | max = setting->int_setting->max; |
507 | min = setting->int_setting->min; | 507 | min = setting->int_setting->min; |
508 | step = setting->int_setting->step; | 508 | step = setting->int_setting->step; |
509 | } | 509 | } |
510 | set_int_ex(str(setting->lang_id), | 510 | set_int_ex(str(setting->lang_id), |
511 | NULL, | 511 | NULL, |
512 | setting->int_setting->unit,var, | 512 | setting->int_setting->unit,var, |
513 | setting->int_setting->option_callback, | 513 | setting->int_setting->option_callback, |
514 | step, min, max, | 514 | step, min, max, |
515 | setting->int_setting->formatter, | 515 | setting->int_setting->formatter, |
516 | setting->int_setting->get_talk_id); | 516 | setting->int_setting->get_talk_id); |
517 | } | 517 | } |
518 | else if (setting->flags&F_CHOICE_SETTING) | 518 | else if (setting->flags&F_CHOICE_SETTING) |
519 | { | 519 | { |
520 | static struct opt_items options[MAX_OPTIONS]; | 520 | static struct opt_items options[MAX_OPTIONS]; |
521 | char buffer[256]; | 521 | char buffer[256]; |
522 | char *buf_start = buffer; | 522 | char *buf_start = buffer; |
523 | int buf_free = 256; | 523 | int buf_free = 256; |
524 | int i,j, count = setting->choice_setting->count; | 524 | int i,j, count = setting->choice_setting->count; |
525 | for (i=0, j=0; i<count && i<MAX_OPTIONS; i++) | 525 | for (i=0, j=0; i<count && i<MAX_OPTIONS; i++) |
526 | { | 526 | { |
527 | if (setting->flags&F_CHOICETALKS) | 527 | if (setting->flags&F_CHOICETALKS) |
528 | { | 528 | { |
529 | if (cfg_int_to_string(setting_id, i, | 529 | if (cfg_int_to_string(setting_id, i, |
530 | buf_start, buf_free)) | 530 | buf_start, buf_free)) |
531 | { | 531 | { |
532 | int len = strlen(buf_start) +1; | 532 | int len = strlen(buf_start) +1; |
533 | options[j].string = buf_start; | 533 | options[j].string = buf_start; |
534 | buf_start += len; | 534 | buf_start += len; |
535 | buf_free -= len; | 535 | buf_free -= len; |
536 | options[j].voice_id = | 536 | options[j].voice_id = |
537 | setting->choice_setting->talks[i]; | 537 | setting->choice_setting->talks[i]; |
538 | j++; | 538 | j++; |
539 | } | 539 | } |
540 | } | 540 | } |
541 | else | 541 | else |
542 | { | 542 | { |
543 | options[j].string = | 543 | options[j].string = |
544 | P2STR(setting-> | 544 | P2STR(setting-> |
545 | choice_setting->desc[i]); | 545 | choice_setting->desc[i]); |
546 | options[j].voice_id = | 546 | options[j].voice_id = |
547 | P2ID(setting-> | 547 | P2ID(setting-> |
548 | choice_setting->desc[i]); | 548 | choice_setting->desc[i]); |
549 | j++; | 549 | j++; |
550 | } | 550 | } |
551 | } | 551 | } |
552 | set_option(str(setting->lang_id), var, INT, | 552 | set_option(str(setting->lang_id), var, INT, |
553 | options,j, | 553 | options,j, |
554 | setting-> | 554 | setting-> |
555 | choice_setting->option_callback); | 555 | choice_setting->option_callback); |
556 | } | 556 | } |
557 | if (setting->flags&F_TEMPVAR) | 557 | if (setting->flags&F_TEMPVAR) |
558 | *(int*)setting->setting = temp_var; | 558 | *(int*)setting->setting = temp_var; |
559 | } | 559 | } |
560 | } | 560 | } |
561 | return ret_val; | 561 | return ret_val; |
562 | } | 562 | } |
563 | 563 | ||
564 | int do_menu(const struct menu_item_ex *start_menu) | 564 | int do_menu(const struct menu_item_ex *start_menu) |
@@ -568,7 +568,10 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
568 | struct gui_synclist lists; | 568 | struct gui_synclist lists; |
569 | const struct menu_item_ex *temp, *menu; | 569 | const struct menu_item_ex *temp, *menu; |
570 | int ret = 0; | 570 | int ret = 0; |
571 | 571 | #ifdef HAS_BUTTONBAR | |
572 | struct gui_buttonbar buttonbar; | ||
573 | #endif | ||
574 | |||
572 | const struct menu_item_ex *menu_stack[MAX_MENUS]; | 575 | const struct menu_item_ex *menu_stack[MAX_MENUS]; |
573 | int menu_stack_selected_item[MAX_MENUS]; | 576 | int menu_stack_selected_item[MAX_MENUS]; |
574 | int stack_top = 0; | 577 | int stack_top = 0; |
@@ -577,7 +580,12 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
577 | if (start_menu == NULL) | 580 | if (start_menu == NULL) |
578 | menu = &main_menu_; | 581 | menu = &main_menu_; |
579 | else menu = start_menu; | 582 | else menu = start_menu; |
580 | 583 | #ifdef HAS_BUTTONBAR | |
584 | gui_buttonbar_init(&buttonbar); | ||
585 | gui_buttonbar_set_display(&buttonbar, &(screens[SCREEN_MAIN]) ); | ||
586 | gui_buttonbar_set(&buttonbar, "<<<", "", ""); | ||
587 | gui_buttonbar_draw(&buttonbar); | ||
588 | #endif | ||
581 | init_menu_lists(menu,&lists,selected,true); | 589 | init_menu_lists(menu,&lists,selected,true); |
582 | in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID); | 590 | in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID); |
583 | 591 | ||
@@ -637,6 +645,10 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
637 | else if (action == ACTION_STD_OK) | 645 | else if (action == ACTION_STD_OK) |
638 | { | 646 | { |
639 | int type; | 647 | int type; |
648 | #ifdef HAS_BUTTONBAR | ||
649 | gui_buttonbar_unset(&buttonbar); | ||
650 | gui_buttonbar_draw(&buttonbar); | ||
651 | #endif | ||
640 | selected = get_menu_selection(gui_synclist_get_sel_pos(&lists), menu); | 652 | selected = get_menu_selection(gui_synclist_get_sel_pos(&lists), menu); |
641 | temp = menu->submenus[selected]; | 653 | temp = menu->submenus[selected]; |
642 | if (in_stringlist) | 654 | if (in_stringlist) |
@@ -676,7 +688,7 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
676 | case MT_SETTING: | 688 | case MT_SETTING: |
677 | { | 689 | { |
678 | if (do_setting_from_menu(temp)) | 690 | if (do_setting_from_menu(temp)) |
679 | init_menu_lists(menu, &lists, 0, true); | 691 | init_menu_lists(menu, &lists, 0, true); |
680 | break; | 692 | break; |
681 | } | 693 | } |
682 | case MT_RETURN_ID: | 694 | case MT_RETURN_ID: |
@@ -700,6 +712,10 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
700 | menu_callback(ACTION_EXIT_MENUITEM,temp); | 712 | menu_callback(ACTION_EXIT_MENUITEM,temp); |
701 | /* callback was changed, so reload the menu's callback */ | 713 | /* callback was changed, so reload the menu's callback */ |
702 | get_menu_callback(menu, &menu_callback); | 714 | get_menu_callback(menu, &menu_callback); |
715 | #ifdef HAS_BUTTONBAR | ||
716 | gui_buttonbar_set(&buttonbar, "<<<", "", ""); | ||
717 | gui_buttonbar_draw(&buttonbar); | ||
718 | #endif | ||
703 | } | 719 | } |
704 | else if(default_event_handler(action) == SYS_USB_CONNECTED) | 720 | else if(default_event_handler(action) == SYS_USB_CONNECTED) |
705 | ret = MENU_ATTACHED_USB; | 721 | ret = MENU_ATTACHED_USB; |