summaryrefslogtreecommitdiff
path: root/apps/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/menu.c')
-rw-r--r--apps/menu.c232
1 files changed, 126 insertions, 106 deletions
diff --git a/apps/menu.c b/apps/menu.c
index 6728481a9f..a45567415d 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -290,7 +290,7 @@ static int current_subitems_count = 0;
290void get_menu_callback(const struct menu_item_ex *m, 290void get_menu_callback(const struct menu_item_ex *m,
291 menu_callback_type *menu_callback) 291 menu_callback_type *menu_callback)
292{ 292{
293 if (m->flags&MENU_HAS_DESC) 293 if (m->flags&(MENU_HAS_DESC|MENU_DYNAMIC_DESC))
294 *menu_callback= m->callback_and_desc->menu_callback; 294 *menu_callback= m->callback_and_desc->menu_callback;
295 else 295 else
296 *menu_callback = m->menu_callback; 296 *menu_callback = m->menu_callback;
@@ -318,6 +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
322 if (menu->flags&MENU_DYNAMIC_DESC)
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);
325
321 type = (menu->flags&MENU_TYPE_MASK); 326 type = (menu->flags&MENU_TYPE_MASK);
322 if (type == MT_SETTING) 327 if (type == MT_SETTING)
323 { 328 {
@@ -333,26 +338,32 @@ static char * get_menu_item_name(int selected_item,void * data, char *buffer)
333static void menu_get_icon(int selected_item, void * data, ICON * icon) 338static void menu_get_icon(int selected_item, void * data, ICON * icon)
334{ 339{
335 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;
336 selected_item = get_menu_selection(selected_item, menu); 342 selected_item = get_menu_selection(selected_item, menu);
337 343
338 menu = menu->submenus[selected_item]; 344 menu = menu->submenus[selected_item];
345 if (menu->flags&MENU_HAS_DESC)
346 menu_icon = menu->callback_and_desc->icon;
347 else if (menu->flags&MENU_DYNAMIC_DESC)
348 menu_icon = menu->menu_get_name_and_icon->icon;
349
339 switch (menu->flags&MENU_TYPE_MASK) 350 switch (menu->flags&MENU_TYPE_MASK)
340 { 351 {
341 case MT_SETTING: 352 case MT_SETTING:
342 *icon = bitmap_icons_6x8[Icon_Menu_setting]; 353 *icon = bitmap_icons_6x8[Icon_Menu_setting];
343 break; 354 break;
344 case MT_MENU: 355 case MT_MENU:
345 if (menu->callback_and_desc->icon == NOICON) 356 if (menu_icon == NOICON)
346 *icon = bitmap_icons_6x8[Icon_Submenu]; 357 *icon = bitmap_icons_6x8[Icon_Submenu];
347 else 358 else
348 *icon = menu->callback_and_desc->icon; 359 *icon = menu_icon;
349 break; 360 break;
350 case MT_FUNCTION_CALL: 361 case MT_FUNCTION_CALL:
351 case MT_FUNCTION_WITH_PARAM: 362 case MT_FUNCTION_WITH_PARAM:
352 if (menu->callback_and_desc->icon == NOICON) 363 if (menu_icon == NOICON)
353 *icon = bitmap_icons_6x8[Icon_Menu_functioncall]; 364 *icon = bitmap_icons_6x8[Icon_Menu_functioncall];
354 else 365 else
355 *icon = menu->callback_and_desc->icon; 366 *icon = menu_icon;
356 break; 367 break;
357 default: 368 default:
358 *icon = NOICON; 369 *icon = NOICON;
@@ -432,6 +443,113 @@ static void talk_menu_item(const struct menu_item_ex *menu,
432 } 443 }
433} 444}
434#define MAX_OPTIONS 32 445#define MAX_OPTIONS 32
446/* returns true if the menu needs to be redrwan */
447bool do_setting_from_menu(const struct menu_item_ex *temp)
448{
449 int setting_id;
450 const struct settings_list *setting = find_setting(
451 temp->variable,
452 &setting_id);
453 bool ret_val = false;
454 if (setting)
455 {
456 if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING)
457 {
458 bool temp_var, *var;
459 bool show_icons = global_settings.show_icons;
460 if (setting->flags&F_TEMPVAR)
461 {
462 temp_var = *(bool*)setting->setting;
463 var = &temp_var;
464 }
465 else
466 {
467 var = (bool*)setting->setting;
468 }
469 set_bool_options(str(setting->lang_id),var,
470 STR(setting->bool_setting->lang_yes),
471 STR(setting->bool_setting->lang_no),
472 setting->bool_setting->option_callback);
473 if (setting->flags&F_TEMPVAR)
474 *(bool*)setting->setting = temp_var;
475 if (show_icons != global_settings.show_icons)
476 ret_val = true;
477 }
478 else if (setting->flags&F_T_SOUND)
479 {
480 set_sound(str(setting->lang_id), setting->setting,
481 setting->sound_setting->setting);
482 }
483 else /* other setting, must be an INT type */
484 {
485 int temp_var, *var;
486 if (setting->flags&F_TEMPVAR)
487 {
488 temp_var = *(int*)setting->setting;
489 var = &temp_var;
490 }
491 else
492 {
493 var = (int*)setting->setting;
494 }
495 if (setting->flags&F_INT_SETTING)
496 {
497 set_int_ex(str(setting->lang_id),
498 NULL,
499 setting->int_setting->unit,var,
500 setting->int_setting->option_callback,
501 setting->int_setting->step,
502 setting->int_setting->min,
503 setting->int_setting->max,
504 setting->int_setting->formatter,
505 setting->int_setting->get_talk_id);
506 }
507 else if (setting->flags&F_CHOICE_SETTING)
508 {
509 static struct opt_items options[MAX_OPTIONS];
510 char buffer[256];
511 char *buf_start = buffer;
512 int buf_free = 256;
513 int i,j, count = setting->choice_setting->count;
514 for (i=0, j=0; i<count && i<MAX_OPTIONS; i++)
515 {
516 if (setting->flags&F_CHOICETALKS)
517 {
518 if (cfg_int_to_string(setting_id, i,
519 buf_start, buf_free))
520 {
521 int len = strlen(buf_start) +1;
522 options[j].string = buf_start;
523 buf_start += len;
524 buf_free -= len;
525 options[j].voice_id =
526 setting->choice_setting->talks[i];
527 j++;
528 }
529 }
530 else
531 {
532 options[j].string =
533 P2STR(setting->
534 choice_setting->desc[i]);
535 options[j].voice_id =
536 P2ID(setting->
537 choice_setting->desc[i]);
538 j++;
539 }
540 }
541 set_option(str(setting->lang_id), var, INT,
542 options,j,
543 setting->
544 choice_setting->option_callback);
545 }
546 if (setting->flags&F_TEMPVAR)
547 *(int*)setting->setting = temp_var;
548 }
549 }
550 return ret_val;
551}
552
435int do_menu(const struct menu_item_ex *start_menu) 553int do_menu(const struct menu_item_ex *start_menu)
436{ 554{
437 int action; 555 int action;
@@ -551,106 +669,8 @@ int do_menu(const struct menu_item_ex *start_menu)
551 break; 669 break;
552 case MT_SETTING: 670 case MT_SETTING:
553 { 671 {
554 int setting_id; 672 if (do_setting_from_menu(temp))
555 const struct settings_list *setting = find_setting( 673 init_menu_lists(menu, &lists, 0, true);
556 temp->variable,
557 &setting_id);
558 if (setting)
559 {
560 if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING)
561 {
562 bool temp_var, *var;
563 bool show_icons = global_settings.show_icons;
564 if (setting->flags&F_TEMPVAR)
565 {
566 temp_var = *(bool*)setting->setting;
567 var = &temp_var;
568 }
569 else
570 {
571 var = (bool*)setting->setting;
572 }
573 set_bool_options(str(setting->lang_id),var,
574 STR(setting->bool_setting->lang_yes),
575 STR(setting->bool_setting->lang_no),
576 setting->bool_setting->option_callback);
577 if (setting->flags&F_TEMPVAR)
578 *(bool*)setting->setting = temp_var;
579 if (show_icons != global_settings.show_icons)
580 init_menu_lists(menu, &lists, 0, true);
581 }
582 else if (setting->flags&F_T_SOUND)
583 {
584 set_sound(str(setting->lang_id), setting->setting,
585 setting->sound_setting->setting);
586 }
587 else /* other setting, must be an INT type */
588 {
589 int temp_var, *var;
590 if (setting->flags&F_TEMPVAR)
591 {
592 temp_var = *(int*)setting->setting;
593 var = &temp_var;
594 }
595 else
596 {
597 var = (int*)setting->setting;
598 }
599 if (setting->flags&F_INT_SETTING)
600 {
601 set_int_ex(str(setting->lang_id),
602 NULL,
603 setting->int_setting->unit,var,
604 setting->int_setting->option_callback,
605 setting->int_setting->step,
606 setting->int_setting->min,
607 setting->int_setting->max,
608 setting->int_setting->formatter,
609 setting->int_setting->get_talk_id);
610 }
611 else if (setting->flags&F_CHOICE_SETTING)
612 {
613 static struct opt_items options[MAX_OPTIONS];
614 char buffer[256];
615 char *buf_start = buffer;
616 int buf_free = 256;
617 int i,j, count = setting->choice_setting->count;
618 for (i=0, j=0; i<count && i<MAX_OPTIONS; i++)
619 {
620 if (setting->flags&F_CHOICETALKS)
621 {
622 if (cfg_int_to_string(setting_id, i,
623 buf_start, buf_free))
624 {
625 int len = strlen(buf_start) +1;
626 options[j].string = buf_start;
627 buf_start += len;
628 buf_free -= len;
629 options[j].voice_id =
630 setting->choice_setting->talks[i];
631 j++;
632 }
633 }
634 else
635 {
636 options[j].string =
637 P2STR(setting->
638 choice_setting->desc[i]);
639 options[j].voice_id =
640 P2ID(setting->
641 choice_setting->desc[i]);
642 j++;
643 }
644 }
645 set_option(str(setting->lang_id), var, INT,
646 options,j,
647 setting->
648 choice_setting->option_callback);
649 }
650 if (setting->flags&F_TEMPVAR)
651 *(int*)setting->setting = temp_var;
652 }
653 }
654 break; 674 break;
655 } 675 }
656 case MT_RETURN_ID: 676 case MT_RETURN_ID: