forked from speed-dreams/speed-dreams-code
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:
parent
a31f0b9494
commit
7c29a98857
1 changed files with 219 additions and 170 deletions
|
@ -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)
|
||||
{
|
||||
static const int nButtons = 2;
|
||||
const tButtonDesc aButtons[nButtons] =
|
||||
{
|
||||
{ label1, tip1, screen1 },
|
||||
{ label2, tip2, screen2 }
|
||||
};
|
||||
|
||||
if (twoStateHdle) {
|
||||
GfuiScreenRelease(twoStateHdle);
|
||||
}
|
||||
|
||||
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);
|
||||
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)
|
||||
{
|
||||
static const int nButtons = 3;
|
||||
const tButtonDesc aButtons[nButtons] =
|
||||
{
|
||||
{ label1, tip1, screen1 },
|
||||
{ label2, tip2, screen2 },
|
||||
{ label3, tip3, screen3 }
|
||||
};
|
||||
|
||||
if (triStateHdle) {
|
||||
GfuiScreenRelease(triStateHdle);
|
||||
}
|
||||
|
||||
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);
|
||||
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)
|
||||
{
|
||||
static const int nButtons = 4;
|
||||
const tButtonDesc aButtons[nButtons] =
|
||||
{
|
||||
{ label1, tip1, screen1 },
|
||||
{ label2, tip2, screen2 },
|
||||
{ label3, tip3, screen3 },
|
||||
{ label4, tip4, screen4 }
|
||||
};
|
||||
|
||||
if (fourStateHdle) {
|
||||
GfuiScreenRelease(fourStateHdle);
|
||||
}
|
||||
|
||||
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);
|
||||
fourStateHdle = rmNStateScreen(title, aButtons, nButtons, 3);
|
||||
|
||||
return fourStateHdle;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*********************************************************
|
||||
* Start screen
|
||||
* Start race screen
|
||||
*/
|
||||
|
||||
#define MAX_LINES 20
|
||||
static const int NMaxLines = 20;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -156,26 +209,40 @@ rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
|
|||
void *params = info->params;
|
||||
const char *race = info->_reRaceName;
|
||||
|
||||
// Create screen, load menu XML descriptor and create static controls.
|
||||
rmScrHdle = GfuiScreenCreate();
|
||||
GfuiTitleCreate(rmScrHdle, race, strlen(race));
|
||||
|
||||
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)) {
|
||||
GfuiLabelCreate(rmScrHdle, "Starting Grid", GFUI_FONT_MEDIUM_C, 320, 420, GFUI_ALIGN_HC_VB, 0);
|
||||
|
||||
// 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 + MAX_LINES, nCars); i++) {
|
||||
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, "");
|
||||
|
@ -204,6 +271,7 @@ rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
|
|||
GfParmReleaseHandle(carHdle);
|
||||
GfParmReleaseHandle(robhdle);
|
||||
}
|
||||
|
||||
curRow = (curRow + 1) % rows;
|
||||
y -= 15;
|
||||
}
|
||||
|
@ -213,62 +281,43 @@ rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
|
|||
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);
|
||||
prevStartRace.start = start - NMaxLines;
|
||||
|
||||
// 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 + 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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
GfuiButtonCreate(rmScrHdle,
|
||||
"Start",
|
||||
GFUI_FONT_LARGE,
|
||||
210,
|
||||
40,
|
||||
150,
|
||||
GFUI_ALIGN_HC_VB,
|
||||
0,
|
||||
startScr,
|
||||
GfuiScreenReplace,
|
||||
NULL,
|
||||
(tfuiCallback)NULL,
|
||||
(tfuiCallback)NULL);
|
||||
// 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);
|
||||
|
||||
GfuiButtonCreate(rmScrHdle,
|
||||
"Abandon",
|
||||
GFUI_FONT_LARGE,
|
||||
430,
|
||||
40,
|
||||
150,
|
||||
GFUI_ALIGN_HC_VB,
|
||||
0,
|
||||
abortScr,
|
||||
GfuiScreenReplace,
|
||||
NULL,
|
||||
(tfuiCallback)NULL,
|
||||
(tfuiCallback)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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue