/***************************************************************************
file : racemenu.cpp
created : Thu May 2 22:02:51 CEST 2002
copyright : (C) 2001 by Eric Espie
email : eric.espie@torcs.org
version : $Id: racemenu.cpp,v 1.2 2003/06/24 21:02:24 torcs Exp $
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
/** @file
This is the race options menu.
@ingroup racemantools
@author Eric Espie
@version $Id: racemenu.cpp,v 1.2 2003/06/24 21:02:24 torcs Exp $
*/
#include
#include
#include
#ifdef WIN32
#include
#endif
#include
#include
#include
#include
#include
#include
static void *scrHandle;
static tRmRaceParam *rp;
static int rmrpDistance;
static int rmrpLaps;
static char buf[256];
static int rmrpDistId;
static int rmrpLapsId;
static int rmDispModeEditId;
static int rmCurDispMode;
static char *rmCurDispModeList[] = { RM_VAL_VISIBLE, RM_VAL_INVISIBLE};
static void
rmrpDeactivate(void *screen)
{
GfuiScreenRelease(scrHandle);
if (screen) {
GfuiScreenActivate(screen);
}
}
static void
rmrpUpdDist(void * /* dummy */)
{
char *val;
val = GfuiEditboxGetString(scrHandle, rmrpDistId);
rmrpDistance = strtol(val, (char **)NULL, 0);
if (rmrpDistance == 0) {
strcpy(buf, "---");
} else {
sprintf(buf, "%d", rmrpDistance);
rmrpLaps = 0;
GfuiEditboxSetString(scrHandle, rmrpLapsId, "---");
}
GfuiEditboxSetString(scrHandle, rmrpDistId, buf);
}
static void
rmrpUpdLaps(void * /* dummy */)
{
char *val;
val = GfuiEditboxGetString(scrHandle, rmrpLapsId);
rmrpLaps = strtol(val, (char **)NULL, 0);
if (rmrpLaps == 0) {
strcpy(buf, "---");
} else {
sprintf(buf, "%d", rmrpLaps);
rmrpDistance = 0;
GfuiEditboxSetString(scrHandle, rmrpDistId, "---");
}
GfuiEditboxSetString(scrHandle, rmrpLapsId, buf);
}
static void
rmrpValidate(void * /* dummy */)
{
if (rp->confMask & RM_CONF_RACE_LEN) {
rmrpUpdDist(0);
rmrpUpdLaps(0);
GfParmSetNum(rp->param, rp->title, RM_ATTR_DISTANCE, "km", rmrpDistance);
GfParmSetNum(rp->param, rp->title, RM_ATTR_LAPS, (char*)NULL, rmrpLaps);
}
if (rp->confMask & RM_CONF_DISP_MODE) {
GfParmSetStr(rp->param, rp->title, RM_ATTR_DISPMODE, rmCurDispModeList[rmCurDispMode]);
}
rmrpDeactivate(rp->nextScreen);
}
static void
rmrpAddKeys(void)
{
GfuiAddKey(scrHandle, 27, "Cancel Modifications", rp->prevScreen, rmrpDeactivate, NULL);
GfuiAddSKey(scrHandle, GLUT_KEY_F1, "Help", scrHandle, GfuiHelpScreen, NULL);
GfuiAddSKey(scrHandle, GLUT_KEY_F12, "Screen-Shot", NULL, GfuiScreenShot, NULL);
GfuiAddKey(scrHandle, 13, "Validate Modifications", NULL, rmrpValidate, NULL);
}
void
rmChangeDisplayMode(void * /* dummy */)
{
rmCurDispMode = 1 - rmCurDispMode;
GfuiLabelSetText(scrHandle, rmDispModeEditId, rmCurDispModeList[rmCurDispMode]);
}
void
RmRaceParamMenu(void *vrp)
{
int y, x, x2, dy, dx;
rp = (tRmRaceParam*)vrp;
sprintf(buf, "%s Options", rp->title);
scrHandle = GfuiMenuScreenCreate(buf);
GfuiScreenAddBgImg(scrHandle, "data/img/splash-raceopt.png");
x = 80;
x2 = 240;
y = 380;
dx = 200;
dy = GfuiFontHeight(GFUI_FONT_LARGE) + 5;
if (rp->confMask & RM_CONF_RACE_LEN) {
GfuiLabelCreate(scrHandle, "Race Distance (km):", GFUI_FONT_MEDIUM_C, x, y, GFUI_ALIGN_HL_VB, 0);
rmrpDistance = (int)GfParmGetNum(rp->param, rp->title, RM_ATTR_DISTANCE, "km", 0);
if (rmrpDistance == 0) {
strcpy(buf, "---");
rmrpLaps = (int)GfParmGetNum(rp->param, rp->title, RM_ATTR_LAPS, NULL, 25);
} else {
sprintf(buf, "%d", rmrpDistance);
rmrpLaps = 0;
}
rmrpDistId = GfuiEditboxCreate(scrHandle, buf, GFUI_FONT_MEDIUM_C,
x + dx, y,
0, 8, NULL, (tfuiCallback)NULL, rmrpUpdDist);
y -= dy;
GfuiLabelCreate(scrHandle, "Laps:", GFUI_FONT_MEDIUM_C, x, y, GFUI_ALIGN_HL_VB, 0);
if (rmrpLaps == 0) {
strcpy(buf, "---");
} else {
sprintf(buf, "%d", rmrpLaps);
}
rmrpLapsId = GfuiEditboxCreate(scrHandle, buf, GFUI_FONT_MEDIUM_C,
x + dx, y,
0, 8, NULL, (tfuiCallback)NULL, rmrpUpdLaps);
y -= dy;
}
if (rp->confMask & RM_CONF_DISP_MODE) {
GfuiLabelCreate(scrHandle, "Display:", GFUI_FONT_MEDIUM_C, x, y, GFUI_ALIGN_HL_VB, 0);
GfuiGrButtonCreate(scrHandle, "data/img/arrow-left.png", "data/img/arrow-left.png",
"data/img/arrow-left.png", "data/img/arrow-left-pushed.png",
x2, y, GFUI_ALIGN_HL_VB, 1,
(void*)0, rmChangeDisplayMode,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
GfuiGrButtonCreate(scrHandle, "data/img/arrow-right.png", "data/img/arrow-right.png",
"data/img/arrow-right.png", "data/img/arrow-right-pushed.png",
x2 + 150, y, GFUI_ALIGN_HL_VB, 1,
(void*)1, rmChangeDisplayMode,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
if (!strcmp(GfParmGetStr(rp->param, rp->title, RM_ATTR_DISPMODE, RM_VAL_VISIBLE), RM_VAL_INVISIBLE)) {
rmCurDispMode = 1;
} else {
rmCurDispMode = 0;
}
rmDispModeEditId = GfuiLabelCreate(scrHandle, rmCurDispModeList[rmCurDispMode], GFUI_FONT_MEDIUM_C, x2 + 35, y, GFUI_ALIGN_HL_VB, 20);
y -= dy;
}
GfuiButtonCreate(scrHandle, "Accept", GFUI_FONT_LARGE, 210, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP,
NULL, rmrpValidate, NULL, NULL, NULL);
GfuiButtonCreate(scrHandle, "Cancel", GFUI_FONT_LARGE, 430, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP,
rp->prevScreen, rmrpDeactivate, NULL, NULL, NULL);
rmrpAddKeys();
GfuiScreenActivate(scrHandle);
}