| 615 | } |
| 616 | |
| 617 | bool menu_is_visible(struct menu *menu) |
| 618 | { |
| 619 | struct menu *child; |
| 620 | struct symbol *sym; |
| 621 | tristate visible; |
| 622 | |
| 623 | if (!menu->prompt) |
| 624 | return false; |
| 625 | |
| 626 | if (menu->visibility) { |
| 627 | if (expr_calc_value(menu->visibility) == no) |
| 628 | return false; |
| 629 | } |
| 630 | |
| 631 | sym = menu->sym; |
| 632 | if (sym) { |
| 633 | sym_calc_value(sym); |
| 634 | visible = menu->prompt->visible.tri; |
| 635 | } else |
| 636 | visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); |
| 637 | |
| 638 | if (visible != no) |
| 639 | return true; |
| 640 | |
| 641 | if (!sym || sym_get_tristate_value(menu->sym) == no) |
| 642 | return false; |
| 643 | |
| 644 | for (child = menu->list; child; child = child->next) { |
| 645 | if (menu_is_visible(child)) { |
| 646 | if (sym) |
| 647 | sym->flags |= SYMBOL_DEF_USER; |
| 648 | return true; |
| 649 | } |
| 650 | } |
| 651 | |
| 652 | return false; |
| 653 | } |
| 654 | |
| 655 | const char *menu_get_prompt(struct menu *menu) |
| 656 | { |
no test coverage detected