]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/voret/skinlist.c
Initial checkout of Vore Tournament 0.1.alpha.
[voretournament/voretournament.git] / data / qcsrc / menu / voret / skinlist.c
1 #ifdef INTERFACE\r
2 CLASS(VoretSkinList) EXTENDS(VoretListBox)\r
3         METHOD(VoretSkinList, configureVoretSkinList, void(entity))\r
4         ATTRIB(VoretSkinList, rowsPerItem, float, 4)\r
5         METHOD(VoretSkinList, resizeNotify, void(entity, vector, vector, vector, vector))\r
6         METHOD(VoretSkinList, drawListBoxItem, void(entity, float, vector, float))\r
7         METHOD(VoretSkinList, getSkins, void(entity))\r
8         METHOD(VoretSkinList, setSkin, void(entity))\r
9         METHOD(VoretSkinList, loadCvars, void(entity))\r
10         METHOD(VoretSkinList, saveCvars, void(entity))\r
11         METHOD(VoretSkinList, skinParameter, string(entity, float, float))\r
12         METHOD(VoretSkinList, clickListBoxItem, void(entity, float, vector))\r
13         METHOD(VoretSkinList, keyDown, float(entity, float, float, float))\r
14         METHOD(VoretSkinList, destroy, void(entity))\r
15 \r
16         ATTRIB(VoretSkinList, skinlist, float, -1)\r
17         ATTRIB(VoretSkinList, realFontSize, vector, '0 0 0')\r
18         ATTRIB(VoretSkinList, columnPreviewOrigin, float, 0)\r
19         ATTRIB(VoretSkinList, columnPreviewSize, float, 0)\r
20         ATTRIB(VoretSkinList, columnNameOrigin, float, 0)\r
21         ATTRIB(VoretSkinList, columnNameSize, float, 0)\r
22         ATTRIB(VoretSkinList, realUpperMargin1, float, 0)\r
23         ATTRIB(VoretSkinList, realUpperMargin2, float, 0)\r
24         ATTRIB(VoretSkinList, origin, vector, '0 0 0')\r
25         ATTRIB(VoretSkinList, itemAbsSize, vector, '0 0 0')\r
26 \r
27         ATTRIB(VoretSkinList, lastClickedSkin, float, -1)\r
28         ATTRIB(VoretSkinList, lastClickedTime, float, 0)\r
29 \r
30         ATTRIB(VoretSkinList, name, string, "skinselector")\r
31 ENDCLASS(VoretSkinList)\r
32 \r
33 entity makeVoretSkinList();\r
34 void SetSkin_Click(entity btn, entity me);\r
35 #endif\r
36 \r
37 #ifdef IMPLEMENTATION\r
38 \r
39 #define SKINPARM_NAME 0\r
40 #define SKINPARM_TITLE 1\r
41 #define SKINPARM_AUTHOR 2\r
42 #define SKINPARM_PREVIEW 3\r
43 #define SKINPARM_COUNT 4\r
44 \r
45 entity makeVoretSkinList()\r
46 {\r
47         entity me;\r
48         me = spawnVoretSkinList();\r
49         me.configureVoretSkinList(me);\r
50         return me;\r
51 }\r
52 \r
53 void configureVoretSkinListVoretSkinList(entity me)\r
54 {\r
55         me.configureVoretListBox(me);\r
56         me.getSkins(me);\r
57         me.loadCvars(me);\r
58 }\r
59 \r
60 void loadCvarsVoretSkinList(entity me)\r
61 {\r
62         string s;\r
63         float i, n;\r
64         s = cvar_string("menu_skin");\r
65         n = me.nItems;\r
66         for(i = 0; i < n; ++i)\r
67         {\r
68                 if(me.skinParameter(me, i, SKINPARM_NAME) == s)\r
69                 {\r
70                         me.selectedItem = i;\r
71                         break;\r
72                 }\r
73         }\r
74 }\r
75 \r
76 void saveCvarsVoretSkinList(entity me)\r
77 {\r
78         cvar_set("menu_skin", me.skinParameter(me, me.selectedItem, SKINPARM_NAME));\r
79 }\r
80 \r
81 string skinParameterVoretSkinList(entity me, float i, float key)\r
82 {\r
83         return bufstr_get(me.skinlist, i * SKINPARM_COUNT + key);\r
84 }\r
85 \r
86 void getSkinsVoretSkinList(entity me)\r
87 {\r
88         float glob, buf, i, n, fh;\r
89         string s;\r
90 \r
91         buf = buf_create();\r
92         glob = search_begin("gfx/menu/*/skinvalues.txt", TRUE, TRUE);\r
93         if(glob < 0)\r
94         {\r
95                 me.skinlist = buf;\r
96                 me.nItems = 0;\r
97                 return;\r
98         }\r
99 \r
100         n = search_getsize(glob);\r
101         for(i = 0; i < n; ++i)\r
102         {\r
103                 s = search_getfilename(glob, i);\r
104                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_NAME, substring(s, 9, strlen(s) - 24)); // the * part\r
105                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_TITLE, "<TITLE>");\r
106                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_AUTHOR, "<AUTHOR>");\r
107                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_PREVIEW, strcat("/gfx/menu/", substring(s, 9, strlen(s) - 24), "/skinpreview"));\r
108                 fh = fopen(s, FILE_READ);\r
109                 if(fh < 0)\r
110                 {\r
111                         print("Warning: can't open skinvalues.txt file\n");\r
112                         continue;\r
113                 }\r
114                 while((s = fgets(fh)))\r
115                 {\r
116                         // these two are handled by skinlist.qc\r
117                         if(substring(s, 0, 6) == "title ")\r
118                                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_TITLE, substring(s, 6, strlen(s) - 6));\r
119                         else if(substring(s, 0, 7) == "author ")\r
120                                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_AUTHOR, substring(s, 7, strlen(s) - 7));\r
121                 }\r
122                 fclose(fh);\r
123         }\r
124 \r
125         search_end(glob);\r
126 \r
127         me.skinlist = buf;\r
128         me.nItems = n;\r
129 }\r
130 \r
131 void destroyVoretSkinList(entity me)\r
132 {\r
133         buf_del(me.skinlist);\r
134 }\r
135 \r
136 void resizeNotifyVoretSkinList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)\r
137 {\r
138         me.itemAbsSize = '0 0 0';\r
139         resizeNotifyVoretListBox(me, relOrigin, relSize, absOrigin, absSize);\r
140 \r
141         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));\r
142         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));\r
143         me.realUpperMargin1 = 0.5 * (1 - 2.5 * me.realFontSize_y);\r
144         me.realUpperMargin2 = me.realUpperMargin1 + 1.5 * me.realFontSize_y;\r
145 \r
146         me.columnPreviewOrigin = 0;\r
147         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;\r
148         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;\r
149         me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x;\r
150 }\r
151 \r
152 void drawListBoxItemVoretSkinList(entity me, float i, vector absSize, float isSelected)\r
153 {\r
154         string s;\r
155         \r
156         if(isSelected)\r
157                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);\r
158                 \r
159         s = me.skinParameter(me, i, SKINPARM_PREVIEW);\r
160         draw_Picture(me.columnPreviewOrigin * eX, s, me.columnPreviewSize * eX + eY, '1 1 1', 1);\r
161         \r
162         s = me.skinParameter(me, i, SKINPARM_NAME);\r
163         s = strcat(s, ": ", me.skinParameter(me, i, SKINPARM_TITLE));\r
164         s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize);\r
165         draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_SKINLIST_TITLE, SKINALPHA_TEXT, 0);\r
166 \r
167         s = me.skinParameter(me, i, SKINPARM_AUTHOR);\r
168         s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize);\r
169         draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 1.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_SKINLIST_AUTHOR, SKINALPHA_TEXT, 0);\r
170 }\r
171 \r
172 void setSkinVoretSkinList(entity me)\r
173 {\r
174         me.saveCvars(me);\r
175         localcmd("\nmenu_restart\ntogglemenu\ndefer 0.1 \"menu_cmd skinselect\"\n");\r
176 }\r
177 \r
178 void SetSkin_Click(entity btn, entity me)\r
179 {\r
180         me.setSkin(me);\r
181 }\r
182 \r
183 void clickListBoxItemVoretSkinList(entity me, float i, vector where)\r
184 {\r
185         if(i == me.lastClickedSkin)\r
186                 if(time < me.lastClickedTime + 0.3)\r
187                 {\r
188                         // DOUBLE CLICK!\r
189                         me.setSelected(me, i);\r
190                         me.setSkin(me);\r
191                 }\r
192         me.lastClickedSkin = i;\r
193         me.lastClickedTime = time;\r
194 }\r
195 \r
196 float keyDownVoretSkinList(entity me, float scan, float ascii, float shift)\r
197 {\r
198         if(scan == K_ENTER) {\r
199                 me.setSkin(me);\r
200                 return 1;\r
201         }\r
202         else\r
203                 return keyDownListBox(me, scan, ascii, shift);\r
204 }\r
205 #endif\r