diff --git a/src/ui/menus.cpp b/src/ui/menus.cpp index bbbdfbd4c..16de66ff3 100644 --- a/src/ui/menus.cpp +++ b/src/ui/menus.cpp @@ -80,43 +80,48 @@ local int MenuButtonCurSel = -1; ** Items for the Game Menu */ local Menuitem GameMenuItems[] = { - { MI_TYPE_TEXT, { text:{ 128, 11, MI_FLAGS_CENTERED, LargeFont, "Game Menu"} } }, - { MI_TYPE_BUTTON, { button:{ 16, 40, MenuButtonDisabled, LargeFont, - "Save (~<F11~>)", 106, 27, MBUTTON_GM_HALF, GameMenuSave, KeyCodeF11} } }, - { MI_TYPE_BUTTON, { button:{ 16 + 12 + 106, 40, MenuButtonDisabled, LargeFont, - "Load (~<F12~>)", 106, 27, MBUTTON_GM_HALF, NULL, KeyCodeF12} } }, - { MI_TYPE_BUTTON, { button:{ 16, 40 + 36, MenuButtonDisabled, LargeFont, - "Options (~<F5~>)", 224, 27, MBUTTON_GM_FULL, NULL, KeyCodeF5} } }, - { MI_TYPE_BUTTON, { button:{ 16, 40 + 36 + 36, MenuButtonDisabled, LargeFont, - "Help (~<F1~>)", 224, 27, MBUTTON_GM_FULL, NULL, KeyCodeF1} } }, - { MI_TYPE_BUTTON, { button:{ 16, 40 + 36 + 36 + 36, MenuButtonDisabled, LargeFont, - "Scenario ~!Objectives", 224, 27, MBUTTON_GM_FULL, NULL, 'o'} } }, - { MI_TYPE_BUTTON, { button:{ 16, 40 + 36 + 36 + 36 + 36, 0, LargeFont, - "~!End Scenario", 224, 27, MBUTTON_GM_FULL, GameMenuEnd, 'e'} } }, - { MI_TYPE_BUTTON, { button:{ 16, 288-40, MenuButtonSelected, LargeFont, - "Return to Game (~<Esc~>)", 224, 27, MBUTTON_GM_FULL, GameMenuReturn, '\033'} } }, + { MI_TYPE_TEXT, 128, 11, 0, LargeFont, NULL, NULL, + { text:{ "Game Menu", MI_FLAGS_CENTERED} } }, + { MI_TYPE_BUTTON, 16, 40, MenuButtonDisabled, LargeFont, NULL, NULL, + { button:{ "Save (~<F11~>)", 106, 27, MBUTTON_GM_HALF, GameMenuSave, KeyCodeF11} } }, + { MI_TYPE_BUTTON, 16 + 12 + 106, 40, MenuButtonDisabled, LargeFont, NULL, NULL, + { button:{ "Load (~<F12~>)", 106, 27, MBUTTON_GM_HALF, NULL, KeyCodeF12} } }, + { MI_TYPE_BUTTON, 16, 40 + 36, MenuButtonDisabled, LargeFont, NULL, NULL, + { button:{ "Options (~<F5~>)", 224, 27, MBUTTON_GM_FULL, NULL, KeyCodeF5} } }, + { MI_TYPE_BUTTON, 16, 40 + 36 + 36, MenuButtonDisabled, LargeFont, NULL, NULL, + { button:{ "Help (~<F1~>)", 224, 27, MBUTTON_GM_FULL, NULL, KeyCodeF1} } }, + { MI_TYPE_BUTTON, 16, 40 + 36 + 36 + 36, MenuButtonDisabled, LargeFont, NULL, NULL, + { button:{ "Scenario ~!Objectives", 224, 27, MBUTTON_GM_FULL, NULL, 'o'} } }, + { MI_TYPE_BUTTON, 16, 40 + 36 + 36 + 36 + 36, 0, LargeFont, NULL, NULL, + { button:{ "~!End Scenario", 224, 27, MBUTTON_GM_FULL, GameMenuEnd, 'e'} } }, + { MI_TYPE_BUTTON, 16, 288-40, MenuButtonSelected, LargeFont, NULL, NULL, + { button:{ "Return to Game (~<Esc~>)", 224, 27, MBUTTON_GM_FULL, GameMenuReturn, '\033'} } }, }; /** ** Items for the Victory Menu */ local Menuitem VictoryMenuItems[] = { - { MI_TYPE_TEXT, { text:{ 144, 11, MI_FLAGS_CENTERED, LargeFont, "Congratulations!"} } }, - { MI_TYPE_TEXT, { text:{ 144, 32, MI_FLAGS_CENTERED, LargeFont, "You are victorious!"} } }, - { MI_TYPE_BUTTON, { button:{ 32, 90, MenuButtonSelected, LargeFont, - "~!Victory", 224, 27, MBUTTON_GM_FULL, GameMenuEnd, 'v'} } }, - { MI_TYPE_BUTTON, { button:{ 32, 56, MenuButtonDisabled, LargeFont, - "Save Game (~<F11~>)", 224, 27, MBUTTON_GM_FULL, NULL, KeyCodeF11} } }, + { MI_TYPE_TEXT, 144, 11, 0, LargeFont, NULL, NULL, + { text:{ "Congratulations!", MI_FLAGS_CENTERED} } }, + { MI_TYPE_TEXT, 144, 32, 0, LargeFont, NULL, NULL, + { text:{ "You are victorious!", MI_FLAGS_CENTERED} } }, + { MI_TYPE_BUTTON, 32, 90, MenuButtonSelected, LargeFont, NULL, NULL, + { button:{ "~!Victory", 224, 27, MBUTTON_GM_FULL, GameMenuEnd, 'v'} } }, + { MI_TYPE_BUTTON, 32, 56, MenuButtonDisabled, LargeFont, NULL, NULL, + { button:{ "Save Game (~<F11~>)", 224, 27, MBUTTON_GM_FULL, NULL, KeyCodeF11} } }, }; /** ** Items for the Lost Menu */ local Menuitem LostMenuItems[] = { - { MI_TYPE_TEXT, { text:{ 144, 11, MI_FLAGS_CENTERED, LargeFont, "You failed to"} } }, - { MI_TYPE_TEXT, { text:{ 144, 32, MI_FLAGS_CENTERED, LargeFont, "achieve victory!"} } }, - { MI_TYPE_BUTTON, { button:{ 32, 90, MenuButtonSelected, LargeFont, - "~!OK", 224, 27, MBUTTON_GM_FULL, GameMenuEnd, 'o'} } }, + { MI_TYPE_TEXT, 144, 11, 0, LargeFont, NULL, NULL, + { text:{ "You failed to", MI_FLAGS_CENTERED} } }, + { MI_TYPE_TEXT, 144, 32, 0, LargeFont, NULL, NULL, + { text:{ "achieve victory!", MI_FLAGS_CENTERED} } }, + { MI_TYPE_BUTTON, 32, 90, MenuButtonSelected, LargeFont, NULL, NULL, + { button:{ "~!OK", 224, 27, MBUTTON_GM_FULL, GameMenuEnd, 'o'} } }, }; /** @@ -135,18 +140,31 @@ local unsigned char *ssmsoptions[] = { "128 x 128", }; +local unsigned char *sslboptions[] = { // (WIP) - test only will be read from directory later!! + "alamo.pud", + "channel.pud" +}; + local Menuitem SelectScenMenuItems[] = { - { MI_TYPE_TEXT, { text:{ 176, 8, MI_FLAGS_CENTERED, LargeFont, "Select scenario"} } }, - { MI_TYPE_TEXT, { text:{ 132, 40, MI_FLAGS_RALIGN, LargeFont, "Type:"} } }, - { MI_TYPE_PULLDOWN, { pulldown:{ 140, 40, 0, GameFont, ssmtoptions, - 192, 20, MBUTTON_PULLDOWN, NULL, 2, 1, 1, 0} } }, - { MI_TYPE_TEXT, { text:{ 132, 80, MI_FLAGS_RALIGN, LargeFont, "Map size:"} } }, - { MI_TYPE_PULLDOWN, { pulldown:{ 140, 80, 0, GameFont, ssmsoptions, - 192, 20, MBUTTON_PULLDOWN, NULL, 5, 0, 0, 0} } }, - { MI_TYPE_BUTTON, { button:{ 48, 318, MenuButtonSelected, LargeFont, - "OK", 106, 27, MBUTTON_GM_HALF, NULL, 0} } }, - { MI_TYPE_BUTTON, { button:{ 198, 318, 0, LargeFont, - "Cancel", 106, 27, MBUTTON_GM_HALF, NULL, 0} } }, + { MI_TYPE_TEXT, 176, 8, 0, LargeFont, NULL, NULL, + { text:{ "Select scenario", MI_FLAGS_CENTERED} } }, + + { MI_TYPE_LISTBOX, 24, 140, 0, GameFont, NULL, NULL, + { listbox:{ sslboptions, 288, 6*18, MBUTTON_PULLDOWN, NULL, 2, 0, 0, 0, 6, 0} } }, + + { MI_TYPE_BUTTON, 48, 318, MenuButtonSelected, LargeFont, NULL, NULL, + { button:{ "OK", 106, 27, MBUTTON_GM_HALF, NULL, 0} } }, + { MI_TYPE_BUTTON, 198, 318, 0, LargeFont, NULL, NULL, + { button:{ "Cancel", 106, 27, MBUTTON_GM_HALF, NULL, 0} } }, + + { MI_TYPE_TEXT, 132, 40, 0, LargeFont, NULL, NULL, + { text:{ "Type:", MI_FLAGS_RALIGN} } }, + { MI_TYPE_PULLDOWN, 140, 40, 0, GameFont, NULL, NULL, + { pulldown:{ ssmtoptions, 192, 20, MBUTTON_PULLDOWN, NULL, 2, 1, 1, 0} } }, + { MI_TYPE_TEXT, 132, 80, 0, LargeFont, NULL, NULL, + { text:{ "Map size:", MI_FLAGS_RALIGN} } }, + { MI_TYPE_PULLDOWN, 140, 80, 0, GameFont, NULL, NULL, + { pulldown:{ ssmsoptions, 192, 20, MBUTTON_PULLDOWN, NULL, 5, 0, 0, 0} } }, }; /** @@ -186,7 +204,7 @@ global Menu Menus[] = { (480-352)/2, 352, 352, ImagePanel5, - 5, 7, + 7, 8, SelectScenMenuItems }, }; @@ -251,12 +269,12 @@ local void DrawPulldown(Menuitem *mi, unsigned mx, unsigned my) { int i, nc, rc; char *text; + unsigned flags = mi->flags; MenuButtonId rb = mi->d.pulldown.button; - unsigned flags = mi->d.pulldown.flags; unsigned w, h, x, y, oh; + x = mx+mi->xofs; + y = my+mi->yofs; w = mi->d.pulldown.xsize; - x = mx+mi->d.pulldown.xofs; - y = my+mi->d.pulldown.yofs; oh = h = mi->d.pulldown.ysize - 2; GetDefaultTextColors(&nc, &rc); @@ -275,13 +293,13 @@ local void DrawPulldown(Menuitem *mi, unsigned mx, unsigned my) SetDefaultTextColors(rc,rc); else SetDefaultTextColors(nc,rc); - DrawText(x+2,y+2 + oh*i ,mi->d.pulldown.font,text); + DrawText(x+2,y+2 + oh*i ,mi->font,text); } } w += 2; } else { h = mi->d.pulldown.ysize; - y = my+mi->d.pulldown.yofs; + y = my+mi->yofs; if (flags&MenuButtonDisabled) { rb--; SetDefaultTextColors(FontGrey,FontGrey); @@ -298,7 +316,7 @@ local void DrawPulldown(Menuitem *mi, unsigned mx, unsigned my) VideoDraw(MenuButtonGfx.Sprite, MBUTTON_DOWN_ARROW + rb - MBUTTON_PULLDOWN, x-1 + w-20, y-2); text = mi->d.pulldown.options[mi->d.pulldown.curopt]; if (text) { - DrawText(x+2,y+2,mi->d.pulldown.font,text); + DrawText(x+2,y+2,mi->font,text); } } if (flags&MenuButtonSelected) { @@ -308,6 +326,59 @@ local void DrawPulldown(Menuitem *mi, unsigned mx, unsigned my) SetDefaultTextColors(nc,rc); } +/** +** Draw listbox 'button' on menu mx, my +** +** @param mi menuitem pointer +** @param mx menu X display position (offset) +** @param my menu Y display position (offset) +*/ +local void DrawListbox(Menuitem *mi, unsigned mx, unsigned my) +{ + int i, s, nc, rc; + char *text; + MenuButtonId rb = mi->d.listbox.button; + unsigned flags = mi->flags; + unsigned w, h, x, y; + w = mi->d.listbox.xsize; + h = mi->d.listbox.ysize; + x = mx+mi->xofs; + y = my+mi->yofs; + + GetDefaultTextColors(&nc, &rc); + + if (flags&MenuButtonDisabled) { + rb--; + } + i = mi->d.listbox.nlines; + s = mi->d.listbox.startline; + while (i--) { + PushClipping(); + SetClipping(0,0,x+w,VideoHeight); + VideoDrawClip(MenuButtonGfx.Sprite, rb, x-1, y-1 + 18*i); + PopClipping(); + if (!(flags&MenuButtonDisabled)) { + if (i < mi->d.listbox.noptions) { + text = mi->d.listbox.options[i + s]; + if (text) { + if (i == mi->d.listbox.curopt) + SetDefaultTextColors(rc,rc); + else + SetDefaultTextColors(nc,rc); + DrawText(x+2,y+2 + 18*i ,mi->font,text); + } + } + } + } + + if (flags&MenuButtonSelected) { + VideoDrawRectangle(ColorYellow,x-2,y-2,w+2,h+2); + /// FIXME: use ColorGrey if selected button is disabled! + } + SetDefaultTextColors(nc,rc); +} + + /** ** Draw menu 'menu' ** @@ -331,26 +402,29 @@ global void DrawMenu(int MenuId) for (i = 0; i < n; i++) { switch (mi->mitype) { case MI_TYPE_TEXT: - if (mi->d.text.flags&MI_FLAGS_CENTERED) - DrawTextCentered(menu->x+mi->d.text.xofs,menu->y+mi->d.text.yofs, - mi->d.text.font,mi->d.text.text); - else if (mi->d.text.flags&MI_FLAGS_RALIGN) { - l = TextLength(mi->d.text.font,mi->d.text.text); - DrawText(menu->x+mi->d.text.xofs-l,menu->y+mi->d.text.yofs, - mi->d.text.font,mi->d.text.text); + if (mi->d.text.tflags&MI_FLAGS_CENTERED) + DrawTextCentered(menu->x+mi->xofs,menu->y+mi->yofs, + mi->font,mi->d.text.text); + else if (mi->d.text.tflags&MI_FLAGS_RALIGN) { + l = TextLength(mi->font,mi->d.text.text); + DrawText(menu->x+mi->xofs-l,menu->y+mi->yofs, + mi->font,mi->d.text.text); } else - DrawText(menu->x+mi->d.text.xofs,menu->y+mi->d.text.yofs, - mi->d.text.font,mi->d.text.text); + DrawText(menu->x+mi->xofs,menu->y+mi->yofs, + mi->font,mi->d.text.text); break; case MI_TYPE_BUTTON: - DrawMenuButton(mi->d.button.button,mi->d.button.flags, + DrawMenuButton(mi->d.button.button,mi->flags, mi->d.button.xsize,mi->d.button.ysize, - menu->x+mi->d.button.xofs,menu->y+mi->d.button.yofs, - mi->d.button.font,mi->d.button.text); + menu->x+mi->xofs,menu->y+mi->yofs, + mi->font,mi->d.button.text); break; case MI_TYPE_PULLDOWN: DrawPulldown(mi,menu->x,menu->y); break; + case MI_TYPE_LISTBOX: + DrawListbox(mi,menu->x,menu->y); + break; default: break; } @@ -431,7 +505,7 @@ global int MenuKey(int key) // FIXME: Should be MenuKeyDown(), and act on _new_ case KeyCodeUp: case KeyCodeDown: if (MenuButtonCurSel != -1) { mi = menu->items + MenuButtonCurSel; - if (mi->mitype == MI_TYPE_PULLDOWN && !(mi->d.pulldown.flags&MenuButtonClicked)) { + if (mi->mitype == MI_TYPE_PULLDOWN && !(mi->flags&MenuButtonClicked)) { if (key == KeyCodeDown) { if (mi->d.pulldown.curopt + 1 < mi->d.pulldown.noptions) mi->d.pulldown.curopt++; @@ -449,29 +523,21 @@ global int MenuKey(int key) // FIXME: Should be MenuKeyDown(), and act on _new_ } break; case 9: /// TAB // FIXME: Add Shift-TAB - if (MenuButtonCurSel != -1 && !(menu->items[MenuButtonCurSel].d.button.flags&MenuButtonClicked)) { + if (MenuButtonCurSel != -1 && !(menu->items[MenuButtonCurSel].flags&MenuButtonClicked)) { n = menu->nitems; for (i = 0; i < n; ++i) { mi = menu->items + ((MenuButtonCurSel + i + 1) % n); switch (mi->mitype) { case MI_TYPE_TEXT: break; - case MI_TYPE_BUTTON: - if (mi->d.button.flags & MenuButtonDisabled) { - break; - } - mi->d.button.flags |= MenuButtonSelected; - menu->items[MenuButtonCurSel].d.button.flags &= ~MenuButtonSelected; - MenuButtonCurSel = mi - menu->items; - MustRedraw |= RedrawMenu; - return 1; + case MI_TYPE_LISTBOX: case MI_TYPE_PULLDOWN: - if (mi->d.pulldown.flags & MenuButtonDisabled) { + case MI_TYPE_BUTTON: + if (mi->flags & MenuButtonDisabled) { break; } - mi->d.pulldown.flags |= MenuButtonSelected; - menu->items[MenuButtonCurSel].d.button.flags &= ~MenuButtonSelected; - // FIXME: maybe different union member, not button! + mi->flags |= MenuButtonSelected; + menu->items[MenuButtonCurSel].flags &= ~MenuButtonSelected; MenuButtonCurSel = mi - menu->items; MustRedraw |= RedrawMenu; return 1; @@ -510,31 +576,31 @@ global void MenuHandleMouseMove(int x,int y) mi = menu->items + i; switch (mi->mitype) { case MI_TYPE_BUTTON: - if (!(mi->d.button.flags&MenuButtonDisabled)) { - xs = menu->x + mi->d.button.xofs; - ys = menu->y + mi->d.button.yofs; + if (!(mi->flags&MenuButtonDisabled)) { + xs = menu->x + mi->xofs; + ys = menu->y + mi->yofs; if (x < xs || x > xs + mi->d.button.xsize || y < ys || y > ys + mi->d.button.ysize) { - if (!(mi->d.button.flags&MenuButtonClicked)) { - if (mi->d.button.flags&MenuButtonActive) { + if (!(mi->flags&MenuButtonClicked)) { + if (mi->flags&MenuButtonActive) { RedrawFlag = 1; - mi->d.button.flags &= ~MenuButtonActive; + mi->flags &= ~MenuButtonActive; } } continue; } - if (!(mi->d.button.flags&MenuButtonActive)) { + if (!(mi->flags&MenuButtonActive)) { RedrawFlag = 1; - mi->d.button.flags |= MenuButtonActive; + mi->flags |= MenuButtonActive; } DebugLevel3("On menu button %d\n", i); MenuButtonUnderCursor = i; } break; case MI_TYPE_PULLDOWN: - if (!(mi->d.pulldown.flags&MenuButtonDisabled)) { - xs = menu->x + mi->d.pulldown.xofs; - if (mi->d.pulldown.flags&MenuButtonClicked) { - ys = menu->y + mi->d.pulldown.yofs; + if (!(mi->flags&MenuButtonDisabled)) { + xs = menu->x + mi->xofs; + if (mi->flags&MenuButtonClicked) { + ys = menu->y + mi->yofs; h = mi->d.pulldown.ysize - 2; ys -= mi->d.pulldown.curopt * h; if (x<xs || x>xs + mi->d.pulldown.xsize || y<ys || y>ys + h*mi->d.pulldown.noptions) { @@ -547,25 +613,29 @@ global void MenuHandleMouseMove(int x,int y) // FIXME: DISPLAY-ACTION HERE ..... } } else { - ys = menu->y + mi->d.pulldown.yofs; + ys = menu->y + mi->yofs; if (x<xs || x>xs + mi->d.pulldown.xsize || y<ys || y>ys + mi->d.pulldown.ysize) { - if (!(mi->d.pulldown.flags&MenuButtonClicked)) { - if (mi->d.pulldown.flags&MenuButtonActive) { + if (!(mi->flags&MenuButtonClicked)) { + if (mi->flags&MenuButtonActive) { RedrawFlag = 1; - mi->d.pulldown.flags &= ~MenuButtonActive; + mi->flags &= ~MenuButtonActive; } } continue; } } - if (!(mi->d.pulldown.flags&MenuButtonActive)) { + if (!(mi->flags&MenuButtonActive)) { RedrawFlag = 1; - mi->d.pulldown.flags |= MenuButtonActive; + mi->flags |= MenuButtonActive; } DebugLevel3("On menu pulldown %d\n", i); MenuButtonUnderCursor = i; } break; + case MI_TYPE_LISTBOX: + if (!(mi->flags&MenuButtonDisabled)) { + } + break; default: break; } @@ -588,29 +658,25 @@ global void MenuHandleButtonDown(int b) if (MouseButtons&LeftButton) { if (MenuButtonUnderCursor != -1) { mi = menu->items + MenuButtonUnderCursor; + if (!(mi->flags&MenuButtonClicked)) { + switch (mi->mitype) { + case MI_TYPE_BUTTON: + case MI_TYPE_PULLDOWN: + case MI_TYPE_LISTBOX: + if (MenuButtonCurSel != -1) { + menu->items[MenuButtonCurSel].flags &= ~MenuButtonSelected; + } + MenuButtonCurSel = MenuButtonUnderCursor; + mi->flags |= MenuButtonClicked|MenuButtonSelected; + MustRedraw |= RedrawMenu; + default: + break; + } + } switch (mi->mitype) { - case MI_TYPE_BUTTON: - if (!(mi->d.button.flags&MenuButtonClicked)) { - if (MenuButtonCurSel != -1) { - // FIXME: maybe different union member, not button! - menu->items[MenuButtonCurSel].d.button.flags &= ~MenuButtonSelected; - } - MenuButtonCurSel = MenuButtonUnderCursor; - mi->d.button.flags |= MenuButtonClicked|MenuButtonSelected; - MustRedraw |= RedrawMenu; - } - break; case MI_TYPE_PULLDOWN: - if (!(mi->d.pulldown.flags&MenuButtonClicked)) { - if (MenuButtonCurSel != -1) { - // FIXME: maybe different union member, not button! - menu->items[MenuButtonCurSel].d.button.flags &= ~MenuButtonSelected; - } - MenuButtonCurSel = MenuButtonUnderCursor; - mi->d.pulldown.flags |= MenuButtonClicked|MenuButtonSelected; - mi->d.pulldown.cursel = mi->d.pulldown.curopt; - MustRedraw |= RedrawMenu; - } + mi->d.pulldown.cursel = mi->d.pulldown.curopt; + break; default: break; } @@ -636,9 +702,9 @@ global void MenuHandleButtonUp(int b) mi = menu->items + i; switch (mi->mitype) { case MI_TYPE_BUTTON: - if (mi->d.button.flags&MenuButtonClicked) { + if (mi->flags&MenuButtonClicked) { RedrawFlag = 1; - mi->d.button.flags &= ~MenuButtonClicked; + mi->flags &= ~MenuButtonClicked; if (MenuButtonUnderCursor == i) { MenuButtonUnderCursor = -1; if (mi->d.button.handler) { @@ -648,9 +714,9 @@ global void MenuHandleButtonUp(int b) } break; case MI_TYPE_PULLDOWN: - if (mi->d.pulldown.flags&MenuButtonClicked) { + if (mi->flags&MenuButtonClicked) { RedrawFlag = 1; - mi->d.pulldown.flags &= ~MenuButtonClicked; + mi->flags &= ~MenuButtonClicked; if (MenuButtonUnderCursor == i) { MenuButtonUnderCursor = -1; if (mi->d.pulldown.cursel != mi->d.pulldown.curopt) { @@ -696,29 +762,42 @@ global void ProcessMenu(int MenuId, int Loop) MenuButtonCurSel = -1; for (i = 0; i < menu->nitems; ++i) { mi = menu->items + i; + // FIXME: Maybe activate if mouse-pointer is over it right now? switch (mi->mitype) { case MI_TYPE_BUTTON: - mi->d.button.flags &= ~(MenuButtonClicked|MenuButtonActive|MenuButtonSelected); + mi->flags &= ~(MenuButtonClicked|MenuButtonActive|MenuButtonSelected); if (i == menu->defsel) { - mi->d.button.flags |= MenuButtonSelected; + mi->flags |= MenuButtonSelected; MenuButtonCurSel = i; } - // FIXME: Maybe activate if mouse-pointer is over it right now? break; case MI_TYPE_PULLDOWN: - mi->d.pulldown.flags &= ~(MenuButtonClicked|MenuButtonActive|MenuButtonSelected); + mi->flags &= ~(MenuButtonClicked|MenuButtonActive|MenuButtonSelected); mi->d.pulldown.cursel = 0; if (mi->d.pulldown.defopt != -1) mi->d.pulldown.curopt = mi->d.pulldown.defopt; if (i == menu->defsel) { - mi->d.pulldown.flags |= MenuButtonSelected; + mi->flags |= MenuButtonSelected; + MenuButtonCurSel = i; + } + break; + case MI_TYPE_LISTBOX: + mi->flags &= ~(MenuButtonClicked|MenuButtonActive|MenuButtonSelected); + mi->d.listbox.cursel = 0; + mi->d.listbox.startline = 0; + if (mi->d.listbox.defopt != -1) + mi->d.listbox.curopt = mi->d.listbox.defopt; + if (i == menu->defsel) { + mi->flags |= MenuButtonSelected; MenuButtonCurSel = i; } - // FIXME: Maybe activate if mouse-pointer is over it right now? break; default: break; } + if (mi->initfunc) { + (*mi->initfunc)(mi); + } } MenuButtonUnderCursor = -1; if (Loop) { @@ -736,6 +815,14 @@ global void ProcessMenu(int MenuId, int Loop) WaitEventsAndKeepSync(); } } + + for (i = 0; i < menu->nitems; ++i) { + mi = menu->items + i; + if (mi->exitfunc) { + (*mi->exitfunc)(mi); // action/destructor + } + } + }