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

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Nov 5 16:36:08 EST 2007


Author: div0
Date: 2007-11-05 16:36:07 -0500 (Mon, 05 Nov 2007)
New Revision: 2910

Modified:
   trunk/data/qcsrc/menu-div0test/item/container.c
   trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c
   trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c
Log:
It can join servers now!


Modified: trunk/data/qcsrc/menu-div0test/item/container.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/item/container.c	2007-11-05 11:44:33 UTC (rev 2909)
+++ trunk/data/qcsrc/menu-div0test/item/container.c	2007-11-05 21:36:07 UTC (rev 2910)
@@ -27,13 +27,13 @@
 ENDCLASS(Container)
 .entity nextSibling;
 .entity prevSibling;
-#endif
-
-#ifdef IMPLEMENTATION
+.float resized;
 .vector Container_origin;
 .vector Container_size;
 .float Container_alpha;
+#endif
 
+#ifdef IMPLEMENTATION
 void showNotifyContainer(entity me)
 {
 	entity e;
@@ -75,12 +75,27 @@
 {
 	entity e;
 	vector o, s;
+	float d;
 	for(e = me.firstChild; e; e = e.nextSibling)
 	{
 		o = e.originField;
 		s = e.sizeField;
 		e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
 	}
+	do
+	{
+		d = 0;
+		for(e = me.firstChild; e; e = e.nextSibling)
+			if(e.resized)
+			{
+				e.resized = 0;
+				d = 1;
+				o = e.originField;
+				s = e.sizeField;
+				e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
+			}
+	}
+	while(d);
 	resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
 }
 

Modified: trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c	2007-11-05 11:44:33 UTC (rev 2909)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c	2007-11-05 21:36:07 UTC (rev 2910)
@@ -19,16 +19,28 @@
 }
 void fillNexuizServerListTab(entity me)
 {
-	entity e;
+	entity e, slist;
 
+	slist  = makeNexuizServerList();
+
 	me.TR(me);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Filter:"));
 
 	me.TR(me);
-		me.TD(me, me.rows - 2, me.columns, e = makeNexuizServerList());
+		me.TD(me, 1, 1, slist.sortButton1 = makeNexuizButton("", '0 0 0'));
+		me.TD(me, 1, 1, slist.sortButton2 = makeNexuizButton("", '0 0 0'));
+		me.TD(me, 1, 1, slist.sortButton3 = makeNexuizButton("", '0 0 0'));
+		me.TD(me, 1, 1, slist.sortButton4 = makeNexuizButton("", '0 0 0'));
+	me.TR(me);
+		me.TD(me, me.rows - 3, me.columns, slist);
 
 	me.gotoXY(me, me.rows - 1, 0);
-		me.TD(me, 1, 1, makeNexuizCommandButton("Refresh!", '0 0 0', "echo FIXME ask for servers again", 0));
-		me.TD(me, 1, me.columns - 1, makeNexuizCommandButton("Join!", '0 0 0', "connect $menu_selected_server", 0));
+		me.TD(me, 1, 1, e = makeNexuizButton("Refresh!", '0 0 0'));
+			e.onClick = ServerList_Refresh_Click;
+			e.onClickEntity = slist;
+		me.TD(me, 1, me.columns - 1, e = makeNexuizButton("Join!", '0 0 0'));
+			e.onClick = ServerList_Connect_Click;
+			e.onClickEntity = slist;
+			slist.connectButton = e;
 }
 #endif

Modified: trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c	2007-11-05 11:44:33 UTC (rev 2909)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c	2007-11-05 21:36:07 UTC (rev 2910)
@@ -4,6 +4,7 @@
 	ATTRIB(NexuizServerList, rowsPerItem, float, 1)
 	METHOD(NexuizServerList, draw, void(entity))
 	METHOD(NexuizServerList, drawListBoxItem, void(entity, float, vector, float))
+	METHOD(NexuizServerList, clickListBoxItem, void(entity, float, vector))
 	METHOD(NexuizServerList, resizeNotify, void(entity, vector, vector, vector, vector))
 
 	ATTRIB(NexuizServerList, realFontSize, vector, '0 0 0')
@@ -19,8 +20,21 @@
 
 	ATTRIB(NexuizServerList, selectedServer, string, string_null) // to restore selected server when needed
 	METHOD(NexuizServerList, setSelected, void(entity, float))
+	METHOD(NexuizServerList, setSortOrder, void(entity, float, float))
+	METHOD(NexuizServerList, positionSortButton, void(entity, entity, float, float, string, void(entity, entity)))
+	ATTRIB(NexuizServerList, sortButton1, entity, NULL)
+	ATTRIB(NexuizServerList, sortButton2, entity, NULL)
+	ATTRIB(NexuizServerList, sortButton3, entity, NULL)
+	ATTRIB(NexuizServerList, sortButton4, entity, NULL)
+	ATTRIB(NexuizServerList, connectButton, entity, NULL)
+	ATTRIB(NexuizServerList, currentSortOrder, float, 0)
+	ATTRIB(NexuizServerList, currentSortField, float, 0)
+	ATTRIB(NexuizServerList, lastClickedServer, float, 0)
+	ATTRIB(NexuizServerList, lastClickedTime, float, 0)
 ENDCLASS(NexuizServerList)
 entity makeNexuizServerList();
+void ServerList_Connect_Click(entity btn, entity me);
+void ServerList_Refresh_Click(entity btn, entity me);
 #endif
 
 #ifdef IMPLEMENTATION
@@ -35,6 +49,7 @@
 float SLIST_FIELD_NUMHUMANS;
 float SLIST_FIELD_NUMBOTS;
 float SLIST_FIELD_PROTOCOL;
+float SLIST_FIELD_FREESLOTS;
 void ServerList_UpdateFieldIDs()
 {
 	SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
@@ -48,6 +63,7 @@
 	SLIST_FIELD_NUMHUMANS = gethostcacheindexforkey( "numhumans" );
 	SLIST_FIELD_NUMBOTS = gethostcacheindexforkey( "numbots" );
 	SLIST_FIELD_PROTOCOL = gethostcacheindexforkey( "protocol" );
+	SLIST_FIELD_FREESLOTS = gethostcacheindexforkey( "freeslots" );
 }
 
 entity makeNexuizServerList()
@@ -63,7 +79,7 @@
 
 	ServerList_UpdateFieldIDs();
 	resethostcachemasks();
-	refreshhostcache();
+	me.currentSortField = -1;
 
 	me.nItems = 0;
 }
@@ -87,7 +103,15 @@
 void drawNexuizServerList(entity me)
 {
 	float i;
+
+	if(me.currentSortField == -1)
+	{
+		refreshhostcache();
+		me.setSortOrder(me, SLIST_FIELD_PING, +1);
+	}
+
 	me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
+	me.connectButton.disabled = (me.nItems == 0);
 	for(i = 0; i < me.nItems; ++i)
 	{
 		if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
@@ -98,6 +122,56 @@
 	}
 	drawListBox(me);
 }
+void ServerList_PingSort_Click(entity btn, entity me)
+{
+	me.setSortOrder(me, SLIST_FIELD_PING, +1);
+}
+void ServerList_NameSort_Click(entity btn, entity me)
+{
+	me.setSortOrder(me, SLIST_FIELD_NAME, -1); // why?
+}
+void ServerList_MapSort_Click(entity btn, entity me)
+{
+	me.setSortOrder(me, SLIST_FIELD_MAP, -1); // why?
+}
+void ServerList_PlayerSort_Click(entity btn, entity me)
+{
+	me.setSortOrder(me, SLIST_FIELD_NUMHUMANS, -1);
+}
+void setSortOrderNexuizServerList(entity me, float field, float direction)
+{
+	if(me.currentSortField == field)
+		direction = -me.currentSortOrder;
+	me.currentSortOrder = direction;
+	me.currentSortField = field;
+	sethostcachesort(field, direction < 0);
+	resorthostcache();
+	me.sortButton1.forcePressed = (field == SLIST_FIELD_PING);
+	me.sortButton2.forcePressed = (field == SLIST_FIELD_NAME);
+	me.sortButton3.forcePressed = (field == SLIST_FIELD_MAP);
+	me.sortButton4.forcePressed = (field == SLIST_FIELD_NUMHUMANS);
+	me.selectedItem = 0;
+	if(me.selectedServer)
+		strunzone(me.selectedServer);
+	me.selectedServer = string_null;
+}
+void positionSortButtonNexuizServerList(entity me, entity btn, float theOrigin, float theSize, string theTitle, void(entity, entity) theFunc)
+{
+	vector originInLBSpace, sizeInLBSpace;
+	originInLBSpace = eY * (-me.itemHeight);
+	sizeInLBSpace = eY * me.itemHeight + eX * (1 - me.controlWidth);
+
+	vector originInDialogSpace, sizeInDialogSpace;
+	originInDialogSpace = boxToGlobal(originInLBSpace, me.Container_origin, me.Container_size);
+	sizeInDialogSpace = boxToGlobalSize(sizeInLBSpace, me.Container_size);
+
+	btn.Container_origin_x = originInDialogSpace_x + sizeInDialogSpace_x * theOrigin;
+	btn.Container_size_x   =                         sizeInDialogSpace_x * theSize;
+	btn.setText(btn, theTitle);
+	btn.onClick = theFunc;
+	btn.onClickEntity = me;
+	btn.resized = 1;
+}
 void resizeNotifyNexuizServerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
 	resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
@@ -114,7 +188,37 @@
 	me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
 	me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
 	me.columnPlayersOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
+
+	me.positionSortButton(me, me.sortButton1, me.columnPingOrigin, me.columnPingSize, "Ping", ServerList_PingSort_Click);
+	me.positionSortButton(me, me.sortButton2, me.columnNameOrigin, me.columnNameSize, "Host name", ServerList_NameSort_Click);
+	me.positionSortButton(me, me.sortButton3, me.columnMapOrigin, me.columnMapSize, "Map", ServerList_MapSort_Click);
+	me.positionSortButton(me, me.sortButton4, me.columnPlayersOrigin, me.columnPlayersSize, "Players", ServerList_PlayerSort_Click);
+
+	float f;
+	f = me.currentSortField;
+	me.currentSortField = -1;
+	me.setSortOrder(me, f, me.currentSortOrder); // force resetting the sort order
 }
+void ServerList_Connect_Click(entity btn, entity me)
+{
+	if(me.nItems > 0)
+		localcmd("connect ", me.selectedServer, "\n");
+}
+void ServerList_Refresh_Click(entity btn, entity me)
+{
+	refreshhostcache();
+}
+void clickListBoxItemNexuizServerList(entity me, float i, vector where)
+{
+	if(i == me.lastClickedServer)
+		if(time < me.lastClickedTime + 0.3)
+		{
+			// DOUBLE CLICK!
+			ServerList_Connect_Click(NULL, me);
+		}
+	me.lastClickedServer = i;
+	me.lastClickedTime = time;
+}
 void drawListBoxItemNexuizServerList(entity me, float i, vector absSize, float isSelected)
 {
 	// layout: Ping, Server name, Map name, NP, TP, MP
@@ -141,8 +245,13 @@
 	else if(p < 650)
 	{
 		theColor = eX;
-		theAlpha *= (650 - p) / 500;
+		theAlpha *= 0.1 + 0.9 * (650 - p) / 500;
 	}
+	else
+	{
+		theColor = eX;
+		theAlpha *= 0.1;
+	}
 	
 	s = ftos(p);
 	draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s) * me.realFontSize_x) * eX, s, me.realFontSize, theColor, theAlpha);




More information about the nexuiz-commits mailing list