Updates to widget-mouse interactions.
This commit is contained in:
parent
5aa3daf342
commit
cd0463c92f
|
@ -1,4 +1,26 @@
|
||||||
[
|
[
|
||||||
|
{
|
||||||
|
"name" : "prev",
|
||||||
|
"group" : "stats",
|
||||||
|
"type" : "WT_IMG_BUTTON",
|
||||||
|
"text" : "",
|
||||||
|
"x" : 540,
|
||||||
|
"y" : 110,
|
||||||
|
"w" : 150,
|
||||||
|
"h": 34,
|
||||||
|
"texture" : "gfx/widgets/optionsLeft.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "next",
|
||||||
|
"group" : "stats",
|
||||||
|
"type" : "WT_IMG_BUTTON",
|
||||||
|
"text" : "",
|
||||||
|
"x" : 720,
|
||||||
|
"y" : 110,
|
||||||
|
"w" : 150,
|
||||||
|
"h": 34,
|
||||||
|
"texture" : "gfx/widgets/optionsRight.png"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name" : "ok",
|
"name" : "ok",
|
||||||
"group" : "stats",
|
"group" : "stats",
|
||||||
|
|
|
@ -222,7 +222,9 @@ enum
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
WT_BUTTON,
|
WT_BUTTON,
|
||||||
WT_SELECT
|
WT_IMG_BUTTON,
|
||||||
|
WT_SELECT,
|
||||||
|
WT_SELECT_BUTTON
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
|
|
@ -20,6 +20,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
#include "stats.h"
|
#include "stats.h"
|
||||||
|
|
||||||
|
static void prevPage(void);
|
||||||
|
static void nextPage(void);
|
||||||
|
|
||||||
static char *statDescription[] = {
|
static char *statDescription[] = {
|
||||||
"Missions Started",
|
"Missions Started",
|
||||||
"Missons Completed",
|
"Missons Completed",
|
||||||
|
@ -49,43 +52,19 @@ static char *statDescription[] = {
|
||||||
|
|
||||||
static int page;
|
static int page;
|
||||||
static int maxPages;
|
static int maxPages;
|
||||||
static SDL_Texture *pagePrev;
|
static Widget *prev;
|
||||||
static SDL_Texture *pageNext;
|
static Widget *next;
|
||||||
static SDL_Rect left, right;
|
|
||||||
|
|
||||||
void initStatsDisplay(void)
|
void initStatsDisplay(void)
|
||||||
{
|
{
|
||||||
page = 0;
|
page = 0;
|
||||||
maxPages = (STAT_MAX / MAX_STAT_ITEMS);
|
maxPages = (STAT_MAX / MAX_STAT_ITEMS);
|
||||||
|
|
||||||
pagePrev = getTexture("gfx/widgets/optionsLeft.png");
|
prev = getWidget("prev", "stats");
|
||||||
pageNext = getTexture("gfx/widgets/optionsRight.png");
|
prev->action = prevPage;
|
||||||
|
|
||||||
left.x = (SCREEN_WIDTH / 2) - 100;
|
next = getWidget("next", "stats");
|
||||||
left.y = 120;
|
next->action = nextPage;
|
||||||
SDL_QueryTexture(pagePrev, NULL, NULL, &left.w, &left.h);
|
|
||||||
|
|
||||||
right.x = (SCREEN_WIDTH / 2) + 100;
|
|
||||||
right.y = 120;
|
|
||||||
SDL_QueryTexture(pageNext, NULL, NULL, &right.w, &right.h);
|
|
||||||
}
|
|
||||||
|
|
||||||
void doStats(void)
|
|
||||||
{
|
|
||||||
if (app.mouse.button[SDL_BUTTON_LEFT])
|
|
||||||
{
|
|
||||||
if (collision(app.mouse.x - (app.mouse.w / 2), app.mouse.y - (app.mouse.h / 2), app.mouse.w, app.mouse.h, left.x - (left.w / 2), left.y - (left.h / 2), left.w, left.h))
|
|
||||||
{
|
|
||||||
page = MAX(0, page - 1);
|
|
||||||
app.mouse.button[SDL_BUTTON_LEFT] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (collision(app.mouse.x - (app.mouse.w / 2), app.mouse.y - (app.mouse.h / 2), app.mouse.w, app.mouse.h, right.x - (right.w / 2), right.y - (right.h / 2), right.w, right.h))
|
|
||||||
{
|
|
||||||
page = MIN(page + 1, maxPages);
|
|
||||||
app.mouse.button[SDL_BUTTON_LEFT] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawStats(void)
|
void drawStats(void)
|
||||||
|
@ -113,16 +92,6 @@ void drawStats(void)
|
||||||
|
|
||||||
drawText(SCREEN_WIDTH / 2, 110, 16, TA_CENTER, colors.lightGrey, "Page %d / %d", page + 1, maxPages + 1);
|
drawText(SCREEN_WIDTH / 2, 110, 16, TA_CENTER, colors.lightGrey, "Page %d / %d", page + 1, maxPages + 1);
|
||||||
|
|
||||||
if (page > 0)
|
|
||||||
{
|
|
||||||
blit(pagePrev, left.x, left.y, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (page < maxPages)
|
|
||||||
{
|
|
||||||
blit(pageNext, right.x, right.y, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
y = 170;
|
y = 170;
|
||||||
|
|
||||||
startIndex = (page * MAX_STAT_ITEMS);
|
startIndex = (page * MAX_STAT_ITEMS);
|
||||||
|
@ -149,3 +118,13 @@ void drawStats(void)
|
||||||
|
|
||||||
drawWidgets("stats");
|
drawWidgets("stats");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nextPage(void)
|
||||||
|
{
|
||||||
|
page = MIN(page + 1, maxPages);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void prevPage(void)
|
||||||
|
{
|
||||||
|
page = MAX(0, page - 1);
|
||||||
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ extern void drawText(int x, int y, int size, int align, SDL_Color c, const char
|
||||||
extern void blit(SDL_Texture *texture, int x, int y, int centered);
|
extern void blit(SDL_Texture *texture, int x, int y, int centered);
|
||||||
extern SDL_Texture *getTexture(char *filename);
|
extern SDL_Texture *getTexture(char *filename);
|
||||||
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
|
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
|
||||||
|
extern Widget *getWidget(const char *name, const char *group);
|
||||||
|
|
||||||
extern App app;
|
extern App app;
|
||||||
extern Colors colors;
|
extern Colors colors;
|
||||||
|
|
|
@ -279,8 +279,10 @@ struct Widget {
|
||||||
int visible;
|
int visible;
|
||||||
int enabled;
|
int enabled;
|
||||||
SDL_Rect rect;
|
SDL_Rect rect;
|
||||||
|
SDL_Texture *texture;
|
||||||
void (*action)(void);
|
void (*action)(void);
|
||||||
void (*onChange)(char *value);
|
void (*onChange)(char *value);
|
||||||
|
Widget *parent;
|
||||||
Widget *next;
|
Widget *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ void initLookups(void)
|
||||||
|
|
||||||
addLookup("WT_BUTTON", WT_BUTTON);
|
addLookup("WT_BUTTON", WT_BUTTON);
|
||||||
addLookup("WT_SELECT", WT_SELECT);
|
addLookup("WT_SELECT", WT_SELECT);
|
||||||
|
addLookup("WT_IMG_BUTTON", WT_IMG_BUTTON);
|
||||||
|
|
||||||
addLookup("SIDE_ALLIES", SIDE_ALLIES);
|
addLookup("SIDE_ALLIES", SIDE_ALLIES);
|
||||||
addLookup("SIDE_PIRATE", SIDE_PIRATE);
|
addLookup("SIDE_PIRATE", SIDE_PIRATE);
|
||||||
|
|
|
@ -24,7 +24,8 @@ static void loadWidgets(char *filename);
|
||||||
static void loadWidgetSet(char *filename);
|
static void loadWidgetSet(char *filename);
|
||||||
static void handleMouse(void);
|
static void handleMouse(void);
|
||||||
static void createOptions(Widget *w, char *options);
|
static void createOptions(Widget *w, char *options);
|
||||||
static void changeSelectedValue(int dir);
|
static void changeSelectedValue(Widget *w, int dir);
|
||||||
|
static void createSelectButtons(Widget *w);
|
||||||
|
|
||||||
static Widget head;
|
static Widget head;
|
||||||
static Widget *tail;
|
static Widget *tail;
|
||||||
|
@ -41,12 +42,12 @@ void initWidgets(void)
|
||||||
|
|
||||||
selectedWidget = NULL;
|
selectedWidget = NULL;
|
||||||
|
|
||||||
|
optionsLeft = getTexture("gfx/widgets/optionsLeft.png");
|
||||||
|
optionsRight = getTexture("gfx/widgets/optionsRight.png");
|
||||||
|
|
||||||
loadWidgets("data/widgets/list.json");
|
loadWidgets("data/widgets/list.json");
|
||||||
|
|
||||||
drawingWidgets = 0;
|
drawingWidgets = 0;
|
||||||
|
|
||||||
optionsLeft = getTexture("gfx/widgets/optionsLeft.png");
|
|
||||||
optionsRight = getTexture("gfx/widgets/optionsRight.png");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void doWidgets(void)
|
void doWidgets(void)
|
||||||
|
@ -104,20 +105,27 @@ void drawWidgets(const char *group)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
|
if (w->texture)
|
||||||
SDL_RenderFillRect(app.renderer, &w->rect);
|
|
||||||
|
|
||||||
if (w == selectedWidget)
|
|
||||||
{
|
{
|
||||||
SDL_SetRenderDrawColor(app.renderer, 64, 128, 200, SDL_ALPHA_OPAQUE);
|
blit(w->texture , w->rect.x, w->rect.y, 0);
|
||||||
SDL_RenderFillRect(app.renderer, &w->rect);
|
|
||||||
SDL_SetRenderDrawColor(app.renderer, 128, 192, 255, SDL_ALPHA_OPAQUE);
|
|
||||||
SDL_RenderDrawRect(app.renderer, &w->rect);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SDL_SetRenderDrawColor(app.renderer, 64, 64, 64, SDL_ALPHA_OPAQUE);
|
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
|
||||||
SDL_RenderDrawRect(app.renderer, &w->rect);
|
SDL_RenderFillRect(app.renderer, &w->rect);
|
||||||
|
|
||||||
|
if (w == selectedWidget)
|
||||||
|
{
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, 64, 128, 200, SDL_ALPHA_OPAQUE);
|
||||||
|
SDL_RenderFillRect(app.renderer, &w->rect);
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, 128, 192, 255, SDL_ALPHA_OPAQUE);
|
||||||
|
SDL_RenderDrawRect(app.renderer, &w->rect);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SDL_SetRenderDrawColor(app.renderer, 64, 64, 64, SDL_ALPHA_OPAQUE);
|
||||||
|
SDL_RenderDrawRect(app.renderer, &w->rect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (w->type)
|
switch (w->type)
|
||||||
|
@ -130,8 +138,6 @@ void drawWidgets(const char *group)
|
||||||
case WT_SELECT:
|
case WT_SELECT:
|
||||||
drawText(w->rect.x + 10, w->rect.y + 2, 20, TA_LEFT, colors.white, w->text);
|
drawText(w->rect.x + 10, w->rect.y + 2, 20, TA_LEFT, colors.white, w->text);
|
||||||
drawText(w->rect.x + w->rect.w - 10, w->rect.y + 2, 20, TA_RIGHT, colors.white, w->options[w->currentOption]);
|
drawText(w->rect.x + w->rect.w - 10, w->rect.y + 2, 20, TA_RIGHT, colors.white, w->options[w->currentOption]);
|
||||||
blit(optionsLeft, w->rect.x - 24, w->rect.y + 16, 1);
|
|
||||||
blit(optionsRight, w->rect.x + w->rect.w + 24, w->rect.y + 16, 1);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,17 +162,17 @@ void drawConfirmMessage(char *message)
|
||||||
drawWidgets("okCancel");
|
drawWidgets("okCancel");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void changeSelectedValue(int dir)
|
static void changeSelectedValue(Widget *w, int dir)
|
||||||
{
|
{
|
||||||
int oldOption = selectedWidget->currentOption;
|
int oldOption = w->currentOption;
|
||||||
|
|
||||||
selectedWidget->currentOption += dir;
|
w->currentOption += dir;
|
||||||
|
|
||||||
selectedWidget->currentOption = MIN(MAX(0, selectedWidget->currentOption), selectedWidget->numOptions - 1);
|
w->currentOption = MIN(MAX(0, w->currentOption), w->numOptions - 1);
|
||||||
|
|
||||||
selectedWidget->onChange(selectedWidget->options[selectedWidget->currentOption]);
|
w->onChange(w->options[w->currentOption]);
|
||||||
|
|
||||||
if (oldOption != selectedWidget->currentOption)
|
if (oldOption != w->currentOption)
|
||||||
{
|
{
|
||||||
playSound(SND_GUI_CLICK);
|
playSound(SND_GUI_CLICK);
|
||||||
}
|
}
|
||||||
|
@ -199,6 +205,7 @@ static void handleMouse(void)
|
||||||
switch (selectedWidget->type)
|
switch (selectedWidget->type)
|
||||||
{
|
{
|
||||||
case WT_BUTTON:
|
case WT_BUTTON:
|
||||||
|
case WT_IMG_BUTTON:
|
||||||
if (selectedWidget->action)
|
if (selectedWidget->action)
|
||||||
{
|
{
|
||||||
playSound(SND_GUI_SELECT);
|
playSound(SND_GUI_SELECT);
|
||||||
|
@ -207,18 +214,12 @@ static void handleMouse(void)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WT_SELECT:
|
case WT_SELECT_BUTTON:
|
||||||
changeSelectedValue(-1);
|
changeSelectedValue(selectedWidget->parent, selectedWidget->value);
|
||||||
app.mouse.button[SDL_BUTTON_LEFT] = 0;
|
app.mouse.button[SDL_BUTTON_LEFT] = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (app.mouse.button[SDL_BUTTON_RIGHT] && selectedWidget->type == WT_SELECT)
|
|
||||||
{
|
|
||||||
changeSelectedValue(1);
|
|
||||||
app.mouse.button[SDL_BUTTON_RIGHT] = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,8 +261,6 @@ static void loadWidgetSet(char *filename)
|
||||||
STRNCPY(w->group, cJSON_GetObjectItem(node, "group")->valuestring, MAX_NAME_LENGTH);
|
STRNCPY(w->group, cJSON_GetObjectItem(node, "group")->valuestring, MAX_NAME_LENGTH);
|
||||||
w->rect.x = cJSON_GetObjectItem(node, "x")->valueint;
|
w->rect.x = cJSON_GetObjectItem(node, "x")->valueint;
|
||||||
w->rect.y = cJSON_GetObjectItem(node, "y")->valueint;
|
w->rect.y = cJSON_GetObjectItem(node, "y")->valueint;
|
||||||
w->rect.w = cJSON_GetObjectItem(node, "w")->valueint;
|
|
||||||
w->rect.h = cJSON_GetObjectItem(node, "h")->valueint;
|
|
||||||
w->enabled = 1;
|
w->enabled = 1;
|
||||||
w->visible = 1;
|
w->visible = 1;
|
||||||
|
|
||||||
|
@ -274,14 +273,24 @@ static void loadWidgetSet(char *filename)
|
||||||
{
|
{
|
||||||
case WT_BUTTON:
|
case WT_BUTTON:
|
||||||
STRNCPY(w->text, cJSON_GetObjectItem(node, "text")->valuestring, MAX_NAME_LENGTH);
|
STRNCPY(w->text, cJSON_GetObjectItem(node, "text")->valuestring, MAX_NAME_LENGTH);
|
||||||
|
w->rect.w = cJSON_GetObjectItem(node, "w")->valueint;
|
||||||
|
w->rect.h = cJSON_GetObjectItem(node, "h")->valueint;
|
||||||
w->rect.x -= w->rect.w / 2;
|
w->rect.x -= w->rect.w / 2;
|
||||||
w->rect.y -= (w->rect.h / 2) + 8;
|
w->rect.y -= (w->rect.h / 2) + 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WT_IMG_BUTTON:
|
||||||
|
w->texture = getTexture(cJSON_GetObjectItem(node, "texture")->valuestring);
|
||||||
|
SDL_QueryTexture(w->texture, NULL, NULL, &w->rect.w, &w->rect.h);
|
||||||
|
break;
|
||||||
|
|
||||||
case WT_SELECT:
|
case WT_SELECT:
|
||||||
STRNCPY(w->text, cJSON_GetObjectItem(node, "text")->valuestring, MAX_NAME_LENGTH);
|
STRNCPY(w->text, cJSON_GetObjectItem(node, "text")->valuestring, MAX_NAME_LENGTH);
|
||||||
|
w->rect.w = cJSON_GetObjectItem(node, "w")->valueint;
|
||||||
|
w->rect.h = cJSON_GetObjectItem(node, "h")->valueint;
|
||||||
w->rect.x -= w->rect.w / 2;
|
w->rect.x -= w->rect.w / 2;
|
||||||
w->rect.y -= (w->rect.h / 2) + 8;
|
w->rect.y -= (w->rect.h / 2) + 8;
|
||||||
|
createSelectButtons(w);
|
||||||
createOptions(w, cJSON_GetObjectItem(node, "options")->valuestring);
|
createOptions(w, cJSON_GetObjectItem(node, "options")->valuestring);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -324,6 +333,40 @@ static void createOptions(Widget *w, char *options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void createSelectButtons(Widget *w)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Widget *btn;
|
||||||
|
|
||||||
|
for (i = 0 ; i < 2 ; i++)
|
||||||
|
{
|
||||||
|
btn = malloc(sizeof(Widget));
|
||||||
|
memcpy(btn, w, sizeof(Widget));
|
||||||
|
strcpy(btn->name, "");
|
||||||
|
|
||||||
|
btn->type = WT_SELECT_BUTTON;
|
||||||
|
btn->parent = w;
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
btn->value = -1;
|
||||||
|
btn->rect.x -= 32;
|
||||||
|
btn->rect.y += 4;
|
||||||
|
btn->texture = optionsLeft;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
btn->value = 1;
|
||||||
|
btn->rect.x += btn->rect.w + 8;
|
||||||
|
btn->rect.y += 4;
|
||||||
|
btn->texture = optionsRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
tail->next = btn;
|
||||||
|
tail = btn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void destroyWidgets(void)
|
void destroyWidgets(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
Loading…
Reference in New Issue