aboutsummaryrefslogtreecommitdiff
#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);
}