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