]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/voret/skinlist.c
Include gmqcc binaries for Windows and Linux
[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                 if(draw_PictureSize(strcat("/gfx/menu/", substring(s, 9, strlen(s) - 24), "/skinpreview")) == '0 0 0')\r
108                         bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_PREVIEW, "nopreview_menuskin");\r
109                 else\r
110                         bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_PREVIEW, strcat("/gfx/menu/", substring(s, 9, strlen(s) - 24), "/skinpreview"));\r
111                 fh = fopen(s, FILE_READ);\r
112                 if(fh < 0)\r
113                 {\r
114                         print("Warning: can't open skinvalues.txt file\n");\r
115                         continue;\r
116                 }\r
117                 while((s = fgets(fh)))\r
118                 {\r
119                         // these two are handled by skinlist.qc\r
120                         if(substring(s, 0, 6) == "title ")\r
121                                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_TITLE, substring(s, 6, strlen(s) - 6));\r
122                         else if(substring(s, 0, 7) == "author ")\r
123                                 bufstr_set(buf, i * SKINPARM_COUNT + SKINPARM_AUTHOR, substring(s, 7, strlen(s) - 7));\r
124                 }\r
125                 fclose(fh);\r
126         }\r
127 \r
128         search_end(glob);\r
129 \r
130         me.skinlist = buf;\r
131         me.nItems = n;\r
132 }\r
133 \r
134 void destroyVoretSkinList(entity me)\r
135 {\r
136         buf_del(me.skinlist);\r
137 }\r
138 \r
139 void resizeNotifyVoretSkinList(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)\r
140 {\r
141         me.itemAbsSize = '0 0 0';\r
142         resizeNotifyVoretListBox(me, relOrigin, relSize, absOrigin, absSize);\r
143 \r
144         me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight));\r
145         me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth)));\r
146         me.realUpperMargin1 = 0.5 * (1 - 2.5 * me.realFontSize_y);\r
147         me.realUpperMargin2 = me.realUpperMargin1 + 1.5 * me.realFontSize_y;\r
148 \r
149         me.columnPreviewOrigin = 0;\r
150         me.columnPreviewSize = me.itemAbsSize_y / me.itemAbsSize_x * 4 / 3;\r
151         me.columnNameOrigin = me.columnPreviewOrigin + me.columnPreviewSize + me.realFontSize_x;\r
152         me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize_x;\r
153 }\r
154 \r
155 void drawListBoxItemVoretSkinList(entity me, float i, vector absSize, float isSelected)\r
156 {\r
157         string s;\r
158         \r
159         if(isSelected)\r
160                 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);\r
161                 \r
162         s = me.skinParameter(me, i, SKINPARM_PREVIEW);\r
163         draw_Picture(me.columnPreviewOrigin * eX, s, me.columnPreviewSize * eX + eY, '1 1 1', 1);\r
164         \r
165         s = me.skinParameter(me, i, SKINPARM_NAME);\r
166         s = strcat(s, ": ", me.skinParameter(me, i, SKINPARM_TITLE));\r
167         s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize);\r
168         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
169 \r
170         s = me.skinParameter(me, i, SKINPARM_AUTHOR);\r
171         s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize);\r
172         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
173 }\r
174 \r
175 void setSkinVoretSkinList(entity me)\r
176 {\r
177         me.saveCvars(me);\r
178         localcmd("\nmenu_restart\ntogglemenu\ndefer 0.1 \"menu_cmd skinselect\"\n");\r
179 }\r
180 \r
181 void SetSkin_Click(entity btn, entity me)\r
182 {\r
183         me.setSkin(me);\r
184 }\r
185 \r
186 void clickListBoxItemVoretSkinList(entity me, float i, vector where)\r
187 {\r
188         if(i == me.lastClickedSkin)\r
189                 if(time < me.lastClickedTime + 0.3)\r
190                 {\r
191                         // DOUBLE CLICK!\r
192                         me.setSelected(me, i);\r
193                         me.setSkin(me);\r
194                 }\r
195         me.lastClickedSkin = i;\r
196         me.lastClickedTime = time;\r
197 }\r
198 \r
199 float keyDownVoretSkinList(entity me, float scan, float ascii, float shift)\r
200 {\r
201         if(scan == K_ENTER) {\r
202                 me.setSkin(me);\r
203                 return 1;\r
204         }\r
205         else\r
206                 return keyDownListBox(me, scan, ascii, shift);\r
207 }\r
208 #endif\r