menu union reorder, further cleanups, start of listbox type (WIP)

This commit is contained in:
ariclone 2000-06-03 11:46:46 +00:00
parent 1ceecfd808
commit b6681626da

View file

@ -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
}
}
}