1 /***************************************************************************
2 
3     file                 : racemenu.cpp
4     created              : Thu May  2 22:02:51 CEST 2002
5     copyright            : (C) 2001-2014 by Eric Espie, Bernhard Wymann
6     email                : eric.espie@torcs.org
7     version              : $Id: racemenu.cpp,v 1.2.2.4 2014/05/20 11:02:18 berniw Exp $
8 
9  ***************************************************************************/
10 
11 /***************************************************************************
12  *                                                                         *
13  *   This program is free software; you can redistribute it and/or modify  *
14  *   it under the terms of the GNU General Public License as published by  *
15  *   the Free Software Foundation; either version 2 of the License, or     *
16  *   (at your option) any later version.                                   *
17  *                                                                         *
18  ***************************************************************************/
19 
20 /** @file
21     Race options menu.
22     @author Bernhard Wymann, Eric Espie
23     @version $Id: racemenu.cpp,v 1.2.2.4 2014/05/20 11:02:18 berniw Exp $
24 */
25 
26 #include <stdlib.h>
27 #include <stdio.h>
28 #ifdef WIN32
29 #include <windows.h>
30 #endif
31 #include <tgfclient.h>
32 #include <track.h>
33 #include <car.h>
34 #include <raceman.h>
35 #include <robot.h>
36 #include <racescreens.h>
37 #include <portability.h>
38 
39 static void *scrHandle;
40 static tRmRaceParam *rp;
41 static int rmrpDistance;
42 static int rmrpLaps;
43 static int rmrpDistId;
44 static int rmrpLapsId;
45 static int rmDispModeEditId;
46 static int rmCurDispMode;
47 static const char *rmCurDispModeList[] = { RM_VAL_VISIBLE, RM_VAL_INVISIBLE };
48 
49 
rmrpDeactivate(void * screen)50 static void rmrpDeactivate(void *screen)
51 {
52 	GfuiScreenRelease(scrHandle);
53 
54 	if (screen) {
55 		GfuiScreenActivate(screen);
56 	}
57 }
58 
59 
rmrpUpdDist(void *)60 static void rmrpUpdDist(void * /* dummy */)
61 {
62 	char *val;
63 	const int BUFSIZE = 1024;
64 	char buf[BUFSIZE];
65 
66 	val = GfuiEditboxGetString(scrHandle, rmrpDistId);
67 	rmrpDistance = strtol(val, (char **)NULL, 0);
68 	if (rmrpDistance == 0) {
69 		strcpy(buf, "---");
70 	} else {
71 		snprintf(buf, BUFSIZE, "%d", rmrpDistance);
72 		rmrpLaps = 0;
73 		GfuiEditboxSetString(scrHandle, rmrpLapsId, "---");
74 	}
75 	GfuiEditboxSetString(scrHandle, rmrpDistId, buf);
76 }
77 
78 
rmrpUpdLaps(void *)79 static void rmrpUpdLaps(void * /* dummy */)
80 {
81 	char *val;
82 	const int BUFSIZE = 1024;
83 	char buf[BUFSIZE];
84 
85 	val = GfuiEditboxGetString(scrHandle, rmrpLapsId);
86 	rmrpLaps = strtol(val, (char **)NULL, 0);
87 	if (rmrpLaps == 0) {
88 		strcpy(buf, "---");
89 	} else {
90 		snprintf(buf, BUFSIZE, "%d", rmrpLaps);
91 		rmrpDistance = 0;
92 		GfuiEditboxSetString(scrHandle, rmrpDistId, "---");
93 	}
94 	GfuiEditboxSetString(scrHandle, rmrpLapsId, buf);
95 }
96 
97 
rmrpValidate(void *)98 static void rmrpValidate(void * /* dummy */)
99 {
100 	if (rp->confMask & RM_CONF_RACE_LEN) {
101 		rmrpUpdDist(0);
102 		rmrpUpdLaps(0);
103 		GfParmSetNum(rp->param, rp->title, RM_ATTR_DISTANCE, "km", rmrpDistance);
104 		GfParmSetNum(rp->param, rp->title, RM_ATTR_LAPS, (char*)NULL, rmrpLaps);
105 	}
106 
107 	if (rp->confMask & RM_CONF_DISP_MODE) {
108 		GfParmSetStr(rp->param, rp->title, RM_ATTR_DISPMODE, rmCurDispModeList[rmCurDispMode]);
109 	}
110 
111 	rmrpDeactivate(rp->nextScreen);
112 }
113 
114 
rmrpAddKeys(void)115 static void rmrpAddKeys(void)
116 {
117 	GfuiAddKey(scrHandle, 27, "Cancel Modifications", rp->prevScreen, rmrpDeactivate, NULL);
118 	GfuiAddSKey(scrHandle, GLUT_KEY_F1, "Help", scrHandle, GfuiHelpScreen, NULL);
119 	GfuiAddSKey(scrHandle, GLUT_KEY_F12, "Screen-Shot", NULL, GfuiScreenShot, NULL);
120 	GfuiAddKey(scrHandle, 13, "Validate Modifications", NULL, rmrpValidate, NULL);
121 }
122 
123 
rmChangeDisplayMode(void *)124 void rmChangeDisplayMode(void * /* dummy */)
125 {
126 	rmCurDispMode = 1 - rmCurDispMode;
127 	GfuiLabelSetText(scrHandle, rmDispModeEditId, rmCurDispModeList[rmCurDispMode]);
128 }
129 
130 
131 /** @brief Race options menu
132  *  @ingroup racemantools
133  *  @param[in,out] vrp Pointer on tRmRaceParam structure (cast to void)
134  *  @note The race manager parameter set is modified in memory but not persisted.
135  */
RmRaceParamMenu(void * vrp)136 void RmRaceParamMenu(void *vrp)
137 {
138 	int y, x, x2, dy, dx;
139 	const int BUFSIZE = 1024;
140 	char buf[BUFSIZE];
141 
142 	rp = (tRmRaceParam*)vrp;
143 
144 	snprintf(buf, BUFSIZE, "%s Options", rp->title);
145 	scrHandle = GfuiMenuScreenCreate(buf);
146 	GfuiScreenAddBgImg(scrHandle, "data/img/splash-raceopt.png");
147 
148 	x = 80;
149 	x2 = 240;
150 	y = 380;
151 	dx = 200;
152 	dy = GfuiFontHeight(GFUI_FONT_LARGE) + 5;
153 
154 	if (rp->confMask & RM_CONF_RACE_LEN) {
155 		GfuiLabelCreate(scrHandle, "Race Distance (km):", GFUI_FONT_MEDIUM_C, x, y, GFUI_ALIGN_HL_VB, 0);
156 		rmrpDistance = (int)GfParmGetNum(rp->param, rp->title, RM_ATTR_DISTANCE, "km", 0);
157 		if (rmrpDistance == 0) {
158 			strcpy(buf, "---");
159 			rmrpLaps = (int)GfParmGetNum(rp->param, rp->title, RM_ATTR_LAPS, NULL, 25);
160 		} else {
161 			snprintf(buf, BUFSIZE, "%d", rmrpDistance);
162 			rmrpLaps = 0;
163 		}
164 
165 		rmrpDistId = GfuiEditboxCreate(scrHandle, buf, GFUI_FONT_MEDIUM_C,
166 						x + dx, y,
167 						0, 8, NULL, (tfuiCallback)NULL, rmrpUpdDist);
168 
169 		y -= dy;
170 		GfuiLabelCreate(scrHandle, "Laps:", GFUI_FONT_MEDIUM_C, x, y, GFUI_ALIGN_HL_VB, 0);
171 		if (rmrpLaps == 0) {
172 			strcpy(buf, "---");
173 		} else {
174 			snprintf(buf, BUFSIZE, "%d", rmrpLaps);
175 		}
176 
177 		rmrpLapsId = GfuiEditboxCreate(scrHandle, buf, GFUI_FONT_MEDIUM_C,
178 						x + dx, y,
179 						0, 8, NULL, (tfuiCallback)NULL, rmrpUpdLaps);
180 		y -= dy;
181 	}
182 
183 	if (rp->confMask & RM_CONF_DISP_MODE) {
184 		GfuiLabelCreate(scrHandle, "Display:", GFUI_FONT_MEDIUM_C, x, y, GFUI_ALIGN_HL_VB, 0);
185 		GfuiGrButtonCreate(scrHandle, "data/img/arrow-left.png", "data/img/arrow-left.png",
186 				"data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
187 				x2, y, GFUI_ALIGN_HL_VB, 1,
188 				(void*)0, rmChangeDisplayMode,
189 				NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
190 		GfuiGrButtonCreate(scrHandle, "data/img/arrow-right.png", "data/img/arrow-right.png",
191 				"data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
192 				x2 + 150, y, GFUI_ALIGN_HL_VB, 1,
193 				(void*)1, rmChangeDisplayMode,
194 				NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
195 		if (!strcmp(GfParmGetStr(rp->param, rp->title, RM_ATTR_DISPMODE, RM_VAL_VISIBLE), RM_VAL_INVISIBLE)) {
196 			rmCurDispMode = 1;
197 		} else {
198 			rmCurDispMode = 0;
199 		}
200 		rmDispModeEditId = GfuiLabelCreate(scrHandle, rmCurDispModeList[rmCurDispMode], GFUI_FONT_MEDIUM_C, x2 + 35, y, GFUI_ALIGN_HL_VB, 20);
201 		y -= dy;
202 	}
203 
204 	GfuiButtonCreate(scrHandle, "Accept", GFUI_FONT_LARGE, 210, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP,
205 				NULL, rmrpValidate, NULL, NULL, NULL);
206 
207 	GfuiButtonCreate(scrHandle, "Cancel", GFUI_FONT_LARGE, 430, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP,
208 				rp->prevScreen, rmrpDeactivate, NULL, NULL, NULL);
209 
210 	rmrpAddKeys();
211 
212 	GfuiScreenActivate(scrHandle);
213 }
214