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