239 lines
8.9 KiB
C
239 lines
8.9 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;
|
|
case TYPE_IMAGE:
|
|
element->data = malloc(sizeof(struct ImageElement));
|
|
((struct ImageElement*)element->data)->width = 0;
|
|
((struct ImageElement*)element->data)->height = 0;
|
|
((struct ImageElement*)element->data)->image = NULL;
|
|
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;
|
|
case TYPE_TEXT_INPUT:
|
|
realloc(((struct TextInputElement*)element->data)->string, length+1);
|
|
memcpy(((struct TextInputElement*)element->data)->string, string, length);
|
|
((struct TextInputElement*)element->data)->string[length] = '\0';
|
|
((struct TextInputElement*)element->data)->length = length;
|
|
((struct TextInputElement*)element->data)->cursor = length;
|
|
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;
|
|
case TYPE_TEXT_INPUT:
|
|
realloc(((struct TextInputElement*)element->data)->string, 1);
|
|
((struct TextInputElement*)element->data)->string[0] = '\0';
|
|
((struct TextInputElement*)element->data)->length = 0;
|
|
((struct TextInputElement*)element->data)->cursor = 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;
|
|
}
|
|
|
|
int setElementImage(struct Element *element, void *image, int width, int height) {
|
|
if (element->type == TYPE_IMAGE) {
|
|
((struct ImageElement*)element->data)->image = image;
|
|
((struct ImageElement*)element->data)->width = width;
|
|
((struct ImageElement*)element->data)->height = height;
|
|
return 0;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/* dynamic setting ops */
|
|
|
|
int handleInputElement(struct Element *element, char ch) {
|
|
printf("got %d, want %d\n", ch, '\b');
|
|
if (element->type == TYPE_TEXT_INPUT) {
|
|
switch (ch) {
|
|
case 0:
|
|
break;
|
|
case 2: // left
|
|
if (((struct TextInputElement*)element->data)->cursor > 0) {
|
|
((struct TextInputElement*)element->data)->cursor--;
|
|
}
|
|
break;
|
|
case 3: // right
|
|
if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->length) {
|
|
((struct TextInputElement*)element->data)->cursor++;
|
|
}
|
|
break;
|
|
case '\b':
|
|
case 127:
|
|
if (((struct TextInputElement*)element->data)->cursor > 0) {
|
|
if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->length) {
|
|
((struct TextInputElement*)element->data)->length--;
|
|
int offset = ((struct TextInputElement*)element->data)->cursor;
|
|
char temp_string[256];
|
|
int i = offset;
|
|
int temp_offset = 0;
|
|
while(((struct TextInputElement*)element->data)->string[i] != '\0') {
|
|
temp_string[temp_offset++] = ((struct TextInputElement*)element->data)->string[i];
|
|
i++;
|
|
}
|
|
temp_string[temp_offset] = '\0';
|
|
// let's readd the end of the string after added char
|
|
((struct TextInputElement*)element->data)->cursor--;
|
|
i = offset-1;
|
|
temp_offset = 0;
|
|
while (temp_string[temp_offset] != '\0') {
|
|
((struct TextInputElement*)element->data)->string[i++] = temp_string[temp_offset++];
|
|
}
|
|
((struct TextInputElement*)element->data)->string[i] = '\0';
|
|
} else {
|
|
((struct TextInputElement*)element->data)->cursor--;
|
|
((struct TextInputElement*)element->data)->length--;
|
|
((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor] = '\0';
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->size) {
|
|
if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->length) {
|
|
printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string);
|
|
((struct TextInputElement*)element->data)->length++;
|
|
int offset = ((struct TextInputElement*)element->data)->cursor;
|
|
char temp_string[256];
|
|
int i = offset;
|
|
int temp_offset = 0;
|
|
while(((struct TextInputElement*)element->data)->string[i] != '\0') {
|
|
temp_string[temp_offset++] = ((struct TextInputElement*)element->data)->string[i];
|
|
i++;
|
|
}
|
|
temp_string[temp_offset] = '\0';
|
|
((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor++] = ch;
|
|
// let's readd the end of the string after added char
|
|
i = offset+1;
|
|
temp_offset = 0;
|
|
while (temp_string[temp_offset] != '\0') {
|
|
((struct TextInputElement*)element->data)->string[i++] = temp_string[temp_offset++];
|
|
}
|
|
((struct TextInputElement*)element->data)->string[i] = '\0';
|
|
} else {
|
|
printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string);
|
|
((struct TextInputElement*)element->data)->length++;
|
|
((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor++] = ch;
|
|
((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor] = '\0';
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return 0;
|
|
} else {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
/* 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 "";
|
|
}
|