|
#include <stdbool.h>
|
|
#include "clickable.h"
|
|
|
|
bool Clickable_CheckBounds(Clickable *c, int x, int y) {
|
|
if(c->dimensions.x < x
|
|
&&c->dimensions.x+c->dimensions.w > x
|
|
&&c->dimensions.y < y
|
|
&&c->dimensions.y+c->dimensions.h > y
|
|
) {
|
|
return true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
Clickable *heldClickable;
|
|
//Calls the clickables clickFunc iff the mouse is inside the clickable.
|
|
//Returns true if it is clicked regardless of whether the clickFunc is NULL or not, and false otherwise.
|
|
bool Clicky_ClickClickable(void *c_, int x, int y) {
|
|
//printf("CALL: Clicky_ClickClickable\n Params: %p, %d, %d\n", c_, x, y);
|
|
Clickable *c = c_;
|
|
if(Clickable_CheckBounds(c, x, y)) {
|
|
heldClickable = c;
|
|
if(c->clickFunc != NULL) { //Not necessarily true.
|
|
c->clickFunc((void*)c, x, y);
|
|
}
|
|
return true; //It doesn't matter if the clickable does anything, if it is clicked it reports it.
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//Calls the clickables releaseFunc iff the mouse is inside the clickable.
|
|
void Clicky_ReleaseClickable(void *c_, int x, int y) {
|
|
Clickable *c = c_;
|
|
if(Clickable_CheckBounds(c, x, y)) {
|
|
heldClickable = c;
|
|
if(c->releaseFunc != NULL) { //Not necessarily true.
|
|
c->releaseFunc((void*)c, x, y);
|
|
}
|
|
}
|
|
}
|
|
|
|
//Calls the releasefunc of the held clickable, if it isn't NULL.
|
|
void Clicky_ReleaseHeldClickable(int x, int y) {
|
|
//printf("Releasing held clickable.\n");
|
|
//printf(" heldClickable: %p\n", heldClickable);
|
|
//printf(" heldClickable->x: %d\n", heldClickable->dimensions.x);
|
|
//printf(" heldClickable->releaseFunc: %p\n", heldClickable->releaseFunc);
|
|
if(heldClickable == NULL) {
|
|
return; //Nothing to do.
|
|
}
|
|
//Only call the function if it exists.
|
|
if(heldClickable->releaseFunc != NULL) {
|
|
heldClickable->releaseFunc(heldClickable, x, y);
|
|
}
|
|
|
|
//Always clear this.
|
|
heldClickable = NULL;
|
|
}
|
|
|
|
Dragable *currentDragged = NULL; //This gets dragged on.
|
|
SDL_Rect dragOffset; //When a dragable gets dragged, this is the local offset into the container to move.
|
|
|
|
void Clicky_DragUpdate(int x, int y) {
|
|
if(currentDragged == NULL) {
|
|
return; //Nothing to do here.
|
|
}
|
|
|
|
Dragable *d = currentDragged;
|
|
|
|
d->coordinatesToDrag->x = x-dragOffset.x;
|
|
d->coordinatesToDrag->y = y-dragOffset.y;
|
|
|
|
//Check boundaries.
|
|
if(d->boundaries != NULL) {
|
|
//Left boundary.
|
|
if(d->coordinatesToDrag->x < d->boundaries->x) {
|
|
d->coordinatesToDrag->x = d->boundaries->x;
|
|
}
|
|
//Upper boundary.
|
|
if(d->coordinatesToDrag->y < d->boundaries->y) {
|
|
d->coordinatesToDrag->y = d->boundaries->y;
|
|
}
|
|
//Right boundary.
|
|
if(d->coordinatesToDrag->x > d->boundaries->x + d->boundaries->w - d->coordinatesToDrag->w) {
|
|
d->coordinatesToDrag->x = d->boundaries->x + d->boundaries->w - d->coordinatesToDrag->w;
|
|
}
|
|
//Lower boundary.
|
|
if(d->coordinatesToDrag->y > d->boundaries->y + d->boundaries->h - d->coordinatesToDrag->h) {
|
|
d->coordinatesToDrag->y = d->boundaries->y + d->boundaries->h - d->coordinatesToDrag->h;
|
|
}
|
|
|
|
//printf("New coords: %d, %d, %d, %d\n", d->coordinatesToDrag->x, d->coordinatesToDrag->y, d->coordinatesToDrag->x+d->coordinatesToDrag->w, d->coordinatesToDrag->y+d->coordinatesToDrag->h);
|
|
}
|
|
}
|
|
|
|
//Sets the global variables for the dragging mechanism. They are used in the function Dragable_DragUpdate.
|
|
void Dragable_ClickFunc(void *dragable, int x, int y) {
|
|
//printf("Dragable clicked.\n");
|
|
currentDragged = dragable;
|
|
dragOffset.x = x - currentDragged->coordinatesToDrag->x;
|
|
dragOffset.y = y - currentDragged->coordinatesToDrag->y;
|
|
}
|
|
|
|
//This function clears the global variables so nothing will be dragged.
|
|
//The args are ignored.
|
|
void Dragable_ReleaseFunc(void *dragable, int x, int y) {
|
|
//printf("Dragable released.\n");
|
|
currentDragged = NULL;
|
|
dragOffset.x = 0;
|
|
dragOffset.y = 0;
|
|
}
|
|
|
|
|