diff --git a/src/deps.mk b/src/deps.mk index 76352f4..c761491 100644 --- a/src/deps.mk +++ b/src/deps.mk @@ -5,14 +5,14 @@ file_processor.o: src/file_processor.c src/client.h src/main.h \ src/types.h src/query.h main.o: src/main.c src/ui/app.h src/ui/widget/dialogue.h \ src/ui/widget/../widget.h src/ui/widget/../../main.h \ - src/ui/widget/../../types.h src/ui/widget/button.h \ - src/ui/widget/../../main.h src/ui/widget/group.h src/ui/modals/login.h \ - src/ui/modals/../widget/dialogue.h src/ui/modals/../app.h \ - src/ui/widget/dialogue.h + src/ui/widget/../../types.h src/ui/widget/../app.h \ + src/ui/widget/button.h src/ui/widget/../../main.h src/ui/widget/group.h \ + src/ui/modals/login.h src/ui/modals/../widget/dialogue.h \ + src/ui/modals/../app.h src/ui/widget/dialogue.h modal.o: src/modal.c src/ui/app.h src/ui/widget/dialogue.h \ src/ui/widget/../widget.h src/ui/widget/../../main.h \ - src/ui/widget/../../types.h src/ui/widget/button.h \ - src/ui/widget/../../main.h src/ui/widget/group.h + src/ui/widget/../../types.h src/ui/widget/../app.h \ + src/ui/widget/button.h src/ui/widget/../../main.h src/ui/widget/group.h query.o: src/query.c src/file_processor.h src/main.h src/types.h \ src/connection.h src/client.h src/server.h server.o: src/server.c src/client.h src/main.h src/types.h \ diff --git a/src/main.c b/src/main.c index 7e51e9a..405b3a1 100644 --- a/src/main.c +++ b/src/main.c @@ -16,6 +16,7 @@ uint32_t m_id = 0; void event_loop(app_t *app); +void app_refresh(app_t *app); int main(int argc, char **argv) { app_t *app; @@ -32,7 +33,8 @@ int main(int argc, char **argv) { app->modal.active = login; init_login_modal(app); - draw_dialogue(app, &(app->modal.dialogue)); + draw_dialogue(&(app->modal.dialogue)); + app_refresh(app); event_loop(app); @@ -45,6 +47,8 @@ int main(int argc, char **argv) { void event_loop(app_t *app) { int c; + callback_args_t d_args = {.app = app, .win = NULL}; + for (;;) { c = wgetch(app->win); switch (c) { @@ -55,24 +59,28 @@ void event_loop(app_t *app) { return; default: if (app->modal.active != none_active) { - app->modal.dialogue.w.callback(app->modal.dialogue.win, - &(app->modal.dialogue), (void *)&c); + d_args.win = app->modal.dialogue.win; + app->modal.dialogue.w.callback(&d_args, &(app->modal.dialogue), + (void *)&c, NULL); } break; } - - draw_borders(app); - - wnoutrefresh(app->win); - wnoutrefresh(app->menu_win); - wnoutrefresh(app->action_win); - if (app->modal.active != none_active) { - wnoutrefresh(app->modal.dialogue.win); - } - doupdate(); + app_refresh(app); }; } +void app_refresh(app_t *app) { + draw_borders(app); + + wnoutrefresh(app->win); + wnoutrefresh(app->menu_win); + wnoutrefresh(app->action_win); + if (app->modal.active != none_active) { + wnoutrefresh(app->modal.dialogue.win); + } + doupdate(); +} + // int main(int argc, char *argv[]) { // params_t params; // init_params(¶ms); diff --git a/src/ui/modals/login.c b/src/ui/modals/login.c index b1e9fb8..d15d31d 100644 --- a/src/ui/modals/login.c +++ b/src/ui/modals/login.c @@ -12,6 +12,24 @@ typedef struct { /* TODO: improve init process (make it more readable) */ +void group_callback(callback_args_t *args, void *widget, void *data, + void *resp_data) { + group_resp_t response; + callback_args_t ch_args = {.win = args->win, .app = NULL}; + group_default_callback(&ch_args, widget, data, (void *)&response); + if (response.value > -1) { + // TODO: finish actions + switch (response.value) { + case 0: + exit(10); + case 1: + exit(11); + case 2: + exit(12); + } + } +} + dialogue_t *init_login_modal(app_t *app) { if (app == NULL) return NULL; @@ -20,13 +38,16 @@ dialogue_t *init_login_modal(app_t *app) { {.type = w_button, .label = "Register"}, {.type = w_end}}; - dialogue_t *d = init_dialogue("Login", "Select your login " - "option"); + dialogue_t *d = init_dialogue("Login", + "Select your login " + "option", + app->cur_y, app->cur_x); memcpy(&(app->modal.dialogue), d, sizeof(dialogue_t)); free(d); app->modal.dialogue.ch_group = init_group(&(app->modal.dialogue.win), &(d->w), children, horizontal); + app->modal.dialogue.ch_group->w.callback = group_callback; return NULL; } \ No newline at end of file diff --git a/src/ui/modals/login.h b/src/ui/modals/login.h index a6d92e3..bd61a33 100644 --- a/src/ui/modals/login.h +++ b/src/ui/modals/login.h @@ -4,6 +4,9 @@ #include "../widget/dialogue.h" #include "../app.h" +typedef struct { + +} ilm_action_args; dialogue_t *init_login_modal(app_t *app); #endif \ No newline at end of file diff --git a/src/ui/widget.h b/src/ui/widget.h index b88bb78..eadc596 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -12,6 +12,11 @@ enum w_type { w_group, }; +typedef struct { + WINDOW *win; + void *app; +} callback_args_t; + typedef struct widget_t { uint32_t id; char title[DIALOGUE_TITLE]; @@ -21,9 +26,11 @@ typedef struct widget_t { uint32_t m_y; WINDOW *const* parent_win; struct widget_t *w_parent; - void (*callback) (WINDOW *win, void *widget, void *data); + void (*callback) (callback_args_t *args, void *widget, void *data, void *resp_data); } widget_t; +typedef void (*callback_t) (callback_args_t *args, void *widget, void *data, void *resp_data); + enum pmt_attrs { PMT_POS_CENTER = 01, PMT_ALIGN_CENTER = 03, diff --git a/src/ui/widget/dialogue.c b/src/ui/widget/dialogue.c index 17075ad..8ae7ec2 100644 --- a/src/ui/widget/dialogue.c +++ b/src/ui/widget/dialogue.c @@ -4,40 +4,36 @@ #include #include -#include "../app.h" #include "dialogue.h" #include "group.h" -void default_callback(WINDOW *win, void *widget, void *data) { + +void dialogue_default_callback(callback_args_t *args, void *widget, void *data, + void *callback) { dialogue_t *d = (void *)widget; char key = *((char *)data); switch (key) { - case '\t': - if (d->ch_group->w_active_id != d->ch_group->last_id) { - d->ch_group->w_active_id = d->ch_group->w_active_id + 1; - } else { - d->ch_group->w_active_id = d->ch_group->first_id; - } - draw_group(win, d->ch_group); - break; + default: + d->ch_group->w.callback(args, d->ch_group, data, callback); + draw_dialogue(d); } } -dialogue_t *init_dialogue(const char title[], const char text[]) { +dialogue_t *init_dialogue(const char title[], const char text[], uint32_t cur_y, uint32_t cur_x) { dialogue_t *dialogue = malloc(sizeof(dialogue_t)); dialogue->win = 0; dialogue->ch_group = NULL; dialogue->w.x = 0; dialogue->w.y = 0; - dialogue->w.callback = default_callback; + dialogue->cur_y = cur_y; + dialogue->cur_x = cur_x; + dialogue->w.callback = dialogue_default_callback; strcpy(dialogue->w.title, title); strcpy(dialogue->text, text); return dialogue; } -int32_t draw_dialogue(void *_app, dialogue_t *d) { - app_t *app = (app_t *)_app; - +int32_t draw_dialogue(dialogue_t *d) { /* count dimensions */ uint32_t x = 1; /* when uses box */ uint32_t y = 1; /* when uses box */ @@ -64,8 +60,8 @@ int32_t draw_dialogue(void *_app, dialogue_t *d) { y += 1; /* when uses box */ d->w.x = x; d->w.y = y; - d->w.m_x = (app->cur_x - x) / 2; - d->w.m_y = (app->cur_y - y) / 2; + d->w.m_y = (d->cur_y - y) / 2; + d->w.m_x = (d->cur_x - x) / 2; /* render window */ if (d->win == NULL) { @@ -92,7 +88,6 @@ int32_t draw_dialogue(void *_app, dialogue_t *d) { print_multiline_text(d->win, d->text, d->w.x, 2, 1, PMT_ALIGN_CENTER); wattroff(d->win, A_REVERSE); draw_group(d->win, d->ch_group); - wrefresh(d->win); return 0; }; diff --git a/src/ui/widget/dialogue.h b/src/ui/widget/dialogue.h index f2f5273..4ea3615 100644 --- a/src/ui/widget/dialogue.h +++ b/src/ui/widget/dialogue.h @@ -10,12 +10,15 @@ typedef struct { WINDOW *win; widget_t w; group_t *ch_group; + uint32_t cur_y; + uint32_t cur_x; char text[DIALOGUE_TEXT]; } dialogue_t; -dialogue_t *init_dialogue(const char title[], const char text[]); -int32_t draw_dialogue(void *app, dialogue_t *d); +dialogue_t *init_dialogue(const char title[], const char text[], uint32_t cur_x, + uint32_t cur_y); +int32_t draw_dialogue(dialogue_t *d); void destroy_active_dialogue(dialogue_t *d); -void default_callback(WINDOW *win, void *widget, void *data); +void dialogue_default_callback(callback_args_t *args, void *widget, void *data, void *); #endif \ No newline at end of file diff --git a/src/ui/widget/group.c b/src/ui/widget/group.c index 6bdfd9c..a728c18 100644 --- a/src/ui/widget/group.c +++ b/src/ui/widget/group.c @@ -4,6 +4,35 @@ #include #include +void group_default_callback(callback_args_t *args, void *widget, void *data, void *resp_data) { + group_t *g = (void *)widget; + char key = *((char *)data); + group_resp_t *response = (group_resp_t *) resp_data; + switch (key) { + case '\t': + if (g->active_id != g->last_id) { + g->active_id = g->active_id + 1; + } else { + g->active_id = g->first_id; + } + if (resp_data != NULL) { + response->active_id = g->active_id; + response->value = -1; + } + break; + case '\n': + if (resp_data != NULL) { + for (int i=0; i < g->count; i++) { + if (g->elements[i].id == g->active_id) { + response->active_id = g->active_id; + response->value = i; + } + } + } + break; + } +} + group_t *init_group(WINDOW **win, widget_t *w_parent, group_el_init_t *children, enum g_direction direction) { group_t *group = malloc(sizeof(group_t)); @@ -14,6 +43,7 @@ group_t *init_group(WINDOW **win, widget_t *w_parent, group_el_init_t *children, ; group->elements = calloc(group->count, sizeof(group_el_t)); group->w.w_parent = w_parent; + group->w.callback = group_default_callback; group_el_t *elements = group->elements; for (int i = 0; i < group->count; i++) { elements[i].type = children[i].type; @@ -25,9 +55,10 @@ group_t *init_group(WINDOW **win, widget_t *w_parent, group_el_init_t *children, switch (elements[i].type) { case w_button: elements[i].element = init_button(win, &(group->w), children[i].label); + button_t *b = (button_t *)elements[i].element; + el_id = b->w.id; + elements[i].id = b->w.id; if (direction == horizontal) { - button_t *b = (button_t *)elements[i].element; - el_id = b->w.id; b->w.m_x = group->w.x; b->w.m_y = group->w.m_y; group->w.x += b->w.x + 1; @@ -42,7 +73,7 @@ group_t *init_group(WINDOW **win, widget_t *w_parent, group_el_init_t *children, } if (i == 0) { group->first_id = el_id; - group->w_active_id = el_id; + group->active_id = el_id; } else { group->last_id = el_id; } @@ -57,7 +88,7 @@ void draw_group(WINDOW *win, group_t *group) { group_el_t *el = &children[i]; switch (el->type) { case w_button: - draw_button((button_t *)el->element, group->w_active_id); + draw_button((button_t *)el->element, group->active_id); break; case w_box: case w_group: diff --git a/src/ui/widget/group.h b/src/ui/widget/group.h index f8029b4..9684a4b 100644 --- a/src/ui/widget/group.h +++ b/src/ui/widget/group.h @@ -2,6 +2,7 @@ #define GROUP_H #include "../widget.h" +#include enum g_direction { horizontal, @@ -9,6 +10,7 @@ enum g_direction { }; typedef struct { + uint32_t id; void *element; enum w_type type; } group_el_t; @@ -21,15 +23,22 @@ typedef struct { typedef struct { group_el_t *elements; widget_t w; - uint32_t w_active_id; + uint32_t active_id; enum g_direction direction; uint32_t count; uint32_t first_id, last_id; + void *action_args; } group_t; +typedef struct { + int32_t value; + uint32_t active_id; +} group_resp_t; + group_t *init_group(WINDOW **win, widget_t *w_parent, group_el_init_t *children, enum g_direction dir); void draw_group(WINDOW *win, group_t *group); void destroy_group(group_t *group); +void group_default_callback(callback_args_t *args, void *widget, void *data, void *resp_data); #endif \ No newline at end of file