timesynk/tile_editor/elements.c

127 lines
3.8 KiB
C

#include "elements.h"
struct Element *newElement(int type) {
struct Element *element = malloc(sizeof(struct Element));
element->state = STATE_NORMAL;
element->type = type;
element->next = NULL;
element->callback = NULL;
element->user = NULL;
switch(type) {
case TYPE_BUTTON:
element->data = malloc(sizeof(struct ButtonElement));
((struct ButtonElement*)element->data)->length = 0;
((struct ButtonElement*)element->data)->string = malloc(1);
((struct ButtonElement*)element->data)->string[0] = '\0';
break;
case TYPE_TEXT:
element->data = malloc(sizeof(struct TextElement));
((struct TextElement*)element->data)->length = 0;
((struct TextElement*)element->data)->string = malloc(1);
((struct TextElement*)element->data)->string[0] = '\0';
break;
case TYPE_TEXT_INPUT:
element->data = malloc(sizeof(struct TextInputElement));
((struct TextInputElement*)element->data)->length = 0;
((struct TextInputElement*)element->data)->string = malloc(1);
((struct TextInputElement*)element->data)->string[0] = '\0';
((struct TextInputElement*)element->data)->size = 8;
((struct TextInputElement*)element->data)->cursor = 0;
break;
default:
break;
}
return element;
}
/****
if the passed Element's type is TYPE_BUTTON or TYPE_TEXT, set either the TextElement or ButtonElemnt's string to the passed string, realloc'ing as needed. If passed string is NULL, the Text or Button's string is realloc'd to fit one char, which is set to '\0'.
****/
int setElementText(struct Element *element, const char *string) {
if (string != NULL) {
int length = strlen(string);
switch(element->type) {
case TYPE_BUTTON:
realloc(((struct ButtonElement*)element->data)->string, length+1);
memcpy(((struct ButtonElement*)element->data)->string, string, length+1);
((struct ButtonElement*)element->data)->length = length;
break;
case TYPE_TEXT:
realloc(((struct TextElement*)element->data)->string, length+1);
memcpy(((struct TextElement*)element->data)->string, string, length);
((struct TextElement*)element->data)->string[length] = '\0';
((struct TextElement*)element->data)->length = length;
break;
default:
break;
}
return 0;
} else {
switch(element->type) {
case TYPE_BUTTON:
realloc(((struct ButtonElement*)element->data)->string, 1);
((struct ButtonElement*)element->data)->string[0] = '\0';
((struct ButtonElement*)element->data)->length = 0;
break;
case TYPE_TEXT:
realloc(((struct TextElement*)element->data)->string, 1);
((struct TextElement*)element->data)->string[0] = '\0';
((struct TextElement*)element->data)->length = 0;
break;
default:
break;
}
return 1;
}
return -1;
}
int setElementPosition(struct Element *element, int x, int y) {
element->x = x;
element->y = y;
return 0;
}
int setElementCallback(struct Element *element, void(*callback)) {
element->callback = callback;
return 0;
}
int setElementSize(struct Element *element, int size) {
switch (element->type) {
case TYPE_TEXT_INPUT:
((struct TextInputElement*)element->data)->size = size;
break;
default:
break;
}
return 0;
}
int setElementUser(struct Element *element, void *user) {
element->user = user;
return 0;
}
/* gettin' operations */
const char *getElementText(struct Element *element) {
switch (element->type) {
case TYPE_TEXT_INPUT:
return ((struct TextInputElement*)element->data)->string;
break;
case TYPE_TEXT:
return ((struct TextElement*)element->data)->string;
break;
case TYPE_BUTTON:
return ((struct ButtonElement*)element->data)->string;
break;
default:
break;
}
return "";
}