bool C4Menu::Enter(bool fRight) { // Not active if (!IsActive()) return false; if (Style==C4MN_Style_Info) return false; // Get selected item C4MenuItem *pItem = GetSelectedItem(); if (!pItem) { // okay for dialogs: Just close them if (Style == C4MN_Style_Dialog) TryClose(false, true); return true; } // Copy command to buffer (menu might be cleared) char szCommand[_MAX_FNAME+30+1]; SCopy(pItem->Command,szCommand); if (fRight && pItem->Command2[0]) SCopy(pItem->Command2,szCommand); // Close if not permanent if (!Permanent) { Close(true); fActive = false; } // exec command (note that menu callback may delete this!) MenuCommand(szCommand, false); return true; }
bool C4Menu::Control(BYTE byCom, int32_t iData) { if (!IsActive()) return false; switch (byCom) { case COM_MenuEnter: Enter(); break; case COM_MenuEnterAll: Enter(true); break; case COM_MenuClose: TryClose(false, true); break; // organize with nicer subfunction... case COM_MenuLeft: // Top wrap-around if (Selection-1 < 0) MoveSelection(ItemCount - 1 - Selection, true, true); else MoveSelection(-1, true, true); break; case COM_MenuRight: // Bottom wrap-around if (Selection+1 >= ItemCount) MoveSelection(-Selection, true, true); else MoveSelection(+1, true, true); break; case COM_MenuUp: iData = -Columns; // Top wrap-around if (Selection + iData < 0) while (Selection + iData + Columns < ItemCount) iData += Columns; MoveSelection(iData, true, true); break; case COM_MenuDown: iData = +Columns; // Bottom wrap-around if (Selection+iData >= ItemCount) while (Selection+iData-Columns >= 0) iData-=Columns; MoveSelection(iData, true, true); break; case COM_MenuSelect: if (ItemCount) SetSelection(iData & (~C4MN_AdjustPosition), !!(iData & C4MN_AdjustPosition), true); break; case COM_MenuShowText: SetTextProgress(-1, false); break; } return true; }
void C4MainMenu::OnUserClose() { // just close TryClose(false, true); }