#include <drawtext.h>
#include "level.h"
#include "lview.h"
+#include "app.h"
static int init(void);
static void cleanup(void);
static void motion(int x, int y);
static void cb_new(utk_event *ev, void *data);
+static void cb_new_ok(utk_event *ev, void *data);
static void cb_open(utk_event *ev, void *data);
+static void cb_open_ok(utk_event *ev, void *data);
static void cb_save(utk_event *ev, void *data);
+static void cb_save_ok(utk_event *ev, void *data);
static void cb_cancel(utk_event *ev, void *data);
-static void cb_new_ok(utk_event *ev, void *data);
+
+static void cb_toolselect(utk_event *ev, void *data);
static int parse_args(int argc, char **argv);
static float uiscale = 1.0f;
#define UISPLIT 150
-int splitx;
+static int splitx;
#define FONTSZ 16
static struct dtx_font *uifont;
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)
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");
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;
}
static void cleanup(void)
{
destroy_lview();
- free_level(lvl);
+ destroy_level(&lvl);
dtx_close_font(uifont);
utk_close(uiroot);
}
glVertex2f(splitx, win_height);
glVertex2f(0, win_height);
glEnd();
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
utk_draw(uiroot);
+ glDisable(GL_BLEND);
glutSwapBuffers();
switch(key) {
case 27:
if(uigrab) {
- utk_hide(uigrab);
+ if(utk_is_dialog(uigrab)) {
+ utk_destroy_window(uigrab);
+ } else {
+ utk_hide(uigrab);
+ }
uigrab = 0;
} else {
exit(0);
{
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))) {
- fprintf(stderr, "failed to create new %dx%d level\n", sz, sz);
- /* TODO: messagebox */
+ 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;
static void cb_open(utk_event *ev, void *data)
{
+ uigrab = utk_file_dialog(UTK_FILE_DIALOG_OPEN, 0, "Level file (*.lvl) [.lvl]", 0, cb_open_ok, 0);
+}
+
+static void cb_open_ok(utk_event *ev, void *data)
+{
+ char *errmsg = 0;
+ const char *path;
+
+ utk_widget *dlg = utk_event_widget(ev);
+ 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)
{
+ uigrab = utk_file_dialog(UTK_FILE_DIALOG_SAVE, 0, "Level file (*.lvl) [.lvl]", 0, cb_save_ok, 0);
+}
+
+static void cb_save_ok(utk_event *ev, void *data)
+{
+ char *errmsg = 0;
+ const char *path;
+
+ utk_widget *dlg = utk_event_widget(ev);
+ 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)
{
- utk_hide(data);
+ if(!data) data = utk_get_window(utk_event_widget(ev));
+
+ if(utk_is_dialog(data)) {
+ utk_destroy_window(data);
+ } else {
+ utk_hide(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;
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;