diff --git a/data/widgets/stats.json b/data/widgets/stats.json index 7744ba5..de211d7 100644 --- a/data/widgets/stats.json +++ b/data/widgets/stats.json @@ -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", "group" : "stats", diff --git a/src/defs.h b/src/defs.h index ed581a1..1ceaff2 100644 --- a/src/defs.h +++ b/src/defs.h @@ -222,7 +222,9 @@ enum enum { WT_BUTTON, - WT_SELECT + WT_IMG_BUTTON, + WT_SELECT, + WT_SELECT_BUTTON }; enum diff --git a/src/galaxy/stats.c b/src/galaxy/stats.c index af16c3b..ef1dd04 100644 --- a/src/galaxy/stats.c +++ b/src/galaxy/stats.c @@ -20,6 +20,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "stats.h" +static void prevPage(void); +static void nextPage(void); + static char *statDescription[] = { "Missions Started", "Missons Completed", @@ -49,43 +52,19 @@ static char *statDescription[] = { static int page; static int maxPages; -static SDL_Texture *pagePrev; -static SDL_Texture *pageNext; -static SDL_Rect left, right; +static Widget *prev; +static Widget *next; void initStatsDisplay(void) { page = 0; maxPages = (STAT_MAX / MAX_STAT_ITEMS); - pagePrev = getTexture("gfx/widgets/optionsLeft.png"); - pageNext = getTexture("gfx/widgets/optionsRight.png"); + prev = getWidget("prev", "stats"); + prev->action = prevPage; - left.x = (SCREEN_WIDTH / 2) - 100; - left.y = 120; - 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; - } - } + next = getWidget("next", "stats"); + next->action = nextPage; } 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); - if (page > 0) - { - blit(pagePrev, left.x, left.y, 1); - } - - if (page < maxPages) - { - blit(pageNext, right.x, right.y, 1); - } - y = 170; startIndex = (page * MAX_STAT_ITEMS); @@ -149,3 +118,13 @@ void drawStats(void) drawWidgets("stats"); } + +static void nextPage(void) +{ + page = MIN(page + 1, maxPages); +} + +static void prevPage(void) +{ + page = MAX(0, page - 1); +} diff --git a/src/galaxy/stats.h b/src/galaxy/stats.h index d1fab24..c48209c 100644 --- a/src/galaxy/stats.h +++ b/src/galaxy/stats.h @@ -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 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 Widget *getWidget(const char *name, const char *group); extern App app; extern Colors colors; diff --git a/src/structs.h b/src/structs.h index ad2947d..01966d1 100644 --- a/src/structs.h +++ b/src/structs.h @@ -279,8 +279,10 @@ struct Widget { int visible; int enabled; SDL_Rect rect; + SDL_Texture *texture; void (*action)(void); void (*onChange)(char *value); + Widget *parent; Widget *next; }; diff --git a/src/system/lookup.c b/src/system/lookup.c index fbb7ee3..d58841d 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -63,6 +63,7 @@ void initLookups(void) addLookup("WT_BUTTON", WT_BUTTON); addLookup("WT_SELECT", WT_SELECT); + addLookup("WT_IMG_BUTTON", WT_IMG_BUTTON); addLookup("SIDE_ALLIES", SIDE_ALLIES); addLookup("SIDE_PIRATE", SIDE_PIRATE); diff --git a/src/system/widgets.c b/src/system/widgets.c index a04634a..b32a228 100644 --- a/src/system/widgets.c +++ b/src/system/widgets.c @@ -24,7 +24,8 @@ static void loadWidgets(char *filename); static void loadWidgetSet(char *filename); static void handleMouse(void); 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 *tail; @@ -41,12 +42,12 @@ void initWidgets(void) selectedWidget = NULL; + optionsLeft = getTexture("gfx/widgets/optionsLeft.png"); + optionsRight = getTexture("gfx/widgets/optionsRight.png"); + loadWidgets("data/widgets/list.json"); drawingWidgets = 0; - - optionsLeft = getTexture("gfx/widgets/optionsLeft.png"); - optionsRight = getTexture("gfx/widgets/optionsRight.png"); } void doWidgets(void) @@ -104,20 +105,27 @@ void drawWidgets(const char *group) } } - SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); - SDL_RenderFillRect(app.renderer, &w->rect); - - if (w == selectedWidget) + if (w->texture) { - 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); + blit(w->texture , w->rect.x, w->rect.y, 0); } else { - SDL_SetRenderDrawColor(app.renderer, 64, 64, 64, SDL_ALPHA_OPAQUE); - SDL_RenderDrawRect(app.renderer, &w->rect); + SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, SDL_ALPHA_OPAQUE); + 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) @@ -130,8 +138,6 @@ void drawWidgets(const char *group) case WT_SELECT: 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]); - 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; } @@ -156,17 +162,17 @@ void drawConfirmMessage(char *message) 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); } @@ -199,6 +205,7 @@ static void handleMouse(void) switch (selectedWidget->type) { case WT_BUTTON: + case WT_IMG_BUTTON: if (selectedWidget->action) { playSound(SND_GUI_SELECT); @@ -207,18 +214,12 @@ static void handleMouse(void) } break; - case WT_SELECT: - changeSelectedValue(-1); + case WT_SELECT_BUTTON: + changeSelectedValue(selectedWidget->parent, selectedWidget->value); app.mouse.button[SDL_BUTTON_LEFT] = 0; 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); w->rect.x = cJSON_GetObjectItem(node, "x")->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->visible = 1; @@ -274,18 +273,28 @@ static void loadWidgetSet(char *filename) { case WT_BUTTON: 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.y -= (w->rect.h / 2) + 8; 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: 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.y -= (w->rect.h / 2) + 8; + createSelectButtons(w); createOptions(w, cJSON_GetObjectItem(node, "options")->valuestring); break; } - + tail->next = w; tail = w; } @@ -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) { int i;