#include "Button.h"
#include "SpritesList.h"
#include "Sdl.h"
bool InitButtonFail (BUTTON* button)
{
ButtonClose (button);
return false;
}
bool ButtonInit (BUTTON* button,
SDL_Renderer* renderer,
char* SprEnabled,
char* SprDisabled,
char* SprClicked,
int x,
int y,
bool enabled,
button_MouseOver over,
button_MouseOut out,
button_LeftClick leftclick)
{
bool ret = false;
// Init pointers in case of failure
button->SprClicked = NULL;
button->SprEnabled = NULL;
button->SprDisabled = NULL;
// Load sprites
button->SprEnabled = LoadSprite (SprEnabled, renderer);
if (button->SprEnabled == NULL)
{
ButtonClose (button);
goto exit;
}
if (SprDisabled != NULL) {
button->SprDisabled = LoadSprite (SprDisabled, renderer);
if (button->SprDisabled == NULL)
{
ButtonClose (button);
goto exit;
}
}
if (SprClicked != NULL) {
button->SprClicked = LoadSprite (SprClicked, renderer);
if (button->SprClicked == NULL)
{
ButtonClose (button);
goto exit;
}
}
// Callbacks
button->over = over;
button->out = out;
button->leftclick = leftclick;
// Status
button->status = STATUS_MOUSE_OUT;
button->enabled = enabled;
// Location and size
button->dest.x = x;
button->dest.y = y;
SDL_QueryTexture (button->SprEnabled, NULL, NULL, &button->dest.w, &button->dest.h);
// Default sprite
button->sprite = enabled ? button->SprEnabled : button->SprDisabled;
ret = true;
exit:
return true;
}
void ButtonClose (BUTTON* button)
{
if (button->SprEnabled != NULL)
UnloadSprite (button->SprEnabled);
if (button->SprDisabled != NULL)
UnloadSprite (button->SprDisabled);
if (button->SprClicked != NULL)
UnloadSprite (button->SprClicked);
}
bool ButtonUpdate (BUTTON* button, SDL_Event* event, int mouse_x, int mouse_y)
{
bool ret = true;
if (button->enabled) {
if ((mouse_x >= button->dest.x) && (mouse_x < button->dest.x + button->dest.w) && (mouse_y >= button->dest.y) &&
(mouse_y < button->dest.y + button->dest.h)) {
// The mouse is over the button
switch (button->status) {
case STATUS_MOUSE_OUT:
button->status = STATUS_MOUSE_OVER;
if (button->over != NULL)
ret = button->over ();
break;
case STATUS_MOUSE_OVER:
if ((event->type == SDL_MOUSEBUTTONDOWN) && (event->button.button == SDL_BUTTON_LEFT)) {
button->status = STATUS_CLICK_LEFT_DOWN;
button->sprite = button->SprClicked == NULL ? button->SprEnabled : button->SprClicked;
break;
}
case STATUS_CLICK_LEFT_DOWN:
if ((event->type == SDL_MOUSEBUTTONUP) && (event->button.button == SDL_BUTTON_LEFT)) {
button->status = STATUS_CLICK_LEFT_UP;
ret = button->leftclick ();
button->status = STATUS_MOUSE_OVER;
button->sprite = button->SprEnabled;
break;
}
}
} else {
// The mouse is out of the button
if (button->status != STATUS_MOUSE_OUT) {
// But it was over before
button->status = STATUS_MOUSE_OUT;
if (button->out != NULL)
ret = button->out ();
}
}
} else { // Button is disabled
button->status = STATUS_MOUSE_OUT;
button->sprite = button->SprDisabled == NULL ? button->SprEnabled : button->SprDisabled;
}
return ret;
}
bool ButtonDraw (BUTTON* button, SDL_Renderer* renderer)
{
return SDL_RenderCopy (renderer, button->sprite, NULL, &button->dest) == 0 ? true : false;
}