#include "game.h"
struct Widget *
add_button(unsigned char layer, const char *label, int x, int y,
void (*callback)(struct Widget *))
{
SDL_Surface *surface;
SDL_Color c = {255, 255, 255, 255};
struct Resources *res = &game->resources;
struct Layer *l = &game->layers[layer];
struct Widget *w;
w = &l->widgets[l->num_widgets ++];
w->callback = callback;
w->is_blended = true;
surface = TTF_RenderText_Solid(res->font, label, c);
TTF_SizeText(res->font, label, &w->rect.w, &w->rect.h);
w->texture = SDL_CreateTextureFromSurface(game->renderer, surface);
res->textures[res->num_textures ++] = w->texture;
SDL_FreeSurface(surface);
if(x == POSITION_CENTERED)
w->rect.x = (game->width / 2) - (w->rect.w / 2);
else
w->rect.x = x;
if(y == POSITION_CENTERED)
w->rect.y = (game->height / 2) - (w->rect.h / 2);
else
w->rect.y = y;
return w;
}
void set_color(struct Widget *w, struct Color color)
{
w->color = color;
w->on_hover_color = color;
w->default_color = color;
}
struct Widget *add_image(unsigned char layer, SDL_Texture *image,
int x, int y, int w, int h)
{
struct Layer *l = &game->layers[layer];
struct Widget *widget;
widget = &l->widgets[l->num_widgets ++];
widget->callback = NULL;
widget->texture = image;
widget->is_blended = false;
widget->rect.w = w;
widget->rect.h = h;
widget->color = (struct Color){255, 255, 255};
widget->default_color = widget->color;
if(x == POSITION_CENTERED)
widget->rect.x = (game->width / 2) - (widget->rect.w / 2);
else
widget->rect.x = x;
if(y == POSITION_CENTERED)
widget->rect.y = (game->height / 2) - (widget->rect.h / 2);
else
widget->rect.y = y;
return widget;
}
void process_widget_events(unsigned char type, int x, int y)
{
int i;
struct Layer *layer = &game->layers[game->current_layer];
struct Widget *widget;
for(i = 0; i < layer->num_widgets; i ++)
{
widget = &layer->widgets[i];
if(x > widget->rect.x && x < widget->rect.x + widget->rect.w
&& y > widget->rect.y && y < widget->rect.y + widget->rect.h)
{
widget->is_hover = true;
widget->color = widget->on_hover_color;
if(widget->callback != NULL && type == MOUSE_BUTTON)
widget->callback(widget);
}
else
{
widget->is_hover = false;
widget->color = widget->default_color;
}
}
}
struct Widget *add_label(unsigned char layer,
const char *text,
struct Color color,
int x, int y)
{
SDL_Surface *surface;
SDL_Color c = (SDL_Color){color.r, color.g, color.b, 255};
struct Resources *res = &game->resources;
struct Layer *l = &game->layers[layer];
struct Widget *w;
w = &l->widgets[l->num_widgets ++];
w->callback = NULL;
w->is_blended = true;
w->initial_x = x;
w->initial_y = y;
w->default_color = color;
w->color = color;
w->on_hover_color = color;
surface = TTF_RenderText_Solid(res->font, text, c);
TTF_SizeText(res->font, text, &w->rect.w, &w->rect.h);
w->texture = SDL_CreateTextureFromSurface(game->renderer, surface);
res->textures[res->num_textures ++] = w->texture;
SDL_FreeSurface(surface);
if(x == POSITION_CENTERED)
w->rect.x = (game->width / 2) - (w->rect.w / 2);
else
w->rect.x = x;
if(y == POSITION_CENTERED)
w->rect.y = (game->height / 2) - (w->rect.h / 2);
else
w->rect.y = y;
return w;
}
void set_text(struct Widget *w, const char *text)
{
int i;
SDL_Surface *surface;
SDL_Texture *texture;
SDL_Color c = (SDL_Color){w->default_color.r,
w->default_color.g,
w->default_color.b,
255};
surface = TTF_RenderText_Solid(game->resources.font, text, c);
TTF_SizeText(game->resources.font, text, &w->rect.w, &w->rect.h);
texture = SDL_CreateTextureFromSurface(game->renderer, surface);
SDL_FreeSurface(surface);
for(i = 0; i < game->resources.num_textures; i ++)
{
if(game->resources.textures[i] == w->texture)
{
SDL_DestroyTexture(w->texture);
game->resources.textures[i] = texture;
}
}
w->texture = texture;
if(w->initial_x == POSITION_CENTERED)
w->rect.x = (game->width / 2) - (w->rect.w / 2);
if(w->initial_y == POSITION_CENTERED)
w->rect.y = (game->height / 2) - (w->rect.h / 2);
}