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