TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
miscscreens.cpp
Go to the documentation of this file.
1/***************************************************************************
2
3 file : miscscreens.cpp
4 created : Sun Dec 8 13:01:47 CET 2002
5 copyright : (C) 2000-2026 by Eric Espié, Bernhard Wymann
6 email : berniw@bluewin.ch
7
8 ***************************************************************************/
9
10/***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18
23
24#include <stdio.h>
25#include <tgfclient.h>
26#include <robot.h>
27
28#include <racescreens.h>
29#include <portability.h>
30
31static void *twoStateHdle = 0;
32static void *triStateHdle = 0;
33static void *fourStateHdle = 0;
34static void *nStateHandle = 0;
35
36
49 const char *title,
50 const char *label1, const char *tip1, void *screen1,
51 const char *label2, const char *tip2, void *screen2)
52{
53 if (twoStateHdle) {
55 }
56
58 GfuiScreenAddBgImg(twoStateHdle, "data/img/splash-quit.png");
59 GfuiMenuButtonCreateAction(twoStateHdle, label1, tip1, [screen1] { GfuiScreenActivate(screen1); });
60 GfuiMenuButtonCreateAction(twoStateHdle, label2, tip2, [screen2] { GfuiScreenActivate(screen2); });
61 GfuiAddKeyAction(twoStateHdle, 27, tip2, [screen2] { GfuiScreenActivate(screen2); }, tGfuiAction());
63
64 return twoStateHdle;
65}
66
67
83 const char *title,
84 const char *label1, const char *tip1, void *screen1,
85 const char *label2, const char *tip2, void *screen2,
86 const char *label3, const char *tip3, void *screen3)
87{
88 if (triStateHdle) {
90 }
91
93 GfuiScreenAddBgImg(triStateHdle, "data/img/splash-quit.png");
94 GfuiMenuButtonCreateAction(triStateHdle, label1, tip1, [screen1] { GfuiScreenActivate(screen1); });
95 GfuiMenuButtonCreateAction(triStateHdle, label2, tip2, [screen2] { GfuiScreenActivate(screen2); });
96 GfuiMenuButtonCreateAction(triStateHdle, label3, tip3, [screen3] { GfuiScreenActivate(screen3); });
97 GfuiAddKeyAction(triStateHdle, 27, tip3, [screen3] { GfuiScreenActivate(screen3); }, tGfuiAction());
99
100 return triStateHdle;
101}
102
103
122 const char *title,
123 const char *label1, const char *tip1, void *screen1,
124 const char *label2, const char *tip2, void *screen2,
125 const char *label3, const char *tip3, void *screen3,
126 const char *label4, const char *tip4, void *screen4)
127{
128 if (fourStateHdle) {
130 }
131
133 GfuiScreenAddBgImg(fourStateHdle, "data/img/splash-quit.png");
134 GfuiMenuButtonCreateAction(fourStateHdle, label1, tip1, [screen1] { GfuiScreenActivate(screen1); });
135 GfuiMenuButtonCreateAction(fourStateHdle, label2, tip2, [screen2] { GfuiScreenActivate(screen2); });
136 GfuiMenuButtonCreateAction(fourStateHdle, label3, tip3, [screen3] { GfuiScreenActivate(screen3); });
137 GfuiMenuButtonCreateAction(fourStateHdle, label4, tip4, [screen4] { GfuiScreenActivate(screen4); });
138 GfuiAddKeyAction(fourStateHdle, 27, tip4, [screen4] { GfuiScreenActivate(screen4); }, tGfuiAction());
140
141 return fourStateHdle;
142}
143
144
155 const char *title,
156 const char** label,
157 const char** tip,
158 void** screen,
159 const int n
160)
161{
162 if (nStateHandle) {
164 }
165
167 GfuiScreenAddBgImg(nStateHandle, "data/img/splash-quit.png");
168
169 int i;
170 for (i = 0; i < n; i++) {
171 void *target = screen[i];
172 GfuiMenuButtonCreateAction(nStateHandle, label[i], tip[i], [target] { GfuiScreenActivate(target); });
173 }
174
175 void *backTarget = screen[n-1];
176 GfuiAddKeyAction(nStateHandle, 27, tip[n-1], [backTarget] { GfuiScreenActivate(backTarget); }, tGfuiAction());
178
179 return nStateHandle;
180}
181
182
183/*********************************************************
184 * Start screen
185 */
186
187#define MAX_LINES 20
188
189typedef struct
190{
191 void *startScr;
192 void *abortScr;
194 int start;
196
198static void *rmScrHdle = 0;
199
200static void rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start);
201
202static void
204{
205 void *prevScr = rmScrHdle;
206
207 rmDisplayStartRace(psrc->info, psrc->startScr, psrc->abortScr, psrc->start);
208 GfuiScreenRelease(prevScr);
209}
210
211static void
212rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
213{
214 const int BUFSIZE = 1024;
215 char path[BUFSIZE];
216 int nCars;
217 int i;
218 int y;
219 int x, dx;
220 int rows, curRow;
221 int robotIdx;
222 void *robhdle;
223 void *carHdle;
224 void *params = info->params;
225 const char *race = info->_reRaceName;
226
228 GfuiTitleCreate(rmScrHdle, race, strlen(race));
229
230 const char* img = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_STARTIMG, 0);
231 if (img) {
233 }
234
235 if (!strcmp(GfParmGetStr(params, race, RM_ATTR_DISP_START_GRID, RM_VAL_YES), RM_VAL_YES)) {
236 GfuiLabelCreate(rmScrHdle, "Starting Grid", GFUI_FONT_MEDIUM_C, 320, 420, GFUI_ALIGN_HC_VB, 0);
237 snprintf(path, BUFSIZE, "%s/%s", race, RM_SECT_STARTINGGRID);
238 rows = (int)GfParmGetNum(params, path, RM_ATTR_ROWS, (char*)NULL, 2);
239
240 dx = 0;
241 x = 40;
242 y = 400;
243 curRow = 0;
244 nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS_RACING);
245
246 for (i = start; i < MIN(start + MAX_LINES, nCars); i++) {
247 /* Find starting driver's name */
248 snprintf(path, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i + 1);
249 const char* name = GfParmGetStr(info->params, path, RM_ATTR_MODULE, "");
250 robotIdx = (int)GfParmGetNum(info->params, path, RM_ATTR_IDX, NULL, 0);
251
252 snprintf(path, BUFSIZE, "%sdrivers/%s/%s.xml", GetLocalDir(), name, name);
253 robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
254 if (!robhdle) {
255 snprintf(path, BUFSIZE, "drivers/%s/%s.xml", name, name);
256 robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
257 }
258
259 if (robhdle) {
260 snprintf(path, BUFSIZE, "%s/%s/%d", ROB_SECT_ROBOTS, ROB_LIST_INDEX, robotIdx);
261 name = GfParmGetStr(robhdle, path, ROB_ATTR_NAME, "<none>");
262 const char* carName = GfParmGetStr(robhdle, path, ROB_ATTR_CAR, "");
263
264 snprintf(path, BUFSIZE, "cars/%s/%s.xml", carName, carName);
265 carHdle = GfParmReadFile(path, GFPARM_RMODE_STD);
266 carName = GfParmGetName(carHdle);
267
268 snprintf(path, BUFSIZE, "%d - %s - (%s)", i + 1, name, carName);
270 x + curRow * dx, y, GFUI_ALIGN_HL_VB, 0);
271
272 GfParmReleaseHandle(carHdle);
273 GfParmReleaseHandle(robhdle);
274 }
275 curRow = (curRow + 1) % rows;
276 y -= 15;
277 }
278
279
280 if (start > 0) {
281 prevStartRace.startScr = startScr;
282 prevStartRace.abortScr = abortScr;
283 prevStartRace.info = info;
284 prevStartRace.start = start - MAX_LINES;
285 GfuiGrButtonCreateAction(rmScrHdle, "data/img/arrow-up.png", "data/img/arrow-up.png",
286 "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
287 80, 40, GFUI_ALIGN_HL_VB, 1,
289 GfuiAddSKeyAction(rmScrHdle, GLUT_KEY_PAGE_UP, "Previous drivers", [] { rmChgStartScreen(&prevStartRace); }, tGfuiAction());
290 }
291
292 if (i < nCars) {
293 nextStartRace.startScr = startScr;
294 nextStartRace.abortScr = abortScr;
295 nextStartRace.info = info;
296 nextStartRace.start = start + MAX_LINES;
297 GfuiGrButtonCreateAction(rmScrHdle, "data/img/arrow-down.png", "data/img/arrow-down.png",
298 "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
299 540, 40, GFUI_ALIGN_HL_VB, 1,
301 GfuiAddSKeyAction(rmScrHdle, GLUT_KEY_PAGE_DOWN, "Next Drivers", [] { rmChgStartScreen(&nextStartRace); }, tGfuiAction());
302 }
303 }
304
306 "Start",
308 210,
309 40,
310 150,
312 0,
313 [startScr] { GfuiScreenReplace(startScr); },
314 tGfuiAction(),
315 tGfuiAction());
316 GfuiAddKeyAction(rmScrHdle, (unsigned char)13, "Start", [startScr] { GfuiScreenReplace(startScr); }, tGfuiAction());
317
319 "Abandon",
321 430,
322 40,
323 150,
325 0,
326 [abortScr] { GfuiScreenReplace(abortScr); },
327 tGfuiAction(),
328 tGfuiAction());
329 GfuiAddKeyAction(rmScrHdle, (unsigned char)27, "Abandon", [abortScr] { GfuiScreenReplace(abortScr); }, tGfuiAction());
330
331 GfuiAddSKeyAction(rmScrHdle, GLUT_KEY_F12, "Take a Screen Shot", [] { GfuiScreenShot(NULL); }, tGfuiAction());
332
334}
335
336
337void
338RmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr)
339{
340 rmDisplayStartRace(info, startScr, abortScr, 0);
341}
static Vector y[4]
Definition Convex.cpp:56
int GfuiMenuButtonCreateAction(void *scr, const char *text, const char *tip, const tGfuiAction &onpush)
Add a menu button with a focus tip.
Definition guimenu.cpp:165
void GfuiScreenRelease(void *scr)
Release the given screen.
Definition gui.cpp:670
int GfuiTitleCreate(void *scr, const char *text, int maxlen)
Add a Title to the screen.
Definition guilabel.cpp:150
void GfuiAddKeyAction(void *scr, unsigned char key, const char *descr, const tGfuiAction &onKeyPressed, const tGfuiAction &onKeyReleased)
Add a Keyboard callback to a screen.
Definition gui.cpp:809
void GfuiScreenAddBgImg(void *scr, const char *filename)
Add an image background to a screen.
Definition gui.cpp:1058
void * GfuiMenuScreenCreate(const char *title)
Create a new menu screen.
Definition guimenu.cpp:77
void GfuiAddSKeyAction(void *scr, int key, const char *descr, const tGfuiAction &onKeyPressed, const tGfuiAction &onKeyReleased)
Add a Special Keyboard shortcut to the screen.
Definition gui.cpp:895
void GfuiScreenReplace(void *screen)
Activate a screen and make it current plus release the current screen.
Definition gui.cpp:549
int GfuiLabelCreate(void *scr, const char *text, int font, int x, int y, int align, int maxlen)
Add a label to a screen.
Definition guilabel.cpp:121
int GfuiGrButtonCreateAction(void *scr, const char *disabled, const char *enabled, const char *focused, const char *pushed, int x, int y, int align, int mouse, const tGfuiAction &onPush, const tGfuiAction &onFocus, const tGfuiAction &onFocusLost)
Add a graphical button to a screen.
Definition guibutton.cpp:58
void * GfuiScreenCreate(void)
Create a new screen.
Definition gui.cpp:588
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
Definition gui.cpp:508
int GfuiButtonCreateAction(void *scr, const char *text, int font, int x, int y, int width, int align, int mouse, const tGfuiAction &onPush, const tGfuiAction &onFocus, const tGfuiAction &onFocusLost)
Add a button to a screen.
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
Definition params.cpp:2453
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
Definition params.cpp:2534
char * GfParmGetName(void *handle)
Get the name property of the parameter set handle.
Definition params.cpp:2192
void GfParmReleaseHandle(void *parmHandle)
Release given parameter set handle parmHandle.
Definition params.cpp:1963
void * GfParmReadFile(const char *file, int mode)
Read parameter set from file and return handle to parameter set.
Definition params.cpp:1173
int GfParmGetEltNb(void *handle, const char *path)
Count the number of subsections in a section in the parameter set handle.
Definition params.cpp:2243
void * RmFourStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2, const char *label3, const char *tip3, void *screen3, const char *label4, const char *tip4, void *screen4)
Screen with 4 menu options (buttons)
void * RmNStateScreen(const char *title, const char **label, const char **tip, void **screen, const int n)
Screen with N menu options (buttons)
void * RmTriStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2, const char *label3, const char *tip3, void *screen3)
Screen with 3 menu options (buttons)
void * RmTwoStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2)
Screen with 2 menu options (buttons)
void GfuiScreenShot(void *)
Save a screen shot in png format.
Definition gui.cpp:998
#define MAX_LINES
static void rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
static void * twoStateHdle
static void * nStateHandle
static tStartRaceCall nextStartRace
static tStartRaceCall prevStartRace
static void * triStateHdle
static void * fourStateHdle
static void * rmScrHdle
void RmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr)
static void rmChgStartScreen(tStartRaceCall *psrc)
struct RmInfo tRmInfo
Race Manager General Info.
#define RM_VAL_YES
Definition raceman.h:315
#define RM_ATTR_MODULE
Definition raceman.h:266
#define RM_ATTR_STARTIMG
Definition raceman.h:264
#define RM_ATTR_IDX
Definition raceman.h:267
#define RM_SECT_STARTINGGRID
Definition raceman.h:238
#define RM_ATTR_ROWS
Definition raceman.h:275
#define RM_SECT_HEADER
Definition raceman.h:236
#define RM_SECT_DRIVERS_RACING
Definition raceman.h:245
#define RM_ATTR_DISP_START_GRID
Definition raceman.h:251
#define ROB_ATTR_CAR
Definition robot.h:128
#define ROB_ATTR_NAME
Definition robot.h:124
#define ROB_SECT_ROBOTS
Definition robot.h:120
#define ROB_LIST_INDEX
Definition robot.h:122
void * params
Raceman parameters.
Definition raceman.h:224
char * GetLocalDir(void)
Definition tgf.cpp:230
#define GFPARM_RMODE_STD
Return a new handle sharing cached data for this filename, if available.
Definition tgf.h:264
#define MIN(x, y)
Definition tgf.h:56
#define GFUI_FONT_LARGE
Definition tgfclient.h:248
#define GFUI_FONT_MEDIUM_C
Definition tgfclient.h:253
#define GFUI_ALIGN_HL_VB
Definition tgfclient.h:71
std::function< void()> tGfuiAction
Definition tgfclient.h:107
#define GFUI_ALIGN_HC_VB
Definition tgfclient.h:74