summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main-menu.c139
1 files changed, 76 insertions, 63 deletions
diff --git a/src/main-menu.c b/src/main-menu.c
index f6398e8..e5b7726 100644
--- a/src/main-menu.c
+++ b/src/main-menu.c
@@ -26,6 +26,16 @@
#include "output.h"
#include "util.h"
+struct _db_main_menu_button {
+ SDL_Texture *texture_text;
+ SDL_Texture *texture_over;
+ SDL_Rect rect;
+ struct _db_main_menu_button *u;
+ struct _db_main_menu_button *d;
+ struct _db_main_menu_button *l;
+ struct _db_main_menu_button *r;
+};
+
static SDL_Texture *
_db_main_menu_text(TTF_Font *font, const char *text, SDL_Color *color,
int width, SDL_Renderer *renderer, SDL_Rect *rect)
@@ -56,24 +66,19 @@ _db_main_menu_text(TTF_Font *font, const char *text, SDL_Color *color,
void
db_main_menu(void)
{
- const char *games_dir;
- char *font_path;
- SDL_Renderer *renderer;
- SDL_Color text_color;
- SDL_Color over_color;
- SDL_Rect dest_rect;
- TTF_Font *font;
- SDL_Texture *texture_title;
- SDL_Texture *texture_help_text;
- SDL_Texture *texture_help_over;
- SDL_Texture *texture_quit_text;
- SDL_Texture *texture_quit_over;
- struct db_game **games;
- int n;
- char *name_desc;
- SDL_Texture **texture_games_text;
- SDL_Texture **texture_games_over;
- int i;
+ const char *games_dir;
+ char *font_path;
+ SDL_Renderer *renderer;
+ SDL_Color text_color;
+ SDL_Color over_color;
+ SDL_Rect dest_rect;
+ TTF_Font *font;
+ SDL_Texture *texture_title;
+ struct db_game **games;
+ int n;
+ struct _db_main_menu_button **buttons;
+ char *name_desc;
+ int i;
games_dir = db_get_games_dir();
font_path = db_strcat(db_get_fonts_dir(), "/UbuntuTitling-Bold.ttf");
@@ -94,12 +99,6 @@ db_main_menu(void)
over_color.b = 0xFF;
over_color.a = 0xFF;
- n = 0;
- texture_help_text = NULL;
- texture_help_over = NULL;
- texture_quit_text = NULL;
- texture_quit_over = NULL;
-
/* Render title text */
font = TTF_OpenFont(font_path, 48);
if (font == NULL) {
@@ -125,46 +124,64 @@ db_main_menu(void)
return;
}
- texture_help_text = _db_main_menu_text(font, "How to Play", &text_color,
- 0, renderer, &dest_rect);
- if (texture_help_text == NULL) {
+ /* Find games */
+ n = db_games_find(games_dir, &games);
+ buttons = calloc(n + 2, sizeof(*buttons));
+ if (buttons == NULL) {
+ db_err("Failed to allocate memory");
+ goto err;
+ }
+
+ /* Render help button */
+ buttons[0] = malloc(sizeof(**buttons));
+ if (buttons[0] == NULL) {
+ db_err("Failed to allocate memory");
goto err;
}
- texture_help_over = _db_main_menu_text(font, "How to Play", &over_color,
- 0, renderer, &dest_rect);
- if (texture_help_over == NULL) {
+ buttons[0]->texture_text = _db_main_menu_text(font, "How to Play",
+ &text_color, 0, renderer, &buttons[0]->rect);
+ if (buttons[0]->texture_text == NULL) {
goto err;
}
- dest_rect.x = 640 - 16 - dest_rect.w;
- dest_rect.y = 16;
- SDL_RenderCopy(renderer, texture_help_text, NULL, &dest_rect);
-
- texture_quit_text = _db_main_menu_text(font, "Quit", &text_color,
- 0, renderer, &dest_rect);
- if (texture_quit_text == NULL) {
+ buttons[0]->texture_over = _db_main_menu_text(font, "How to Play",
+ &over_color, 0, renderer, &buttons[0]->rect);
+ if (buttons[0]->texture_over == NULL) {
+ goto err;
+ }
+ buttons[0]->rect.x = 640 - 16 - buttons[0]->rect.w;
+ buttons[0]->rect.y = 16;
+ SDL_RenderCopy(renderer, buttons[0]->texture_text, NULL,
+ &buttons[0]->rect);
+
+ /* Render quit button */
+ buttons[1] = malloc(sizeof(**buttons));
+ if (buttons[1] == NULL) {
+ db_err("Failed to allocate memory");
+ goto err;
+ }
+ buttons[1]->texture_text = _db_main_menu_text(font, "Quit",
+ &text_color, 0, renderer, &buttons[1]->rect);
+ if (buttons[1]->texture_text == NULL) {
goto err;
}
- texture_quit_over = _db_main_menu_text(font, "Quit", &over_color,
- 0, renderer, &dest_rect);
- if (texture_quit_over == NULL) {
+ buttons[1]->texture_over = _db_main_menu_text(font, "Quit",
+ &over_color, 0, renderer, &buttons[1]->rect);
+ if (buttons[1]->texture_over == NULL) {
goto err;
}
- dest_rect.x = 640 - 16 - dest_rect.w;
- dest_rect.y = 48;
- SDL_RenderCopy(renderer, texture_quit_text, NULL, &dest_rect);
+ buttons[1]->rect.x = 640 - 16 - buttons[1]->rect.w;
+ buttons[1]->rect.y = 48;
+ SDL_RenderCopy(renderer, buttons[1]->texture_text, NULL,
+ &buttons[1]->rect);
- /* Find games */
- n = db_games_find(games_dir, &games);
+ /* Render game buttons */
if (n > 0) {
- texture_games_text = calloc(n, sizeof(*texture_games_text));
- if (texture_games_text == NULL) {
- goto err;
- }
- texture_games_over = calloc(n, sizeof(*texture_games_over));
- if (texture_games_over == NULL) {
- goto err;
- }
for (i = 0; i < n; ++i) {
+ buttons[i + 2] = malloc(sizeof(**buttons));
+ if (buttons[i + 2] == NULL) {
+ db_err("Failed to allocate memory");
+ goto err;
+ }
name_desc = malloc((strlen(db_game_get_name(games[i])) +
strlen(db_game_get_desc(
games[i])) + 2)
@@ -175,22 +192,22 @@ db_main_menu(void)
}
sprintf(name_desc, "%s\n%s", db_game_get_name(games[i]),
db_game_get_desc(games[i]));
- texture_games_text[i] = _db_main_menu_text(font,
+ buttons[i + 2]->texture_text = _db_main_menu_text(font,
name_desc, &text_color, 608, renderer,
&dest_rect);
- if (texture_games_text[i] == NULL) {
+ if (buttons[i + 2]->texture_text == NULL) {
free(name_desc);
goto err;
}
dest_rect.x = 16;
- dest_rect.y = 80 + 48 * i;
- SDL_RenderCopy(renderer, texture_games_text[i], NULL,
+ dest_rect.y = 80 + 48 * i + 2;
+ SDL_RenderCopy(renderer, buttons[i + 2]->texture_text, NULL,
&dest_rect);
- texture_games_over[i] = _db_main_menu_text(font,
+ buttons[i + 2]->texture_over = _db_main_menu_text(font,
name_desc, &over_color, 608, renderer,
&dest_rect);
free(name_desc);
- if (texture_games_over[i] == NULL) {
+ if (buttons[i + 2]->texture_over == NULL) {
goto err;
}
}
@@ -208,8 +225,4 @@ db_main_menu(void)
}
free(font_path);
TTF_CloseFont(font);
- SDL_DestroyTexture(texture_help_text);
- SDL_DestroyTexture(texture_help_over);
- SDL_DestroyTexture(texture_quit_text);
- SDL_DestroyTexture(texture_quit_over);
}