選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

84 行
2.7 KiB

  1. #include <stdbool.h>
  2. #include "clickable_hierarchy.h"
  3. void Clicky_Clickable_Hierarchy_Render(Clickable_Hierarchy* ch, SDL_Renderer* r) {
  4. for(int i = 0; i < ch->num_children; i++) {
  5. Clickable_Hierarchy_Element* elem = (ch->children)+i;
  6. //Render the clickable.
  7. if(elem->clickable->drawFunc != NULL) {
  8. elem->clickable->drawFunc(elem->clickable, r);
  9. }
  10. if(elem->subtree != NULL) {
  11. Clicky_Clickable_Hierarchy_Render(elem->subtree, r);
  12. }
  13. }
  14. }
  15. //True if a clickable was activated, false otherwise.
  16. bool Clicky_Clickable_Hierarchy_Click(Clickable_Hierarchy* ch, int x, int y) {
  17. //printf("Call_ Click_Clickable_Hierarchy_Click\n Params: %p, %d, %d\n", ch, x, y);
  18. //printf(" #children: %d, #children slots: %d, children: %p\n", ch->num_children, ch->num_children_slots, ch->children);
  19. bool retval = false;
  20. for(int i = 0; i < ch->num_children; i++) {
  21. Clickable_Hierarchy_Element* elem = (ch->children)+i;
  22. if(elem->subtree != NULL) { //If it is a container, first attempt its children.
  23. bool innerclick = Clicky_Clickable_Hierarchy_Click(elem->subtree, x, y);
  24. if(!innerclick) { //Didn't hit anything inside the clickable, propagate to the clickable itself.
  25. retval = Clicky_ClickClickable((void*)(elem->clickable), x, y);
  26. if(retval) {break;}
  27. }
  28. } else {
  29. retval = Clicky_ClickClickable((void*)(elem->clickable), x, y);
  30. if(retval) {break;}
  31. }
  32. }
  33. return retval;
  34. }
  35. int Clicky_Clickable_Hierarchy_Add_Clickable(Clickable_Hierarchy* ch, Clickable* cl) {
  36. //printf("Hierarchy: %p, Clickable: %p\n", ch, cl);
  37. //printf(" #children: %d, #children slots: %d, children: %p\n", ch->num_children, ch->num_children_slots, ch->children);
  38. if(ch->num_children >= ch->num_children_slots) {
  39. return 1;
  40. }
  41. //printf("%p, %p\n", ch->children, ch->children+1);
  42. Clickable_Hierarchy_Element *elem = (ch->children+ch->num_children);
  43. //printf("Element pointer: %p\n", elem);
  44. elem->clickable = cl;
  45. elem->subtree = NULL;
  46. ch->num_children++;
  47. return 0;
  48. }
  49. Clickable_Hierarchy* Clicky_Clickable_Hierarchy_Add_Subtree(Clickable_Hierarchy* ch, Clickable* cl, int num_children) {
  50. if(ch->num_children >= ch->num_children_slots) {
  51. return NULL;
  52. }
  53. Clickable_Hierarchy_Element *elem = (ch->children+ch->num_children);
  54. //printf("Element pointer: %p\n", elem);
  55. elem->clickable = cl;
  56. Clickable_Hierarchy* sh = (Clickable_Hierarchy*) malloc(sizeof(Clickable_Hierarchy));
  57. sh->num_children = 0;
  58. sh->num_children_slots = num_children;
  59. sh->children = (Clickable_Hierarchy_Element*) malloc(sizeof(Clickable_Hierarchy_Element)*num_children);
  60. elem->subtree = sh;
  61. ch->num_children++;
  62. return sh;
  63. }