r676 - trunk/game
black at icculus.org
black at icculus.org
Mon Mar 13 17:08:52 EST 2006
Author: black
Date: 2006-03-13 17:08:52 -0500 (Mon, 13 Mar 2006)
New Revision: 676
Modified:
trunk/game/m_menucore.c
trunk/game/m_menucore.h
Log:
Renamed addpos to origin.
Renamed DrawMenu to Draw.
Added a Frame callback to Menu_Item and added support for it to Menu_SubMenu.
Modified: trunk/game/m_menucore.c
===================================================================
--- trunk/game/m_menucore.c 2006-03-13 21:28:38 UTC (rev 675)
+++ trunk/game/m_menucore.c 2006-03-13 22:08:52 UTC (rev 676)
@@ -152,13 +152,17 @@
//generic items
+void Menu_Generic_Frame(Menu_Item *item, Menu_Inheritance *inh, Ndouble elaspedtime)
+{
+}
+
void Menu_Generic_MouseMoveSelectable(Menu_Item *item, Menu_Inheritance *inh)
{
NUint j;
for (j = 0; j < 2; j++)
{
- if (Input.mouse[j] < item->pos[j]+inh->addpos[j] || item->pos[j]+inh->addpos[j] + item->size[j] < Input.mouse[j] )
+ if (Input.mouse[j] < item->pos[j]+inh->origin[j] || item->pos[j]+inh->origin[j] + item->size[j] < Input.mouse[j] )
return;
}
@@ -192,6 +196,7 @@
item = Mem_Alloc(Menu.menu_zone, bytes);
+ item->Frame = Menu_Generic_Frame;
item->MouseMove = Menu_Generic_MouseMoveNonSelectable;
item->KeyEvent = Menu_Generic_KeyPressIgnore;
item->Destroy = Menu_Generic_Destroy;
@@ -218,7 +223,7 @@
{
R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
R_SetTexture(R.resource_font);
- R_DrawString(item->text, 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString(item->text, 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
}
void Menu_Text_DefaultUse (struct Menu_TextItem *item, void *cookie)
{
@@ -240,7 +245,7 @@
Menu_TextItem *it;
it = (Menu_TextItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_TextItem));
- it->super.DrawMenu = Menu_Text_Draw;
+ it->super.Draw = Menu_Text_Draw;
if (command != NULL)
{
it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
@@ -269,9 +274,9 @@
{
R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
R_SetTexture(R.resource_font);
- R_DrawString(item->text, 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString(item->text, 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
if (item->super.parent->selecteditem == &item->super)
- R_DrawString("_", 0, item->super.pos[0] + inh->addpos[0] + item->cursorpos*8, item->super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, 0);
+ R_DrawString("_", 0, item->super.pos[0] + inh->origin[0] + item->cursorpos*8, item->super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, 0);
}
Nbool Menu_Edit_KeyPress (Menu_EditItem *item, UNUSED NUint mod, NUint sym, NUint character, Nbool downevent)
{
@@ -349,7 +354,7 @@
Menu_EditItem *it;
it = (Menu_EditItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_EditItem));
- it->super.DrawMenu = Menu_Edit_Draw;
+ it->super.Draw = Menu_Edit_Draw;
it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
it->super.KeyEvent = Menu_Edit_KeyPress;
it->super.size[0] = 8*strlen(text);
@@ -378,7 +383,7 @@
{
item->super.super.size[0]-=8;
Menu_Edit_Draw(&item->super, inh);
- R_DrawString("V", 0, item->super.super.pos[0] + item->super.super.size[0] + inh->addpos[0], item->super.super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.super.parent->selecteditem == &item->super.super);
+ R_DrawString("V", 0, item->super.super.pos[0] + item->super.super.size[0] + inh->origin[0], item->super.super.pos[1] + inh->origin[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.super.parent->selecteditem == &item->super.super);
item->super.super.size[0]+=8;
}
@@ -474,7 +479,7 @@
Menu_ComboItem *it;
it = (Menu_ComboItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_ComboItem));
- it->super.super.DrawMenu = Menu_Combo_Draw;
+ it->super.super.Draw = Menu_Combo_Draw;
it->super.super.MouseMove = Menu_Generic_MouseMoveSelectable;
it->super.super.KeyEvent = Menu_Combo_KeyPress;
it->super.super.Destroy = Menu_Combo_Destroy;
@@ -527,7 +532,7 @@
R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
R_SetColor(1, 1, 1, 1);
R_SetTexture(Resource_IndexForName(item->imagename, RESOURCETYPE_TEXTURE, 0, 0));
- R_DrawPic(item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->super.size[0], item->super.size[1]);
+ R_DrawPic(item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->super.size[0], item->super.size[1]);
}
void Menu_Picture_DefaultUse (struct Menu_PictureItem *item, void *cookie)
{
@@ -551,7 +556,7 @@
Menu_PictureItem *it;
it = (Menu_PictureItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_PictureItem));
- it->super.DrawMenu = Menu_Picture_Draw;
+ it->super.Draw = Menu_Picture_Draw;
if (command != NULL)
{
it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
@@ -586,12 +591,12 @@
// R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// R_SetColor(1, 1, 1, 1);
// R_SetTexture(Resource_IndexForName(item->imagename, RESOURCETYPE_TEXTURE, 0, 0));
-// R_DrawPic(item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->super.size[0], item->super.size[1]);
+// R_DrawPic(item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->super.size[0], item->super.size[1]);
if (Menu.grabs == &item->super)
{
{
- item->value = Input.mouse[item->axis] - (item->super.pos[item->axis]+inh->addpos[item->axis] + item->scale*1.5);
+ item->value = Input.mouse[item->axis] - (item->super.pos[item->axis]+inh->origin[item->axis] + item->scale*1.5);
if (item->value < 0)
item->value = 0;
if (item->value > item->super.size[item->axis] - item->scale*3)
@@ -615,15 +620,15 @@
if (item->axis == 0)
{
- R_DrawString("x", 0, item->super.pos[0] + inh->addpos[0] + item->scale + (item->super.size[0]-item->scale*3)*frac, item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
- R_DrawString("<", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
- R_DrawString(">", 0, item->super.pos[0] + inh->addpos[0] - item->scale + (item->super.size[0]), item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString("x", 0, item->super.pos[0] + inh->origin[0] + item->scale + (item->super.size[0]-item->scale*3)*frac, item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString("<", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString(">", 0, item->super.pos[0] + inh->origin[0] - item->scale + (item->super.size[0]), item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
}
else
{
- R_DrawString("x", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1] + item->scale + (item->super.size[1]-item->scale*3)*frac, item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
- R_DrawString("A", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
- R_DrawString("V", 0, item->super.pos[0] + inh->addpos[0], item->super.pos[1] + inh->addpos[1] - item->scale + (item->super.size[1]), item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString("x", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1] + item->scale + (item->super.size[1]-item->scale*3)*frac, item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString("A", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1], item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ R_DrawString("V", 0, item->super.pos[0] + inh->origin[0], item->super.pos[1] + inh->origin[1] - item->scale + (item->super.size[1]), item->scale, item->scale, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
}
}
Nbool Menu_Slider_KeyPress (Menu_SliderItem *item, UNUSED NUint mod, NUint sym, UNUSED NUint character, Nbool downevent)
@@ -661,7 +666,7 @@
Menu_SliderItem *it;
it = (Menu_SliderItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_SliderItem));
- it->super.DrawMenu = Menu_Slider_Draw;
+ it->super.Draw = Menu_Slider_Draw;
it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
it->super.KeyEvent = Menu_Slider_KeyPress;
@@ -693,93 +698,95 @@
+//submenus
+void Menu_SubMenu_SetupInheritance(Menu_SubMenu *menu, Menu_Inheritance *base, Menu_Inheritance *local)
+{
+ NUint j;
+ for (j = 0; j < 2; j++)
+ {
+ NSint wmin, wmax;
+ wmin = base->origin[j] + menu->super.pos[j];
+ wmax = wmin + menu->super.size[j];
+ if (wmin < base->window.pos[j])
+ wmin = base->window.pos[j];
+ local->window.pos[j] = wmin;
+ if (wmax > base->window.pos[j] + base->window.size[j])
+ wmax = base->window.pos[j] + base->window.size[j];
+ local->window.size[j] = wmax-wmin;
+ local->origin[j] = menu->subwindow.pos[j] + wmin;
+ }
+}
-
-
-
-
-//submenus
-void Menu_SubMenu_MouseMove(Menu_SubMenu *item, Menu_Inheritance *inh)
+void Menu_SubMenu_MouseMove(Menu_SubMenu *menu, Menu_Inheritance *inh)
{
Menu_Item *subitem;
Menu_Inheritance ninh;
NUint j;
- if (Menu.grabs == &item->super && item->dragable)
+ if (Menu.grabs == &menu->super && menu->dragable)
{
- item->super.pos[0] += Input.mouse[0] - item->dragmousepos[0];
- item->super.pos[1] += Input.mouse[1] - item->dragmousepos[1];
- item->dragmousepos[0] = Input.mouse[0];
- item->dragmousepos[1] = Input.mouse[1];
+ menu->super.pos[0] += Input.mouse[0] - menu->dragmousepos[0];
+ menu->super.pos[1] += Input.mouse[1] - menu->dragmousepos[1];
+ menu->dragmousepos[0] = Input.mouse[0];
+ menu->dragmousepos[1] = Input.mouse[1];
}
- for (j = 0; j < 2; j++)
+ Menu_SubMenu_SetupInheritance(menu, inh, &ninh);
+
+ // TODO: add a function pointinrect?
+ for( j = 0 ; j < 2 ; j++ )
{
- NSint wmin, wmax;
-
- wmin = inh->addpos[j] + item->super.pos[j];
- wmax = wmin + item->super.size[j];
- if (inh->window.pos[j] > wmin)
- wmin = inh->window.pos[j];
- if (inh->window.pos[j] + inh->window.size[j] < wmax)
- wmax = inh->window.pos[j] + inh->window.size[j];
-
- if (Input.mouse[j] < wmin || Input.mouse[j] > wmax)
+ if (Input.mouse[j] < ninh.window.pos[j] || ninh.origin[j] + ninh.window.size[j] < Input.mouse[j])
{
return;
}
-
- ninh.window.pos[j] = wmin;
- ninh.window.size[j] = wmax-wmin;
-
- ninh.addpos[j] = inh->addpos[j] + item->subwindow.pos[j] + wmin;
}
+ if (menu->super.parent)
+ menu->super.parent->selecteditem = &menu->super; //mouse is in us.
- if (item->super.parent)
- item->super.parent->selecteditem = &item->super; //mouse is in us.
+ menu->selecteditem = NULL;
- item->selecteditem = NULL;
-
- for (subitem = item->subitems; subitem; subitem = subitem->next)
+ for (subitem = menu->subitems; subitem; subitem = subitem->next)
subitem->MouseMove(subitem, &ninh);
}
-void Menu_SubMenu_Draw(Menu_SubMenu *item, Menu_Inheritance *inh)
+
+void Menu_SubMenu_Frame(Menu_SubMenu *menu, Menu_Inheritance *inh, Ndouble elapsedtime)
{
Menu_Item *subitem, *next;
Menu_Inheritance ninh;
- NUint j;
- if (item->super.parent)
+ if (menu->super.parent)
{
- if (item->super.parent->selecteditem != &item->super)
- item->selecteditem = NULL;
+ if (menu->super.parent->selecteditem != &menu->super)
+ menu->selecteditem = NULL;
}
- for (j = 0; j < 2; j++)
+ Menu_SubMenu_SetupInheritance(menu, inh, &ninh);
+
+ for (subitem = menu->subitems; subitem; subitem = next)
{
- NSint wmin, wmax;
- wmin = inh->addpos[j] + item->super.pos[j];
- wmax = wmin + item->super.size[j];
- if (wmin < inh->window.pos[j])
- wmin = inh->window.pos[j];
- ninh.window.pos[j] = wmin;
- if (wmax > inh->window.pos[j] + inh->window.size[j])
- wmax = inh->window.pos[j] + inh->window.size[j];
- ninh.window.size[j] = wmax-wmin;
-
- ninh.addpos[j] = item->subwindow.pos[j] + wmin;
+ next = subitem->next;//this funkyness is so that we can unlink and kill things in the draw function (if the need arises).
+ subitem->Frame(subitem, &ninh, elapsedtime);
}
+}
+void Menu_SubMenu_Draw(Menu_SubMenu *menu, Menu_Inheritance *inh)
+{
+ Menu_Item *subitem, *next;
+ Menu_Inheritance ninh;
+ Menu_SubMenu_SetupInheritance(menu, inh, &ninh);
+
R_SetScissor(ninh.window.pos[0], ninh.window.pos[1], ninh.window.size[0], ninh.window.size[1]);
- for (subitem = item->subitems; subitem; subitem = next)
+ for (subitem = menu->subitems; subitem; subitem = next)
{
+ // TODO: remove this since we only accept Frame to delete items, Draw should just draw them and don't do any management work like deleting our beloved items
next = subitem->next;//this funkyness is so that we can unlink and kill things in the draw function (if the need arises).
- subitem->DrawMenu(subitem, &ninh);
+ subitem->Draw(subitem, &ninh);
}
R_SetScissor(inh->window.pos[0], inh->window.pos[1], inh->window.size[0], inh->window.size[1]);
@@ -867,7 +874,8 @@
}
menu->super.MouseMove = Menu_SubMenu_MouseMove;
- menu->super.DrawMenu = Menu_SubMenu_Draw;
+ menu->super.Frame = Menu_SubMenu_Frame;
+ menu->super.Draw = Menu_SubMenu_Draw;
menu->super.KeyEvent = Menu_SubMenu_KeyEvent;
menu->super.Destroy = Menu_SubMenu_Destroy;
@@ -995,7 +1003,9 @@
Menu.rootmenu.selecteditem = NULL;
Menu.rootmenu.super.MouseMove(&Menu.rootmenu, &inh);
- Menu.rootmenu.super.DrawMenu(&Menu.rootmenu, &inh);
+ // FIXME: add real frametime support
+ Menu.rootmenu.super.Frame(&Menu.rootmenu, &inh, 0.0);
+ Menu.rootmenu.super.Draw(&Menu.rootmenu, &inh);
}
@@ -1171,7 +1181,8 @@
// init the root menu
// FIXME: create the rootmenu using the normal submenu creation function instead?
+ Menu.rootmenu.super.Frame = Menu_SubMenu_Frame;
Menu.rootmenu.super.MouseMove = Menu_SubMenu_MouseMove;
- Menu.rootmenu.super.DrawMenu = Menu_SubMenu_Draw;
+ Menu.rootmenu.super.Draw = Menu_SubMenu_Draw;
Menu.rootmenu.super.KeyEvent = Menu_SubMenu_KeyEvent;
}
Modified: trunk/game/m_menucore.h
===================================================================
--- trunk/game/m_menucore.h 2006-03-13 21:28:38 UTC (rev 675)
+++ trunk/game/m_menucore.h 2006-03-13 22:08:52 UTC (rev 676)
@@ -11,7 +11,7 @@
typedef struct Menu_Inheritance
{
- NSint addpos[2];
+ NSint origin[2];
Menu_Rect window;
}
@@ -19,7 +19,9 @@
typedef struct Menu_Item
{
- void (*DrawMenu) (void *item, Menu_Inheritance *inheritance);
+ // pass an elapsedtime parameter to make animation-speed changes, etc. possible
+ void (*Frame) (void *item, Menu_Inheritance *inheritance, Ndouble elapsedtime);
+ void (*Draw) (void *item, Menu_Inheritance *inheritance);
Nbool (*KeyEvent) (void *item, NUint mod, NUint sym, NUint character, Nbool downevent);
void (*MouseMove) (void *item, Menu_Inheritance *inheritance);
void (*Destroy) (void *item);
More information about the neither-commits
mailing list