| 503 | //============================================================================= |
| 504 | |
| 505 | void M_SetMenu(FName menu, int param) |
| 506 | { |
| 507 | if (sysCallbacks.SetSpecialMenu && !sysCallbacks.SetSpecialMenu(menu, param)) return; |
| 508 | |
| 509 | DMenuDescriptor **desc = MenuDescriptors.CheckKey(menu); |
| 510 | if (desc != nullptr) |
| 511 | { |
| 512 | |
| 513 | if ((*desc)->IsKindOf(RUNTIME_CLASS(DListMenuDescriptor))) |
| 514 | { |
| 515 | DListMenuDescriptor *ld = static_cast<DListMenuDescriptor*>(*desc); |
| 516 | if (ld->mAutoselect >= 0 && ld->mAutoselect < (int)ld->mItems.Size()) |
| 517 | { |
| 518 | // recursively activate the autoselected item without ever creating this menu. |
| 519 | ld->mItems[ld->mAutoselect]->Activate(); |
| 520 | } |
| 521 | else |
| 522 | { |
| 523 | PClass *cls = ld->mClass; |
| 524 | if (cls == nullptr) cls = DefaultListMenuClass; |
| 525 | if (cls == nullptr) cls = PClass::FindClass("ListMenu"); |
| 526 | |
| 527 | DMenu *newmenu = (DMenu *)cls->CreateNew(); |
| 528 | IFVIRTUALPTRNAME(newmenu, "ListMenu", Init) |
| 529 | { |
| 530 | VMValue params[3] = { newmenu, CurrentMenu, ld }; |
| 531 | VMCall(func, params, 3, nullptr, 0); |
| 532 | } |
| 533 | M_ActivateMenu(newmenu); |
| 534 | } |
| 535 | } |
| 536 | else if ((*desc)->IsKindOf(RUNTIME_CLASS(DOptionMenuDescriptor))) |
| 537 | { |
| 538 | DOptionMenuDescriptor *ld = static_cast<DOptionMenuDescriptor*>(*desc); |
| 539 | PClass *cls = ld->mClass; |
| 540 | if (cls == nullptr) cls = DefaultOptionMenuClass; |
| 541 | if (cls == nullptr) cls = PClass::FindClass("OptionMenu"); |
| 542 | |
| 543 | DMenu *newmenu = (DMenu*)cls->CreateNew(); |
| 544 | IFVIRTUALPTRNAME(newmenu, "OptionMenu", Init) |
| 545 | { |
| 546 | VMValue params[3] = { newmenu, CurrentMenu, ld }; |
| 547 | VMCall(func, params, 3, nullptr, 0); |
| 548 | } |
| 549 | M_ActivateMenu(newmenu); |
| 550 | } |
| 551 | else if ((*desc)->IsKindOf(RUNTIME_CLASS(DImageScrollerDescriptor))) |
| 552 | { |
| 553 | auto ld = static_cast<DImageScrollerDescriptor*>(*desc); |
| 554 | PClass* cls = ld->mClass; |
| 555 | if (cls == nullptr) cls = DefaultOptionMenuClass; |
| 556 | if (cls == nullptr) cls = PClass::FindClass("ImageScrollerMenu"); |
| 557 | |
| 558 | DMenu* newmenu = (DMenu*)cls->CreateNew(); |
| 559 | IFVIRTUALPTRNAME(newmenu, "ImageScrollerMenu", Init) |
| 560 | { |
| 561 | VMValue params[3] = { newmenu, CurrentMenu, ld }; |
| 562 | VMCall(func, params, 3, nullptr, 0); |
no test coverage detected