r2907 - in trunk/data/qcsrc/menu-div0test: . item nexuiz

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Nov 5 06:20:59 EST 2007


Author: div0
Date: 2007-11-05 06:20:58 -0500 (Mon, 05 Nov 2007)
New Revision: 2907

Added:
   trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c
   trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c
   trunk/data/qcsrc/menu-div0test/nexuiz/listbox.c
   trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c
Removed:
   trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_player.c
Modified:
   trunk/data/qcsrc/menu-div0test/classes.c
   trunk/data/qcsrc/menu-div0test/draw.qc
   trunk/data/qcsrc/menu-div0test/draw.qh
   trunk/data/qcsrc/menu-div0test/item/listbox.c
   trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c
   trunk/data/qcsrc/menu-div0test/skin.qh
Log:
add somehow broken server list, far from done yet


Modified: trunk/data/qcsrc/menu-div0test/classes.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/classes.c	2007-11-05 09:46:39 UTC (rev 2906)
+++ trunk/data/qcsrc/menu-div0test/classes.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -25,7 +25,7 @@
 #include "nexuiz/dialog_settings_effects.c"
 #include "nexuiz/dialog_settings_audio.c"
 #include "nexuiz/dialog_multiplayer.c"
-#include "nexuiz/dialog_settings_player.c"
+#include "nexuiz/dialog_multiplayer_playersetup.c"
 #include "nexuiz/tabcontroller.c"
 #include "nexuiz/textlabel.c"
 #include "nexuiz/slider.c"
@@ -36,3 +36,6 @@
 #include "nexuiz/rootdialog.c"
 #include "nexuiz/textslider.c"
 #include "nexuiz/colorbutton.c"
+#include "nexuiz/dialog_multiplayer_join.c"
+#include "nexuiz/listbox.c"
+#include "nexuiz/serverlist.c"

Modified: trunk/data/qcsrc/menu-div0test/draw.qc
===================================================================
--- trunk/data/qcsrc/menu-div0test/draw.qc	2007-11-05 09:46:39 UTC (rev 2906)
+++ trunk/data/qcsrc/menu-div0test/draw.qc	2007-11-05 11:20:58 UTC (rev 2907)
@@ -54,6 +54,11 @@
 	drawpic(boxToGlobal(theOrigin, draw_shift, draw_scale), pic, boxToGlobalSize(theSize, draw_scale), theColor, theAlpha * draw_alpha, 0);
 }
 
+void draw_Fill(vector theOrigin, vector theSize, vector theColor, float theAlpha)
+{
+	drawfill(boxToGlobal(theOrigin, draw_shift, draw_scale), boxToGlobalSize(theSize, draw_scale), theColor, theAlpha * draw_alpha, 0);
+}
+
 // a button picture is a texture containing three parts:
 //   1/4 width: left part
 //   1/2 width: middle part (stretched)
@@ -225,3 +230,36 @@
 	drawresetcliparea();
 	draw_clipSet = 0;
 }
+
+string draw_TextShortenToWidth(string theText, float maxWidth)
+{
+	// STOP.
+	// The following function is SLOW.
+	// For your safety and for the protection of those around you...
+	// DO NOT CALL THIS AT HOME.
+	// No really, don't.
+	if(draw_TextWidth(theText) <= maxWidth)
+		return theText; // yeah!
+
+	// binary search for right place to cut string
+	float left, right, middle; // this always works
+	left = 0;
+	right = strlen(theText); // this always fails
+	do
+	{
+		middle = floor((left + right) / 2);
+		if(draw_TextWidth(strcat(substring(theText, 0, middle), "...")) <= maxWidth)
+			left = middle;
+		else
+			right = middle;
+	}
+	while(left < right - 1);
+
+	// NOTE: when color codes are involved, this binary search is,
+	// mathematically, BROKEN. However, it is obviously guaranteed to
+	// terminate, as the range still halves each time - but nevertheless, it is
+	// guaranteed that it finds ONE valid cutoff place (where "left" is in
+	// range, and "right" is outside).
+
+	return strcat(substring(theText, 0, left), "...");
+}

Modified: trunk/data/qcsrc/menu-div0test/draw.qh
===================================================================
--- trunk/data/qcsrc/menu-div0test/draw.qh	2007-11-05 09:46:39 UTC (rev 2906)
+++ trunk/data/qcsrc/menu-div0test/draw.qh	2007-11-05 11:20:58 UTC (rev 2907)
@@ -10,8 +10,10 @@
 void draw_VertButtonPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha);
 void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize);
 void draw_Picture(vector origin, string pic, vector size, vector color, float alpha);
+void draw_Fill(vector theOrigin, vector theSize, vector theColor, float theAlpha);
 void draw_Text(vector origin, string text, vector size, vector color, float alpha);
 float draw_TextWidth(string text);
+string draw_TextShortenToWidth(string text, float maxWidth);
 
 void draw_SetClip();
 void draw_ClearClip();
@@ -22,3 +24,4 @@
 vector globalToBoxSize(vector v, vector scale);
 
 float draw_NeedResizeNotify;
+

Modified: trunk/data/qcsrc/menu-div0test/item/listbox.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/item/listbox.c	2007-11-05 09:46:39 UTC (rev 2906)
+++ trunk/data/qcsrc/menu-div0test/item/listbox.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -25,7 +25,7 @@
 	ATTRIB(ListBox, src, string, "") // scrollbar
 	ATTRIB(ListBox, tolerance, vector, '0 0 0') // drag tolerance
 	ATTRIB(ListBox, scrollbarWidth, float, 0) // pixels
-	ATTRIB(ListBox, nItems, float, 0)
+	ATTRIB(ListBox, nItems, float, 42)
 	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
@@ -80,10 +80,10 @@
 	if(me.pressed == 1)
 	{
 		hit = 1;
-		if(pos_x < 1 - me.controlWidth - me.tolerance_x) hit = 0;
-		if(pos_y < 0 - me.tolerance_y) hit = 0;
-		if(pos_x >= 1 + me.tolerance_x) hit = 0;
-		if(pos_y >= 1 + me.tolerance_y) hit = 0;
+		if(pos_x < 1 - me.controlWidth - me.tolerance_y * me.controlWidth) hit = 0;
+		if(pos_y < 0 - me.tolerance_x) hit = 0;
+		if(pos_x >= 1 + me.tolerance_y * me.controlWidth) hit = 0;
+		if(pos_y >= 1 + me.tolerance_x) hit = 0;
 		if(hit)
 		{
 			// calculate new pos to v
@@ -111,6 +111,7 @@
 	if(pos_y < 0) return 0;
 	if(pos_x >= 1) return 0;
 	if(pos_y >= 1) return 0;
+	me.dragScrollPos = pos;
 	me.updateControlTopBottom(me);
 	if(pos_x >= 1 - me.controlWidth)
 	{
@@ -218,7 +219,7 @@
 		vector o, s;
 		o = eX * (1 - me.controlWidth) + eY * me.controlTop;
 		s = eX * me.controlWidth + eY * (me.controlBottom - me.controlTop);
-		if(me.pressed)
+		if(me.pressed == 1)
 			draw_VertButtonPicture(o, strcat(me.src, "_c"), s, '1 1 1', 1);
 		else if(me.focused)
 			draw_VertButtonPicture(o, strcat(me.src, "_f"), s, '1 1 1', 1);

Modified: trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c	2007-11-05 09:46:39 UTC (rev 2906)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -15,7 +15,7 @@
 	entity mc;
 	mc = makeNexuizTabController(me.rows - 2);
 	me.TR(me);
-		me.TD(me, 1, 1, mc.makeTabButton(mc, "Serverlist",  makeNexuizPlayerSettingsTab()));
+		me.TD(me, 1, 1, mc.makeTabButton(mc, "Serverlist",  makeNexuizServerListTab()));
 		me.TD(me, 1, 1, mc.makeTabButton(mc, "Player Setup",  makeNexuizPlayerSettingsTab()));
 		me.TD(me, 1, 1, mc.makeTabButton(mc, "Server Setup",  makeNexuizPlayerSettingsTab()));
 	me.TR(me);

Added: trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c	                        (rev 0)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_join.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -0,0 +1,34 @@
+#ifdef INTERFACE
+CLASS(NexuizServerListTab) EXTENDS(NexuizTab)
+	METHOD(NexuizServerListTab, fill, void(entity))
+	ATTRIB(NexuizServerListTab, title, string, "Settings")
+	ATTRIB(NexuizServerListTab, intendedWidth, float, 0.9)
+	ATTRIB(NexuizServerListTab, rows, float, 15)
+	ATTRIB(NexuizServerListTab, columns, float, 6.5)
+ENDCLASS(NexuizServerListTab)
+entity makeNexuizServerListTab();
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizServerListTab()
+{
+	entity me;
+	me = spawnNexuizServerListTab();
+	me.configureDialog(me);
+	return me;
+}
+void fillNexuizServerListTab(entity me)
+{
+	entity e;
+
+	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.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));
+}
+#endif

Copied: trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c (from rev 2902, trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_player.c)
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c	                        (rev 0)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/dialog_multiplayer_playersetup.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -0,0 +1,78 @@
+#ifdef INTERFACE
+CLASS(NexuizPlayerSettingsTab) EXTENDS(NexuizTab)
+	METHOD(NexuizPlayerSettingsTab, fill, void(entity))
+	ATTRIB(NexuizPlayerSettingsTab, title, string, "Settings")
+	ATTRIB(NexuizPlayerSettingsTab, intendedWidth, float, 0.9)
+	ATTRIB(NexuizPlayerSettingsTab, rows, float, 15)
+	ATTRIB(NexuizPlayerSettingsTab, columns, float, 6.5)
+ENDCLASS(NexuizPlayerSettingsTab)
+entity makeNexuizPlayerSettingsTab();
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizPlayerSettingsTab()
+{
+	entity me;
+	me = spawnNexuizPlayerSettingsTab();
+	me.configureDialog(me);
+	return me;
+}
+void fillNexuizPlayerSettingsTab(entity me)
+{
+	entity e;
+	float i;
+
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Player Name:"));
+		me.TD(me, 1, 2, e = makeNexuizResolutionSlider());
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Shirt Color:"));
+		for(i = 0; i < 15; ++i)
+			me.TD(me, 1, 2 / 15, e = makeNexuizColorButton(1, 0, i));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Pants Color:"));
+		for(i = 0; i < 15; ++i)
+			me.TD(me, 1, 2 / 15, e = makeNexuizColorButton(2, 1, i));
+
+	me.gotoXY(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Field of View:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(90, 130, 1, "fov"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Zoom Factor:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(2, 10, 1, "cl_zoomfactor"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Zoom Speed:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(-1, 5, 1, "cl_zoomspeed"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(0, 10, 1, "crosshair"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Alpha:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_blue"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Color Red:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_red"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Color Green:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_green"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Color Blue:"));
+		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_blue"));
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Hud Style:"));
+		me.TD(me, 1, 2, e = makeNexuizTextSlider("sbar_hudselector"));
+			e.addValue(e, "Old", "0");
+			e.addValue(e, "New", "1");
+			e.configureNexuizTextSliderValues(e);
+	me.TR(me);
+		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Hud Size:"));
+		me.TD(me, 1, 2, e = makeNexuizTextSlider("viewsize"));
+			e.addValue(e, "Disabled", "120");
+			e.addValue(e, "Simple", "110");
+			e.addValue(e, "Full", "100");
+			e.configureNexuizTextSliderValues(e);
+
+	me.gotoXY(me, me.rows - 1, 0);
+		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "color -1 -1", COMMANDBUTTON_APPLY));
+}
+#endif

Deleted: trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_player.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_player.c	2007-11-05 09:46:39 UTC (rev 2906)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_player.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -1,78 +0,0 @@
-#ifdef INTERFACE
-CLASS(NexuizPlayerSettingsTab) EXTENDS(NexuizTab)
-	METHOD(NexuizPlayerSettingsTab, fill, void(entity))
-	ATTRIB(NexuizPlayerSettingsTab, title, string, "Settings")
-	ATTRIB(NexuizPlayerSettingsTab, intendedWidth, float, 0.9)
-	ATTRIB(NexuizPlayerSettingsTab, rows, float, 15)
-	ATTRIB(NexuizPlayerSettingsTab, columns, float, 6.5)
-ENDCLASS(NexuizPlayerSettingsTab)
-entity makeNexuizPlayerSettingsTab();
-#endif
-
-#ifdef IMPLEMENTATION
-entity makeNexuizPlayerSettingsTab()
-{
-	entity me;
-	me = spawnNexuizPlayerSettingsTab();
-	me.configureDialog(me);
-	return me;
-}
-void fillNexuizPlayerSettingsTab(entity me)
-{
-	entity e;
-	float i;
-
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Player Name:"));
-		me.TD(me, 1, 2, e = makeNexuizResolutionSlider());
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Shirt Color:"));
-		for(i = 0; i < 15; ++i)
-			me.TD(me, 1, 2 / 15, e = makeNexuizColorButton(1, 0, i));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Pants Color:"));
-		for(i = 0; i < 15; ++i)
-			me.TD(me, 1, 2 / 15, e = makeNexuizColorButton(2, 1, i));
-
-	me.gotoXY(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Field of View:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(90, 130, 1, "fov"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Zoom Factor:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(2, 10, 1, "cl_zoomfactor"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Zoom Speed:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(-1, 5, 1, "cl_zoomspeed"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(0, 10, 1, "crosshair"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Alpha:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_blue"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Color Red:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_red"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Color Green:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_green"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Crosshair Color Blue:"));
-		me.TD(me, 1, 2, e = makeNexuizSlider(0, 1, 0.01, "crosshair_color_blue"));
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Hud Style:"));
-		me.TD(me, 1, 2, e = makeNexuizTextSlider("sbar_hudselector"));
-			e.addValue(e, "Old", "0");
-			e.addValue(e, "New", "1");
-			e.configureNexuizTextSliderValues(e);
-	me.TR(me);
-		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Hud Size:"));
-		me.TD(me, 1, 2, e = makeNexuizTextSlider("viewsize"));
-			e.addValue(e, "Disabled", "120");
-			e.addValue(e, "Simple", "110");
-			e.addValue(e, "Full", "100");
-			e.configureNexuizTextSliderValues(e);
-
-	me.gotoXY(me, me.rows - 1, 0);
-		me.TD(me, 1, me.columns, makeNexuizCommandButton("Apply immediately", '0 0 0', "color -1 -1", COMMANDBUTTON_APPLY));
-}
-#endif

Added: trunk/data/qcsrc/menu-div0test/nexuiz/listbox.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/listbox.c	                        (rev 0)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/listbox.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -0,0 +1,31 @@
+#ifdef INTERFACE
+CLASS(NexuizListBox) EXTENDS(ListBox)
+	METHOD(NexuizListBox, configureNexuizListBox, void(entity))
+	ATTRIB(NexuizListBox, fontSize, float, SKINFONTSIZE_NORMAL)
+	ATTRIB(NexuizListBox, scrollbarWidth, float, SKINWIDTH_SCROLLBAR)
+	ATTRIB(NexuizListBox, src, string, SKINGFX_SCROLLBAR)
+	ATTRIB(NexuizListBox, tolerance, vector, SKINTOLERANCE_SLIDER)
+	ATTRIB(NexuizListBox, rowsPerItem, float, 1)
+	METHOD(NexuizListBox, resizeNotify, void(entity, vector, vector, vector, vector))
+ENDCLASS(NexuizListBox)
+entity makeNexuizListBox();
+#endif
+
+#ifdef IMPLEMENTATION
+entity makeNexuizListBox()
+{
+	entity me;
+	me = spawnNexuizListBox();
+	me.configureNexuizListBox(me);
+	return me;
+}
+void configureNexuizListBoxNexuizListBox(entity me)
+{
+	me.configureListBox(me, me.scrollbarWidth, 1); // item height gets set up later
+}
+void resizeNotifyNexuizListBox(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+	me.itemHeight = me.rowsPerItem * me.fontSize / absSize_y;
+	resizeNotifyListBox(me, relOrigin, relSize, absOrigin, absSize);
+}
+#endif

Added: trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c	                        (rev 0)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/serverlist.c	2007-11-05 11:20:58 UTC (rev 2907)
@@ -0,0 +1,128 @@
+#ifdef INTERFACE
+CLASS(NexuizServerList) EXTENDS(NexuizListBox)
+	METHOD(NexuizServerList, configureNexuizServerList, void(entity))
+	ATTRIB(NexuizServerList, rowsPerItem, float, 1)
+	METHOD(NexuizServerList, draw, void(entity))
+	METHOD(NexuizServerList, drawListBoxItem, void(entity, float, vector, float))
+	METHOD(NexuizServerList, resizeNotify, void(entity, vector, vector, vector, vector))
+
+	ATTRIB(NexuizServerList, realFontSize, vector, '0 0 0')
+	ATTRIB(NexuizServerList, realUpperMargin, float, 0)
+	ATTRIB(NexuizServerList, columnPingOrigin, float, 0)
+	ATTRIB(NexuizServerList, columnPingSize, float, 0)
+	ATTRIB(NexuizServerList, columnNameOrigin, float, 0)
+	ATTRIB(NexuizServerList, columnNameSize, float, 0)
+	ATTRIB(NexuizServerList, columnMapOrigin, float, 0)
+	ATTRIB(NexuizServerList, columnMapSize, float, 0)
+	ATTRIB(NexuizServerList, columnPlayersOrigin, float, 0)
+	ATTRIB(NexuizServerList, columnPlayersSize, float, 0)
+ENDCLASS(NexuizServerList)
+entity makeNexuizServerList();
+#endif
+
+#ifdef IMPLEMENTATION
+
+float SLIST_FIELD_CNAME;
+float SLIST_FIELD_PING;
+float SLIST_FIELD_GAME;
+float SLIST_FIELD_MOD;
+float SLIST_FIELD_MAP;
+float SLIST_FIELD_NAME;
+float SLIST_FIELD_MAXPLAYERS;
+float SLIST_FIELD_NUMPLAYERS;
+float SLIST_FIELD_NUMHUMANS;
+float SLIST_FIELD_NUMBOTS;
+float SLIST_FIELD_PROTOCOL;
+void ServerList_UpdateFieldIDs()
+{
+	SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
+	SLIST_FIELD_PING = gethostcacheindexforkey( "ping" );
+	SLIST_FIELD_GAME = gethostcacheindexforkey( "game" );
+	SLIST_FIELD_MOD = gethostcacheindexforkey( "mod" );
+	SLIST_FIELD_MAP = gethostcacheindexforkey( "map" );
+	SLIST_FIELD_NAME = gethostcacheindexforkey( "name" );
+	SLIST_FIELD_MAXPLAYERS = gethostcacheindexforkey( "maxplayers" );
+	SLIST_FIELD_NUMPLAYERS = gethostcacheindexforkey( "numplayers" );
+	SLIST_FIELD_NUMHUMANS = gethostcacheindexforkey( "numhumans" );
+	SLIST_FIELD_NUMBOTS = gethostcacheindexforkey( "numbots" );
+	SLIST_FIELD_PROTOCOL = gethostcacheindexforkey( "protocol" );
+}
+
+entity makeNexuizServerList()
+{
+	entity me;
+	me = spawnNexuizServerList();
+	me.configureNexuizServerList(me);
+	return me;
+}
+void configureNexuizServerListNexuizServerList(entity me)
+{
+	me.configureNexuizListBox(me);
+
+	ServerList_UpdateFieldIDs();
+	resethostcachemasks();
+	refreshhostcache();
+
+	me.nItems = 0;
+}
+void drawNexuizServerList(entity me)
+{
+	me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
+	drawListBox(me);
+}
+void resizeNotifyNexuizServerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+	resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
+
+	me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
+	me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
+	me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
+
+	me.columnPingOrigin = 0;
+	me.columnPingSize = me.realFontSize_x * 4;
+	me.columnMapSize = me.realFontSize_x * 12;
+	me.columnPlayersSize = me.realFontSize_x * 6;
+	me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - 3 * me.realFontSize_x;
+	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;
+}
+void drawListBoxItemNexuizServerList(entity me, float i, vector absSize, float isSelected)
+{
+	// layout: Ping, Server name, Map name, NP, TP, MP
+	string s;
+	float p;
+	vector theColor;
+	float theAlpha;
+
+	if(isSelected)
+		draw_Fill('0 0 0', '1 1 0', '0 0 1', 0.5);
+
+	if(gethostcachenumber(SLIST_FIELD_NUMPLAYERS, i) >= gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i))
+		theAlpha = 0.2;
+	else if(!gethostcachenumber(SLIST_FIELD_NUMHUMANS, i))
+		theAlpha = 0.5;
+	else
+		theAlpha = 1;
+	
+	p = gethostcachenumber(SLIST_FIELD_PING, i);
+	if(p < 50)
+		theColor = eX * (p / 50) + eY;
+	else if(p < 150)
+		theColor = eX + eY * ((150 - p) / 100);
+	else if(p < 650)
+	{
+		theColor = eX;
+		theAlpha *= (650 - p) / 500;
+	}
+	
+	s = ftos(p);
+	draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s) * me.realFontSize_x) * eX, s, me.realFontSize, theColor, theAlpha);
+	s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize / me.realFontSize_x);
+	draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha);
+	s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize / me.realFontSize_x);
+	draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);
+	s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
+	draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);
+}
+#endif

Modified: trunk/data/qcsrc/menu-div0test/skin.qh
===================================================================
--- trunk/data/qcsrc/menu-div0test/skin.qh	2007-11-05 09:46:39 UTC (rev 2906)
+++ trunk/data/qcsrc/menu-div0test/skin.qh	2007-11-05 11:20:58 UTC (rev 2907)
@@ -9,6 +9,7 @@
 const string SKINGFX_RADIOBUTTON = "qcsrc/menu-div0test/baseradiobutton";
 const string SKINGFX_COLORBUTTON = "qcsrc/menu-div0test/basebutton";
 const string SKINGFX_COLORBUTTON_COLOR = "qcsrc/menu-div0test/color";
+const string SKINGFX_SCROLLBAR = "qcsrc/menu-div0test/basescrollbar";
 
 const float SKINMARGIN_TOP = 8;
 const float SKINMARGIN_LEFT = 8;
@@ -18,6 +19,7 @@
 const float SKINFONTSIZE_NORMAL = 12;
 const float SKINHEIGHT_NORMAL = 1.5;
 const float SKINHEIGHT_NORMAL_WITHSPACING = 2;
+const float SKINWIDTH_SCROLLBAR = 16;
 
 const float SKINWIDTH_SLIDERTEXT = 0.333333333333;
 




More information about the nexuiz-commits mailing list