diff options
Diffstat (limited to 'apps/menu.c')
-rw-r--r-- | apps/menu.c | 232 |
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; | |||
290 | void get_menu_callback(const struct menu_item_ex *m, | 290 | void 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) | |||
333 | 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) |
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 */ | ||
447 | bool 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 | |||
435 | int do_menu(const struct menu_item_ex *start_menu) | 553 | int 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: |