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{
16 entity me;
18 me.configureXonoticLanguageList(me);
19 return me;
20}
21
23{
24 me.configureXonoticListBox(me);
25 me.getLanguages(me);
26 me.loadCvars(me);
27}
28
29void XonoticLanguageList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
30{
31 if(isSelected)
32 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
33 else if(isFocused)
34 {
35 me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED);
36 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha);
37 }
38
39 string p = me.languageParameter(me, i, LANGPARM_PERCENTAGE);
40 float alpha_factor;
41 if(p == "") // 100%
42 alpha_factor = 1;
43 else
44 {
45 float percent = stof(p);
46 if (percent >= 90)
47 alpha_factor = 1;
48 else if (percent >= 50)
49 alpha_factor = 0.65;
50 else
51 alpha_factor = 0.3;
52 p = ftos_decimals_percentage(percent / 100, 0); // make it translatable
53 }
54
55 string s = me.languageParameter(me, i, LANGPARM_NAME_LOCALIZED);
56
57 vector save_fontscale = draw_fontscale;
58 float f = draw_CondensedFontFactor(s, false, me.realFontSize, 1);
59 draw_fontscale.x *= f;
60 vector fs = me.realFontSize;
61 fs.x *= f;
62 draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, fs, SKINCOLOR_TEXT * alpha_factor, SKINALPHA_TEXT, 0);
63 draw_fontscale = save_fontscale;
64
65 if(p == "")
66 {
67 float x_ofs = me.columnPercentageOrigin + (me.columnPercentageSize - me.columnIconSize);
68 draw_Picture(me.realUpperMargin * eY + x_ofs * eX, PERCENTAGE_FULL_ICON, me.columnIconSize * eX + eY, '1 1 1', SKINALPHA_LISTBOX_SELECTED);
69 }
70 else
71 {
72 vector save_fontscale = draw_fontscale;
73 float f = draw_CondensedFontFactor(p, false, me.realFontSize, 1);
74 draw_fontscale.x *= f;
75 vector fs = me.realFontSize;
76 fs.x *= f;
77 float x_ofs = me.columnPercentageOrigin + (me.columnPercentageSize - draw_TextWidth(p, 0, fs));
78 draw_Text(me.realUpperMargin * eY + x_ofs * eX, p, fs, SKINCOLOR_TEXT, SKINALPHA_TEXT * alpha_factor, 0);
79 draw_fontscale = save_fontscale;
80 }
81}
82
83void XonoticLanguageList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
84{
85 SUPER(XonoticLanguageList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
86
87 me.itemAbsSize.y = absSize.y * me.itemHeight;
88 me.itemAbsSize.x = absSize.x * (1 - me.controlWidth);
89 me.realFontSize.y = me.fontSize / (absSize.y * me.itemHeight);
90 me.realFontSize.x = me.fontSize / (absSize.x * (1 - me.controlWidth));
91 me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
92
94 float aspect_ratio = sz.y ? sz.x / sz.y : 1;
95 me.columnIconSize = me.itemAbsSize.y / me.itemAbsSize.x * aspect_ratio;
96
97 me.columnPercentageSize = me.realFontSize.x * 3;
98 me.columnPercentageOrigin = 1 - me.columnPercentageSize - 0.5 * me.realFontSize.x;
99 me.columnNameOrigin = 0.5 * me.realFontSize.x;
100 me.columnNameSize = me.columnPercentageOrigin - me.columnNameOrigin;
101}
102
104{
105 SUPER(XonoticLanguageList).setSelected(me, i);
106 me.saveCvars(me);
107}
108
110{
111 string s;
112 float i, n;
113 s = cvar_string("_menu_prvm_language");
114 n = me.nItems;
115
116 // default to English
117 for(i = 0; i < n; ++i)
118 {
119 if(me.languageParameter(me, i, LANGPARM_ID) == "en")
120 {
121 SUPER(XonoticLanguageList).setSelected(me, i);
122 break;
123 }
124 }
125
126 // otherwise, find the language
127 for(i = 0; i < n; ++i)
128 {
129 if(me.languageParameter(me, i, LANGPARM_ID) == s)
130 {
131 SUPER(XonoticLanguageList).setSelected(me, i);
132 break;
133 }
134 }
135
136 // save it off (turning anything unknown into "en")
137 me.saveCvars(me);
138}
139
141{
142 cvar_set("_menu_prvm_language", me.languageParameter(me, me.selectedItem, LANGPARM_ID));
143}
144
146{
148 me.setLanguage(me);
149}
150
151float XonoticLanguageList_keyDown(entity me, float scan, float ascii, float shift)
152{
153 if(scan == K_ENTER || scan == K_KP_ENTER)
154 {
156 me.setLanguage(me);
157 return 1;
158 }
159 else
160 return SUPER(XonoticLanguageList).keyDown(me, scan, ascii, shift);
161}
162
164{
165 buf_del(me.languagelist);
166}
167
169{
170 float buf, i, n, fh;
171 string s;
172
173 buf = buf_create();
174
175 fh = fopen("languages.txt", FILE_READ);
176 i = 0;
177 while((s = fgets(fh)))
178 {
179 n = tokenize_console(s);
180 if(n < 3)
181 continue;
182 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_ID, argv(0));
183 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME, argv(1));
184 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_NAME_LOCALIZED, argv(2));
185 string percent = argv(3);
186 if(percent && percent != "100%")
187 bufstr_set(buf, i * LANGPARM_COUNT + LANGPARM_PERCENTAGE, percent);
188 ++i;
189 }
190 fclose(fh);
191
192 me.languagelist = buf;
193 me.nItems = i;
194}
195
197{
198 if(prvm_language != cvar_string("_menu_prvm_language"))
199 {
201 localcmd("\nprvm_language \"$_menu_prvm_language\"; menu_restart; menu_cmd languageselect\n");
202 else
203 DialogOpenButton_Click(me, main.languageWarningDialog);
204 }
205}
206
207string XonoticLanguageList_languageParameter(entity me, float i, float key)
208{
209 return bufstr_get(me.languagelist, i * LANGPARM_COUNT + key);
210}
211
213{
214 me.setLanguage(me);
215}
216
218{
219 if (me.focusedItem >= 0)
220 setZonedTooltip(me, me.languageParameter(me, me.focusedItem, LANGPARM_NAME), string_null);
221 else
222 clearTooltip(me);
223}
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:316
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:1106
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