diff --git a/Makefile b/Makefile index f206e64..bc8504c 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,7 @@ clean: rm -f pack_tiles rm -f pack_data cd test && make clean + cd tile_editor && make clean pack_tiles: pack_tiles.c $(CC) pack_tiles.c -o pack_tiles diff --git a/tile_editor/.helper.c.swp b/tile_editor/.helper.c.swp new file mode 100644 index 0000000..8265c06 Binary files /dev/null and b/tile_editor/.helper.c.swp differ diff --git a/tile_editor/Makefile b/tile_editor/Makefile index a2b7b0d..1ba11d2 100644 --- a/tile_editor/Makefile +++ b/tile_editor/Makefile @@ -1,9 +1,9 @@ CC = gcc CFLAGS = -Wall -c -g -LFLAGS = -lSDL -lSDL_image +LFLAGS = -lX11 -lSDL -lSDL_image BINARY = TILE_EDITOR -OBJS = main.o sdl.o elements.o font.o +OBJS = main.o helper.o sdl.o elements.o font.o $(BINARY): $(OBJS) $(CC) $(OBJS) $(LFLAGS) -o tile_editor @@ -20,5 +20,8 @@ font.o: font.c elements.o: elements.c elements.h $(CC) $(CFLAGS) -c elements.c +helper.o: helper.c helper.h + $(CC) $(CFLAGS) -c helper.c + clean: rm -f tile_editor *.o diff --git a/tile_editor/assets.h b/tile_editor/assets.h index 126a079..11db53d 100644 --- a/tile_editor/assets.h +++ b/tile_editor/assets.h @@ -1,6 +1,7 @@ #ifndef ASSETS_H #define ASSETS_H /* globals */ +int g_gfx; // 0 = not loaded, 1 = loaded int g_set; int g_id; float g_scale_x; diff --git a/tile_editor/elements.c b/tile_editor/elements.c index a62af04..aa1178f 100644 --- a/tile_editor/elements.c +++ b/tile_editor/elements.c @@ -2,6 +2,8 @@ #include // for that NULL #include // for dat malloc #include // memcpy +#include // INT_MAX, etc. +#include "helper.h" struct Element *newElement(int type) { struct Element *element = malloc(sizeof(struct Element)); @@ -10,7 +12,6 @@ struct Element *newElement(int type) { element->next = NULL; element->callback = NULL; element->user = NULL; - char *test; switch(type) { case TYPE_BUTTON: element->data = malloc(sizeof(struct ButtonElement)); @@ -18,6 +19,14 @@ struct Element *newElement(int type) { ((struct ButtonElement*)element->data)->string = malloc(1); ((struct ButtonElement*)element->data)->string[0] = '\0'; break; + case TYPE_SPINNER: + element->data = malloc(sizeof(struct SpinnerElement)); + ((struct SpinnerElement*)element->data)->length = 0; + ((struct SpinnerElement*)element->data)->string = malloc(1); + ((struct SpinnerElement*)element->data)->string[0] = '\0'; + ((struct SpinnerElement*)element->data)->size = 3; + ((struct SpinnerElement*)element->data)->cursor = 0; + break; case TYPE_TEXT: element->data = malloc(sizeof(struct TextElement)); ((struct TextElement*)element->data)->length = 0; @@ -53,6 +62,10 @@ void freeElement(struct Element *element) { free(((struct ButtonElement*)element->data)->string); free(element->data); break; + case TYPE_SPINNER: + free(((struct SpinnerElement*)element->data)->string); + free(element->data); + break; case TYPE_TEXT: free(((struct TextElement*)element->data)->string); free(element->data); @@ -81,6 +94,13 @@ int setElementText(struct Element *element, const char *string) { memcpy(((struct ButtonElement*)element->data)->string, string, length+1); ((struct ButtonElement*)element->data)->length = length; break; + case TYPE_SPINNER: + ((struct SpinnerElement*)element->data)->string = realloc(((struct SpinnerElement*)element->data)->string, length+1); + if (((struct SpinnerElement*)element->data)->string == NULL) + return -3; + memcpy(((struct SpinnerElement*)element->data)->string, string, length+1); + ((struct SpinnerElement*)element->data)->length = length; + break; case TYPE_TEXT: ((struct TextElement*)element->data)->string = realloc(((struct TextElement*)element->data)->string, length+1); if (((struct TextElement*)element->data)->string == NULL) @@ -131,6 +151,21 @@ int setElementText(struct Element *element, const char *string) { return -1; } +int setElementValue(struct Element *element, int value) { + char value_string[128]; + switch(element->type) { + case TYPE_SPINNER: + ((struct SpinnerElement*)element->data)->value = value; + itoa(value, value_string, 10); + setElementText(element, value_string); + return 0; + break; + default: + return -2; + break; + } + return -1; +} int setElementPosition(struct Element *element, int x, int y) { element->x = x; @@ -148,6 +183,9 @@ int setElementSize(struct Element *element, int size) { case TYPE_TEXT_INPUT: ((struct TextInputElement*)element->data)->size = size; break; + case TYPE_SPINNER: + ((struct SpinnerElement*)element->data)->size = size; + break; default: break; } @@ -172,7 +210,7 @@ int setElementImage(struct Element *element, void *image, int width, int height) /* dynamic setting ops */ int handleInputElement(struct Element *element, int ch) { -printf("got %d, want %d\n", ch, '\b'); + printf("got %d\n", ch); if (element->type == TYPE_TEXT_INPUT) { switch (ch) { case 0: @@ -187,6 +225,11 @@ printf("got %d, want %d\n", ch, '\b'); ((struct TextInputElement*)element->data)->cursor++; } break; + case 13: // enter + if (element->callback != NULL) { + element->callback(); + } + break; case '\b': case 127: if (((struct TextInputElement*)element->data)->cursor > 0) { @@ -218,9 +261,9 @@ printf("got %d, want %d\n", ch, '\b'); break; default: if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->size) { - printf("cursor: %d, length: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->string); + //printf("cursor: %d, length: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->string); if (((struct TextInputElement*)element->data)->cursor < ((struct TextInputElement*)element->data)->length) { - printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string); + //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]; @@ -240,21 +283,143 @@ printf("got %d, want %d\n", ch, '\b'); } ((struct TextInputElement*)element->data)->string[i] = '\0'; } else { - printf("cursor: %d, length: %d, size: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->string); + //printf("cursor: %d, length: %d, size: %d, string: \"%s\"\n", ((struct TextInputElement*)element->data)->cursor, ((struct TextInputElement*)element->data)->length, ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->string); ((struct TextInputElement*)element->data)->length++; ((struct TextInputElement*)element->data)->string = realloc(((struct TextInputElement*)element->data)->string, ((struct TextInputElement*)element->data)->length+1); ((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor++] = ch; ((struct TextInputElement*)element->data)->string[((struct TextInputElement*)element->data)->cursor] = '\0'; - printf("max size is %d, cursor is at %d\n", ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->cursor); - printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string); + //printf("max size is %d, cursor is at %d\n", ((struct TextInputElement*)element->data)->size, ((struct TextInputElement*)element->data)->cursor); + //printf("adding %c, now is %s!\n", ch, ((struct TextInputElement*)element->data)->string); } } break; } return 0; + } else if (element->type == TYPE_SPINNER) { + switch (ch) { + case 0: + break; + case 276: // left + if (((struct SpinnerElement*)element->data)->cursor > 0) { + ((struct SpinnerElement*)element->data)->cursor--; + } + break; + case 275: // right + if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->length) { + ((struct SpinnerElement*)element->data)->cursor++; + } + break; + case 273: // up + if (((struct SpinnerElement*)element->data)->value < INT_MAX) { + char temp_string[256]; + itoa(((struct SpinnerElement*)element->data)->value+1, temp_string, 10); + if (((struct SpinnerElement*)element->data)->value+1 >= 0) { + if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size) { + setElementValue(element, ((struct SpinnerElement*)element->data)->value+1); + } + } else { + if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size+1) { + setElementValue(element, ((struct SpinnerElement*)element->data)->value+1); + } + } + } + if (element->callback != NULL) { + element->callback(); + } + break; + case 274: // down + if (((struct SpinnerElement*)element->data)->value > INT_MIN) { + char temp_string[256]; + itoa(((struct SpinnerElement*)element->data)->value-1, temp_string, 10); + if (((struct SpinnerElement*)element->data)->value-1 >= 0) { + if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size) { + setElementValue(element, ((struct SpinnerElement*)element->data)->value-1); + } + } else { + // +1 size due to negative sign, rendering must render width as size + 1 as well! + if (strlen(temp_string) <= ((struct SpinnerElement*)element->data)->size+1) { + setElementValue(element, ((struct SpinnerElement*)element->data)->value-1); + } + } + } + if (element->callback != NULL) { + element->callback(); + } + break; + case 13: // enter + if (element->callback != NULL) { + element->callback(); + } + break; + case '\b': + case 127: + if (((struct SpinnerElement*)element->data)->cursor > 0) { + if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->length) { + ((struct SpinnerElement*)element->data)->length--; + int offset = ((struct SpinnerElement*)element->data)->cursor; + char temp_string[256]; + int i = offset; + int temp_offset = 0; + while(((struct SpinnerElement*)element->data)->string[i] != '\0') { + temp_string[temp_offset++] = ((struct SpinnerElement*)element->data)->string[i]; + i++; + } + temp_string[temp_offset] = '\0'; + // let's readd the end of the string after added char + ((struct SpinnerElement*)element->data)->cursor--; + i = offset-1; + temp_offset = 0; + while (temp_string[temp_offset] != '\0') { + ((struct SpinnerElement*)element->data)->string[i++] = temp_string[temp_offset++]; + } + ((struct SpinnerElement*)element->data)->string[i] = '\0'; + } else { + ((struct SpinnerElement*)element->data)->cursor--; + ((struct SpinnerElement*)element->data)->length--; + ((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)element->data)->cursor] = '\0'; + } + } + setElementValue(element, atoi(((struct SpinnerElement*)element->data)->string)); + break; + default: + if ((ch >= 48 && ch <= 57) || ch == 45) { + if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->size) { + if (((struct SpinnerElement*)element->data)->cursor < ((struct SpinnerElement*)element->data)->length) { + ((struct SpinnerElement*)element->data)->length++; + int offset = ((struct SpinnerElement*)element->data)->cursor; + char temp_string[256]; + int i = offset; + int temp_offset = 0; + while(((struct SpinnerElement*)element->data)->string[i] != '\0') { + temp_string[temp_offset++] = ((struct SpinnerElement*)element->data)->string[i]; + i++; + } + temp_string[temp_offset] = '\0'; + ((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)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 SpinnerElement*)element->data)->string[i++] = temp_string[temp_offset++]; + } + ((struct SpinnerElement*)element->data)->string[i] = '\0'; + } else { + ((struct SpinnerElement*)element->data)->length++; + ((struct SpinnerElement*)element->data)->string = realloc(((struct SpinnerElement*)element->data)->string, ((struct SpinnerElement*)element->data)->length+1); + ((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)element->data)->cursor++] = ch; + ((struct SpinnerElement*)element->data)->string[((struct SpinnerElement*)element->data)->cursor] = '\0'; + } + } + setElementValue(element, atoi(((struct SpinnerElement*)element->data)->string)); + + printf("got number\n"); + } + break; + } } else { return -1; } + return 1; } /* gettin' operations */ @@ -267,6 +432,9 @@ const char *getElementText(struct Element *element) { case TYPE_TEXT: return ((struct TextElement*)element->data)->string; break; + case TYPE_SPINNER: + return ((struct SpinnerElement*)element->data)->string; + break; case TYPE_BUTTON: return ((struct ButtonElement*)element->data)->string; break; diff --git a/tile_editor/elements.h b/tile_editor/elements.h index 078cc02..aa7f7c4 100644 --- a/tile_editor/elements.h +++ b/tile_editor/elements.h @@ -22,18 +22,28 @@ struct Element { }; struct Element *newElement(int type); +void freeElement(struct Element *element); /* element type structs and such */ #define TYPE_TEXT 0 #define TYPE_BUTTON 1 #define TYPE_TEXT_INPUT 2 #define TYPE_IMAGE 3 +#define TYPE_SPINNER 4 struct ButtonElement { int length; char *string; }; +struct SpinnerElement { + int size; + int cursor; + int length; + char *string; + int value; +}; + struct TextElement { int length; char *string; @@ -57,6 +67,7 @@ int setElementPosition(struct Element *element, int x, int y); int setElementCallback(struct Element *element, void(*callback)); int setElementSize(struct Element *element, int size); int setElementImage(struct Element *element, void *image, int width, int height); +int setElementValue(struct Element *element, int value); const char *getElementText(struct Element *element); int handleInputElement(struct Element *element, int ch); diff --git a/tile_editor/helper.c b/tile_editor/helper.c new file mode 100644 index 0000000..e41b287 --- /dev/null +++ b/tile_editor/helper.c @@ -0,0 +1,46 @@ +#include "helper.h" +/** +* C++ version 0.4 char* style "itoa": +* Written by Lukás Chmela +* Released under GPLv3. +*/ +char* itoa(int value, char* result, int base) { + // check that the base if valid +if (base < 2 || base > 36) { *result = '\0'; return result; } + +char* ptr = result, *ptr1 = result, tmp_char; +int tmp_value; + +do { + tmp_value = value; + value /= base; + *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" [35 + (tmp_value - value * base)]; + } while ( value ); + + // Apply negative sign + if (tmp_value < 0) *ptr++ = '-'; + *ptr-- = '\0'; + while(ptr1 < ptr) { + tmp_char = *ptr; + *ptr--= *ptr1; + *ptr1++ = tmp_char; + } + return result; +} + +#if __APPLE__ | _WIN32 | _WIN64 +char * strndup (const char *s, size_t n) { + char *result; + size_t len = strlen (s); + + if (n < len) + len = n; + + result = (char *) malloc (len + 1); + if (!result) + return 0; + + result[len] = '\0'; + return (char *) memcpy (result, s, len); +} +#endif diff --git a/tile_editor/helper.h b/tile_editor/helper.h new file mode 100644 index 0000000..a764be5 --- /dev/null +++ b/tile_editor/helper.h @@ -0,0 +1,14 @@ +#ifndef HELPER_H +#define HELPER_H +#include +#include +/** +* C++ version 0.4 char* style "itoa": +* Written by Lukás Chmela +* Released under GPLv3. +*/ +char* itoa(int value, char* result, int base); +#if __APPLE__ | _WIN32 | _WIN64 +char * strndup (const char *s, size_t n); +#endif +#endif diff --git a/tile_editor/sdl.c b/tile_editor/sdl.c index 27b508a..8ca8853 100644 --- a/tile_editor/sdl.c +++ b/tile_editor/sdl.c @@ -4,6 +4,9 @@ #else #include #endif + +#include // for wm hints + #include // for getcwd #include "stubs.h" @@ -18,13 +21,16 @@ int interfaceInit() { // Enable Unicode, for later text input SDL_EnableUNICODE(SDL_ENABLE); // Set up our SDL Window - if ((screen = SDL_SetVideoMode(320, 480, 32, SDL_SWSURFACE|SDL_DOUBLEBUF|SDL_RESIZABLE)) == NULL) { + if ((screen = SDL_SetVideoMode(320, 480, 32, SDL_SWSURFACE|SDL_DOUBLEBUF)) == NULL) { return -1; } - SDL_WM_SetCaption("Tile Editor", NULL); - menu_area = SDL_CreateRGBSurface(screen->flags, screen->w, 104, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); - tile_area_rect.y = 104; - tile_area = SDL_CreateRGBSurface(screen->flags, screen->w, 384, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); + SDL_WM_SetCaption("TS:Tile Editor", NULL); + menu_area = SDL_CreateRGBSurface(screen->flags, 320, 112, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); + tile_area_rect.y = 112; + tile_area = SDL_CreateRGBSurface(screen->flags, 320, 392, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); + + sprite_area_rect.x = 320; + sprite_area = SDL_CreateRGBSurface(screen->flags, 320, screen->h, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); loadFont(&font, font_images, font_images_length, 8, 8); @@ -35,113 +41,116 @@ int interfaceInit() { // load up our elements button_quit = newElement(TYPE_BUTTON); setElementText(button_quit, "QUIT"); - setElementPosition(button_quit, screen->w - getElementWidth(button_quit)-2, 2); + //setElementPosition(button_quit, screen->w - getElementWidth(button_quit)-2, 2); + setElementPosition(button_quit, menu_area->w - getElementWidth(button_quit)-2, 2+font.height*2); setElementCallback(button_quit, &Quit); addElement(button_quit, menu_area); text_console = newElement(TYPE_TEXT); - setElementPosition(text_console, 0, 0); + //setElementPosition(text_console, 0, 2+font.height*2); + setElementPosition(text_console, 0, 2); addElement(text_console, menu_area); /* graphics input */ text_graphics = newElement(TYPE_TEXT); setElementText(text_graphics, "graphics:"); - setElementPosition(text_graphics, 2, 2 + font.height*3); + setElementPosition(text_graphics, 2, 2 + font.height*4); addElement(text_graphics, menu_area); input_graphics = newElement(TYPE_TEXT_INPUT); - setElementPosition(input_graphics, getElementWidth(text_graphics) + font.width + 4, 2 + font.height*3); + setElementPosition(input_graphics, getElementWidth(text_graphics) + font.width + 4, 2 + font.height*4); + setElementCallback(input_graphics, &loadGraphicsCallback); setElementSize(input_graphics, 16); addElement(input_graphics, menu_area); button_graphics = newElement(TYPE_BUTTON); setElementText(button_graphics, "load"); - setElementPosition(button_graphics, getElementWidth(text_graphics) + getElementWidth(input_graphics) + (font.width*2) + 4, 2 + font.height*3); + setElementPosition(button_graphics, getElementWidth(text_graphics) + getElementWidth(input_graphics) + (font.width*2) + 4, 2 + font.height*4); setElementCallback(button_graphics, &loadGraphicsCallback); addElement(button_graphics, menu_area); /* tileset data input */ text_data = newElement(TYPE_TEXT); setElementText(text_data, "data: "); - setElementPosition(text_data, 2, 2 + font.height*5); + setElementPosition(text_data, 2, 2 + font.height*6); addElement(text_data, menu_area); input_data = newElement(TYPE_TEXT_INPUT); - setElementPosition(input_data, getElementWidth(text_data) + font.width + 4, 2 + font.height*5); + setElementPosition(input_data, getElementWidth(text_data) + font.width + 4, 2 + font.height*6); + setElementCallback(input_data, &loadDataCallback); setElementSize(input_data, 16); addElement(input_data, menu_area); button_data = newElement(TYPE_BUTTON); setElementText(button_data, "load"); - setElementPosition(button_data, getElementWidth(text_data) + getElementWidth(input_data) + (font.width*2) + 4, 2 + font.height*5); + setElementPosition(button_data, getElementWidth(text_data) + getElementWidth(input_data) + (font.width*2) + 4, 2 + font.height*6); setElementCallback(button_data, &loadDataCallback); addElement(button_data, menu_area); button_data_save = newElement(TYPE_BUTTON); setElementText(button_data_save, "save"); - setElementPosition(button_data_save, getElementWidth(text_data) + getElementWidth(input_data) + getElementWidth(button_data) + (font.width*3) + 4, 2 + font.height*5); + setElementPosition(button_data_save, getElementWidth(text_data) + getElementWidth(input_data) + getElementWidth(button_data) + (font.width*3) + 4, 2 + font.height*6); setElementCallback(button_data_save, &saveDataCallback); addElement(button_data_save, menu_area); /* set input */ text_set = newElement(TYPE_TEXT); setElementText(text_set, "set:"); - setElementPosition(text_set, 2, 2 + font.height*8); + setElementPosition(text_set, 2, 2 + font.height*9); addElement(text_set, menu_area); - input_set = newElement(TYPE_TEXT_INPUT); - setElementPosition(input_set, getElementWidth(text_set) + font.width + 4, 2 + font.height*8); + g_set = 1; + input_set = newElement(TYPE_SPINNER); + setElementPosition(input_set, getElementWidth(text_set) + font.width + 4, 2 + font.height*9); + setElementCallback(input_set, &setSetCallback); setElementSize(input_set, 3); - setElementText(input_set, "0"); + setElementValue(input_set, 1); addElement(input_set, menu_area); - button_set = newElement(TYPE_BUTTON); + /*button_set = newElement(TYPE_BUTTON); setElementText(button_set, "ok"); - setElementPosition(button_set, getElementWidth(text_set) + getElementWidth(input_set) + (font.width*2) + 4, 2 + font.height*8); + setElementPosition(button_set, getElementWidth(text_set) + getElementWidth(input_set) + (font.width*2) + 4, 2 + font.height*9); setElementCallback(button_set, &setSetCallback); - addElement(button_set, menu_area); + addElement(button_set, menu_area);*/ /* tile id input */ text_id = newElement(TYPE_TEXT); setElementText(text_id, "id: "); - setElementPosition(text_id, 2, 2 + font.height*10); + setElementPosition(text_id, 2, 2 + font.height*11); addElement(text_id, menu_area); - input_id = newElement(TYPE_TEXT_INPUT); - setElementPosition(input_id, getElementWidth(text_id) + font.width + 4, 2 + font.height*10); + g_id = 0; + /*input_id = newElement(TYPE_TEXT_INPUT); + setElementPosition(input_id, getElementWidth(text_id) + font.width + 4, 2 + font.height*11); + setElementCallback(input_id, &setIdCallback); setElementSize(input_id, 3); setElementText(input_id, "0"); + addElement(input_id, menu_area);*/ + + input_id = newElement(TYPE_SPINNER); + setElementPosition(input_id, getElementWidth(text_id) + font.width + 4, 2 + font.height*11); + setElementCallback(input_id, &setIdCallback); + setElementSize(input_id, 3); + setElementValue(input_id, 0); addElement(input_id, menu_area); - button_id = newElement(TYPE_BUTTON); + /*button_id = newElement(TYPE_BUTTON); setElementText(button_id, "ok"); - setElementPosition(button_id, getElementWidth(text_id) + getElementWidth(input_id) + (font.width*2) + 4, 2 + font.height*10); + setElementPosition(button_id, getElementWidth(text_id) + getElementWidth(input_id) + (font.width*2) + 4, 2 + font.height*11); setElementCallback(button_id, &setIdCallback); - addElement(button_id, menu_area); + addElement(button_id, menu_area);*/ SDL_FillRect(menu_area, NULL, SDL_MapRGB(menu_area->format, 8, 16, 12)); image_tile = newElement(TYPE_IMAGE); - setElementPosition(image_tile, getElementWidth(button_id) + getElementWidth(text_id) + getElementWidth(input_id) + (font.width*3) + 4, 2 + font.height*8); + //setElementPosition(image_tile, getElementWidth(button_id) + getElementWidth(text_id) + getElementWidth(input_id) + (font.width*3) + 4, 2 + font.height*9); + setElementPosition(image_tile, getElementWidth(text_set) + getElementWidth(input_set) + (font.width*3) + 4, 2 + font.height*9); + setElementCallback(image_tile, &showSpritesheet); SDL_Surface *tile_surface = SDL_CreateRGBSurface(menu_area->flags, 32, 32, menu_area->format->BitsPerPixel, menu_area->format->Rmask, menu_area->format->Gmask, menu_area->format->Bmask, menu_area->format->Amask); setElementImage(image_tile, tile_surface, 32, 32); addElement(image_tile, menu_area); - drawElement(button_quit); - drawElement(text_graphics); - drawElement(input_graphics); - drawElement(button_graphics); - drawElement(text_data); - drawElement(input_data); - drawElement(button_data); - drawElement(button_data_save); - drawElement(text_set); - drawElement(input_set); - drawElement(button_set); - drawElement(text_id); - drawElement(input_id); - drawElement(button_id); - drawElement(image_tile); + drawElements(); char cwd[128]; getcwd(cwd, sizeof(cwd)); printConsole(cwd); @@ -152,7 +161,6 @@ int interfaceInit() { SDL_BlitSurface(menu_area, NULL, screen, NULL); /* now load up our tile area stuff */ -printf("hurr\n"); text_name = newElement(TYPE_TEXT); setElementText(text_name, "...... name ......"); setElementPosition(text_name, 2, 2); @@ -208,25 +216,16 @@ int interfaceLoop() { void interfaceClose() { SDL_FreeSurface(screen); - freeElement(button_quit); - freeElement(text_console); - freeElement(text_graphics); - freeElement(input_graphics); - freeElement(button_graphics); - freeElement(text_data); - freeElement(input_data); - freeElement(button_data); - freeElement(button_data_save); - freeElement(text_set); - freeElement(input_set); - freeElement(button_set); - freeElement(text_id); - freeElement(input_id); - freeElement(button_id); - freeElement(text_name); - freeElement(text_value); - SDL_FreeSurface(((struct ImageElement*)image_tile->data)->image); - freeElement(image_tile); + struct Element *t_element = first_element; + while (t_element) { + struct Element *next_element = t_element->next; + if (t_element->type == TYPE_IMAGE) { + if (((struct ImageElement*)t_element->data)->image) + SDL_FreeSurface(((struct ImageElement*)t_element->data)->image); + } + freeElement(t_element); + t_element = next_element; + } SDL_Quit(); } @@ -249,6 +248,15 @@ void addElement(struct Element *element, SDL_Surface *surface) { element->user = surface; } +void drawElements() { + struct Element *t_element = first_element; + while (t_element->next != NULL) { + drawElement(t_element); + t_element = t_element->next; + } + drawElement(t_element); +} + /* drawing functions */ void drawElement(const struct Element *element) { if (element != NULL) { @@ -279,6 +287,29 @@ void drawElement(const struct Element *element) { drawString(&font, element->user, element->x+2, element->y+2, ((struct ButtonElement*)element->data)->string); } break; + case TYPE_SPINNER: + get_rect_son.x = element->x-1; + get_rect_son.y = element->y-1; + get_rect_son.w = font.width * ((((struct SpinnerElement*)element->data)->size)+1) + 4; + get_rect_son.h = font.height + 4; + if (element->state == STATE_FOCUS) { + SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 128, 128, 200)); + } else { + SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 48, 48, 64)); + } + get_rect_son.x = element->x; + get_rect_son.y = element->y; + get_rect_son.w = font.width * ((((struct SpinnerElement*)element->data)->size)+1) + 2; + get_rect_son.h = font.height + 2; + SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 32, 32, 48)); + // draw string + drawString(&font, element->user, element->x+1, element->y+1, ((struct SpinnerElement*)element->data)->string); + get_rect_son.x = element->x + (font.width * ((struct SpinnerElement*)element->data)->cursor); + get_rect_son.y = element->y+1; + get_rect_son.w = 2; + get_rect_son.h = font.height; + SDL_FillRect(element->user, &get_rect_son, SDL_MapRGB(((SDL_Surface*)element->user)->format, 128, 128, 200)); + break; case TYPE_TEXT: get_rect_son.w = (font.width * ((struct TextElement*)element->data)->length) + 2; get_rect_son.h = font.height + 2; @@ -347,6 +378,8 @@ int getElementWidth(const struct Element* element) { case TYPE_TEXT: return (font.width * ((struct TextElement*)element->data)->length) + 2; break; + case TYPE_SPINNER: + return font.width * (((struct SpinnerElement*)element->data)->size+1) + 4; case TYPE_BUTTON: return (font.width * ((struct ButtonElement*)element->data)->length) + 4; break; @@ -414,6 +447,19 @@ void handleMouseDown(const SDL_MouseButtonEvent *event) { t_y = element->y-1; printf("coll: %dx%d from %dx%d to %dx%d\n", event->x, event->y, t_x, t_y, t_w, t_h); break; + case TYPE_SPINNER: + t_w = element->x-1 + (font.width * (((struct SpinnerElement*)element->data)->size+1)) + 4; + t_h = element->y-1 + font.height + 4; + t_x = element->x-1; + t_y = element->y-1; + printf("coll: %dx%d from %dx%d to %dx%d\n", event->x, event->y, t_x, t_y, t_w, t_h); + break; + case TYPE_IMAGE: + t_w = element->x + ((struct ImageElement*)element->data)->width; + t_h = element->y + ((struct ImageElement*)element->data)->height; + t_x = element->x; + t_y = element->y; + break; } if ((t_x <= event->x && t_w >= event->x) && (t_y <= event->y && t_h >= event->y)) { element->state = STATE_PRESSED; @@ -452,14 +498,28 @@ void handleMouseUp(const SDL_MouseButtonEvent *event) { t_x = last_element->x-1; t_y = last_element->y-1; break; + case TYPE_SPINNER: + t_w = last_element->x-1 + font.width * (((struct SpinnerElement*)last_element->data)->size+1) + 4; + t_h = last_element->y-1 + font.height + 4; + t_x = last_element->x-1; + t_y = last_element->y-1; + break; + case TYPE_IMAGE: + t_w = last_element->x + ((struct ImageElement*)last_element->data)->width; + t_h = last_element->y + ((struct ImageElement*)last_element->data)->height; + t_x = last_element->x; + t_y = last_element->y; + break; } last_element->state = STATE_NORMAL; drawElement(last_element); if ((t_x <= event->x && t_w >= event->x) && (t_y <= event->y && t_h >= event->y)) { if (last_element->callback != NULL) { - last_element->callback(); + if (last_element->type != TYPE_TEXT_INPUT && last_element->type != TYPE_SPINNER) { + last_element->callback(); + } } - if (last_element->type == TYPE_TEXT_INPUT) { + if (last_element->type == TYPE_TEXT_INPUT || last_element->type == TYPE_SPINNER) { focus_element = last_element; focus_element->state = STATE_FOCUS; printf("focused on element!\n"); @@ -551,7 +611,11 @@ void loadGraphicsCallback() { return; } sprintf(temp_2, "OK, graphics loaded successfully"); + g_gfx = 1; + printConsole(temp_2); + reloadImagePreview(); + showSpritesheet(); } void loadDataCallback() { @@ -563,14 +627,19 @@ void saveDataCallback() { } void setSetCallback() { + if (g_gfx != 1) + return; char temp[16]; sprintf(temp, "OK: using set %s", getElementText(input_set)); printConsole(temp); g_set = atoi(getElementText(input_set)); reloadImagePreview(); + showSpritesheet(); } void setIdCallback() { + if (g_gfx != 1) + return; char temp[16]; sprintf(temp, "OK: using id %s", getElementText(input_id)); printConsole(temp); @@ -578,6 +647,56 @@ void setIdCallback() { reloadImagePreview(); } +void showSpritesheet() { + struct Spritesheet *spritesheet; + switch (g_set) { + case PLAYER: + spritesheet = &player_sprites; + break; + case FLOOR: + spritesheet = &floor_sprites; + break; + case WALL: + spritesheet = &wall_sprites; + break; + case DOOR: + spritesheet = &door_sprites; + break; + case ITEM: + spritesheet = &item_sprites; + break; + case EQUIP: + spritesheet = &equip_sprites; + break; + case NPC: + spritesheet = &npc_sprites; + break; + default: + return; + break; + } + screen = SDL_SetVideoMode(320+spritesheet->spritesheet->w, 480, 32, SDL_SWSURFACE|SDL_DOUBLEBUF); + + int rows = spritesheet->spritesheet->h / spritesheet->height; + + int i, j = 0; + Uint32 color_a = SDL_MapRGB(screen->format, 95, 95, 128); + Uint32 color_b = SDL_MapRGB(screen->format, 128, 128, 95); + while (i < spritesheet->columns) { + j = 0; + while (j < rows) { + SDL_Rect sprite_rect = { i*spritesheet->width, j*spritesheet->height, spritesheet->width, spritesheet->height}; + SDL_FillRect(sprite_area, &sprite_rect, (((j+i) & 1) == 1 ? color_a : color_b)); + j++; + } + i++; + } + + //SDL_FillRect(sprite_area, &spritesheet_rect, SDL_MapRGB(screen->format, 95, 95, 128)); + SDL_BlitSurface(spritesheet->spritesheet, NULL, sprite_area, NULL); + SDL_BlitSurface(sprite_area, NULL, screen, &sprite_area_rect); +} + void reloadImagePreview() { struct Spritesheet *spritesheet; switch (g_set) { @@ -606,6 +725,7 @@ void reloadImagePreview() { return; break; } + /* now load small preview of tile */ int y_offset = g_id / spritesheet->columns; int x_offset = g_id - (y_offset * spritesheet->columns); diff --git a/tile_editor/sdl.h b/tile_editor/sdl.h index 67a2d5d..1be2e89 100644 --- a/tile_editor/sdl.h +++ b/tile_editor/sdl.h @@ -5,7 +5,9 @@ SDL_Surface* screen; SDL_Surface* menu_area; SDL_Surface* tile_area; +SDL_Surface* sprite_area; SDL_Rect tile_area_rect; +SDL_Rect sprite_area_rect; SDL_Rect update_rect; @@ -45,6 +47,7 @@ int loadSpritesheetFromFile(struct Spritesheet *spritesheet, char *file_name, in void freeSpritesheet(struct Spritesheet *spritesheet); void drawElement(const struct Element *element); +void drawElements(); void clearElement(const struct Element *element); void addElement(struct Element *element, SDL_Surface *surface); @@ -63,6 +66,7 @@ void saveDataCallback(); void setSetCallback(); void setIdCallback(); +void showSpritesheet(); void reloadImagePreview(); void printConsole(const char *string);