]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/voret/maplist.c
Tweak the Effects menu, and add iris adaptation to it as well.
[voretournament/voretournament.git] / data / qcsrc / menu / voret / maplist.c
1 #ifdef INTERFACE\r
2 CLASS(VoretMapList) EXTENDS(VoretListBox)\r
3         METHOD(VoretMapList, configureVoretMapList, void(entity))\r
4         ATTRIB(VoretMapList, rowsPerItem, float, 4)\r
5         METHOD(VoretMapList, draw, void(entity))\r
6         METHOD(VoretMapList, drawListBoxItem, void(entity, float, vector, float))\r
7         METHOD(VoretMapList, clickListBoxItem, void(entity, float, vector))\r
8         METHOD(VoretMapList, resizeNotify, void(entity, vector, vector, vector, vector))\r
9         METHOD(VoretMapList, refilter, void(entity))\r
10         METHOD(VoretMapList, refilterCallback, void(entity, entity))\r
11         METHOD(VoretMapList, keyDown, float(entity, float, float, float))\r
12 \r
13         ATTRIB(VoretMapList, realFontSize, vector, '0 0 0')\r
14         ATTRIB(VoretMapList, columnPreviewOrigin, float, 0)\r
15         ATTRIB(VoretMapList, columnPreviewSize, float, 0)\r
16         ATTRIB(VoretMapList, columnNameOrigin, float, 0)\r
17         ATTRIB(VoretMapList, columnNameSize, float, 0)\r
18         ATTRIB(VoretMapList, checkMarkOrigin, vector, '0 0 0')\r
19         ATTRIB(VoretMapList, checkMarkSize, vector, '0 0 0')\r
20         ATTRIB(VoretMapList, realUpperMargin1, float, 0)\r
21         ATTRIB(VoretMapList, realUpperMargin2, float, 0)\r
22 \r
23         ATTRIB(VoretMapList, lastClickedMap, float, -1)\r
24         ATTRIB(VoretMapList, lastClickedTime, float, 0)\r
25 \r
26         ATTRIB(VoretMapList, lastGametype, float, 0)\r
27         ATTRIB(VoretMapList, lastFeatures, float, 0)\r
28 \r
29         ATTRIB(VoretMapList, origin, vector, '0 0 0')\r
30         ATTRIB(VoretMapList, itemAbsSize, vector, '0 0 0')\r
31 \r
32         ATTRIB(VoretMapList, g_maplistCache, string, string_null)\r
33         METHOD(VoretMapList, g_maplistCacheToggle, void(entity, float))\r
34         METHOD(VoretMapList, g_maplistCacheQuery, float(entity, float))\r
35 \r
36         ATTRIB(VoretMapList, startButton, entity, NULL)\r
37 \r
38         METHOD(VoretMapList, loadCvars, void(entity))\r
39 \r
40         ATTRIB(VoretMapList, typeToSearchString, string, string_null)\r
41         ATTRIB(VoretMapList, typeToSearchTime, float, 0)\r
42 \r
43         METHOD(VoretMapList, destroy, void(entity))\r
44 \r
45         ATTRIB(VoretListBox, alphaBG, float, 0)\r
46 ENDCLASS(VoretMapList)\r
47 entity makeVoretMapList();\r
48 void MapList_All(entity btn, entity me);\r
49 void MapList_None(entity btn, entity me);\r
50 void MapList_LoadMap(entity btn, entity me);\r
51 #endif\r
52 \r
53 #ifdef IMPLEMENTATION\r
54 void destroyVoretMapList(entity me)\r
55 {\r
56         MapInfo_Shutdown();\r
57 }\r
58 \r
59 entity makeVoretMapList()\r
60 {\r
61         entity me;\r
62         me = spawnVoretMapList();\r
63         me.configureVoretMapList(me);\r
64         return me;\r
65 }\r
66 \r
67 void configureVoretMapListVoretMapList(entity me)\r
68 {\r
69         me.configureVoretListBox(me);\r
70         me.refilter(me);\r
71 }\r
72 \r
73 void loadCvarsVoretMapList(entity me)\r
74 {\r
75         me.refilter(me);\r
76 }\r
77 \r
78 float g_maplistCacheQueryVoretMapList(entity me, float i)\r
79 {\r
80         return stof(substring(me.g_maplistCache, i, 1));\r
81 }\r
82 void g_maplistCacheToggleVoretMapList(entity me, float i)\r
83 {\r
84         string a, b, c, s, bspname;\r
85         float n;\r
86         s = me.g_maplistCache;\r
87         if not(s)\r
88                 return;\r
89         b = substring(s, i, 1);\r
90         if(b == "0")\r
91                 b = "1";\r
92         else if(b == "1")\r
93                 b = "0";\r
94         else\r
95                 return; // nothing happens\r
96         a = substring(s, 0, i);\r
97         c = substring(s, i+1, strlen(s) - (i+1));\r
98         strunzone(s);\r
99         me.g_maplistCache = strzone(strcat(a, b, c));\r
100         // TODO also update the actual cvar\r
101         if not((bspname = MapInfo_BSPName_ByID(i)))\r
102                 return;\r
103         if(b == "1")\r
104                 cvar_set("g_maplist", strcat(bspname, " ", cvar_string("g_maplist")));\r
105         else\r
106         {\r
107                 s = "";\r
108                 n = tokenize_console(cvar_string("g_maplist"));\r
109                 for(i = 0; i < n; ++i)\r
110                         if(argv(i) != bspname)\r
111                                 s = strcat(s, " ", argv(i));\r
112                 cvar_set("g_maplist", substring(s, 1, strlen(s) - 1));\r
113         }\r
114 }\r
115 \r
116 void drawVoretMapList(entity me)\r
117 {\r
118         if(me.startButton)\r
119                 me.startButton.disabled = ((me.selectedItem < 0) || (me.selectedItem >= me.nItems));\r
120         drawListBox(me);\r
121 }\r
122 \r
123 void resizeNotifyVoretMapList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)\r
124 {\r
125         me.itemAbsSize = '0 0 0';\r
126         resizeNotifyVoretListBox(me, relOrigin, relSize, absOrigin, absSize);\r
127 \r
128         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));\r
129         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));\r
130         me.realUpperMargin1 = 0.5 * (1 - 2.5 * me.realFontSize_y);\r
131         me.realUpperMargin2 = me.realUpperMargin1 + 1.5 * me.realFontSize_y;\r
132 \r
133         me.columnPreviewOrigin = 0;\r
134         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;\r
135         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;\r
136         me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x;\r
137 \r
138         me.checkMarkSize = (eX * (me.itemAbsSize_y / me.itemAbsSize_x) + eY) * 0.5;\r
139         me.checkMarkOrigin = eY + eX * (me.columnPreviewOrigin + me.columnPreviewSize) - me.checkMarkSize;\r
140 }\r
141 \r
142 void clickListBoxItemVoretMapList(entity me, float i, vector where)\r
143 {\r
144         if(where_x <= me.columnPreviewOrigin + me.columnPreviewSize)\r
145         {\r
146                 if(where_x >= 0)\r
147                         me.g_maplistCacheToggle(me, i);\r
148         }\r
149         if(where_x >= me.columnNameOrigin)\r
150                 if(where_x <= 1)\r
151                         {\r
152                                 if(i == me.lastClickedMap)\r
153                                         if(time < me.lastClickedTime + 0.3)\r
154                                         {\r
155                                                 // DOUBLE CLICK!\r
156                                                 // pop up map info screen\r
157                                                 main.mapInfoDialog.loadMapInfo(main.mapInfoDialog, i, me);\r
158                                                 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));\r
159                                                 return;\r
160                                         }\r
161                                 me.lastClickedMap = i;\r
162                                 me.lastClickedTime = time;\r
163                         }\r
164 }\r
165 \r
166 void drawListBoxItemVoretMapList(entity me, float i, vector absSize, float isSelected)\r
167 {\r
168         // layout: Ping, Map name, Map name, NP, TP, MP\r
169         string s;\r
170         float p;\r
171         float theAlpha;\r
172         float included;\r
173 \r
174         if(!MapInfo_Get_ByID(i))\r
175                 return;\r
176 \r
177         included = me.g_maplistCacheQuery(me, i);\r
178         if(included || isSelected)\r
179                 theAlpha = SKINALPHA_MAPLIST_INCLUDEDFG;\r
180         else\r
181                 theAlpha = SKINALPHA_MAPLIST_NOTINCLUDEDFG;\r
182 \r
183         if(isSelected)\r
184                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);\r
185         else if(included)\r
186                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_MAPLIST_INCLUDEDBG, SKINALPHA_MAPLIST_INCLUDEDBG);\r
187 \r
188         s = ftos(p);\r
189         draw_Picture(me.columnPreviewOrigin * eX, strcat("/maps/", MapInfo_Map_bspname), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);\r
190         if(included)\r
191                 draw_Picture(me.checkMarkOrigin, "checkmark", me.checkMarkSize, '1 1 1', 1);\r
192         s = draw_TextShortenToWidth(strcat(MapInfo_Map_bspname, ": ", MapInfo_Map_title), me.columnNameSize, 0, me.realFontSize);\r
193         draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_TITLE, theAlpha, 0);\r
194         s = draw_TextShortenToWidth(MapInfo_Map_author, me.columnNameSize, 0,  me.realFontSize);\r
195         draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 1.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_AUTHOR, theAlpha, 0);\r
196 \r
197         MapInfo_ClearTemps();\r
198 }\r
199 \r
200 void refilterVoretMapList(entity me)\r
201 {\r
202         float i, j, n;\r
203         string s;\r
204         float gt, f;\r
205         gt = MapInfo_CurrentGametype();\r
206         f = MapInfo_CurrentFeatures();\r
207         MapInfo_FilterGametype(gt, f, MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);\r
208         me.nItems = MapInfo_count;\r
209         for(i = 0; i < MapInfo_count; ++i)\r
210                 draw_PreloadPicture(strcat("/maps/", MapInfo_BSPName_ByID(i)));\r
211         if(me.g_maplistCache)\r
212                 strunzone(me.g_maplistCache);\r
213         s = "0";\r
214         for(i = 1; i < MapInfo_count; i *= 2)\r
215                 s = strcat(s, s);\r
216         n = tokenize_console(cvar_string("g_maplist"));\r
217         for(i = 0; i < n; ++i)\r
218         {\r
219                 j = MapInfo_FindName(argv(i));\r
220                 if(j >= 0)\r
221                         s = strcat(\r
222                                 substring(s, 0, j),\r
223                                 "1",\r
224                                 substring(s, j+1, MapInfo_count - (j+1))\r
225                         );\r
226         }\r
227         me.g_maplistCache = strzone(s);\r
228         if(gt != me.lastGametype || f != me.lastFeatures)\r
229         {\r
230                 me.lastGametype = gt;\r
231                 me.lastFeatures = f;\r
232                 me.setSelected(me, 0);\r
233         }\r
234 }\r
235 \r
236 void refilterCallbackVoretMapList(entity me, entity cb)\r
237 {\r
238         me.refilter(me);\r
239 }\r
240 \r
241 void MapList_All(entity btn, entity me)\r
242 {\r
243         float i;\r
244         string s;\r
245         MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MAPINFO_FLAG_FORBIDDEN, 0); // all\r
246         s = "";\r
247         for(i = 0; i < MapInfo_count; ++i)\r
248                 s = strcat(s, " ", MapInfo_BSPName_ByID(i));\r
249         cvar_set("g_maplist", substring(s, 1, strlen(s) - 1));\r
250         me.refilter(me);\r
251 }\r
252 \r
253 void MapList_None(entity btn, entity me)\r
254 {\r
255         cvar_set("g_maplist", "");\r
256         me.refilter(me);\r
257 }\r
258 \r
259 void MapList_LoadMap(entity btn, entity me)\r
260 {\r
261         string m;\r
262         float i;\r
263 \r
264         i = me.selectedItem;\r
265 \r
266         if(btn.parent.instanceOfVoretMapInfoDialog)\r
267         {\r
268                 i = btn.parent.currentMapIndex;\r
269                 Dialog_Close(btn, btn.parent);\r
270         }\r
271 \r
272         if(i >= me.nItems || i < 0)\r
273                 return;\r
274 \r
275         m = MapInfo_BSPName_ByID(i);\r
276         if not(m)\r
277         {\r
278                 print("Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n");\r
279                 return;\r
280         }\r
281         if(MapInfo_CheckMap(m))\r
282         {\r
283                 localcmd("\nmenu_loadmap_prepare\n");\r
284                 if(cvar("menu_use_default_hostname"))\r
285                         localcmd("hostname \"", strdecolorize(cvar_string("_cl_name")), "'s Voret server\"\n");\r
286                 MapInfo_LoadMap(m);\r
287         }\r
288         else\r
289         {\r
290                 print("Huh? Can't play this (invalid game type). Refiltering so this won't happen again.\n");\r
291                 me.refilter(me);\r
292         }\r
293 }\r
294 \r
295 float keyDownVoretMapList(entity me, float scan, float ascii, float shift)\r
296 {\r
297         string ch, save;\r
298         if(scan == K_ENTER)\r
299         {\r
300                 // pop up map info screen\r
301                 main.mapInfoDialog.loadMapInfo(main.mapInfoDialog, me.selectedItem, me);\r
302                 DialogOpenButton_Click_withCoords(NULL, main.mapInfoDialog, me.origin + eX * (me.columnNameOrigin * me.size_x) + eY * ((me.itemHeight * me.selectedItem - me.scrollPos) * me.size_y), eY * me.itemAbsSize_y + eX * (me.itemAbsSize_x * me.columnNameSize));\r
303         }\r
304         else if(scan == K_SPACE)\r
305         {\r
306                 me.g_maplistCacheToggle(me, me.selectedItem);\r
307         }\r
308         else if(ascii == 43) // +\r
309         {\r
310                 if not(me.g_maplistCacheQuery(me, me.selectedItem))\r
311                         me.g_maplistCacheToggle(me, me.selectedItem);\r
312         }\r
313         else if(ascii == 45) // -\r
314         {\r
315                 if(me.g_maplistCacheQuery(me, me.selectedItem))\r
316                         me.g_maplistCacheToggle(me, me.selectedItem);\r
317         }\r
318         else if(scan == K_BACKSPACE)\r
319         {\r
320                 if(time < me.typeToSearchTime)\r
321                 {\r
322                         save = substring(me.typeToSearchString, 0, strlen(me.typeToSearchString) - 1);\r
323                         if(me.typeToSearchString)\r
324                                 strunzone(me.typeToSearchString);\r
325                         me.typeToSearchString = strzone(save);\r
326                         me.typeToSearchTime = time + 0.5;\r
327                         if(strlen(me.typeToSearchString))\r
328                         {\r
329                                 MapInfo_FindName(me.typeToSearchString);\r
330                                 if(MapInfo_FindName_firstResult >= 0)\r
331                                         me.setSelected(me, MapInfo_FindName_firstResult);\r
332                         }\r
333                 }\r
334         }\r
335         else if(ascii >= 32 && ascii != 127)\r
336         {\r
337                 ch = chr(ascii);\r
338                 if(time > me.typeToSearchTime)\r
339                         save = ch;\r
340                 else\r
341                         save = strcat(me.typeToSearchString, ch);\r
342                 if(me.typeToSearchString)\r
343                         strunzone(me.typeToSearchString);\r
344                 me.typeToSearchString = strzone(save);\r
345                 me.typeToSearchTime = time + 0.5;\r
346                 MapInfo_FindName(me.typeToSearchString);\r
347                 if(MapInfo_FindName_firstResult >= 0)\r
348                         me.setSelected(me, MapInfo_FindName_firstResult);\r
349         }\r
350         else\r
351                 return keyDownListBox(me, scan, ascii, shift);\r
352         return 1;\r
353 }\r
354 \r
355 #endif\r