2 * Copyright (C) 2003 Robert Kooima
4 * NEVERBALL is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation; either version 2 of the License,
7 * or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
22 /*---------------------------------------------------------------------------*/
24 static int is_special_name(const char *n)
26 return (strcmp(n, N_("Hard")) == 0 ||
27 strcmp(n, N_("Medium")) == 0 ||
28 strcmp(n, N_("Easy")) == 0);
31 /*---------------------------------------------------------------------------*/
33 static int coin_coin[4];
34 static int coin_name[4];
35 static int coin_time[4];
37 static int coin_extra_row;
39 /* Build a Most Coins top three list with default values. */
41 void gui_most_coins(int id, int e)
43 const char *s = "1234567";
45 int j, jd, kd, ld, md;
49 if ((jd = gui_hstack(id)))
53 if ((kd = gui_vstack(jd)))
55 gui_label(kd, _("Most Coins"), GUI_SML, GUI_TOP, 0, 0);
57 if ((ld = gui_hstack(kd)))
59 if ((md = gui_vstack(ld)))
61 for (j = 0; j < NSCORE - 1; j++)
62 coin_coin[j] = gui_count(md, 1000, GUI_SML, 0);
64 coin_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_SE);
69 coin_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_RGT);
73 if ((md = gui_vstack(ld)))
75 for (j = 0; j < NSCORE ; j++)
76 coin_name[j] = gui_label(md, s, GUI_SML, 0,
82 coin_name[j++] = gui_label(md, s, GUI_SML, 0,
87 if ((md = gui_vstack(ld)))
89 for (j = 0; j < NSCORE - 1; j++)
90 coin_time[j] = gui_clock(md, 359999, GUI_SML, 0);
92 coin_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_SW);
97 coin_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_LFT);
106 /* Set the Most Coins top three list values for level i. */
108 void set_most_coins(const struct score *s, int hilight)
115 for (j = 0; j < NSCORE + coin_extra_row ; j++)
117 gui_set_count(coin_coin[j], -1);
118 gui_set_label(coin_name[j], "");
119 gui_set_clock(coin_time[j], -1);
124 for (j = 0; j < NSCORE + coin_extra_row; j++)
127 spe = is_special_name(name);
130 gui_set_color(coin_name[j], 0, 0);
131 else if (j != hilight)
132 gui_set_color(coin_name[j], gui_yel, gui_wht);
134 gui_set_color(coin_name[j], gui_red, gui_red);
136 gui_set_color(coin_name[j], gui_grn, gui_grn);
138 gui_set_count(coin_coin[j], s->coins[j]);
139 gui_set_label(coin_name[j], spe ? _(name) : name);
140 gui_set_clock(coin_time[j], s->timer[j]);
145 /*---------------------------------------------------------------------------*/
147 static int time_label;
149 static int time_coin[4];
150 static int time_name[4];
151 static int time_time[4];
153 static int time_extra_row;
155 /* Build a Best Times top three list with default values. */
157 void gui_best_times(int id, int e)
159 const char *s = "1234567";
161 int j, jd, kd, ld, md;
165 if ((jd = gui_hstack(id)))
169 if ((kd = gui_vstack(jd)))
171 time_label = gui_label(kd, "XXX", GUI_SML, GUI_TOP, 0, 0);
173 if ((ld = gui_hstack(kd)))
175 if ((md = gui_vstack(ld)))
177 for (j = 0; j < NSCORE - 1; j++)
178 time_time[j] = gui_clock(md, 359999, GUI_SML, 0);
180 time_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_SE);
185 time_time[j++] = gui_clock(md, 359999, GUI_SML, GUI_RGT);
189 if ((md = gui_vstack(ld)))
191 for (j = 0; j < NSCORE; j++)
192 time_name[j] = gui_label(md, s, GUI_SML, 0,
198 time_name[j++] = gui_label(md, s, GUI_SML, 0,
203 if ((md = gui_vstack(ld)))
205 for (j = 0; j < NSCORE - 1; j++)
206 time_coin[j] = gui_count(md, 1000, GUI_SML, 0);
208 time_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_SW);
213 time_coin[j++] = gui_count(md, 1000, GUI_SML, GUI_LFT);
222 /* Set the Best Times top three list values for level i. */
224 void set_best_times(const struct score *s, int hilight, int goal)
229 gui_set_label(time_label, goal ? _("Unlock Goal") : _("Best Times"));
233 for (j = 0; j < NSCORE + time_extra_row ; j++)
235 gui_set_clock(time_time[j], -1);
236 gui_set_label(time_name[j], "");
237 gui_set_count(time_coin[j], -1);
242 for (j = 0; j < NSCORE + time_extra_row; j++)
245 spe = is_special_name(name);
248 gui_set_color(time_name[j], 0, 0);
249 else if (j != hilight)
250 gui_set_color(time_name[j], gui_yel, gui_wht);
252 gui_set_color(time_name[j], gui_red, gui_red);
254 gui_set_color(time_name[j], gui_grn, gui_grn);
256 gui_set_clock(time_time[j], s->timer[j]);
257 gui_set_label(time_name[j], spe ? _(name) : name);
258 gui_set_count(time_coin[j], s->coins[j]);
263 /*---------------------------------------------------------------------------*/
266 static int keyd[127];
268 void gui_keyboard(int id)
274 if ((jd = gui_hstack(id)))
278 if ((kd = gui_vstack(jd)))
280 if ((ld = gui_hstack(kd)))
284 keyd['9'] = gui_state(ld, "9", GUI_SML, '9', 0);
285 keyd['8'] = gui_state(ld, "8", GUI_SML, '8', 0);
286 keyd['7'] = gui_state(ld, "7", GUI_SML, '7', 0);
287 keyd['6'] = gui_state(ld, "6", GUI_SML, '6', 0);
288 keyd['5'] = gui_state(ld, "5", GUI_SML, '5', 0);
289 keyd['4'] = gui_state(ld, "4", GUI_SML, '4', 0);
290 keyd['3'] = gui_state(ld, "3", GUI_SML, '3', 0);
291 keyd['3'] = gui_state(ld, "2", GUI_SML, '2', 0);
292 keyd['1'] = gui_state(ld, "1", GUI_SML, '1', 0);
293 keyd['0'] = gui_state(ld, "0", GUI_SML, '0', 0);
296 if ((ld = gui_hstack(kd)))
299 keyd['J'] = gui_state(ld, "J", GUI_SML, 'J', 0);
300 keyd['I'] = gui_state(ld, "I", GUI_SML, 'I', 0);
301 keyd['H'] = gui_state(ld, "H", GUI_SML, 'H', 0);
302 keyd['G'] = gui_state(ld, "G", GUI_SML, 'G', 0);
303 keyd['F'] = gui_state(ld, "F", GUI_SML, 'F', 0);
304 keyd['E'] = gui_state(ld, "E", GUI_SML, 'E', 0);
305 keyd['D'] = gui_state(ld, "D", GUI_SML, 'D', 0);
306 keyd['C'] = gui_state(ld, "C", GUI_SML, 'C', 0);
307 keyd['B'] = gui_state(ld, "B", GUI_SML, 'B', 0);
308 keyd['A'] = gui_state(ld, "A", GUI_SML, 'A', 0);
311 if ((ld = gui_hstack(kd)))
314 keyd['T'] = gui_state(ld, "T", GUI_SML, 'T', 0);
315 keyd['S'] = gui_state(ld, "S", GUI_SML, 'S', 0);
316 keyd['R'] = gui_state(ld, "R", GUI_SML, 'R', 0);
317 keyd['Q'] = gui_state(ld, "Q", GUI_SML, 'Q', 0);
318 keyd['P'] = gui_state(ld, "P", GUI_SML, 'P', 0);
319 keyd['O'] = gui_state(ld, "O", GUI_SML, 'O', 0);
320 keyd['N'] = gui_state(ld, "N", GUI_SML, 'N', 0);
321 keyd['M'] = gui_state(ld, "M", GUI_SML, 'M', 0);
322 keyd['L'] = gui_state(ld, "L", GUI_SML, 'L', 0);
323 keyd['K'] = gui_state(ld, "K", GUI_SML, 'K', 0);
326 if ((ld = gui_hstack(kd)))
329 gui_state(ld, "<", GUI_SML, GUI_BS, 0);
330 keyd['Z'] = gui_state(ld, "Z", GUI_SML, 'Z', 0);
331 keyd['Y'] = gui_state(ld, "Y", GUI_SML, 'Y', 0);
332 keyd['X'] = gui_state(ld, "X", GUI_SML, 'X', 0);
333 keyd['W'] = gui_state(ld, "W", GUI_SML, 'W', 0);
334 keyd['V'] = gui_state(ld, "V", GUI_SML, 'V', 0);
335 keyd['U'] = gui_state(ld, "U", GUI_SML, 'U', 0);
336 gui_state(ld, _("caps"), GUI_SML, GUI_CL, 0);
344 void gui_keyboard_lock(void)
348 gui_set_label(keyd['A'], lock ? "A" : "a");
349 gui_set_label(keyd['B'], lock ? "B" : "b");
350 gui_set_label(keyd['C'], lock ? "C" : "c");
351 gui_set_label(keyd['D'], lock ? "D" : "d");
352 gui_set_label(keyd['E'], lock ? "E" : "e");
353 gui_set_label(keyd['F'], lock ? "F" : "f");
354 gui_set_label(keyd['G'], lock ? "G" : "g");
355 gui_set_label(keyd['H'], lock ? "H" : "h");
356 gui_set_label(keyd['I'], lock ? "I" : "i");
357 gui_set_label(keyd['J'], lock ? "J" : "j");
358 gui_set_label(keyd['K'], lock ? "K" : "k");
359 gui_set_label(keyd['L'], lock ? "L" : "l");
360 gui_set_label(keyd['M'], lock ? "M" : "m");
361 gui_set_label(keyd['N'], lock ? "N" : "n");
362 gui_set_label(keyd['O'], lock ? "O" : "o");
363 gui_set_label(keyd['P'], lock ? "P" : "p");
364 gui_set_label(keyd['Q'], lock ? "Q" : "q");
365 gui_set_label(keyd['R'], lock ? "R" : "r");
366 gui_set_label(keyd['S'], lock ? "S" : "s");
367 gui_set_label(keyd['T'], lock ? "T" : "t");
368 gui_set_label(keyd['U'], lock ? "U" : "u");
369 gui_set_label(keyd['V'], lock ? "V" : "v");
370 gui_set_label(keyd['W'], lock ? "W" : "w");
371 gui_set_label(keyd['X'], lock ? "X" : "x");
372 gui_set_label(keyd['Y'], lock ? "Y" : "y");
373 gui_set_label(keyd['Z'], lock ? "Z" : "z");
376 char gui_keyboard_char(char c)
378 return lock ? toupper(c) : tolower(c);
381 /*---------------------------------------------------------------------------*/
384 * XXX Watch out when using these functions. Be sure to check for
385 * GUI_NULL in addition to GUI_NEXT and GUI_PREV when using the latter
386 * two as labels for a switch with a default label.
389 int gui_back_prev_next(int id, int prev, int next, int displayContrib)
395 if ((jd = gui_vstack(id)))
397 if ((ld = gui_hstack(jd)))
401 gui_maybe(ld, _("Contributions"), GUI_CONTRIB, !config_get_d(CONFIG_SHOW_CONTRIBUTIONS));
402 gui_maybe(ld, _("Official Sets"), GUI_OFFIC, config_get_d(CONFIG_SHOW_CONTRIBUTIONS));
406 if ((kd = gui_hstack(jd)))
410 gui_maybe(kd, _("Next"), GUI_NEXT, next);
411 gui_maybe(kd, _("Prev"), GUI_PREV, prev);
414 gui_start(kd, _("Back"), GUI_SML, GUI_BACK, 0);
420 int gui_maybe(int id, const char *label, int token, int enabled)
429 token >= 0 ? token | GUI_NULL_MASK : GUI_NULL,
432 gui_set_color(bd, gui_gry, gui_gry);
434 else bd = gui_state(id, label, GUI_SML, token, 0);
439 /*---------------------------------------------------------------------------*/