r2909 - in trunk/data/qcsrc/menu-div0test: item nexuiz

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Nov 5 06:44:33 EST 2007


Author: div0
Date: 2007-11-05 06:44:33 -0500 (Mon, 05 Nov 2007)
New Revision: 2909

Modified:
   trunk/data/qcsrc/menu-div0test/item/listbox.c
   trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c
Log:
fix selection bug. Now REALLY gone.


Modified: trunk/data/qcsrc/menu-div0test/item/listbox.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/item/listbox.c	2007-11-05 11:40:30 UTC (rev 2908)
+++ trunk/data/qcsrc/menu-div0test/item/listbox.c	2007-11-05 11:44:33 UTC (rev 2909)
@@ -29,10 +29,15 @@
 	ATTRIB(ListBox, itemHeight, float, 0)
 	METHOD(ListBox, drawListBoxItem, void(entity, float, vector, float)) // item number, width/height, selected
 	METHOD(ListBox, clickListBoxItem, void(entity, float, vector)) // item number, relative clickpos
+	METHOD(ListBox, setSelected, void(entity, float))
 ENDCLASS(ListBox)
 #endif
 
 #ifdef IMPLEMENTATION
+void setSelectedListBox(entity me, float i)
+{
+	me.selectedItem = floor(0.5 + bound(0, i, me.nItems - 1));
+}
 void resizeNotifyListBox(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
 	me.size = absSize;
@@ -52,29 +57,29 @@
 	else if(key == K_MWHEELUP)
 	{
 		me.scrollPos = max(me.scrollPos - 0.5, 0);
-		me.selectedItem = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
+		me.setSelected(me, min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1)));
 	}
 	else if(key == K_MWHEELDOWN)
 	{
 		me.scrollPos = min(me.scrollPos + 0.5, me.nItems * me.itemHeight - 1);
-		me.selectedItem = max(me.selectedItem, ceil(me.scrollPos / me.itemHeight));
+		me.setSelected(me, max(me.selectedItem, ceil(me.scrollPos / me.itemHeight)));
 	}
 	else if(key == K_PGUP)
-		me.selectedItem = me.selectedItem - 1 / me.itemHeight;
+		me.setSelected(me, me.selectedItem - 1 / me.itemHeight);
 	else if(key == K_PGDN)
-		me.selectedItem = me.selectedItem + 1 / me.itemHeight;
+		me.setSelected(me, me.selectedItem + 1 / me.itemHeight);
 	else if(key == K_HOME)
-		me.selectedItem = 0;
+		me.setSelected(me, 0);
 	else if(key == K_END)
-		me.selectedItem = me.nItems - 1;
+		me.setSelected(me, me.nItems - 1);
 	else
 		return 0;
-	me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
 	return 1;
 }
 float mouseDragListBox(entity me, vector pos)
 {
 	float hit;
+	float i;
 	me.updateControlTopBottom(me);
 	me.dragScrollPos = pos;
 	if(me.pressed == 1)
@@ -95,13 +100,13 @@
 			me.scrollPos = me.previousValue;
 		me.scrollPos = min(me.scrollPos, me.nItems * me.itemHeight - 1);
 		me.scrollPos = max(me.scrollPos, 0);
-		me.selectedItem = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
-		me.selectedItem = max(me.selectedItem, ceil(me.scrollPos / me.itemHeight));
+		i = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
+		i = max(i, ceil(me.scrollPos / me.itemHeight));
+		me.setSelected(me, i);
 	}
 	else if(me.pressed == 2)
 	{
-		me.selectedItem = (me.scrollPos + pos_y) / me.itemHeight;
-		me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
+		me.setSelected(me, (me.scrollPos + pos_y) / me.itemHeight);
 	}
 	return 1;
 }
@@ -120,13 +125,13 @@
 		{
 			// page up
 			me.scrollPos = max(me.scrollPos - 1, 0);
-			me.selectedItem = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
+			me.setSelected(me, min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1)));
 		}
 		else if(pos_y > me.controlBottom)
 		{
 			// page down
 			me.scrollPos = min(me.scrollPos + 1, me.nItems * me.itemHeight - 1);
-			me.selectedItem = max(me.selectedItem, ceil(me.scrollPos / me.itemHeight));
+			me.setSelected(me, max(me.selectedItem, ceil(me.scrollPos / me.itemHeight)));
 		}
 		else
 		{
@@ -138,8 +143,7 @@
 	else
 	{
 		// an item has been clicked. Select it, ...
-		me.selectedItem = (me.scrollPos + pos_y) / me.itemHeight;
-		me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
+		me.setSelected(me, (me.scrollPos + pos_y) / me.itemHeight);
 		// continue doing that while dragging (even when dragging outside). When releasing, forward the click to the then selected item.
 		me.pressed = 2;
 	}
@@ -157,8 +161,7 @@
 	{
 		// item dragging mode
 		// select current one one last time...
-		me.selectedItem = (me.scrollPos + pos_y) / me.itemHeight;
-		me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
+		me.setSelected(me, (me.scrollPos + pos_y) / me.itemHeight);
 		// and give it a nice click event
 		if(me.nItems > 0)
 		{

Modified: trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c	2007-11-05 11:40:30 UTC (rev 2908)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c	2007-11-05 11:44:33 UTC (rev 2909)
@@ -16,12 +16,14 @@
 	ATTRIB(NexuizServerList, columnMapSize, float, 0)
 	ATTRIB(NexuizServerList, columnPlayersOrigin, float, 0)
 	ATTRIB(NexuizServerList, columnPlayersSize, float, 0)
+
+	ATTRIB(NexuizServerList, selectedServer, string, string_null) // to restore selected server when needed
+	METHOD(NexuizServerList, setSelected, void(entity, float))
 ENDCLASS(NexuizServerList)
 entity makeNexuizServerList();
 #endif
 
 #ifdef IMPLEMENTATION
-
 float SLIST_FIELD_CNAME;
 float SLIST_FIELD_PING;
 float SLIST_FIELD_GAME;
@@ -65,9 +67,35 @@
 
 	me.nItems = 0;
 }
+void setSelectedNexuizServerList(entity me, float i)
+{
+	float save;
+	save = me.selectedItem;
+	setSelectedListBox(me, i);
+	/*
+	if(me.selectedItem == save)
+		return;
+	*/
+	if(me.nItems == 0)
+		return;
+	if(gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT) != me.nItems)
+		return; // sorry, it would be wrong
+	if(me.selectedServer)
+		strunzone(me.selectedServer);
+	me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
+}
 void drawNexuizServerList(entity me)
 {
+	float i;
 	me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
+	for(i = 0; i < me.nItems; ++i)
+	{
+		if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
+		{
+			me.selectedItem = i;
+			break;
+		}
+	}
 	drawListBox(me);
 }
 void resizeNotifyNexuizServerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)




More information about the nexuiz-commits mailing list