r674 - trunk/game
spike at icculus.org
spike at icculus.org
Mon Mar 13 16:15:28 EST 2006
Author: spike
Date: 2006-03-13 16:15:28 -0500 (Mon, 13 Mar 2006)
New Revision: 674
Modified:
trunk/game/m_menucore.c
trunk/game/m_menucore.h
Log:
tweeked combo.
(possibly) improoved offseting (well, makes more sense now).
Modified: trunk/game/m_menucore.c
===================================================================
--- trunk/game/m_menucore.c 2006-03-13 20:59:04 UTC (rev 673)
+++ trunk/game/m_menucore.c 2006-03-13 21:15:28 UTC (rev 674)
@@ -10,7 +10,7 @@
MenuState Menu;
-#define MOUSE1 (SDLK_LAST + 1)
+#define MOUSE1 (SDLK_LAST + 1) //yeah, this needs something suitable
/*
-make every item have a parent
@@ -44,9 +44,13 @@
break;
}
}
- if( node->next == NULL ) {
+ /*if( node->next == NULL )
+ {
// FIXME: error condition
- }
+
+ //Black: if you want an error condition here, you should probably make sure that item->next wasn't null too.
+ //Just felt I should point that out.
+ }*/
}
item->next = NULL;
item->parent = NULL;
@@ -87,9 +91,8 @@
{
Menu_SubMenu *parent = item->parent;
// FIXME: fix this
- if( !parent ) {
+ if( !parent )
return;
- }
Menu_Item_RemoveFromParent(item);
Menu_SubMenu_AddAtFront(parent, item);
}
@@ -139,10 +142,15 @@
// TODO: make it move to the center of the parent
menu->super.pos[0] = (Video.width - menu->super.size[0])/2;
menu->super.pos[1] = (Video.height - menu->super.size[1])/2;
- menu->subwindow.pos[0] = menu->super.pos[0];
- menu->subwindow.pos[1] = menu->super.pos[1];
+ menu->subwindow.pos[0] = 0;
+ menu->subwindow.pos[1] = 0;
}
+
+
+
+
+
//generic items
void Menu_Generic_MouseMoveSelectable(Menu_Item *item, Menu_Inheritance *inh)
{
@@ -212,22 +220,22 @@
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);
}
-void Menu_Text_DefaultUse (struct Menu_TextItem *item)
+void Menu_Text_DefaultUse (struct Menu_TextItem *item, void *cookie)
{
- Shell_ExecuteScript("menu text use", item->command);
+ Shell_ExecuteScript("menu text use", cookie);
}
Nbool Menu_Text_KeyPress (Menu_TextItem *item, UNUSED NUint mod, NUint sym, UNUSED NUint character, Nbool downevent)
{
if (sym == SDLK_RETURN || sym == MOUSE1)
{
if (downevent)
- if (item->UseTextItem)
- item->UseTextItem(item);
+ if (item->UseItem)
+ item->UseItem(item, item->cookie);
return true;
}
return false;
}
-Menu_TextItem *Menu_Text_Create(Menu_SubMenu *parent, NSint x, NSint y, char *text, void *command, void (*UseTextItem) (struct Menu_TextItem *item))
+Menu_TextItem *Menu_Text_Create(Menu_SubMenu *parent, NSint x, NSint y, char *text, void *command, void (*UseItem) (struct Menu_TextItem *item, void *cookie))
{
Menu_TextItem *it;
it = (Menu_TextItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_TextItem));
@@ -242,12 +250,12 @@
it->super.size[1] = 8;
it->text = text;
- it->command = command;
+ it->cookie = command;
- if (UseTextItem == NULL && command)
- UseTextItem = Menu_Text_DefaultUse;
+ if (UseItem == NULL && command)
+ UseItem = Menu_Text_DefaultUse;
- it->UseTextItem = UseTextItem;
+ it->UseItem = UseItem;
return it;
}
@@ -368,20 +376,19 @@
//combos
void Menu_Combo_Draw(Menu_ComboItem *item, Menu_Inheritance *inh)
{
- 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("V", 0, item->super.pos[0] + item->super.size[0]-8 + inh->addpos[0], item->super.pos[1] + inh->addpos[1], 8, 8, Console_DefaultColorTable, Console_DefaultColorTableSize, item->super.parent->selecteditem == &item->super);
+ 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);
+ item->super.super.size[0]+=8;
}
void Menu_Combo_SetText(Menu_ComboItem *item, char *text)//it's just easier. not sure whether this should be public or not.
{
Menu_ComboOption *option;
char *oldtext;
- oldtext = item->text;
- item->text = Mem_Alloc(Menu.menu_zone, strlen(text)+1);
- strcpy(item->text, text);
+ oldtext = item->super.text;
+ item->super.text = Mem_Alloc(Menu.menu_zone, strlen(text)+1);
+ strcpy(item->super.text, text);
item->selected = NULL;
for (option = item->options; option; option = option->next)
@@ -395,15 +402,19 @@
Mem_Free(&oldtext);
}
+void Menu_Combo_AddOption(Menu_ComboItem *item, char *text, int key)
+{
-void Menu_Combo_UseSlider (Menu_SliderItem *slider)
+}
+
+void Menu_Combo_UseSlider (Menu_SliderItem *slider, void *cookie)
{
- Menu_SubMenu *submenu = slider->data;
+ Menu_SubMenu *submenu = cookie;
submenu->subwindow.pos[1] = -slider->value;
}
-void Menu_Combo_UseOption (Menu_TextItem *it)
+void Menu_Combo_UseOption (Menu_TextItem *it, void *cookie)
{
- Menu_ComboItem *comboitem = (void*)it->command;
+ Menu_ComboItem *comboitem = cookie;
Menu_Combo_SetText(comboitem, it->text);
//seeing as this happens from a key event, and the text control will return true, we can safly kill the popup
@@ -412,7 +423,7 @@
}
-Nbool Menu_Combo_KeyPress (Menu_ComboItem *item, UNUSED NUint mod, UNUSED NUint sym, UNUSED NUint character, UNUSED Nbool downevent)
+Nbool Menu_Combo_KeyPress (Menu_ComboItem *item, NUint mod, NUint sym, NUint character, Nbool downevent)
{
if (sym == SDLK_RETURN || sym == MOUSE1)
{
@@ -431,51 +442,50 @@
for (i = 0; option; i+=8, option = option->next)
{
txt = Menu_Text_Create(interior, 0, i, option->text, item, Menu_Combo_UseOption);
- txt->super.size[0] = item->super.size[0] - 8;
+ txt->super.size[0] = item->super.super.size[0] - 8;
}
pixels = i-64;
if (pixels < 0)
pixels = 0;
- Menu_VSlider_Create(item->popup, item->super.size[0] - 8, 0, 8, ((i>64)?64:i), 0, pixels, 0, Menu_Combo_UseSlider, NULL, interior);
+ Menu_VSlider_Create(item->popup, item->super.super.size[0] - 8, 0, 8, ((i>64)?64:i), 0, pixels, 0, Menu_Combo_UseSlider, NULL, interior);
item->popup->super.pos[0] = Input.mouse[0];
item->popup->super.pos[1] = Input.mouse[1];
- item->popup->subwindow.pos[0] = item->popup->super.pos[0];
- item->popup->subwindow.pos[1] = item->popup->super.pos[1];
Menu_SubMenu_Finish(interior);
interior->super.size[1] = ((i>64)?64:i);
Menu_SubMenu_Finish(item->popup);
return true;
}
- return false;
+ else
+ return Menu_Edit_KeyPress(&item->super, mod, sym, character, downevent);
}
void Menu_Combo_Destroy(Menu_ComboItem *item)
{
if (item->popup)
item->popup->super.Destroy(item->popup);
- Menu_Generic_Destroy(&item->super);
+ Menu_Generic_Destroy(&item->super.super);
}
Menu_ComboItem *Menu_Combo_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, char *defalt, char *list)
{
- //list is pipe-sperated
+ //list is pipe-seperated
Menu_ComboItem *it;
it = (Menu_ComboItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_ComboItem));
- it->super.DrawMenu = Menu_Combo_Draw;
- it->super.MouseMove = Menu_Generic_MouseMoveSelectable;
- it->super.KeyEvent = Menu_Combo_KeyPress;
- it->super.Destroy = Menu_Combo_Destroy;
- it->super.size[0] = w;
- it->super.size[1] = 8;
+ it->super.super.DrawMenu = Menu_Combo_Draw;
+ it->super.super.MouseMove = Menu_Generic_MouseMoveSelectable;
+ it->super.super.KeyEvent = Menu_Combo_KeyPress;
+ it->super.super.Destroy = Menu_Combo_Destroy;
+ it->super.super.size[0] = w;
+ it->super.super.size[1] = 8;
//FIXME: no delete to free the text
- it->text = Mem_Alloc(Menu.menu_zone, strlen(defalt)+1);
- strcpy(it->text, defalt);
+ it->super.text = Mem_Alloc(Menu.menu_zone, strlen(defalt)+1);
+ strcpy(it->super.text, defalt);
- if (*list)
+ if (list && *list)
{
char *pipe;
NUint chars;
@@ -519,17 +529,24 @@
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]);
}
+void Menu_Picture_DefaultUse (struct Menu_PictureItem *item, void *cookie)
+{
+ Shell_ExecuteScript("console", cookie);
+}
Nbool Menu_Picture_KeyPress (Menu_PictureItem *item, UNUSED NUint mod, NUint sym, UNUSED NUint character, Nbool downevent)
{
if (sym == SDLK_RETURN || sym == MOUSE1)
{
- if (downevent)
- Shell_ExecuteScript("console", item->command);
- return true;
+ if (item->UseItem)
+ {
+ if (downevent)
+ item->UseItem(item, item->cookie);
+ return true;
+ }
}
return false;
}
-Menu_PictureItem *Menu_Picture_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, char *imagename, char *command)
+Menu_PictureItem *Menu_Picture_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, char *imagename, void *command, void (*UseItem) (struct Menu_PictureItem *item, void *cookie))
{
Menu_PictureItem *it;
it = (Menu_PictureItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_PictureItem));
@@ -543,8 +560,12 @@
it->super.size[0] = w;
it->super.size[1] = h;
+ if (command && !UseItem)
+ UseItem = Menu_Picture_DefaultUse;
+
it->imagename = imagename;
- it->command = command;
+ it->cookie = command;
+ it->UseItem = UseItem;
return it;
}
@@ -580,12 +601,12 @@
item->value /= item->super.size[0] - item->scale*3;
item->value += item->minv;
- item->SliderChanged(item);
+ item->SliderChanged(item, item->cookie);
}
}
if (item->SliderUpdate)
- item->SliderUpdate(item);
+ item->SliderUpdate(item, item->cookie);
R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -613,7 +634,7 @@
if (downevent)
{
item->value -= 1;
- item->SliderChanged(item);
+ item->SliderChanged(item, item->cookie);
}
return true;
}
@@ -622,13 +643,13 @@
if (downevent)
{
item->value += 1;
- item->SliderChanged(item);
+ item->SliderChanged(item, item->cookie);
}
return true;
}
return false;
}
-Menu_SliderItem *Menu_HSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem*), void (*UpdateSlider)(Menu_SliderItem*), void *data)
+Menu_SliderItem *Menu_HSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem *item, void *cookie), void (*UpdateSlider)(Menu_SliderItem *item, void *cookie), void *cookie)
{
Menu_SliderItem *it;
it = (Menu_SliderItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_SliderItem));
@@ -642,7 +663,7 @@
it->scale = h;
- it->data = data;
+ it->cookie = cookie;
it->maxv = maxv;
it->minv = minv;
it->value = defaultv;
@@ -681,12 +702,12 @@
item->value /= item->super.size[1] - item->scale*3;
item->value += item->minv;
- item->SliderChanged(item);
+ item->SliderChanged(item, item->cookie);
}
}
if (item->SliderUpdate)
- item->SliderUpdate(item);
+ item->SliderUpdate(item, item->cookie);
R_SetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -699,7 +720,7 @@
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);
}
-Menu_SliderItem *Menu_VSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem*), void (*UpdateSlider)(Menu_SliderItem*), void *data)
+Menu_SliderItem *Menu_VSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem *item, void *cookie), void (*UpdateSlider)(Menu_SliderItem *item, void *cookie), void *cookie)
{
Menu_SliderItem *it;
it = (Menu_SliderItem*)Menu_Generic_Create(parent, x, y, sizeof(Menu_SliderItem));
@@ -713,7 +734,7 @@
it->scale = w;
- it->data = data;
+ it->cookie = cookie;
it->maxv = maxv;
it->minv = minv;
it->value = defaultv;
@@ -740,24 +761,15 @@
if (Menu.grabs == &item->super && item->dragable)
{
- item->subwindow.pos[0] += Input.mouse[0] - item->dragmousepos[0];
- item->subwindow.pos[1] += Input.mouse[1] - item->dragmousepos[1];
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_SubMenu_Finish(item->super.parent);
}
for (j = 0; j < 2; j++)
{
NSint wmin, wmax;
-/* if (Input.mouse[j] < item->subwindow.pos[j]+inh->addpos[j] || Input.mouse[j] > item->subwindow.pos[j]+inh->addpos[j] + item->subwindow.size[j])
- {
- item->indrag = false;
- return;
- }
-*/
wmin = inh->addpos[j] + item->super.pos[j];
wmax = wmin + item->super.size[j];
@@ -773,12 +785,11 @@
ninh.window.pos[j] = wmin;
ninh.window.size[j] = wmax-wmin;
+
+ ninh.addpos[j] = inh->addpos[j] + item->subwindow.pos[j] + wmin;
}
- ninh.addpos[0] = inh->addpos[0] + item->subwindow.pos[0];
- ninh.addpos[1] = inh->addpos[1] + item->subwindow.pos[1];
-
if (item->super.parent)
item->super.parent->selecteditem = &item->super; //mouse is in us.
@@ -799,9 +810,6 @@
item->selecteditem = NULL;
}
- ninh.addpos[0] = inh->addpos[0] + item->subwindow.pos[0];
- ninh.addpos[1] = inh->addpos[1] + item->subwindow.pos[1];
-
for (j = 0; j < 2; j++)
{
NSint wmin, wmax;
@@ -813,6 +821,8 @@
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;
}
@@ -922,25 +932,34 @@
{
Menu_Item *subitem;
NSint maxpos[2];
+ NSint minpos[2];
assert( menu != NULL );
maxpos[0] = 0;
maxpos[1] = 0;
+ minpos[0] = 0x32767;
+ minpos[1] = 0x32767;
+
for (subitem = menu->subitems; subitem; subitem = subitem->next)
{
if (maxpos[0] < subitem->pos[0] + subitem->size[0])
maxpos[0] = subitem->pos[0] + subitem->size[0];
if (maxpos[1] < subitem->pos[1] + subitem->size[1])
maxpos[1] = subitem->pos[1] + subitem->size[1];
+
+ if (minpos[0] > subitem->pos[0])
+ minpos[0] = subitem->pos[0];
+ if (minpos[1] > subitem->pos[1])
+ minpos[1] = subitem->pos[1];
}
menu->super.size[0] = maxpos[0];
menu->super.size[1] = maxpos[1];
- menu->subwindow.size[0] = maxpos[0];
- menu->subwindow.size[1] = maxpos[1];
+ menu->subwindow.size[0] = maxpos[0] - minpos[0];
+ menu->subwindow.size[1] = maxpos[1] - minpos[1];
}
void Menu_SubMenu_Arrange(Menu_SubMenu *menu, Nbool horizontal, NSint pad, Menu_ArrangeStyle arrange)
@@ -1049,26 +1068,26 @@
Nfloat sliderscale = 8;
Nfloat imagesize = 512;
Nfloat windowsize = 128;
-void MoveMenuH(Menu_SliderItem *it)
+void MoveMenuH(Menu_SliderItem *it, void *cookie)
{
- Menu_SubMenu *menu = it->data;
+ Menu_SubMenu *menu = cookie;
// it->value = 16*(NSint)(it->value/16);
menu->subwindow.pos[0] = it->value;
}
-void UpdateMoveMenuH(Menu_SliderItem *it)
+void UpdateMoveMenuH(Menu_SliderItem *it, void *cookie)
{
- Menu_SubMenu *menu = it->data;
+ Menu_SubMenu *menu = cookie;
it->value = menu->subwindow.pos[0];
}
-void MoveMenuV(Menu_SliderItem *it)
+void MoveMenuV(Menu_SliderItem *it, void *cookie)
{
- Menu_SubMenu *menu = it->data;
+ Menu_SubMenu *menu = cookie;
menu->subwindow.pos[1] = it->value;
}
-void UpdateMoveMenuV(Menu_SliderItem *it)
+void UpdateMoveMenuV(Menu_SliderItem *it, void *cookie)
{
- Menu_SubMenu *menu = it->data;
+ Menu_SubMenu *menu = cookie;
it->value = menu->subwindow.pos[1];
}
void Menu_Menu_Test(void)
@@ -1087,20 +1106,21 @@
Menu_HSlider_Create(menu, sliderscale, sliderscale+windowsize, windowsize, sliderscale, sliderscale, sliderscale-imagesize + windowsize, 0, MoveMenuH, UpdateMoveMenuH, child);
Menu_VSlider_Create(menu, 0, sliderscale, sliderscale, windowsize, sliderscale, sliderscale-imagesize + windowsize, 0, MoveMenuV, UpdateMoveMenuV, child);
Menu_VSlider_Create(menu, sliderscale+windowsize, sliderscale, sliderscale, windowsize, sliderscale, sliderscale-imagesize + windowsize, 0, MoveMenuV, UpdateMoveMenuV, child);
- Menu_Picture_Create(child, 0, 0, imagesize, imagesize, "lhfont.tga", NULL);
+ Menu_Picture_Create(child, 0, 0, imagesize, imagesize, "lhfont.tga", NULL, NULL);
-
Menu_SubMenu_Finish(child);
child->allowclose = false;
- Menu_Picture_Create(child, 0, 0, child->super.size[0], child->super.size[1], "maps/test/skybox_ny.tga", NULL);
+ Menu_Picture_Create(child, 0, 0, child->super.size[0], child->super.size[1], "maps/test/skybox_ny.tga", NULL, NULL);
+
menu->dragable = true;
child->super.size[0] = windowsize;
child->super.size[1] = windowsize;
Menu_SubMenu_Finish(menu);
- Menu_Picture_Create(menu, 0, 0, menu->super.size[0], menu->super.size[1], "maps/test/skybox_ny.tga", NULL);
+
+ Menu_Picture_Create(menu, 0, 0, menu->super.size[0], menu->super.size[1], "maps/test/skybox_ny.tga", NULL, NULL);
}
static Shell_SymbolDecl Menu_Menu_Test_Decl = {
"menu_test",
@@ -1137,7 +1157,7 @@
Menu_SubMenu_Finish(menu);
Menu_SubMenu_Arrange(menu, false, 0, MENU_ARRANGESTYLE_CENTER);
Menu_SubMenu_Finish(menu);
- Menu_Picture_Create(menu, 0, 0, menu->super.size[0], menu->super.size[1], "maps/test/skybox_ny.tga", NULL);
+ Menu_Picture_Create(menu, 0, 0, menu->super.size[0], menu->super.size[1], "maps/test/skybox_ny.tga", NULL, NULL);
Menu_MoveToCenter(menu);
}
@@ -1181,7 +1201,7 @@
Menu_SubMenu_Finish(menu);
- Menu_Picture_Create(menu, 0, 0, menu->super.size[0], menu->super.size[1], "maps/test/skybox_ny.tga", NULL);
+ Menu_Picture_Create(menu, 0, 0, menu->super.size[0], menu->super.size[1], "maps/test/skybox_ny.tga", NULL, NULL);
Menu_MoveToCenter(menu);
}
Modified: trunk/game/m_menucore.h
===================================================================
--- trunk/game/m_menucore.h 2006-03-13 20:59:04 UTC (rev 673)
+++ trunk/game/m_menucore.h 2006-03-13 21:15:28 UTC (rev 674)
@@ -53,9 +53,9 @@
Menu_Item super;
char *text; //what to display (warning: it's a pointer, isn't freed, and isn't copied)
- void *command; //command is a misnomer, it should be used as a cookie for the text item
+ void *cookie; //command is a misnomer, it should be used as a cookie for the text item
- void (*UseTextItem) (struct Menu_TextItem *item); //called when the user uses this item
+ void (*UseItem) (struct Menu_TextItem *item, void *cookie); //called when the user uses (clicks) this item
}
Menu_TextItem;
@@ -63,10 +63,13 @@
{
Menu_Item super;
+ Nbool editable; //user may type into the control
char *text; //what it currently says
NUint cursorpos; //where the cursor is, set between 0 and strlen(text)
NSint scrollpos; //fixme
NUint maxchars; //0 for unlimited
+
+ void (*ChangeEvent) (struct Menu_EditItem *item, char *newtext, void *cookie);
}
Menu_EditItem;
@@ -80,18 +83,14 @@
typedef struct Menu_ComboItem
{
- Menu_Item super;
+ Menu_EditItem super; //this is one advantage of c++.
- Nbool editable; //user may type into the control
struct Menu_ComboOption *options; //a list of the current options
struct Menu_ComboOption *selected; //set
- char *text;
- NSint cursorpos;
- NUint scrollpos;
- NUint maxchars;
+ struct Menu_SubMenu *popup;
- struct Menu_SubMenu *popup;
+ void (*ChangeEvent) (struct Menu_EditItem *item, char *newtext, NSint optionident, void *cookie); //we use the ChangeEvent of the text item to set our 'selected' value
}
Menu_ComboItem;
@@ -100,7 +99,9 @@
Menu_Item super;
char *imagename;
- char *command; //console command when clicked
+ void *cookie; //console command when clicked
+
+ void (*UseItem) (struct Menu_PictureItem *item, void *cookie); //called when the user uses (clicks) this item
}
Menu_PictureItem;
@@ -108,7 +109,7 @@
{
Menu_Item super;
- void *data; //for custom stuff
+ void *cookie; //for custom stuff
Nfloat value;//set and used in the slider code
Nfloat minv;//min value
@@ -117,8 +118,8 @@
Nfloat scale;//size of slider, in pixels.
//notification function
- void (*SliderChanged) (struct Menu_SliderItem *slider); //the user just changed the slider->value
- void (*SliderUpdate) (struct Menu_SliderItem *slider); //about to draw the slider's value, where you should feel free to update the value from external sources
+ void (*SliderChanged) (struct Menu_SliderItem *slider, void *cookie); //the user just changed the slider->value
+ void (*SliderUpdate) (struct Menu_SliderItem *slider, void *cookie); //about to draw the slider's value, where you should feel free to update the value from external sources
//internal
Nbool mousepressed; //adjust the slider with the mouse
@@ -144,20 +145,25 @@
} MenuState;
extern MenuState Menu;
+
+
+
+//Entry points central to the menu's workings
void Menu_Draw(void);
void Menu_Frame(void);
void Menu_Main(void);
void Menu_Init(void);
Nbool Menu_IsVisible(void);
-Nbool Menu_KeyEvent(NUint mod, NUint sym, UNUSED NUint character, Nbool downevent);
+Nbool Menu_KeyEvent(NUint mod, NUint sym, NUint character, Nbool downevent);
+//Entry points for using the menu in other systems
Menu_SubMenu *Menu_SubMenu_Create(Menu_SubMenu *parent);
-Menu_SliderItem *Menu_VSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem*), void (*UpdateSlider)(Menu_SliderItem*), void *data);//vertical scrolling bar
-Menu_SliderItem *Menu_HSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem*), void (*UpdateSlider)(Menu_SliderItem*), void *data);//horizontal scrolling bar
-Menu_TextItem *Menu_Text_Create(Menu_SubMenu *parent, NSint x, NSint y, char *text, void *command, void (*UseTextItem) (struct Menu_TextItem *item)); //if usetextitem == null, interpret as a console command. if not null, command can be used as a magic cookie. If both null, item is non-selectable.
+Menu_SliderItem *Menu_VSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem *item, void *cookie), void (*UpdateSlider)(Menu_SliderItem *item, void *cookie), void *cookie);//vertical scrolling bar
+Menu_SliderItem *Menu_HSlider_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, Nfloat minv, Nfloat maxv, Nfloat defaultv, void (*ChangeNotification)(Menu_SliderItem *item, void *cookie), void (*UpdateSlider)(Menu_SliderItem *item, void *cookie), void *cookie);//horizontal scrolling bar
+Menu_TextItem *Menu_Text_Create(Menu_SubMenu *parent, NSint x, NSint y, char *text, void *command, void (*UseItem) (struct Menu_TextItem *item, void *cookie)); //if usetextitem == null, interpret as a console command. if not null, command can be used as a magic cookie. If both null, item is non-selectable.
Menu_EditItem *Menu_Edit_Create(Menu_SubMenu *parent, NSint x, NSint y, char *text); //an item for editing text (fixme: needs callbacks and stuff)
Menu_ComboItem *Menu_Combo_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, char *defalt, char *list);//a list of multiple choices.
-Menu_PictureItem *Menu_Picture_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, char *imagename, char *command); //just a simple picture. clicking it can give a console command (fixme: make like text)
+Menu_PictureItem *Menu_Picture_Create(Menu_SubMenu *parent, NSint x, NSint y, NUint w, NUint h, char *imagename, void *command, void (*UseItem) (struct Menu_PictureItem *item, void *cookie)); //just a simple picture. clicking it can give a console command
#endif
More information about the neither-commits
mailing list