]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/nexuiz/serverlist.c
fix selection bug. Now REALLY gone.
[divverent/nexuiz.git] / data / qcsrc / menu-div0test / nexuiz / serverlist.c
1 #ifdef INTERFACE
2 CLASS(NexuizServerList) EXTENDS(NexuizListBox)
3         METHOD(NexuizServerList, configureNexuizServerList, void(entity))
4         ATTRIB(NexuizServerList, rowsPerItem, float, 1)
5         METHOD(NexuizServerList, draw, void(entity))
6         METHOD(NexuizServerList, drawListBoxItem, void(entity, float, vector, float))
7         METHOD(NexuizServerList, resizeNotify, void(entity, vector, vector, vector, vector))
8
9         ATTRIB(NexuizServerList, realFontSize, vector, '0 0 0')
10         ATTRIB(NexuizServerList, realUpperMargin, float, 0)
11         ATTRIB(NexuizServerList, columnPingOrigin, float, 0)
12         ATTRIB(NexuizServerList, columnPingSize, float, 0)
13         ATTRIB(NexuizServerList, columnNameOrigin, float, 0)
14         ATTRIB(NexuizServerList, columnNameSize, float, 0)
15         ATTRIB(NexuizServerList, columnMapOrigin, float, 0)
16         ATTRIB(NexuizServerList, columnMapSize, float, 0)
17         ATTRIB(NexuizServerList, columnPlayersOrigin, float, 0)
18         ATTRIB(NexuizServerList, columnPlayersSize, float, 0)
19
20         ATTRIB(NexuizServerList, selectedServer, string, string_null) // to restore selected server when needed
21         METHOD(NexuizServerList, setSelected, void(entity, float))
22 ENDCLASS(NexuizServerList)
23 entity makeNexuizServerList();
24 #endif
25
26 #ifdef IMPLEMENTATION
27 float SLIST_FIELD_CNAME;
28 float SLIST_FIELD_PING;
29 float SLIST_FIELD_GAME;
30 float SLIST_FIELD_MOD;
31 float SLIST_FIELD_MAP;
32 float SLIST_FIELD_NAME;
33 float SLIST_FIELD_MAXPLAYERS;
34 float SLIST_FIELD_NUMPLAYERS;
35 float SLIST_FIELD_NUMHUMANS;
36 float SLIST_FIELD_NUMBOTS;
37 float SLIST_FIELD_PROTOCOL;
38 void ServerList_UpdateFieldIDs()
39 {
40         SLIST_FIELD_CNAME = gethostcacheindexforkey( "cname" );
41         SLIST_FIELD_PING = gethostcacheindexforkey( "ping" );
42         SLIST_FIELD_GAME = gethostcacheindexforkey( "game" );
43         SLIST_FIELD_MOD = gethostcacheindexforkey( "mod" );
44         SLIST_FIELD_MAP = gethostcacheindexforkey( "map" );
45         SLIST_FIELD_NAME = gethostcacheindexforkey( "name" );
46         SLIST_FIELD_MAXPLAYERS = gethostcacheindexforkey( "maxplayers" );
47         SLIST_FIELD_NUMPLAYERS = gethostcacheindexforkey( "numplayers" );
48         SLIST_FIELD_NUMHUMANS = gethostcacheindexforkey( "numhumans" );
49         SLIST_FIELD_NUMBOTS = gethostcacheindexforkey( "numbots" );
50         SLIST_FIELD_PROTOCOL = gethostcacheindexforkey( "protocol" );
51 }
52
53 entity makeNexuizServerList()
54 {
55         entity me;
56         me = spawnNexuizServerList();
57         me.configureNexuizServerList(me);
58         return me;
59 }
60 void configureNexuizServerListNexuizServerList(entity me)
61 {
62         me.configureNexuizListBox(me);
63
64         ServerList_UpdateFieldIDs();
65         resethostcachemasks();
66         refreshhostcache();
67
68         me.nItems = 0;
69 }
70 void setSelectedNexuizServerList(entity me, float i)
71 {
72         float save;
73         save = me.selectedItem;
74         setSelectedListBox(me, i);
75         /*
76         if(me.selectedItem == save)
77                 return;
78         */
79         if(me.nItems == 0)
80                 return;
81         if(gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT) != me.nItems)
82                 return; // sorry, it would be wrong
83         if(me.selectedServer)
84                 strunzone(me.selectedServer);
85         me.selectedServer = strzone(gethostcachestring(SLIST_FIELD_CNAME, me.selectedItem));
86 }
87 void drawNexuizServerList(entity me)
88 {
89         float i;
90         me.nItems = gethostcachevalue(SLIST_HOSTCACHEVIEWCOUNT);
91         for(i = 0; i < me.nItems; ++i)
92         {
93                 if(gethostcachestring(SLIST_FIELD_CNAME, i) == me.selectedServer)
94                 {
95                         me.selectedItem = i;
96                         break;
97                 }
98         }
99         drawListBox(me);
100 }
101 void resizeNotifyNexuizServerList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
102 {
103         resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
104
105         me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);
106         me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));
107         me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);
108
109         me.columnPingOrigin = 0;
110         me.columnPingSize = me.realFontSize_x * 4;
111         me.columnMapSize = me.realFontSize_x * 12;
112         me.columnPlayersSize = me.realFontSize_x * 6;
113         me.columnNameSize = 1 - me.columnPlayersSize - me.columnMapSize - me.columnPingSize - 3 * me.realFontSize_x;
114         me.columnNameOrigin = me.columnPingOrigin + me.columnPingSize + me.realFontSize_x;
115         me.columnMapOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize_x;
116         me.columnPlayersOrigin = me.columnMapOrigin + me.columnMapSize + me.realFontSize_x;
117 }
118 void drawListBoxItemNexuizServerList(entity me, float i, vector absSize, float isSelected)
119 {
120         // layout: Ping, Server name, Map name, NP, TP, MP
121         string s;
122         float p;
123         vector theColor;
124         float theAlpha;
125
126         if(isSelected)
127                 draw_Fill('0 0 0', '1 1 0', '0 0 1', 0.5);
128
129         if(gethostcachenumber(SLIST_FIELD_NUMPLAYERS, i) >= gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i))
130                 theAlpha = 0.2;
131         else if(!gethostcachenumber(SLIST_FIELD_NUMHUMANS, i))
132                 theAlpha = 0.5;
133         else
134                 theAlpha = 1;
135         
136         p = gethostcachenumber(SLIST_FIELD_PING, i);
137         if(p < 50)
138                 theColor = eX * (p / 50) + eY;
139         else if(p < 150)
140                 theColor = eX + eY * ((150 - p) / 100);
141         else if(p < 650)
142         {
143                 theColor = eX;
144                 theAlpha *= (650 - p) / 500;
145         }
146         
147         s = ftos(p);
148         draw_Text(me.realUpperMargin * eY + (me.columnPingSize - draw_TextWidth(s) * me.realFontSize_x) * eX, s, me.realFontSize, theColor, theAlpha);
149         s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_NAME, i), me.columnNameSize / me.realFontSize_x);
150         draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, theColor, theAlpha);
151         s = draw_TextShortenToWidth(gethostcachestring(SLIST_FIELD_MAP, i), me.columnMapSize / me.realFontSize_x);
152         draw_Text(me.realUpperMargin * eY + (me.columnMapOrigin + (me.columnMapSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);
153         s = strcat(ftos(gethostcachenumber(SLIST_FIELD_NUMHUMANS, i)), "/", ftos(gethostcachenumber(SLIST_FIELD_MAXPLAYERS, i)));
154         draw_Text(me.realUpperMargin * eY + (me.columnPlayersOrigin + (me.columnPlayersSize - draw_TextWidth(s) * me.realFontSize_x) * 0.5) * eX, s, me.realFontSize, theColor, theAlpha);
155 }
156 #endif