#include #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; }