X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=tools%2Fdunger%2Fsrc%2Fmain.c;h=6bc37a7d44fabf151f8f505a5fd1562410579a82;hb=594c18e3671a27624a867071b5bafd08148652b3;hp=ed456f7ce294a8d2be12720f4d658eb53fcb7db1;hpb=9e9a3e07aed3782206b00efda2a180a4a30968aa;p=vrlugburz diff --git a/tools/dunger/src/main.c b/tools/dunger/src/main.c index ed456f7..6bc37a7 100644 --- a/tools/dunger/src/main.c +++ b/tools/dunger/src/main.c @@ -6,6 +6,7 @@ #include #include "level.h" #include "lview.h" +#include "app.h" static int init(void); static void cleanup(void); @@ -25,6 +26,8 @@ static void cb_save_ok(utk_event *ev, void *data); static void cb_cancel(utk_event *ev, void *data); +static void cb_toolselect(utk_event *ev, void *data); + static int parse_args(int argc, char **argv); @@ -47,7 +50,7 @@ int mousex, mousey, clickx, clicky; static float uiscale = 1.0f; #define UISPLIT 150 -int splitx; +static int splitx; #define FONTSZ 16 static struct dtx_font *uifont; @@ -55,7 +58,9 @@ static utk_widget *uiroot, *uiwin_new; static utk_widget *uigrab; static utk_widget *cbox_newsz; -static struct level *lvl; +static struct level lvl; + +static const char *opt_fname; int main(int argc, char **argv) @@ -125,6 +130,9 @@ static int init(void) utk_button(win, "New", 0, 0, cb_new, 0); utk_button(win, "Open ...", 0, 0, cb_open, 0); utk_button(win, "Save ...", 0, 0, cb_save, 0); + utk_label(win, "-- Tools --"); + utk_radiobox(win, "Draw", 1, cb_toolselect, (void*)TOOL_DRAW); + utk_radiobox(win, "Player start", 0, cb_toolselect, (void*)TOOL_PSTART); uiwin_new = utk_window(uiroot, (win_width - 220) / 2, (win_height - 150) / 2, 220, 150, "New level"); @@ -141,11 +149,18 @@ static int init(void) utk_set_size(uiwin_new, utk_get_width(vbox) + pad * 2.0f, utk_get_height(vbox) + pad * 2.0f); - if(!(lvl = create_level(32, 32))) { - fprintf(stderr, "failed to create level\n"); - return -1; + if(opt_fname) { + if(load_level(&lvl, opt_fname) == -1) { + fprintf(stderr, "failed to load level: %s\n", opt_fname); + return -1; + } + } else { + if(init_level(&lvl, 32, 32) == -1) { + fprintf(stderr, "failed to create level\n"); + return -1; + } } - if(init_lview(lvl) == -1) { + if(init_lview(&lvl) == -1) { return -1; } @@ -159,7 +174,7 @@ static int init(void) static void cleanup(void) { destroy_lview(); - free_level(lvl); + destroy_level(&lvl); dtx_close_font(uifont); utk_close(uiroot); } @@ -316,21 +331,21 @@ static void cb_new_ok(utk_event *ev, void *data) { static int levsz[] = {16, 24, 32}; int sz; - struct level *newlvl; + struct level newlvl; sz = levsz[utk_get_selected(cbox_newsz)]; - if(!(newlvl = create_level(sz, sz))) { + if(init_level(&newlvl, sz, sz) == -1) { utk_message_dialog("failed to create new level", UTK_MSG_TYPE_ERROR, UTK_MSG_BN_OK, cb_cancel, 0); return; } - free_level(lvl); + destroy_level(&lvl); destroy_lview(); lvl = newlvl; - init_lview(newlvl); + init_lview(&lvl); utk_hide(uiwin_new); uigrab = 0; @@ -343,10 +358,22 @@ static void cb_open(utk_event *ev, void *data) static void cb_open_ok(utk_event *ev, void *data) { + char *errmsg = 0; + const char *path; + utk_widget *dlg = utk_event_widget(ev); - printf("selected: %s\n", utk_file_dialog_file(dlg)); + path = utk_file_dialog_path(dlg); + printf("selected: %s\n", path); + if(load_level(&lvl, path) == -1) { + errmsg = alloca(strlen(path) + 32); + sprintf(errmsg, "Failed to load level: %s", path); + } utk_destroy_window(dlg); if(uigrab == dlg) uigrab = 0; + + if(errmsg) { + uigrab = utk_message_dialog(errmsg, UTK_MSG_TYPE_ERROR, UTK_MSG_BN_OK, cb_cancel, 0); + } } static void cb_save(utk_event *ev, void *data) @@ -356,10 +383,22 @@ static void cb_save(utk_event *ev, void *data) static void cb_save_ok(utk_event *ev, void *data) { + char *errmsg = 0; + const char *path; + utk_widget *dlg = utk_event_widget(ev); - printf("selected: %s\n", utk_file_dialog_file(dlg)); + path = utk_file_dialog_path(dlg); + printf("selected: %s\n", path); + if(save_level(&lvl, path) == -1) { + errmsg = alloca(strlen(path) + 32); + sprintf(errmsg, "Failed to save level file: %s", path); + } utk_destroy_window(dlg); if(uigrab == dlg) uigrab = 0; + + if(errmsg) { + uigrab = utk_message_dialog(errmsg, UTK_MSG_TYPE_ERROR, UTK_MSG_BN_OK, cb_cancel, 0); + } } static void cb_cancel(utk_event *ev, void *data) @@ -374,6 +413,14 @@ static void cb_cancel(utk_event *ev, void *data) uigrab = 0; } +static void cb_toolselect(utk_event *ev, void *data) +{ + utk_widget *w = utk_event_widget(ev); + if(utk_is_checked(w)) { + tool = (intptr_t)data; + } +} + static int parse_args(int argc, char **argv) { int i; @@ -396,8 +443,11 @@ static int parse_args(int argc, char **argv) return -1; } } else { - fprintf(stderr, "unexpected argument: %s\n", argv[i]); - return -1; + if(opt_fname) { + fprintf(stderr, "unexpected argument: %s\n", argv[i]); + return -1; + } + opt_fname = argv[i]; } } return 0;