Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
hudskinlist.qc
Go to the documentation of this file.
1#include "hudskinlist.qh"
2
3#include "inputbox.qh"
4
6{
8 me.configureXonoticHUDSkinList(me);
9 return me;
10}
11
13{
14 me.configureXonoticListBox(me);
15 me.nItems = 0;
16}
17
18const float HUDSKINPARM_NAME = 0;
19const float HUDSKINPARM_PATH = 1;
20const float HUDSKINPARM_TITLE = 2;
21const float HUDSKINPARM_AUTHOR = 3;
22const float HUDSKINPARM_COUNT = 4;
24{
25 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_NAME);
26}
28{
29 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_PATH);
30}
32{
33 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_TITLE);
34}
36{
37 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_AUTHOR);
38}
39
40// subdir can be a regular expression
41void getHUDSkinFiles(entity me, int sortbuf, string subdir)
42{
43 string s;
44 if(me.filterString)
45 s = me.filterString;
46 else
47 s = "*";
48 s = strcat(subdir, "hud_", s, ".cfg");
49
50 int list = search_begin(s, false, true);
51 if(list >= 0)
52 {
53 int n = search_getsize(list);
54 for(int i = 0; i < n; ++i)
55 {
56 string s = search_getfilename(list, i);
57 int subdir_ofs = strstrofs(s, "/", 0);
58 if(subdir_ofs >= 0)
59 {
60 int ofs = subdir_ofs;
61 while(ofs != -1)
62 {
63 subdir_ofs = ofs;
64 ofs = strstrofs(s, "/", subdir_ofs + 1);
65 }
66 }
67
68 if(subdir_ofs == -1)
69 bufstr_add(sortbuf, s, true);
70 else
71 {
72 subdir = substring(s, 0, subdir_ofs);
73 string filename = substring(s, subdir_ofs + 1, -1);
74 // invert path and filename position so we can sort sortbuf by filename
75 bufstr_add(sortbuf, strcat(filename, "/", subdir), true);
76 }
77 }
78 search_end(list);
79 }
80}
81
82void getAllHUDSkins(entity me, int sortbuf)
83{
84 int n = buf_getsize(sortbuf);
85 for(int i = 0; i < n; ++i)
86 {
87 string entry = bufstr_get(sortbuf, i);
88 int ofs = strstrofs(entry, "/", 0);
89 string s = "";
90 string filename = entry;
91 if(ofs >= 0)
92 {
93 s = substring(entry, ofs + 1, -1); // skip initial "/"
94 s = strcat(s, "/");
95 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_PATH, s);
96 filename = strcat(s, substring(entry, 0, ofs));
97 }
98 else
99 ofs = strlen(entry);
100 s = substring(entry, 4, ofs - 4 - 4); // remove "hud_" prefix and ".cfg" suffix
101 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_NAME, s);
102
103 int fh = fopen(filename, FILE_READ);
104 if(fh < 0)
105 continue;
106 while((s = fgets(fh)) && substring(s, 0, 2) == "//")
107 {
108 tokenize_console(substring(s, 2, -1));
109 if(argv(0) == "title")
110 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_TITLE, argv(1));
111 else if(argv(0) == "author")
112 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_AUTHOR, argv(1));
113 }
114 fclose(fh);
115 }
116}
117
119{
120 if (me.listHUDSkin >= 0)
121 buf_del(me.listHUDSkin);
122 me.listHUDSkin = buf_create();
123 if (me.listHUDSkin < 0)
124 {
125 me.nItems = 0;
126 return;
127 }
128 int sortbuf = buf_create();
129 getHUDSkinFiles(me, sortbuf, "");
130 getHUDSkinFiles(me, sortbuf, "data/");
131 buf_sort(sortbuf, 128, 0);
132 getAllHUDSkins(me, sortbuf);
133 buf_del(sortbuf);
134 me.nItems = buf_getsize(me.listHUDSkin) / HUDSKINPARM_COUNT;
135}
136
138{
139 if(me.nItems > 0)
140 buf_del(me.listHUDSkin);
141}
142
143void XonoticHUDSkinList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
144{
145 me.itemAbsSize = '0 0 0';
146 SUPER(XonoticHUDSkinList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
147
148 me.itemAbsSize.y = absSize.y * me.itemHeight;
149 me.itemAbsSize.x = absSize.x * (1 - me.controlWidth);
150 me.realFontSize.y = me.fontSize / me.itemAbsSize.y;
151 me.realFontSize.x = me.fontSize / me.itemAbsSize.x;
152 me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
153
154 me.columnNameOrigin = me.realFontSize.x;
155 me.columnNameSize = 1 - 2 * me.realFontSize.x;
156}
157
158void XonoticHUDSkinList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
159{
160 string s, s2;
161 if(isSelected)
162 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
163 else if(isFocused)
164 {
165 me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED);
166 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha);
167 }
168
169 s = me.hudskinTitle(me, i);
170 if(s == "")
171 s = me.hudskinName(me, i);
172 s2 = me.hudskinAuthor(me, i);
173 if(s2 != "")
174 s = strcat(s, " (", s2, ")");
175 s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize);
176 draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_TEXT, SKINALPHA_TEXT, 1);
177}
178
180{
181 me.getHUDSkins(me);
182}
183
185{
186 me.getHUDSkins(me);
187 me.setSelected(me, 0); //always select the first element after a list update
188}
189
191{
192 strfree(me.savedName);
193
194 if(box.text != "")
195 me.savedName = strzone(box.text);
196}
197
199{
200 strfree(me.filterString);
201
202 if(box.text != "")
203 {
204 if (strstrofs(box.text, "*", 0) >= 0 || strstrofs(box.text, "?", 0) >= 0)
205 me.filterString = strzone(box.text);
206 else
207 me.filterString = strzone(strcat("*", box.text, "*"));
208 }
209
210 me.getHUDSkins(me);
211}
212
214{
215 string s = me.savedName;
216 if(s == "")
217 s = "myconfig";
218 localcmd(sprintf("hud save \"%s\"\n", s));
219 me.delayedRefreshTime = time + 1;
220}
221
223{
224 if(me.delayedRefreshTime > 0 && me.delayedRefreshTime < time)
225 {
227 me.delayedRefreshTime = 0;
228 }
229 SUPER(XonoticHUDSkinList).draw(me);
230}
231
233{
234 string cfg = strcat(me.hudskinPath(me, me.selectedItem), "hud_", me.hudskinName(me, me.selectedItem), ".cfg");
235 localcmd("exec \"", cfg, "\"\n");
236}
237
239{
240 me.setHUDSkin(me);
241}
242
244{
246 me.setHUDSkin(me);
247}
248
249float XonoticHUDSkinList_keyDown(entity me, float scan, float ascii, float shift)
250{
251 if(scan == K_ENTER || scan == K_KP_ENTER)
252 {
253 me.setHUDSkin(me);
254 return 1;
255 }
256 else
257 {
258 return SUPER(XonoticHUDSkinList).keyDown(me, scan, ascii, shift);
259 }
260}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
const float FILE_READ
float time
#define strstrofs
#define strlen
#define tokenize_console
#define buf_create
void SetHUDSkin_Click(entity btn, entity me)
void SaveHUDSkin_Click(entity btn, entity me)
entity makeXonoticHUDSkinList()
Definition hudskinlist.qc:5
const float HUDSKINPARM_TITLE
void XonoticHUDSkinList_setHUDSkin(entity me)
void HUDSkinList_Filter_Change(entity box, entity me)
string XonoticHUDSkinList_hudskinAuthor(entity me, float i)
void getHUDSkinFiles(entity me, int sortbuf, string subdir)
void XonoticHUDSkinList_showNotify(entity me)
const float HUDSKINPARM_PATH
void XonoticHUDSkinList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
string XonoticHUDSkinList_hudskinPath(entity me, float i)
void XonoticHUDSkinList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
const float HUDSKINPARM_AUTHOR
const float HUDSKINPARM_NAME
float XonoticHUDSkinList_keyDown(entity me, float scan, float ascii, float shift)
void XonoticHUDSkinList_destroy(entity me)
void XonoticHUDSkinList_configureXonoticHUDSkinList(entity me)
string XonoticHUDSkinList_hudskinTitle(entity me, float i)
void getAllHUDSkins(entity me, int sortbuf)
string XonoticHUDSkinList_hudskinName(entity me, float i)
const float HUDSKINPARM_COUNT
void HUDSkinList_SavedName_Change(entity box, entity me)
void HUDSkinList_Refresh_Click(entity btn, entity me)
void XonoticHUDSkinList_getHUDSkins(entity me)
void XonoticHUDSkinList_draw(entity me)
void XonoticHUDSkinList_doubleClickListBoxItem(entity me, float i, vector where)
float K_ENTER
Definition keycodes.qc:8
float K_KP_ENTER
Definition keycodes.qc:74
string draw_TextShortenToWidth(string theText, float maxWidth, float ICanHasKallerz, vector SizeThxBye)
Definition draw.qc:378
void draw_Text(vector theOrigin, string theText, vector theSize, vector theColor, float theAlpha, float ICanHasKallerz)
Definition draw.qc:282
float draw_TextWidth(string theText, float ICanHasKallerz, vector SizeThxBye)
Definition draw.qc:304
void draw_Fill(vector theOrigin, vector theSize, vector theColor, float theAlpha)
Definition draw.qc:97
float getFadedAlpha(float currentAlpha, float startAlpha, float targetAlpha)
Definition util.qc:816
void m_play_click_sound(string soundfile)
Definition menu.qc:1111
const string MENU_SOUND_EXECUTE
Definition menu.qh:51
void localcmd(string command,...)
string fgets(float fhandle)
void fclose(float fhandle)
string substring(string s, float start, float length)
float fopen(string filename, float mode)
string search_getfilename(float handle, float num)
float search_getsize(float handle)
float search_begin(string pattern, float caseinsensitive, float quiet)
string strzone(string s)
string argv(float n)
void search_end(float handle)
spree_inf s1 s2 s3loc s2 spree_inf s1 s2 s3loc s2 spree_inf s1 s2 s3loc s2 s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2loc s1 s2 f1points s1 s2
Definition all.inc:471
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define NEW(cname,...)
Definition oo.qh:117
#define SUPER(cname)
Definition oo.qh:231
#define NULL
Definition post.qh:14
vector
Definition self.qh:92
#define strfree(this)
Definition string.qh:59
const vector eY
Definition vector.qh:45
const vector eX
Definition vector.qh:44