Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
languagelist.qc
Go to the documentation of this file.
1#include "languagelist.qh"
2
4#include "mainwindow.qh"
5
6const int LANGPARM_ID = 0;
7const int LANGPARM_NAME = 1;
9const int LANGPARM_PERCENTAGE = 3;
10const int LANGPARM_COUNT = 4;
11
12const string PERCENTAGE_FULL_ICON = "/gfx/scoreboard/player_ready";
13
15{
17 me.configureXonoticLanguageList(me);
18 return me;
19}
20
22{
23 me.configureXonoticListBox(me);
24 me.getLanguages(me);
25 me.loadCvars(me);
26}
27
28void XonoticLanguageList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
29{
30 if(isSelected)
31 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
32 else if(isFocused)
33 {
34 me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED);
35 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha);
36 }
37
38 string p = me.languageParameter(me, i, LANGPARM_PERCENTAGE);
39 float alpha_factor;
40 if(p == "") // 100%
41 alpha_factor = 1;
42 else
43 {
44 float percent = stof(p);
45 if (percent >= 90)
46 alpha_factor = 1;
47 else if (percent >= 50)
48 alpha_factor = 0.65;
49 else
50 alpha_factor = 0.3;
51 p = ftos_decimals_percentage(percent / 100, 0); // make it translatable
52 }
53
54 string s = me.languageParameter(me, i, LANGPARM_NAME_LOCALIZED);
55
56 vector save_fontscale = draw_fontscale;
57 float f = draw_CondensedFontFactor(s, false, me.realFontSize, 1);
58 draw_fontscale.x *= f;
59 vector fs = me.realFontSize;
60 fs.x *= f;
61 draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, fs, SKINCOLOR_TEXT * alpha_factor, SKINALPHA_TEXT, 0);
62 draw_fontscale = save_fontscale;
63
64 if(p == "")
65 {
66 float x_ofs = me.columnPercentageOrigin + (me.columnPercentageSize - me.columnIconSize);
67 draw_Picture(me.realUpperMargin * eY + x_ofs * eX, PERCENTAGE_FULL_ICON, me.columnIconSize * eX + eY, '1 1 1', SKINALPHA_LISTBOX_SELECTED);
68 }
69 else
70 {
71 vector save_fontscale = draw_fontscale;
72 float f = draw_CondensedFontFactor(p, false, me.realFontSize, 1);
73 draw_fontscale.x *= f;
74 vector fs = me.realFontSize;
75 fs.x *= f;
76 float x_ofs = me.columnPercentageOrigin + (me.columnPercentageSize - draw_TextWidth(p, 0, fs));
77 draw_Text(me.realUpperMargin * eY + x_ofs * eX, p, fs, SKINCOLOR_TEXT, SKINALPHA_TEXT * alpha_factor, 0);
78 draw_fontscale = save_fontscale;
79 }
80}
81
82void XonoticLanguageList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
83{
84 SUPER(XonoticLanguageList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
85
86 me.itemAbsSize.y = absSize.y * me.itemHeight;
87 me.itemAbsSize.x = absSize.x * (1 - me.controlWidth);
88 me.realFontSize.y = me.fontSize / (absSize.y * me.itemHeight);
89 me.realFontSize.x = me.fontSize / (absSize.x * (1 - me.controlWidth));
90 me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
91
93 float aspect_ratio = sz.y ? sz.x / sz.y : 1;
94 me.columnIconSize = me.itemAbsSize.y / me.itemAbsSize.x * aspect_ratio;
95
96 me.columnPercentageSize = me.realFontSize.x * 3;
97 me.columnPercentageOrigin = 1 - me.columnPercentageSize - 0.5 * me.realFontSize.x;
98 me.columnNameOrigin = 0.5 * me.realFontSize.x;
99 me.columnNameSize = me.columnPercentageOrigin - me.columnNameOrigin;
100}
101
103{
104 SUPER(XonoticLanguageList).setSelected(me, i);
105 me.saveCvars(me);
106}
107
109{
110 string s;
111 float i, n;
112 s = cvar_string("_menu_prvm_language");
113 n = me.nItems;
114
115 // default to English
116 for(i = 0; i < n; ++i)
117 {
118 if(me.languageParameter(me, i, LANGPARM_ID) == "en")
119 {
120 SUPER(XonoticLanguageList).setSelected(me, i);
121 break;
122 }
123 }
124
125 // otherwise, find the language
126 for(i = 0; i < n; ++i)
127 {
128 if(me.languageParameter(me, i, LANGPARM_ID) == s)
129 {
130 SUPER(XonoticLanguageList).setSelected(me, i);
131 break;
132 }
133 }
134
135 // save it off (turning anything unknown into "en")
136 me.saveCvars(me);
137}
138
140{
141 cvar_set("_menu_prvm_language", me.languageParameter(me, me.selectedItem, LANGPARM_ID));
142}
143
145{
147 me.setLanguage(me);
148}
149
150float XonoticLanguageList_keyDown(entity me, float scan, float ascii, float shift)
151{
152 if(scan == K_ENTER || scan == K_KP_ENTER)
153 {
155 me.setLanguage(me);
156 return 1;
157 }
158 else
159 return SUPER(XonoticLanguageList).keyDown(me, scan, ascii, shift);
160}
161
163{
164 buf_del(me.languagelist);
165}
166
168{
169 float buf, i, n, fh;
170 string s;
171
172 buf = buf_create();
173
174 fh = fopen("languages.txt", FILE_READ);
175 i = 0;
176 while((s = fgets(fh)))
177 {
178 n = tokenize_console(s);
179 if(n < 3)
180 continue;
181 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_ID, argv(0));
182 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME, argv(1));
183 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME_LOCALIZED, argv(2));
184 string percent = argv(3);
185 if(percent && percent != "100%")
186 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_PERCENTAGE, percent);
187 ++i;
188 }
189 fclose(fh);
190
191 me.languagelist = buf;
192 me.nItems = i;
193}
194
196{
197 if(prvm_language != cvar_string("_menu_prvm_language"))
198 {
200 localcmd("\nprvm_language \"$_menu_prvm_language\"; menu_restart; menu_cmd languageselect\n");
201 else
202 DialogOpenButton_Click(me, main.languageWarningDialog);
203 }
204}
205
206string XonoticLanguageList_languageParameter(entity me, float i, float key)
207{
208 return bufstr_get(me.languagelist, i * LANGPARM_COUNT + key);
209}
210
212{
213 me.setLanguage(me);
214}
215
217{
218 if (me.focusedItem >= 0)
219 setZonedTooltip(me, me.languageParameter(me, me.focusedItem, LANGPARM_NAME), string_null);
220 else
221 clearTooltip(me);
222}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
const float FILE_READ
#define tokenize_console
#define buf_create
string prvm_language
Definition i18n.qh:8
float K_ENTER
Definition keycodes.qc:8
float K_KP_ENTER
Definition keycodes.qc:74
void XonoticLanguageList_getLanguages(entity me)
void XonoticLanguageList_focusedItemChangeNotify(entity me)
float XonoticLanguageList_keyDown(entity me, float scan, float ascii, float shift)
void SetLanguage_Click(entity btn, entity me)
const string PERCENTAGE_FULL_ICON
const int LANGPARM_NAME
void XonoticLanguageList_configureXonoticLanguageList(entity me)
void XonoticLanguageList_doubleClickListBoxItem(entity me, float i, vector where)
void XonoticLanguageList_destroy(entity me)
entity makeXonoticLanguageList()
void XonoticLanguageList_setSelected(entity me, float i)
void XonoticLanguageList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
void XonoticLanguageList_setLanguage(entity me)
void XonoticLanguageList_saveCvars(entity me)
const int LANGPARM_ID
void XonoticLanguageList_loadCvars(entity me)
const int LANGPARM_COUNT
const int LANGPARM_PERCENTAGE
string XonoticLanguageList_languageParameter(entity me, float i, float key)
const int LANGPARM_NAME_LOCALIZED
void XonoticLanguageList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
#define main
Definition _all.inc:202
void draw_Picture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha)
Definition draw.qc:72
float draw_CondensedFontFactor(string theText, float ICanHasKallerz, vector SizeThxBye, float maxWidth)
Definition draw.qc:317
void draw_Text(vector theOrigin, string theText, vector theSize, vector theColor, float theAlpha, float ICanHasKallerz)
Definition draw.qc:282
vector draw_PictureSize(string pic)
Definition draw.qc:80
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
#define draw_fontscale
Definition draw.qh:5
float getFadedAlpha(float currentAlpha, float startAlpha, float targetAlpha)
Definition util.qc:816
void clearTooltip(entity e)
Definition util.qc:277
void setZonedTooltip(entity e, string theTooltip, string theCvar)
Definition util.qc:257
void m_play_click_sound(string soundfile)
Definition menu.qc:1111
const int GAME_CONNECTED
Definition menu.qh:12
int gamestatus
Definition menu.qh:16
const string MENU_SOUND_EXECUTE
Definition menu.qh:51
void localcmd(string command,...)
void cvar_set(string name, string value)
string fgets(float fhandle)
void fclose(float fhandle)
float stof(string val,...)
float fopen(string filename, float mode)
const string cvar_string(string name)
string argv(float n)
void DialogOpenButton_Click(entity button, entity tab)
string string_null
Definition nil.qh:9
#define NEW(cname,...)
Definition oo.qh:117
#define SUPER(cname)
Definition oo.qh:231
vector
Definition self.qh:92
ERASEABLE string ftos_decimals_percentage(float number, int decimals)
converts a percentage to a string with the indicated number of decimals
Definition string.qh:480
const vector eY
Definition vector.qh:45
const vector eX
Definition vector.qh:44