You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

84 lines
2.7 KiB

#include <stdbool.h>
#include "clickable_hierarchy.h"
void Clicky_Clickable_Hierarchy_Render(Clickable_Hierarchy* ch, SDL_Renderer* r) {
for(int i = 0; i < ch->num_children; i++) {
Clickable_Hierarchy_Element* elem = (ch->children)+i;
//Render the clickable.
if(elem->clickable->drawFunc != NULL) {
elem->clickable->drawFunc(elem->clickable, r);
}
if(elem->subtree != NULL) {
Clicky_Clickable_Hierarchy_Render(elem->subtree, r);
}
}
}
//True if a clickable was activated, false otherwise.
bool Clicky_Clickable_Hierarchy_Click(Clickable_Hierarchy* ch, int x, int y) {
//printf("Call_ Click_Clickable_Hierarchy_Click\n Params: %p, %d, %d\n", ch, x, y);
//printf(" #children: %d, #children slots: %d, children: %p\n", ch->num_children, ch->num_children_slots, ch->children);
bool retval = false;
for(int i = 0; i < ch->num_children; i++) {
Clickable_Hierarchy_Element* elem = (ch->children)+i;
if(elem->subtree != NULL) { //If it is a container, first attempt its children.
bool innerclick = Clicky_Clickable_Hierarchy_Click(elem->subtree, x, y);
if(!innerclick) { //Didn't hit anything inside the clickable, propagate to the clickable itself.
retval = Clicky_ClickClickable((void*)(elem->clickable), x, y);
if(retval) {break;}
}
} else {
retval = Clicky_ClickClickable((void*)(elem->clickable), x, y);
if(retval) {break;}
}
}
return retval;
}
int Clicky_Clickable_Hierarchy_Add_Clickable(Clickable_Hierarchy* ch, Clickable* cl) {
//printf("Hierarchy: %p, Clickable: %p\n", ch, cl);
//printf(" #children: %d, #children slots: %d, children: %p\n", ch->num_children, ch->num_children_slots, ch->children);
if(ch->num_children >= ch->num_children_slots) {
return 1;
}
//printf("%p, %p\n", ch->children, ch->children+1);
Clickable_Hierarchy_Element *elem = (ch->children+ch->num_children);
//printf("Element pointer: %p\n", elem);
elem->clickable = cl;
elem->subtree = NULL;
ch->num_children++;
return 0;
}
Clickable_Hierarchy* Clicky_Clickable_Hierarchy_Add_Subtree(Clickable_Hierarchy* ch, Clickable* cl, int num_children) {
if(ch->num_children >= ch->num_children_slots) {
return NULL;
}
Clickable_Hierarchy_Element *elem = (ch->children+ch->num_children);
//printf("Element pointer: %p\n", elem);
elem->clickable = cl;
Clickable_Hierarchy* sh = (Clickable_Hierarchy*) malloc(sizeof(Clickable_Hierarchy));
sh->num_children = 0;
sh->num_children_slots = num_children;
sh->children = (Clickable_Hierarchy_Element*) malloc(sizeof(Clickable_Hierarchy_Element)*num_children);
elem->subtree = sh;
ch->num_children++;
return sh;
}