diff --git a/TODO.md b/TODO.md index f8a36eb..50eb12d 100644 --- a/TODO.md +++ b/TODO.md @@ -2,4 +2,5 @@ TODO: - [x] More universal Makefile - [ ] Check and fix registration and login - [x] UI: destroy child elements everywhere -- [x] use parent widgets pointers to count the margins correctly \ No newline at end of file +- [x] use parent widgets pointers to count the margins correctly +- [ ] Hotkeys for buttons \ No newline at end of file diff --git a/src/deps.mk b/src/deps.mk index c761491..1b3488f 100644 --- a/src/deps.mk +++ b/src/deps.mk @@ -3,16 +3,12 @@ client.o: src/client.c src/file_processor.h src/main.h src/types.h \ connection.o: src/connection.c src/main.h src/types.h 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/../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/../app.h \ - src/ui/widget/button.h src/ui/widget/../../main.h src/ui/widget/group.h +main.o: src/main.c src/connection.h src/main.h src/types.h src/ui/app.h \ + src/ui/widget/dialogue.h src/ui/widget/../widget.h \ + src/ui/widget/../../main.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.h src/ui/widget/dialogue.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 405b3a1..697ef65 100644 --- a/src/main.c +++ b/src/main.c @@ -9,8 +9,11 @@ #include #include +#include "connection.h" +#include "main.h" #include "ui/app.h" #include "ui/modals/login.h" +#include "ui/widget.h" #include "ui/widget/dialogue.h" uint32_t m_id = 0; @@ -20,21 +23,21 @@ void app_refresh(app_t *app); int main(int argc, char **argv) { app_t *app; + params_t params; app = calloc(1, sizeof(app_t)); init_nc(); app = init_app(); + init_params(¶ms); + app->params = ¶ms; + analyze_args(argc, argv, ¶ms); - wrefresh(app->menu_win); - wrefresh(app->action_win); + wrefresh(app->left_win); + wrefresh(app->right_win); // temporal - app->modal.active = login; - - init_login_modal(app); - draw_dialogue(&(app->modal.dialogue)); - app_refresh(app); + app->modal.type = login; event_loop(app); @@ -44,27 +47,35 @@ int main(int argc, char **argv) { return 0; } +void app_draw_modal(app_t *app); + void event_loop(app_t *app) { int c; - callback_args_t d_args = {.app = app, .win = NULL}; - + callback_args_t d_args = {.app = app, + .win = NULL, + .widget = NULL, + .data = (void *)&c, + .resp_data = NULL}; + app_draw_modal(app); + app_refresh(app); for (;;) { c = wgetch(app->win); switch (c) { - // 113 is q key. This exits the program - case 113: + // 113 is q key. This exits the program + case 113: return; - case KEY_F(9): + case KEY_F(9): return; - default: - if (app->modal.active != none_active) { + default: + if (app->modal.type != none) { d_args.win = app->modal.dialogue.win; - app->modal.dialogue.w.callback(&d_args, &(app->modal.dialogue), - (void *)&c, NULL); + d_args.widget = &(app->modal.dialogue); + app->modal.dialogue.w.callback(&d_args); } break; } + app_draw_modal(app); app_refresh(app); }; } @@ -73,14 +84,32 @@ 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); + wnoutrefresh(app->left_win); + wnoutrefresh(app->right_win); + if (app->modal.type != none) { + if (app->modal.dialogue.is_initiated == 0) { + app->modal.type = none; + } else { + wnoutrefresh(app->modal.dialogue.win); + } } doupdate(); } +void app_draw_modal(app_t *app) { + if (app->modal.type != none && !app->modal.dialogue.is_initiated) { + switch (app->modal.type) { + case login: + init_login_modal(app); + break; + case none: + default: + break; + } + draw_dialogue(&(app->modal.dialogue)); + } +} + // int main(int argc, char *argv[]) { // params_t params; // init_params(¶ms); diff --git a/src/modal.c b/src/modal.c deleted file mode 100644 index ef7d8c9..0000000 --- a/src/modal.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "ui/app.h" -#include - -int32_t m_login(char evt_c, app_t *app); - -int32_t modal_event_loop(char evt_c, app_t *app) { - switch (app->modal.active) { - - case none_active: - return 0; - case login: - m_login(evt_c, app); - break; - } - return 1; -} - -int32_t m_login(char evt_c, app_t *app) { - -} \ No newline at end of file diff --git a/src/modal.h b/src/modal.h deleted file mode 100644 index ff8cd07..0000000 --- a/src/modal.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef MODAL_H -#define MODAL_H - -#include "ui/app.h" -#include - -int32_t modal_event_loop(char evt_c, app_t *app); - -#endif \ No newline at end of file diff --git a/src/ui/app.c b/src/ui/app.c index b8b6212..0dd7a0d 100644 --- a/src/ui/app.c +++ b/src/ui/app.c @@ -23,13 +23,15 @@ app_t *init_app() { int action_w_x = x_max - menu_w_x - 2; // create the menu window - _app->menu_win = newwin(y_max - 4, menu_w_x, 2, 1); + _app->left_win = newwin(y_max - 4, menu_w_x, 2, 1); // create the action window - _app->action_win = newwin(y_max - 4, action_w_x, 2, menu_w_x + 1); + _app->right_win = newwin(y_max - 4, action_w_x, 2, menu_w_x + 1); // dialogue _app->modal.dialogue.win = NULL; + _app->modal.dialogue.is_initiated = 0; + _app->modal.type = none; // print decorative bars print_bars(_app); @@ -37,22 +39,10 @@ app_t *init_app() { // here goes box borders draw_borders(_app); - // init menus - // _app->menus = malloc(3 * sizeof(menu_t)); - // _app->menus[0] = init_menu("(F)ile", 'f'); - // _app->menus[1] = init_menu("(E)dit", 'e'); - // _app->menus[2] = init_menu("(A)bout", 'a'); - - // set active window by default - // _app->active = N_MENU; - - // call the action window content by default - // ac_file(_app->action_win, _app->active); - // refresh the windows wnoutrefresh(_app->win); - wnoutrefresh(_app->menu_win); - wnoutrefresh(_app->action_win); + wnoutrefresh(_app->left_win); + wnoutrefresh(_app->right_win); doupdate(); return _app; @@ -80,8 +70,8 @@ void draw_borders(app_t *app) { // refresh the windows wnoutrefresh(app->win); - wnoutrefresh(app->menu_win); - wnoutrefresh(app->action_win); + wnoutrefresh(app->left_win); + wnoutrefresh(app->right_win); doupdate(); } diff --git a/src/ui/app.h b/src/ui/app.h index af9a141..31c7a67 100644 --- a/src/ui/app.h +++ b/src/ui/app.h @@ -10,23 +10,20 @@ typedef enum { } color; typedef enum { - none_active = 0, + none = 0, login = 1, } dialogue_e; typedef struct { WINDOW *win; - WINDOW *menu_win; - WINDOW *action_win; + WINDOW *left_win; + WINDOW *right_win; struct { - dialogue_e active; + dialogue_e type; dialogue_t dialogue; } modal; - - // menu_bar_t *menu_bar; - // menu_t *menus; - // active_win_e active; int cur_y, cur_x; + params_t *params; } app_t; app_t *init_app(); diff --git a/src/ui/modals/login.c b/src/ui/modals/login.c index d15d31d..7fc7a59 100644 --- a/src/ui/modals/login.c +++ b/src/ui/modals/login.c @@ -2,7 +2,6 @@ #include "../widget/dialogue.h" #include "../widget/group.h" #include -#include #include typedef struct { @@ -10,22 +9,21 @@ typedef struct { enum w_type type; } group_bt_t; -/* 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) { +void login_modal_group_callback(callback_args_t *args) { + group_resp_t *response = (group_resp_t *)args->resp_data; + callback_args_t ch_args; + memcpy(&ch_args, args, sizeof(callback_args_t)); + ch_args.app = NULL; + group_default_callback(&ch_args); + if (response->value > -1) { // TODO: finish actions - switch (response.value) { + switch (response->value) { case 0: - exit(10); + // exit(10); case 1: - exit(11); + // exit(11); case 2: - exit(12); + // exit(12); } } } @@ -38,16 +36,14 @@ 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", - app->cur_y, app->cur_x); - - memcpy(&(app->modal.dialogue), d, sizeof(dialogue_t)); - free(d); + init_dialogue(&(app->modal.dialogue), "Login", + "Select your login " + "option", + app->cur_y, app->cur_x); app->modal.dialogue.ch_group = - init_group(&(app->modal.dialogue.win), &(d->w), children, horizontal); - app->modal.dialogue.ch_group->w.callback = group_callback; + init_group(&(app->modal.dialogue.win), &(app->modal.dialogue.w), children, + horizontal); + app->modal.dialogue.ch_group->w.callback = login_modal_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 bd61a33..a6d92e3 100644 --- a/src/ui/modals/login.h +++ b/src/ui/modals/login.h @@ -4,9 +4,6 @@ #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 eadc596..980b111 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -2,19 +2,23 @@ #define WIDGET_H #include "../main.h" -#include #include +#include enum w_type { w_end, w_button, w_box, w_group, + w_input, }; typedef struct { WINDOW *win; void *app; + void *widget; + void *data; + void *resp_data; } callback_args_t; typedef struct widget_t { @@ -24,12 +28,12 @@ typedef struct widget_t { uint32_t y; uint32_t m_x; uint32_t m_y; - WINDOW *const* parent_win; + WINDOW *const *parent_win; struct widget_t *w_parent; - void (*callback) (callback_args_t *args, void *widget, void *data, void *resp_data); + void (*callback)(callback_args_t *args); } widget_t; -typedef void (*callback_t) (callback_args_t *args, void *widget, void *data, void *resp_data); +typedef void (*callback_t)(callback_args_t *args); enum pmt_attrs { PMT_POS_CENTER = 01, diff --git a/src/ui/widget/dialogue.c b/src/ui/widget/dialogue.c index 8ae7ec2..3b3dc5d 100644 --- a/src/ui/widget/dialogue.c +++ b/src/ui/widget/dialogue.c @@ -1,26 +1,36 @@ #include #include -#include #include #include #include "dialogue.h" #include "group.h" +#include "../app.h" - -void dialogue_default_callback(callback_args_t *args, void *widget, void *data, - void *callback) { - dialogue_t *d = (void *)widget; - char key = *((char *)data); +void dialogue_default_callback(callback_args_t *args) { + dialogue_t *d = (void *)args->widget; + char key = *((char *)args->data); + app_t *app = (app_t *)args->app; + callback_args_t new_args; + group_resp_t response; + memcpy(&new_args, args, sizeof(callback_args_t)); + new_args.widget = d->ch_group; + new_args.resp_data = &response; switch (key) { default: - d->ch_group->w.callback(args, d->ch_group, data, callback); - draw_dialogue(d); + d->ch_group->w.callback(&new_args); + if (response.value > -1) { + d->is_initiated = 0; + destroy_dialogue(d); + app->modal.type = none; + } else { + draw_dialogue(d); + } } } -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)); +void init_dialogue(dialogue_t *dialogue, const char title[], const char text[], uint32_t cur_y, + uint32_t cur_x) { dialogue->win = 0; dialogue->ch_group = NULL; dialogue->w.x = 0; @@ -28,12 +38,13 @@ dialogue_t *init_dialogue(const char title[], const char text[], uint32_t cur_y, dialogue->cur_y = cur_y; dialogue->cur_x = cur_x; dialogue->w.callback = dialogue_default_callback; + dialogue->is_initiated = 1; strcpy(dialogue->w.title, title); strcpy(dialogue->text, text); - return dialogue; } int32_t draw_dialogue(dialogue_t *d) { + if (!d->is_initiated) return -1; /* count dimensions */ uint32_t x = 1; /* when uses box */ uint32_t y = 1; /* when uses box */ @@ -92,11 +103,11 @@ int32_t draw_dialogue(dialogue_t *d) { return 0; }; -void destroy_active_dialogue(dialogue_t *d) { +void destroy_dialogue(dialogue_t *d) { if (d->ch_group) { destroy_group(d->ch_group); } delwin(d->win); - free(d->win); d->win = NULL; + d->is_initiated = 0; } \ No newline at end of file diff --git a/src/ui/widget/dialogue.h b/src/ui/widget/dialogue.h index 4ea3615..1b5196b 100644 --- a/src/ui/widget/dialogue.h +++ b/src/ui/widget/dialogue.h @@ -13,12 +13,13 @@ typedef struct { uint32_t cur_y; uint32_t cur_x; char text[DIALOGUE_TEXT]; + uint32_t is_initiated : 1; } dialogue_t; -dialogue_t *init_dialogue(const char title[], const char text[], uint32_t cur_x, +void init_dialogue(dialogue_t *d, 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 dialogue_default_callback(callback_args_t *args, void *widget, void *data, void *); +void destroy_dialogue(dialogue_t *d); +void dialogue_default_callback(callback_args_t *args); #endif \ No newline at end of file diff --git a/src/ui/widget/group.c b/src/ui/widget/group.c index a728c18..ed49232 100644 --- a/src/ui/widget/group.c +++ b/src/ui/widget/group.c @@ -4,10 +4,10 @@ #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; +void group_default_callback(callback_args_t *args) { + group_t *g = (group_t *)args->widget; + char key = *((char *)args->data); + group_resp_t *response = (group_resp_t *) args->resp_data; switch (key) { case '\t': if (g->active_id != g->last_id) { @@ -15,13 +15,13 @@ void group_default_callback(callback_args_t *args, void *widget, void *data, voi } else { g->active_id = g->first_id; } - if (resp_data != NULL) { + if (args->resp_data != NULL) { response->active_id = g->active_id; response->value = -1; } break; case '\n': - if (resp_data != NULL) { + if (args->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; @@ -41,9 +41,12 @@ group_t *init_group(WINDOW **win, widget_t *w_parent, group_el_init_t *children, group->count = 0; for (; children[group->count].type != w_end; group->count++) ; - group->elements = calloc(group->count, sizeof(group_el_t)); group->w.w_parent = w_parent; group->w.callback = group_default_callback; + if (group->count == 0) { + return group; + } + group->elements = calloc(group->count, sizeof(group_el_t)); group_el_t *elements = group->elements; for (int i = 0; i < group->count; i++) { elements[i].type = children[i].type; @@ -112,6 +115,8 @@ void destroy_group(group_t *group) { break; } } - free(group->elements); + if (group->elements != NULL) { + free(group->elements); + } free(group); } \ No newline at end of file diff --git a/src/ui/widget/group.h b/src/ui/widget/group.h index 9684a4b..5670d2a 100644 --- a/src/ui/widget/group.h +++ b/src/ui/widget/group.h @@ -39,6 +39,6 @@ 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); +void group_default_callback(callback_args_t *args); #endif \ No newline at end of file