]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu-div0test/nexuiz/maplist.c
Lots of cvars added, and starship recompile with better performance. Thanks SavageX...
[divverent/nexuiz.git] / data / qcsrc / menu-div0test / nexuiz / maplist.c
1 #ifdef INTERFACE
2 CLASS(NexuizMapList) EXTENDS(NexuizListBox)
3         METHOD(NexuizMapList, configureNexuizMapList, void(entity))
4         ATTRIB(NexuizMapList, rowsPerItem, float, 4)
5         METHOD(NexuizMapList, draw, void(entity))
6         METHOD(NexuizMapList, drawListBoxItem, void(entity, float, vector, float))
7         METHOD(NexuizMapList, clickListBoxItem, void(entity, float, vector))
8         METHOD(NexuizMapList, resizeNotify, void(entity, vector, vector, vector, vector))
9         METHOD(NexuizMapList, refilter, void(entity))
10
11         ATTRIB(NexuizMapList, realFontSize, vector, '0 0 0')
12         ATTRIB(NexuizMapList, columnPreviewOrigin, float, 0)
13         ATTRIB(NexuizMapList, columnPreviewSize, float, 0)
14         ATTRIB(NexuizMapList, columnNameOrigin, float, 0)
15         ATTRIB(NexuizMapList, columnNameSize, float, 0)
16         ATTRIB(NexuizMapList, checkMarkOrigin, vector, '0 0 0')
17         ATTRIB(NexuizMapList, checkMarkSize, vector, '0 0 0')
18         ATTRIB(NexuizMapList, realUpperMargin1, float, 0)
19         ATTRIB(NexuizMapList, realUpperMargin2, float, 0)
20
21         ATTRIB(NexuizMapList, lastClickedMap, float, -1)
22         ATTRIB(NexuizMapList, lastClickedTime, float, 0)
23
24         ATTRIB(NexuizMapList, lastGametype, float, 0)
25         ATTRIB(NexuizMapList, lastFeatures, float, 0)
26
27         ATTRIB(NexuizMapList, origin, vector, '0 0 0')
28         ATTRIB(NexuizMapList, itemAbsSize, vector, '0 0 0')
29
30         ATTRIB(NexuizMapList, g_maplistCache, string, string_null)
31         METHOD(NexuizMapList, g_maplistCacheToggle, void(entity, float))
32         METHOD(NexuizMapList, g_maplistCacheQuery, float(entity, float))
33
34         ATTRIB(NexuizMapList, startButton, entity, NULL)
35
36         ATTRIB(NexuizMapList, cvarName, string, "dummy")
37         METHOD(NexuizMapList, loadCvars, void(entity))
38 ENDCLASS(NexuizMapList)
39 entity makeNexuizMapList();
40 void MapList_All(entity btn, entity me);
41 void MapList_None(entity btn, entity me);
42 void MapList_LoadMap(entity btn, entity me);
43 #endif
44
45 #ifdef IMPLEMENTATION
46 entity makeNexuizMapList()
47 {
48         entity me;
49         me = spawnNexuizMapList();
50         me.configureNexuizMapList(me);
51         return me;
52 }
53 void configureNexuizMapListNexuizMapList(entity me)
54 {
55         me.configureNexuizListBox(me);
56         me.refilter(me);
57 }
58
59 void loadCvarsNexuizMapList(entity me)
60 {
61         me.refilter(me);
62 }
63
64 float g_maplistCacheQueryNexuizMapList(entity me, float i)
65 {
66         return stof(substring(me.g_maplistCache, i, 1));
67 }
68 void g_maplistCacheToggleNexuizMapList(entity me, float i)
69 {
70         string a, b, c, s, bspname;
71         float n;
72         s = me.g_maplistCache;
73         if not(s)
74                 return;
75         b = substring(s, i, 1);
76         if(b == "0")
77                 b = "1";
78         else if(b == "1")
79                 b = "0";
80         else
81                 return; // nothing happens
82         a = substring(s, 0, i);
83         c = substring(s, i+1, strlen(s) - (i+1));
84         strunzone(s);
85         me.g_maplistCache = strzone(strcat(a, b, c));
86         // TODO also update the actual cvar
87         if not((bspname = MapInfo_BSPName_ByID(i)))
88                 return;
89         if(b == "1")
90                 cvar_set("g_maplist", strcat(bspname, " ", cvar_string("g_maplist")));
91         else
92         {
93                 s = "";
94                 n = tokenize(cvar_string("g_maplist"));
95                 for(i = 0; i < n; ++i)
96                         if(argv(i) != bspname)
97                                 s = strcat(s, " ", argv(i));
98                 cvar_set("g_maplist", substring(s, 1, strlen(s) - 1));
99         }
100 }
101
102 void drawNexuizMapList(entity me)
103 {
104         if(me.startButton)
105                 me.startButton.disabled = ((me.selectedItem < 0) || (me.selectedItem >= me.nItems));
106         drawListBox(me);
107 }
108
109 void resizeNotifyNexuizMapList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
110 {
111         me.origin = absOrigin;
112         me.itemAbsSize = '0 0 0';
113         resizeNotifyNexuizListBox(me, relOrigin, relSize, absOrigin, absSize);
114
115         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));
116         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));
117         me.realUpperMargin1 = 0.5 * (1 - 2.5 * me.realFontSize_y);
118         me.realUpperMargin2 = me.realUpperMargin1 + 1.5 * me.realFontSize_y;
119
120         me.columnPreviewOrigin = 0;
121         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;
122         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;
123         me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x;
124
125         me.checkMarkSize = (eX * (me.itemAbsSize_y / me.itemAbsSize_x) + eY) * 0.5;
126         me.checkMarkOrigin = eY + eX * (me.columnPreviewOrigin + me.columnPreviewSize) - me.checkMarkSize;
127 }
128 void clickListBoxItemNexuizMapList(entity me, float i, vector where)
129 {
130         if(where_x <= me.columnPreviewOrigin + me.columnPreviewSize)
131         {
132                 if(where_x >= 0)
133                         me.g_maplistCacheToggle(me, i);
134         }
135         if(where_x >= me.columnNameOrigin)
136                 if(where_x <= 1)
137                         {
138                                 if(i == me.lastClickedMap)
139                                         if(time < me.lastClickedTime + 0.3)
140                                         {
141                                                 // DOUBLE CLICK!
142                                                 // pop up map info screen
143                                                 main.mapInfoDialog.loadMapInfo(main.mapInfoDialog, i);
144                                                 DialogOpenButton_Click_withCoords(NULL, main.mapInfoDialog, me.origin + eX * (me.columnNameOrigin * me.size_x) + eY * ((me.itemHeight * i - me.scrollPos) * me.size_y), eY * me.itemAbsSize_y + eX * (me.itemAbsSize_x * me.columnNameSize));
145                                                 return;
146                                         }
147                                 me.lastClickedMap = i;
148                                 me.lastClickedTime = time;
149                         }
150 }
151 void drawListBoxItemNexuizMapList(entity me, float i, vector absSize, float isSelected)
152 {
153         // layout: Ping, Map name, Map name, NP, TP, MP
154         string s;
155         float p;
156         vector theColor;
157         float theAlpha;
158         float included;
159
160         theColor = '1 1 1';
161
162         if(!MapInfo_Get_ByID(i))
163                 return;
164
165         included = me.g_maplistCacheQuery(me, i);
166         if(included)
167                 theAlpha = 1;
168         else
169                 theAlpha = 0.4;
170
171         if(isSelected)
172                 draw_Fill('0 0 0', '1 1 0', '0 0 1', 0.5);
173         else if(included)
174                 draw_Fill('0 0 0', '1 1 0', '0 0 0', 0.5);
175
176         s = ftos(p);
177         draw_Picture(me.columnPreviewOrigin * eX, strcat("/maps/", MapInfo_Map_bspname), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);
178         if(included)
179                 draw_Picture(me.checkMarkOrigin, "checkmark", me.checkMarkSize, '1 1 1', 1);
180         s = draw_TextShortenToWidth(strcat(MapInfo_Map_bspname, ": ", MapInfo_Map_title), me.columnNameSize / me.realFontSize_x, 0);
181         draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0) * me.realFontSize_x)) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_TITLE, theAlpha, 0);
182         s = draw_TextShortenToWidth(MapInfo_Map_author, me.columnNameSize / me.realFontSize_x, 0);
183         draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 1.00 * (me.columnNameSize - draw_TextWidth(s, 0) * me.realFontSize_x)) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_AUTHOR, theAlpha, 0);
184 }
185
186 void refilterNexuizMapList(entity me)
187 {
188         float i, j, n;
189         string s;
190         float gt, f;
191         gt = MapInfo_CurrentGametype();
192         f = MapInfo_CurrentFeatures();
193         MapInfo_FilterGametype(gt, f, 0);
194         me.nItems = MapInfo_count;
195         for(i = 0; i < MapInfo_count; ++i)
196                 draw_PreloadPicture(strcat("/maps/", MapInfo_BSPName_ByID(i)));
197         if(me.g_maplistCache)
198                 strunzone(me.g_maplistCache);
199         s = "0";
200         for(i = 1; i < MapInfo_count; i *= 2)
201                 s = strcat(s, s);
202         n = tokenize(cvar_string("g_maplist"));
203         for(i = 0; i < n; ++i)
204         {
205                 j = MapInfo_FindName(argv(i));
206                 if(j >= 0)
207                         s = strcat(
208                                 substring(s, 0, j),
209                                 "1",
210                                 substring(s, j+1, MapInfo_count - (j+1))
211                         );
212         }
213         me.g_maplistCache = strzone(s);
214         if(gt != me.lastGametype || f != me.lastFeatures)
215         {
216                 me.lastGametype = gt;
217                 me.lastFeatures = f;
218                 me.setSelected(me, 0);
219         }
220 }
221 void MapList_All(entity btn, entity me)
222 {
223         float i;
224         string s;
225         MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0); // all
226         s = "";
227         for(i = 0; i < MapInfo_count; ++i)
228                 s = strcat(s, " ", MapInfo_BSPName_ByID(i));
229         cvar_set("g_maplist", substring(s, 1, strlen(s) - 1));
230         me.refilter(me);
231 }
232 void MapList_None(entity btn, entity me)
233 {
234         cvar_set("g_maplist", "");
235         me.refilter(me);
236 }
237 void MapList_LoadMap(entity btn, entity me)
238 {
239         string m;
240         if(me.selectedItem >= me.nItems || me.selectedItem < 0)
241                 return;
242         m = MapInfo_BSPName_ByID(me.selectedItem);
243         if not(m)
244                 return;
245         if(MapInfo_CheckMap(m))
246         {
247                 localcmd("\ndisconnect\nwait\nmaxplayers $menu_maxplayers\ng_maplist_shufflenow\n");
248                 MapInfo_LoadMap(m);
249         }
250         else
251         {
252                 print("Huh? Can't play this. Refiltering so this won't happen again.\n");
253                 me.refilter(me);
254         }
255 }
256 #endif