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{
7 entity me;
9 me.configureXonoticHUDSkinList(me);
10 return me;
11}
12
14{
15 me.configureXonoticListBox(me);
16 me.nItems = 0;
17}
18
19const float HUDSKINPARM_NAME = 0;
20const float HUDSKINPARM_PATH = 1;
21const float HUDSKINPARM_TITLE = 2;
22const float HUDSKINPARM_AUTHOR = 3;
23const float HUDSKINPARM_COUNT = 4;
25{
26 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_NAME);
27}
29{
30 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_PATH);
31}
33{
34 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_TITLE);
35}
37{
38 return bufstr_get(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_AUTHOR);
39}
40
41// subdir can be a regular expression
42void getHUDSkinFiles(entity me, int sortbuf, string subdir)
43{
44 string s;
45 if(me.filterString)
46 s = me.filterString;
47 else
48 s = "*";
49 s = strcat(subdir, "hud_", s, ".cfg");
50
51 int list = search_begin(s, false, true);
52 if(list >= 0)
53 {
54 int n = search_getsize(list);
55 for(int i = 0; i < n; ++i)
56 {
57 string s = search_getfilename(list, i);
58 int subdir_ofs = strstrofs(s, "/", 0);
59 if(subdir_ofs >= 0)
60 {
61 int ofs = subdir_ofs;
62 while(ofs != -1)
63 {
64 subdir_ofs = ofs;
65 ofs = strstrofs(s, "/", subdir_ofs + 1);
66 }
67 }
68
69 if(subdir_ofs == -1)
70 bufstr_add(sortbuf, s, true);
71 else
72 {
73 subdir = substring(s, 0, subdir_ofs);
74 string filename = substring(s, subdir_ofs + 1, -1);
75 // invert path and filename position so we can sort sortbuf by filename
76 bufstr_add(sortbuf, strcat(filename, "/", subdir), true);
77 }
78 }
79 search_end(list);
80 }
81}
82
83void getAllHUDSkins(entity me, int sortbuf)
84{
85 int n = buf_getsize(sortbuf);
86 for(int i = 0; i < n; ++i)
87 {
88 string entry = bufstr_get(sortbuf, i);
89 int ofs = strstrofs(entry, "/", 0);
90 string s = "";
91 string filename = entry;
92 if(ofs >= 0)
93 {
94 s = substring(entry, ofs + 1, -1); // skip initial "/"
95 s = strcat(s, "/");
96 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_PATH, s);
97 filename = strcat(s, substring(entry, 0, ofs));
98 }
99 else
100 ofs = strlen(entry);
101 s = substring(entry, 4, ofs - 4 - 4); // remove "hud_" prefix and ".cfg" suffix
102 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_NAME, s);
103
104 int fh = fopen(filename, FILE_READ);
105 if(fh < 0)
106 continue;
107 while((s = fgets(fh)) && substring(s, 0, 2) == "//")
108 {
109 tokenize_console(substring(s, 2, -1));
110 if(argv(0) == "title")
111 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_TITLE, argv(1));
112 else if(argv(0) == "author")
113 bufstr_set(me.listHUDSkin, i * HUDSKINPARM_COUNT + HUDSKINPARM_AUTHOR, argv(1));
114 }
115 fclose(fh);
116 }
117}
118
120{
121 if (me.listHUDSkin >= 0)
122 buf_del(me.listHUDSkin);
123 me.listHUDSkin = buf_create();
124 if (me.listHUDSkin < 0)
125 {
126 me.nItems = 0;
127 return;
128 }
129 int sortbuf = buf_create();
130 getHUDSkinFiles(me, sortbuf, "");
131 getHUDSkinFiles(me, sortbuf, "data/");
132 buf_sort(sortbuf, 128, 0);
133 getAllHUDSkins(me, sortbuf);
134 buf_del(sortbuf);
135 me.nItems = buf_getsize(me.listHUDSkin) / HUDSKINPARM_COUNT;
136}
137
139{
140 if(me.nItems > 0)
141 buf_del(me.listHUDSkin);
142}
143
144void XonoticHUDSkinList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
145{
146 me.itemAbsSize = '0 0 0';
147 SUPER(XonoticHUDSkinList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
148
149 me.itemAbsSize.y = absSize.y * me.itemHeight;
150 me.itemAbsSize.x = absSize.x * (1 - me.controlWidth);
151 me.realFontSize.y = me.fontSize / me.itemAbsSize.y;
152 me.realFontSize.x = me.fontSize / me.itemAbsSize.x;
153 me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
154
155 me.columnNameOrigin = me.realFontSize.x;
156 me.columnNameSize = 1 - 2 * me.realFontSize.x;
157}
158
159void XonoticHUDSkinList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
160{
161 string s, s2;
162 if(isSelected)
163 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
164 else if(isFocused)
165 {
166 me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED);
167 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha);
168 }
169
170 s = me.hudskinTitle(me, i);
171 if(s == "")
172 s = me.hudskinName(me, i);
173 s2 = me.hudskinAuthor(me, i);
174 if(s2 != "")
175 s = strcat(s, " (", s2, ")");
176 s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize);
177 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);
178}
179
181{
182 me.getHUDSkins(me);
183}
184
186{
187 me.getHUDSkins(me);
188 me.setSelected(me, 0); //always select the first element after a list update
189}
190
192{
193 strfree(me.savedName);
194
195 if(box.text != "")
196 me.savedName = strzone(box.text);
197}
198
200{
201 strfree(me.filterString);
202
203 if(box.text != "")
204 {
205 if (strstrofs(box.text, "*", 0) >= 0 || strstrofs(box.text, "?", 0) >= 0)
206 me.filterString = strzone(box.text);
207 else
208 me.filterString = strzone(strcat("*", box.text, "*"));
209 }
210
211 me.getHUDSkins(me);
212}
213
215{
216 string s = me.savedName;
217 if(s == "")
218 s = "myconfig";
219 localcmd(sprintf("hud save \"%s\"\n", s));
220 me.delayedRefreshTime = time + 1;
221}
222
224{
225 if(me.delayedRefreshTime > 0 && me.delayedRefreshTime < time)
226 {
228 me.delayedRefreshTime = 0;
229 }
230 SUPER(XonoticHUDSkinList).draw(me);
231}
232
234{
235 string cfg = strcat(me.hudskinPath(me, me.selectedItem), "hud_", me.hudskinName(me, me.selectedItem), ".cfg");
236 localcmd("exec \"", cfg, "\"\n");
237}
238
240{
241 me.setHUDSkin(me);
242}
243
245{
247 me.setHUDSkin(me);
248}
249
250float XonoticHUDSkinList_keyDown(entity me, float scan, float ascii, float shift)
251{
252 if(scan == K_ENTER || scan == K_KP_ENTER)
253 {
254 me.setHUDSkin(me);
255 return 1;
256 }
257 else
258 {
259 return SUPER(XonoticHUDSkinList).keyDown(me, scan, ascii, shift);
260 }
261}
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:377
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:1106
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:469
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