/***************************************************************************
trackselect.cpp -- interactive track selection
-------------------
created : Mon Aug 16 21:43:00 CEST 1999
copyright : (C) 1999 by Eric Espie
email : torcs@free.fr
version : $Id: trackselect.cpp,v 1.5 2005/02/01 15:55:52 berniw 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
@ingroup racemantools
@author Eric Espie
@version $Id: trackselect.cpp,v 1.5 2005/02/01 15:55:52 berniw Exp $
*/
#include
#include
#include
#ifdef WIN32
#include
#endif
#include
#include
#include
#include
#include
/* Tracks Categories */
static tFList *CategoryList;
static void *scrHandle;
static int TrackLabelId;
static int CatLabelId;
static int MapId;
static int AuthorId;
static int LengthId;
static int WidthId;
static int DescId;
static int PitsId;
static tRmTrackSelect *ts;
static char buf[1024];
static char path[1024];
static void rmtsActivate(void * /* dummy */)
{
/* call display function of graphic */
//gfuiReleaseImage(MapId);
}
static void rmtsFreeLists(void *vl)
{
GfDirFreeList((tFList*)(((tFList*)vl)->userData), NULL, true, true);
}
static char * rmGetMapName(void)
{
sprintf(buf, "tracks/%s/%s/%s.png", CategoryList->name,
((tFList*)CategoryList->userData)->name, ((tFList*)CategoryList->userData)->name);
return buf;
}
static void rmtsDeactivate(void *screen)
{
GfuiScreenRelease(scrHandle);
GfDirFreeList(CategoryList, rmtsFreeLists, true, true);
if (screen) {
GfuiScreenActivate(screen);
}
}
static void rmUpdateTrackInfo(void)
{
void *trackHandle;
float tmp;
tTrack *trk;
sprintf(buf, "tracks/%s/%s/%s.%s", CategoryList->name, ((tFList*)CategoryList->userData)->name,
((tFList*)CategoryList->userData)->name, TRKEXT);
trackHandle = GfParmReadFile(buf, GFPARM_RMODE_STD); /* COMMENT VALID? don't release, the name is used later */
if (!trackHandle) {
GfTrace("File %s has pb\n", buf);
return;
}
trk = ts->trackItf.trkBuild(buf);
GfuiLabelSetText(scrHandle, DescId, GfParmGetStr(trackHandle, TRK_SECT_HDR, TRK_ATT_DESCR, ""));
GfuiLabelSetText(scrHandle, AuthorId, GfParmGetStr(trackHandle, TRK_SECT_HDR, TRK_ATT_AUTHOR, ""));
tmp = GfParmGetNum(trackHandle, TRK_SECT_MAIN, TRK_ATT_WIDTH, NULL, 0);
sprintf(buf, "%.2f m", tmp);
GfuiLabelSetText(scrHandle, WidthId, buf);
tmp = trk->length;
sprintf(buf, "%.2f m", tmp);
GfuiLabelSetText(scrHandle, LengthId, buf);
if (trk->pits.nMaxPits != 0) {
sprintf(buf, "%d", trk->pits.nMaxPits);
GfuiLabelSetText(scrHandle, PitsId, buf);
} else {
GfuiLabelSetText(scrHandle, PitsId, "none");
}
ts->trackItf.trkShutdown();
GfParmReleaseHandle(trackHandle);
}
static void rmtsPrevNext(void *vsel)
{
if (vsel == 0) {
CategoryList->userData = (void*)(((tFList*)CategoryList->userData)->prev);
} else {
CategoryList->userData = (void*)(((tFList*)CategoryList->userData)->next);
}
GfuiLabelSetText(scrHandle, TrackLabelId, ((tFList*)CategoryList->userData)->dispName);
GfuiStaticImageSet(scrHandle, MapId, rmGetMapName());
rmUpdateTrackInfo();
}
static void rmCatPrevNext(void *vsel)
{
if (vsel == 0) {
CategoryList = CategoryList->prev;
} else {
CategoryList = CategoryList->next;
}
GfuiLabelSetText(scrHandle, CatLabelId, CategoryList->dispName);
GfuiLabelSetText(scrHandle, TrackLabelId, ((tFList*)CategoryList->userData)->dispName);
GfuiStaticImageSet(scrHandle, MapId, rmGetMapName());
rmUpdateTrackInfo();
}
void rmtsSelect(void * /* dummy */)
{
int curTrkIdx;
curTrkIdx = (int)GfParmGetNum(ts->param, RM_SECT_TRACKS, RE_ATTR_CUR_TRACK, NULL, 1);
sprintf(path, "%s/%d", RM_SECT_TRACKS, curTrkIdx);
GfParmSetStr(ts->param, path, RM_ATTR_CATEGORY, CategoryList->name);
GfParmSetStr(ts->param, path, RM_ATTR_NAME, ((tFList*)CategoryList->userData)->name);
rmtsDeactivate(ts->nextScreen);
}
static void rmtsAddKeys(void)
{
GfuiAddKey(scrHandle, 13, "Select Track", NULL, rmtsSelect, NULL);
GfuiAddKey(scrHandle, 27, "Cancel Selection", ts->prevScreen, rmtsDeactivate, NULL);
GfuiAddSKey(scrHandle, GLUT_KEY_LEFT, "Previous Track", (void*)0, rmtsPrevNext, NULL);
GfuiAddSKey(scrHandle, GLUT_KEY_RIGHT, "Next Track", (void*)1, rmtsPrevNext, NULL);
GfuiAddSKey(scrHandle, GLUT_KEY_F12, "Screen-Shot", NULL, GfuiScreenShot, NULL);
GfuiAddSKey(scrHandle, GLUT_KEY_UP, "Previous Track Category", (void*)0, rmCatPrevNext, NULL);
GfuiAddSKey(scrHandle, GLUT_KEY_DOWN, "Next Track Category", (void*)1, rmCatPrevNext, NULL);
}
/** Get the track name
@param category track category directory
@param trackName track name for file
@return Long track name
@ingroup racemantools
*/
char *
RmGetTrackName(char *category, char *trackName)
{
void *trackHandle;
char *name;
sprintf(buf, "tracks/%s/%s/%s.%s", category, trackName, trackName, TRKEXT);
trackHandle = GfParmReadFile(buf, GFPARM_RMODE_STD); /* don't release, the name is used later */
if (trackHandle) {
name = strdup(GfParmGetStr(trackHandle, TRK_SECT_HDR, TRK_ATT_NAME, trackName));
} else {
GfTrace("File %s has pb\n", buf);
return "";
}
GfParmReleaseHandle(trackHandle);
return name;
}
/** Get the track category name from the directory name
@param category track category directory
@return category display name
@ingroup racemantools
*/
char *
RmGetCategoryName(char *category)
{
void *categoryHandle;
char *name;
sprintf(buf, "data/tracks/%s.%s", category, TRKEXT);
categoryHandle = GfParmReadFile(buf, GFPARM_RMODE_STD); /* don't release, the name is used later */
if (categoryHandle) {
name = strdup(GfParmGetStr(categoryHandle, TRK_SECT_HDR, TRK_ATT_NAME, category));
} else {
GfTrace("File %s has pb\n", buf);
return "";
}
GfParmReleaseHandle(categoryHandle);
return name;
}
/** Interactive track selection
@param vs Pointer on a tRmTrackSelect structure (cast to void *)
@warning The race manager's parameters are updated but not saved.
@ingroup racemantools
*/
void
RmTrackSelect(void *vs)
{
char *defaultTrack;
char *defaultCategory;
tFList *CatCur;
tFList *TrList, *TrCur;
int Xpos, Ypos, DX, DY;
int curTrkIdx;
ts = (tRmTrackSelect*)vs;
/* Get the list of categories directories */
CategoryList = GfDirGetList("tracks");
if (CategoryList == NULL) {
GfTrace("RmTrackSelect: No track category available\n");
return;
}
CatCur = CategoryList;
do {
CatCur->dispName = RmGetCategoryName(CatCur->name);
if (strlen(CatCur->dispName) == 0) {
GfTrace("RmTrackSelect: No definition for track category %s\n", CatCur->name);
return;
}
/* get the tracks in the category directory */
sprintf(buf, "tracks/%s", CatCur->name);
TrList = GfDirGetList(buf);
if (TrList == NULL) {
GfTrace("RmTrackSelect: No track for category %s available\n", CatCur->name);
return;
}
TrList = TrList->next; /* get the first one */
CatCur->userData = (void*)TrList;
TrCur = TrList;
do {
TrCur->dispName = RmGetTrackName(CatCur->name, TrCur->name);
if (strlen(TrCur->dispName) == 0) {
GfTrace("RmTrackSelect: No definition for track %s\n", TrCur->name);
return;
}
TrCur = TrCur->next;
} while (TrCur != TrList);
CatCur = CatCur->next;
} while (CatCur != CategoryList);
curTrkIdx = (int)GfParmGetNum(ts->param, RM_SECT_TRACKS, RE_ATTR_CUR_TRACK, NULL, 1);
sprintf(path, "%s/%d", RM_SECT_TRACKS, curTrkIdx);
defaultCategory = GfParmGetStr(ts->param, path, RM_ATTR_CATEGORY, CategoryList->name);
/* XXX coherency check */
defaultTrack = GfParmGetStr(ts->param, path, RM_ATTR_NAME, ((tFList*)CategoryList->userData)->name);
CatCur = CategoryList;
do {
if (strcmp(CatCur->name, defaultCategory) == 0) {
CategoryList = CatCur;
TrCur = (tFList*)(CatCur->userData);
do {
if (strcmp(TrCur->name, defaultTrack) == 0) {
CatCur->userData = (void*)TrCur;
break;
}
TrCur = TrCur->next;
} while (TrCur != TrList);
break;
}
CatCur = CatCur->next;
} while (CatCur != CategoryList);
scrHandle = GfuiScreenCreateEx((float*)NULL, NULL, rmtsActivate, NULL, (tfuiCallback)NULL, 1);
GfuiScreenAddBgImg(scrHandle, "data/img/splash-qrtrk.png");
rmtsAddKeys();
GfuiTitleCreate(scrHandle, "Select Track", 0);
GfuiGrButtonCreate(scrHandle,
"data/img/arrow-left.png",
"data/img/arrow-left.png",
"data/img/arrow-left.png",
"data/img/arrow-left-pushed.png",
80, 400, GFUI_ALIGN_HC_VB, 0,
(void*)0, rmCatPrevNext,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
CatLabelId = GfuiLabelCreate(scrHandle,
CategoryList->dispName,
GFUI_FONT_LARGE_C,
320, 400, GFUI_ALIGN_HC_VB,
30);
GfuiGrButtonCreate(scrHandle,
"data/img/arrow-right.png",
"data/img/arrow-right.png",
"data/img/arrow-right.png",
"data/img/arrow-right-pushed.png",
540, 400, GFUI_ALIGN_HC_VB, 0,
(void*)1, rmCatPrevNext,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
GfuiGrButtonCreate(scrHandle,
"data/img/arrow-left.png",
"data/img/arrow-left.png",
"data/img/arrow-left.png",
"data/img/arrow-left-pushed.png",
80, 370, GFUI_ALIGN_HC_VB, 0,
(void*)0, rmtsPrevNext,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
TrackLabelId = GfuiLabelCreate(scrHandle,
((tFList*)CategoryList->userData)->dispName,
GFUI_FONT_LARGE_C,
320, 370, GFUI_ALIGN_HC_VB,
30);
GfuiGrButtonCreate(scrHandle,
"data/img/arrow-right.png",
"data/img/arrow-right.png",
"data/img/arrow-right.png",
"data/img/arrow-right-pushed.png",
540, 370, GFUI_ALIGN_HC_VB, 0,
(void*)1, rmtsPrevNext,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
MapId = GfuiStaticImageCreate(scrHandle,
320, 100, 260, 195,
rmGetMapName());
GfuiButtonCreate(scrHandle, "Accept", GFUI_FONT_LARGE, 210, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP,
NULL, rmtsSelect, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
GfuiButtonCreate(scrHandle, "Back", GFUI_FONT_LARGE, 430, 40, 150, GFUI_ALIGN_HC_VB, GFUI_MOUSE_UP,
ts->prevScreen, rmtsDeactivate, NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
Xpos = 20;
Ypos = 320;
DX = 110;
DY = 30;
GfuiLabelCreate(scrHandle,
"Description:",
GFUI_FONT_MEDIUM,
Xpos, Ypos,
GFUI_ALIGN_HL_VB, 0);
DescId = GfuiLabelCreate(scrHandle,
"",
GFUI_FONT_MEDIUM_C,
Xpos + DX, Ypos,
GFUI_ALIGN_HL_VB, 50);
Ypos -= DY;
GfuiLabelCreate(scrHandle,
"Author:",
GFUI_FONT_MEDIUM,
Xpos, Ypos,
GFUI_ALIGN_HL_VB, 0);
AuthorId = GfuiLabelCreate(scrHandle,
"",
GFUI_FONT_MEDIUM_C,
Xpos + DX, Ypos,
GFUI_ALIGN_HL_VB, 20);
Ypos -= DY;
GfuiLabelCreate(scrHandle,
"Length:",
GFUI_FONT_MEDIUM,
Xpos, Ypos,
GFUI_ALIGN_HL_VB, 0);
LengthId = GfuiLabelCreate(scrHandle,
"",
GFUI_FONT_MEDIUM_C,
Xpos + DX, Ypos,
GFUI_ALIGN_HL_VB, 20);
Ypos -= DY;
GfuiLabelCreate(scrHandle,
"Width:",
GFUI_FONT_MEDIUM,
Xpos, Ypos,
GFUI_ALIGN_HL_VB, 0);
WidthId = GfuiLabelCreate(scrHandle,
"",
GFUI_FONT_MEDIUM_C,
Xpos + DX, Ypos,
GFUI_ALIGN_HL_VB, 20);
Ypos -= DY;
GfuiLabelCreate(scrHandle,
"Pits:",
GFUI_FONT_MEDIUM,
Xpos, Ypos,
GFUI_ALIGN_HL_VB, 0);
PitsId = GfuiLabelCreate(scrHandle,
"",
GFUI_FONT_MEDIUM_C,
Xpos + DX, Ypos,
GFUI_ALIGN_HL_VB, 20);
rmUpdateTrackInfo();
GfuiScreenActivate(scrHandle);
}