Converted Start and Stop race menus to XML (miscscreens)

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@1774 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: e94ea3f1f1d9eda370b7ac27c0dbaf89e21558f2
Former-commit-id: 21cbb3a2768d3d37e710bb553ba135e5db756ab4
This commit is contained in:
pouillot 2009-11-07 11:28:23 +00:00
parent a31f0b9494
commit 7c29a98857

View file

@ -24,39 +24,92 @@
*/
#include <stdio.h>
#include <tgfclient.h>
#include <robot.h>
#include "racescreens.h"
/*********************************************************
* 2, 3, 4 or 5 buttons "Quit race" screens
*/
static void *twoStateHdle = 0;
static void *triStateHdle = 0;
static void *fourStateHdle = 0;
// Descriptor for 1 button.
typedef struct {
const char *label; // Label to display.
const char *tip; // Tip displayed when mouse hover.
void *screen; // Screen to activate if clicked.
} tButtonDesc;
// Generic N state "quit race" screen creation and activation.
static void *
rmNStateScreen(const char *title, const tButtonDesc aButtons[], int nButtons, int nQuitIndex)
{
void *screenHdle = 0;
// Create screen, load menu XML descriptor and create static controls.
screenHdle = GfuiScreenCreateEx(NULL, NULL, NULL, NULL, NULL, 1);
void *menuXMLDescHdle = LoadMenuXML("stopracemenu.xml");
CreateStaticControls(menuXMLDescHdle, screenHdle);
// Create variable title label.
int titleId = CreateLabelControl(screenHdle, menuXMLDescHdle, "titlelabel");
GfuiLabelSetText(screenHdle, titleId, title);
// Create specified buttons
for (int nButInd = 0; nButInd < nButtons; nButInd++)
GfuiMenuButtonCreate(screenHdle, aButtons[nButInd].label, aButtons[nButInd].tip,
aButtons[nButInd].screen, GfuiScreenActivate);
// Close menu XML descriptor.
GfParmReleaseHandle(menuXMLDescHdle);
// Register keyboard shortcuts.
GfuiAddKey(screenHdle, 27, aButtons[nQuitIndex].tip,
aButtons[nQuitIndex].screen, GfuiScreenActivate, NULL);
GfuiAddSKey(screenHdle, GLUT_KEY_F1, "Help", screenHdle, GfuiHelpScreen, NULL);
GfuiAddSKey(screenHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
// Activate the created screen.
GfuiScreenActivate(screenHdle);
return screenHdle;
}
// 2 state "quit race" screen creation and activation.
void *
RmTwoStateScreen(
const char *title,
const char *label1, const char *tip1, void *screen1,
const char *label2, const char *tip2, void *screen2)
{
if (twoStateHdle) {
GfuiScreenRelease(twoStateHdle);
}
static const int nButtons = 2;
const tButtonDesc aButtons[nButtons] =
{
{ label1, tip1, screen1 },
{ label2, tip2, screen2 }
};
twoStateHdle = GfuiMenuScreenCreate(title);
GfuiScreenAddBgImg(twoStateHdle, "data/img/splash-quit.png");
GfuiMenuButtonCreate(twoStateHdle, label1, tip1, screen1, GfuiScreenActivate);
GfuiMenuButtonCreate(twoStateHdle, label2, tip2, screen2, GfuiScreenActivate);
GfuiAddKey(twoStateHdle, 27, tip2, screen2, GfuiScreenActivate, NULL);
GfuiAddSKey(twoStateHdle, GLUT_KEY_F1, "Help", twoStateHdle, GfuiHelpScreen, NULL);
GfuiAddSKey(twoStateHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
GfuiScreenActivate(twoStateHdle);
return twoStateHdle;
if (twoStateHdle) {
GfuiScreenRelease(twoStateHdle);
}
twoStateHdle = rmNStateScreen(title, aButtons, nButtons, 1);
return twoStateHdle;
}
// 3 state "quit race" screen creation and activation.
void *
RmTriStateScreen(
const char *title,
@ -64,23 +117,24 @@ RmTriStateScreen(
const char *label2, const char *tip2, void *screen2,
const char *label3, const char *tip3, void *screen3)
{
if (triStateHdle) {
GfuiScreenRelease(triStateHdle);
}
static const int nButtons = 3;
const tButtonDesc aButtons[nButtons] =
{
{ label1, tip1, screen1 },
{ label2, tip2, screen2 },
{ label3, tip3, screen3 }
};
triStateHdle = GfuiMenuScreenCreate(title);
GfuiScreenAddBgImg(triStateHdle, "data/img/splash-quit.png");
GfuiMenuButtonCreate(triStateHdle, label1, tip1, screen1, GfuiScreenActivate);
GfuiMenuButtonCreate(triStateHdle, label2, tip2, screen2, GfuiScreenActivate);
GfuiMenuButtonCreate(triStateHdle, label3, tip3, screen3, GfuiScreenActivate);
GfuiAddKey(triStateHdle, 27, tip3, screen3, GfuiScreenActivate, NULL);
GfuiAddSKey(triStateHdle, GLUT_KEY_F1, "Help", triStateHdle, GfuiHelpScreen, NULL);
GfuiAddSKey(triStateHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
GfuiScreenActivate(triStateHdle);
if (triStateHdle) {
GfuiScreenRelease(triStateHdle);
}
return triStateHdle;
triStateHdle = rmNStateScreen(title, aButtons, nButtons, 2);
return triStateHdle;
}
// 4 state "quit race" screen creation and activation.
void *
RmFourStateScreen(
const char *title,
@ -89,31 +143,30 @@ RmFourStateScreen(
const char *label3, const char *tip3, void *screen3,
const char *label4, const char *tip4, void *screen4)
{
if (fourStateHdle) {
GfuiScreenRelease(fourStateHdle);
}
static const int nButtons = 4;
const tButtonDesc aButtons[nButtons] =
{
{ label1, tip1, screen1 },
{ label2, tip2, screen2 },
{ label3, tip3, screen3 },
{ label4, tip4, screen4 }
};
fourStateHdle = GfuiMenuScreenCreate(title);
GfuiScreenAddBgImg(fourStateHdle, "data/img/splash-quit.png");
GfuiMenuButtonCreate(fourStateHdle, label1, tip1, screen1, GfuiScreenActivate);
GfuiMenuButtonCreate(fourStateHdle, label2, tip2, screen2, GfuiScreenActivate);
GfuiMenuButtonCreate(fourStateHdle, label3, tip3, screen3, GfuiScreenActivate);
GfuiMenuButtonCreate(fourStateHdle, label4, tip4, screen4, GfuiScreenActivate);
GfuiAddKey(fourStateHdle, 27, tip4, screen4, GfuiScreenActivate, NULL);
GfuiAddSKey(fourStateHdle, GLUT_KEY_F1, "Help", fourStateHdle, GfuiHelpScreen, NULL);
GfuiAddSKey(fourStateHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
GfuiScreenActivate(fourStateHdle);
if (fourStateHdle) {
GfuiScreenRelease(fourStateHdle);
}
return fourStateHdle;
fourStateHdle = rmNStateScreen(title, aButtons, nButtons, 3);
return fourStateHdle;
}
/*********************************************************
* Start screen
* Start race screen
*/
#define MAX_LINES 20
static const int NMaxLines = 20;
typedef struct
{
@ -131,145 +184,141 @@ static void rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, in
static void
rmChgStartScreen(void *vpsrc)
{
void *prevScr = rmScrHdle;
tStartRaceCall *psrc = (tStartRaceCall*)vpsrc;
rmDisplayStartRace(psrc->info, psrc->startScr, psrc->abortScr, psrc->start);
GfuiScreenRelease(prevScr);
void *prevScr = rmScrHdle;
tStartRaceCall *psrc = (tStartRaceCall*)vpsrc;
rmDisplayStartRace(psrc->info, psrc->startScr, psrc->abortScr, psrc->start);
GfuiScreenRelease(prevScr);
}
static void
rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
{
static char path[1024];
int nCars;
int i;
int y;
int x, dx;
int rows, curRow;
const char *img;
const char *name;
int robotIdx;
void *robhdle;
void *carHdle;
const char *carName;
void *params = info->params;
const char *race = info->_reRaceName;
rmScrHdle = GfuiScreenCreate();
GfuiTitleCreate(rmScrHdle, race, strlen(race));
img = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_STARTIMG, 0);
if (img) {
GfuiScreenAddBgImg(rmScrHdle, img);
}
if (!strcmp(GfParmGetStr(params, race, RM_ATTR_DISP_START_GRID, RM_VAL_YES), RM_VAL_YES)) {
GfuiLabelCreate(rmScrHdle, "Starting Grid", GFUI_FONT_MEDIUM_C, 320, 420, GFUI_ALIGN_HC_VB, 0);
sprintf(path, "%s/%s", race, RM_SECT_STARTINGGRID);
rows = (int)GfParmGetNum(params, path, RM_ATTR_ROWS, (char*)NULL, 2);
dx = 0;
x = 40;
y = 400;
curRow = 0;
nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS_RACING);
for (i = start; i < MIN(start + MAX_LINES, nCars); i++) {
/* Find starting driver's name */
sprintf(path, "%s/%d", RM_SECT_DRIVERS_RACING, i + 1);
name = GfParmGetStr(info->params, path, RM_ATTR_MODULE, "");
robotIdx = (int)GfParmGetNum(info->params, path, RM_ATTR_IDX, NULL, 0);
sprintf(path, "%sdrivers/%s/%s.xml", GetLocalDir(), name, name);
robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
if (!robhdle) {
sprintf(path, "drivers/%s/%s.xml", name, name);
robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
}
static char path[1024];
int nCars;
int i;
int y;
int x, dx;
int rows, curRow;
const char *img;
const char *name;
int robotIdx;
void *robhdle;
void *carHdle;
const char *carName;
void *params = info->params;
const char *race = info->_reRaceName;
// Create screen, load menu XML descriptor and create static controls.
rmScrHdle = GfuiScreenCreate();
if (robhdle) {
sprintf(path, "%s/%s/%d", ROB_SECT_ROBOTS, ROB_LIST_INDEX, robotIdx);
name = GfParmGetStr(robhdle, path, ROB_ATTR_NAME, "<none>");
carName = GfParmGetStr(robhdle, path, ROB_ATTR_CAR, "");
void *menuXMLDescHdle = LoadMenuXML("startracemenu.xml");
CreateStaticControls(menuXMLDescHdle, rmScrHdle);
// Create variable title label.
int titleId = CreateLabelControl(rmScrHdle, menuXMLDescHdle, "titlelabel");
GfuiLabelSetText(rmScrHdle, titleId, race);
// Create background image if any.
img = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_STARTIMG, 0);
if (img) {
GfuiScreenAddBgImg(rmScrHdle, img);
}
// Create starting grid labels if specified in race params.
if (!strcmp(GfParmGetStr(params, race, RM_ATTR_DISP_START_GRID, RM_VAL_YES), RM_VAL_YES)) {
// Create starting grid subtitle label.
CreateLabelControl(rmScrHdle, menuXMLDescHdle, "subtitlelabel");
sprintf(path, "%s/%s", race, RM_SECT_STARTINGGRID);
rows = (int)GfParmGetNum(params, path, RM_ATTR_ROWS, (char*)NULL, 2);
// Create drivers info table.
dx = 0;
x = 40;
y = 400;
curRow = 0;
nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS_RACING);
for (i = start; i < MIN(start + NMaxLines, nCars); i++) {
/* Find starting driver's name */
sprintf(path, "%s/%d", RM_SECT_DRIVERS_RACING, i + 1);
name = GfParmGetStr(info->params, path, RM_ATTR_MODULE, "");
robotIdx = (int)GfParmGetNum(info->params, path, RM_ATTR_IDX, NULL, 0);
sprintf(path, "%sdrivers/%s/%s.xml", GetLocalDir(), name, name);
robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
if (!robhdle) {
sprintf(path, "drivers/%s/%s.xml", name, name);
robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
}
if (robhdle) {
sprintf(path, "%s/%s/%d", ROB_SECT_ROBOTS, ROB_LIST_INDEX, robotIdx);
name = GfParmGetStr(robhdle, path, ROB_ATTR_NAME, "<none>");
carName = GfParmGetStr(robhdle, path, ROB_ATTR_CAR, "");
sprintf(path, "cars/%s/%s.xml", carName, carName);
carHdle = GfParmReadFile(path, GFPARM_RMODE_STD);
carName = GfParmGetName(carHdle);
sprintf(path, "cars/%s/%s.xml", carName, carName);
carHdle = GfParmReadFile(path, GFPARM_RMODE_STD);
carName = GfParmGetName(carHdle);
sprintf(path, "%d - %s - (%s)", i + 1, name, carName);
GfuiLabelCreate(rmScrHdle, path, GFUI_FONT_MEDIUM_C,
x + curRow * dx, y, GFUI_ALIGN_HL_VB, 0);
sprintf(path, "%d - %s - (%s)", i + 1, name, carName);
GfuiLabelCreate(rmScrHdle, path, GFUI_FONT_MEDIUM_C,
x + curRow * dx, y, GFUI_ALIGN_HL_VB, 0);
GfParmReleaseHandle(carHdle);
GfParmReleaseHandle(robhdle);
}
curRow = (curRow + 1) % rows;
y -= 15;
}
if (start > 0) {
prevStartRace.startScr = startScr;
prevStartRace.abortScr = abortScr;
prevStartRace.info = info;
prevStartRace.start = start - MAX_LINES;
GfuiGrButtonCreate(rmScrHdle, "data/img/arrow-up.png", "data/img/arrow-up.png",
"data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
80, 40, GFUI_ALIGN_HL_VB, 1,
(void*)&prevStartRace, rmChgStartScreen,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_UP, "Previous drivers", (void*)&prevStartRace, rmChgStartScreen, NULL);
}
if (i < nCars) {
nextStartRace.startScr = startScr;
nextStartRace.abortScr = abortScr;
nextStartRace.info = info;
nextStartRace.start = start + MAX_LINES;
GfuiGrButtonCreate(rmScrHdle, "data/img/arrow-down.png", "data/img/arrow-down.png",
"data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
540, 40, GFUI_ALIGN_HL_VB, 1,
(void*)&nextStartRace, rmChgStartScreen,
NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_DOWN, "Next Drivers", (void*)&nextStartRace, rmChgStartScreen, NULL);
}
GfParmReleaseHandle(carHdle);
GfParmReleaseHandle(robhdle);
}
curRow = (curRow + 1) % rows;
y -= 15;
}
GfuiButtonCreate(rmScrHdle,
"Start",
GFUI_FONT_LARGE,
210,
40,
150,
GFUI_ALIGN_HC_VB,
0,
startScr,
GfuiScreenReplace,
NULL,
(tfuiCallback)NULL,
(tfuiCallback)NULL);
GfuiAddKey(rmScrHdle, (unsigned char)13, "Start", startScr, GfuiScreenReplace, NULL);
GfuiButtonCreate(rmScrHdle,
"Abandon",
GFUI_FONT_LARGE,
430,
40,
150,
GFUI_ALIGN_HC_VB,
0,
abortScr,
GfuiScreenReplace,
NULL,
(tfuiCallback)NULL,
(tfuiCallback)NULL);
if (start > 0) {
prevStartRace.startScr = startScr;
prevStartRace.abortScr = abortScr;
prevStartRace.info = info;
prevStartRace.start = start - NMaxLines;
GfuiAddKey(rmScrHdle, (unsigned char)27, "Abandon", abortScr, GfuiScreenReplace, NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_F1, "Help", rmScrHdle, GfuiHelpScreen, NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
// Create Previous page button and associated keyboard shortcut if needed.
CreateButtonControl(rmScrHdle, menuXMLDescHdle, "previouspagearrow",
(void*)&prevStartRace, rmChgStartScreen);
GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_UP, "Previous drivers",
(void*)&prevStartRace, rmChgStartScreen, NULL);
}
if (i < nCars) {
nextStartRace.startScr = startScr;
nextStartRace.abortScr = abortScr;
nextStartRace.info = info;
nextStartRace.start = start + NMaxLines;
// Create Next page button and associated keyboard shortcut if needed.
CreateButtonControl(rmScrHdle, menuXMLDescHdle, "nextpagearrow",
(void*)&nextStartRace, rmChgStartScreen);
GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_DOWN, "Next Drivers",
(void*)&nextStartRace, rmChgStartScreen, NULL);
}
}
GfuiScreenActivate(rmScrHdle);
// Create Start and Abandon buttons.
CreateButtonControl(rmScrHdle, menuXMLDescHdle, "startbutton", startScr, GfuiScreenReplace);
CreateButtonControl(rmScrHdle, menuXMLDescHdle, "abandonbutton", abortScr, GfuiScreenReplace);
// Close menu XML descriptor.
GfParmReleaseHandle(menuXMLDescHdle);
// Register keyboard shortcuts.
GfuiAddKey(rmScrHdle, (unsigned char)13, "Start", startScr, GfuiScreenReplace, NULL);
GfuiAddKey(rmScrHdle, (unsigned char)27, "Abandon", abortScr, GfuiScreenReplace, NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_F1, "Help", rmScrHdle, GfuiHelpScreen, NULL);
GfuiAddSKey(rmScrHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
// Activate the created screen.
GfuiScreenActivate(rmScrHdle);
}