]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/voret/credits.c
Optimize menu code for my last change
[voretournament/voretournament.git] / data / qcsrc / menu / voret / credits.c
1 #ifdef INTERFACE\r
2 CLASS(VoretCreditsList) EXTENDS(VoretListBox)\r
3         METHOD(VoretCreditsList, configureVoretCreditsList, void(entity))\r
4         ATTRIB(VoretCreditsList, rowsPerItem, float, 1)\r
5         METHOD(VoretCreditsList, draw, void(entity))\r
6         METHOD(VoretCreditsList, drawListBoxItem, void(entity, float, vector, float))\r
7         METHOD(VoretCreditsList, resizeNotify, void(entity, vector, vector, vector, vector))\r
8         METHOD(VoretCreditsList, keyDown, float(entity, float, float, float))\r
9         METHOD(VoretCreditsList, destroy, void(entity))\r
10 \r
11         ATTRIB(VoretCreditsList, realFontSize, vector, '0 0 0')\r
12         ATTRIB(VoretCreditsList, realUpperMargin, float, 0)\r
13         ATTRIB(VoretCreditsList, bufferIndex, float, 0)\r
14         ATTRIB(VoretCreditsList, scrolling, float, 0)\r
15 \r
16         ATTRIB(VoretListBox, alphaBG, float, 0)\r
17 ENDCLASS(VoretCreditsList)\r
18 entity makeVoretCreditsList();\r
19 #endif\r
20 \r
21 #ifdef IMPLEMENTATION\r
22 entity makeVoretCreditsList()\r
23 {\r
24         entity me;\r
25         me = spawnVoretCreditsList();\r
26         me.configureVoretCreditsList(me);\r
27         return me;\r
28 }\r
29 void configureVoretCreditsListVoretCreditsList(entity me)\r
30 {\r
31         me.configureVoretListBox(me);\r
32         // load the file\r
33         me.bufferIndex = buf_load("voretournament-credits.txt");\r
34         me.nItems = buf_getsize(me.bufferIndex);\r
35 }\r
36 void destroyVoretCreditsList(entity me)\r
37 {\r
38         buf_del(me.bufferIndex);\r
39 }\r
40 void drawVoretCreditsList(entity me)\r
41 {\r
42         float i;\r
43         if(me.scrolling)\r
44         {\r
45                 me.scrollPos = bound(0, (time - me.scrolling) * me.itemHeight, me.nItems * me.itemHeight - 1);\r
46                 i = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));\r
47                 i = max(i, ceil(me.scrollPos / me.itemHeight));\r
48                 me.setSelected(me, i);\r
49         }\r
50         drawListBox(me);\r
51 }\r
52 void resizeNotifyVoretCreditsList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)\r
53 {\r
54         resizeNotifyVoretListBox(me, relOrigin, relSize, absOrigin, absSize);\r
55 \r
56         me.realFontSize_y = me.fontSize / (absSize_y * me.itemHeight);\r
57         me.realFontSize_x = me.fontSize / (absSize_x * (1 - me.controlWidth));\r
58         me.realUpperMargin = 0.5 * (1 - me.realFontSize_y);\r
59 }\r
60 void drawListBoxItemVoretCreditsList(entity me, float i, vector absSize, float isSelected)\r
61 {\r
62         // layout: Ping, Credits name, Map name, NP, TP, MP\r
63         string s;\r
64         float theAlpha;\r
65         vector theColor;\r
66 \r
67         s = bufstr_get(me.bufferIndex, i);\r
68 \r
69         if(substring(s, 0, 2) == "**")\r
70         {\r
71                 s = substring(s, 2, strlen(s) - 2);\r
72                 theColor = SKINCOLOR_CREDITS_TITLE;\r
73                 theAlpha = SKINALPHA_CREDITS_TITLE;\r
74         }\r
75         else if(substring(s, 0, 1) == "*")\r
76         {\r
77                 s = substring(s, 1, strlen(s) - 1);\r
78                 theColor = SKINCOLOR_CREDITS_FUNCTION;\r
79                 theAlpha = SKINALPHA_CREDITS_FUNCTION;\r
80         }\r
81         else\r
82         {\r
83                 theColor = SKINCOLOR_CREDITS_PERSON;\r
84                 theAlpha = SKINALPHA_CREDITS_PERSON;\r
85         }\r
86 \r
87         draw_CenterText(me.realUpperMargin * eY + 0.5 * eX, s, me.realFontSize, theColor, theAlpha, 0);\r
88 }\r
89 \r
90 float keyDownVoretCreditsList(entity me, float scan, float ascii, float shift)\r
91 {\r
92         float i;\r
93         me.dragScrollTimer = time;\r
94         me.scrolling = 0;\r
95 \r
96         if(scan == K_PGUP)\r
97                 me.scrollPos = max(me.scrollPos - 0.5, 0);\r
98         else if(scan == K_PGDN)\r
99                 me.scrollPos = min(me.scrollPos + 0.5, me.nItems * me.itemHeight - 1);\r
100         else if(scan == K_UPARROW)\r
101                 me.scrollPos = max(me.scrollPos - me.itemHeight, 0);\r
102         else if(scan == K_DOWNARROW)\r
103                 me.scrollPos = min(me.scrollPos + me.itemHeight, me.nItems * me.itemHeight - 1);\r
104         else\r
105                 return keyDownListBox(me, scan, ascii, shift);\r
106 \r
107         i = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));\r
108         i = max(i, ceil(me.scrollPos / me.itemHeight));\r
109         me.setSelected(me, i);\r
110 \r
111         return 1;\r
112 }\r
113 #endif\r