From bdb194679efdd877b96686b3e03a522cf3306aa1 Mon Sep 17 00:00:00 2001 From: Alexander Zhylin Date: Mon, 5 Jan 2026 16:09:23 +0200 Subject: [PATCH] ui: brings back text centering in modals | fixes error on exit | small clean-up --- src/connection.c | 3 +- src/deps.mk | 3 +- src/main.c | 10 ++++-- src/main.h | 1 - src/query.c | 1 - src/server.c | 1 - src/ui.c | 25 -------------- src/ui.h | 3 -- src/ui/app.c | 19 +++++------ src/ui/app.h | 2 +- src/ui/modals/ask_server_addr.c | 3 +- src/ui/modals/download_pr.c | 4 +-- src/ui/modals/login_credentials.c | 3 +- src/ui/modals/upload_dialogue.c | 57 +++++++++++++++++++++++++++++++ src/ui/modals/upload_dialogue.h | 9 +++++ src/ui/widget.c | 4 +-- src/ui/widget.h | 2 +- src/ui/widget/dialogue.c | 2 +- src/ui/widget/file_list.c | 2 +- src/ui/widget/file_list.h | 1 + src/ui/widget/group.c | 2 +- 21 files changed, 96 insertions(+), 61 deletions(-) delete mode 100644 src/ui.c delete mode 100644 src/ui.h create mode 100644 src/ui/modals/upload_dialogue.c create mode 100644 src/ui/modals/upload_dialogue.h diff --git a/src/connection.c b/src/connection.c index a4cab2f..8096162 100644 --- a/src/connection.c +++ b/src/connection.c @@ -20,8 +20,7 @@ void connect_to_server(app_t *app) { if (-1 == connect(app->params->sd, (struct sockaddr *)&server, sizeof(server))) { perror("connect"); - destroy_app(app); - exit(2); + destroy_app(app, 2); } app->params->is_connected = TRUE; print_bars(app); diff --git a/src/deps.mk b/src/deps.mk index 080b537..94ec06b 100644 --- a/src/deps.mk +++ b/src/deps.mk @@ -25,5 +25,4 @@ query.o: src/query.c src/client.h src/main.h src/types.h src/connection.h \ src/ui/widget/../../common.h src/ui/widget/button.h \ src/ui/widget/../../main.h src/ui/widget/group.h src/file_processor.h \ src/ui/widget/file_list.h src/server.h -server.o: src/server.c src/main.h src/types.h src/ui.h -ui.o: src/ui.c +server.o: src/server.c src/main.h src/types.h diff --git a/src/main.c b/src/main.c index fed60d0..7361c6d 100644 --- a/src/main.c +++ b/src/main.c @@ -57,7 +57,7 @@ int main(int argc, char **argv) { query_loop(app); clear_params(¶ms); - destroy_app(app); + destroy_app(app, 0); return OK; } @@ -67,8 +67,12 @@ int32_t process_user_input(app_t *app, callback_args_t *d_args) { c = wgetch(app->win); switch (c) { case KEY_F(9): - destroy_app(app); - return ERR; + destroy_app(app, 0); + return OK; + case 'U': + case 'u': + app->query_args->state = S_UPLOAD_FILE; + break; default: d_args->data = (void *)&c; app->active_callback(d_args); diff --git a/src/main.h b/src/main.h index 54f857f..ca06b5e 100644 --- a/src/main.h +++ b/src/main.h @@ -45,7 +45,6 @@ enum state { WAIT_REGISTER, WAIT_REGISTER_CONFIRMATION, WAIT_CLIENT, - UPLOAD_FILE, }; typedef struct p_file { diff --git a/src/query.c b/src/query.c index 5a9638e..b600d00 100644 --- a/src/query.c +++ b/src/query.c @@ -144,7 +144,6 @@ int process_query(query_args_t *query_args, file_args_t *file_args) { case WAIT_REGISTER_CONFIRMATION: wait_side(query_args); break; - case UPLOAD_FILE: case S_ERR: break; case S_FILE_LIST: diff --git a/src/server.c b/src/server.c index 604f8d5..b7b51a4 100644 --- a/src/server.c +++ b/src/server.c @@ -1,5 +1,4 @@ #include "main.h" -#include "ui.h" #include #include #include diff --git a/src/ui.c b/src/ui.c deleted file mode 100644 index 1581b3b..0000000 --- a/src/ui.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include - -uint32_t print_ask_list(char title[], const char *options[]) { - char c; - uint32_t i, answer; - - printf("%s\n", title); - - for (i = 0; options[i] != NULL; i++) { - printf("[%u] %s\n", i + 1, options[i]); - } - - write(STDOUT_FILENO, "> ", sizeof "> "); - - while (!scanf("%u", &answer) || answer > i) { - printf("Input format is not correct! You need to specify between 1 and " - "%u\n > ", - i); - } - while ((c = getchar()) != '\n' && c != EOF); - - return answer; -} \ No newline at end of file diff --git a/src/ui.h b/src/ui.h deleted file mode 100644 index 9cc68e4..0000000 --- a/src/ui.h +++ /dev/null @@ -1,3 +0,0 @@ -#include - -uint32_t print_ask_list(char *title, const char *options[]); \ No newline at end of file diff --git a/src/ui/app.c b/src/ui/app.c index f24b12d..8c820b6 100644 --- a/src/ui/app.c +++ b/src/ui/app.c @@ -5,6 +5,7 @@ #include "modals/login_option.h" #include "modals/notification.h" #include "modals/server_message.h" +#include "modals/upload_dialogue.h" #include "widget/dialogue.h" #include #include @@ -90,12 +91,6 @@ void draw_borders(app_t *app) { box(app->win, 0, 0); box(app->left_win, 0, 0); box(app->right_win, 0, 0); - - /* refresh the windows */ - wnoutrefresh(app->win); - wnoutrefresh(app->left_win); - wnoutrefresh(app->right_win); - doupdate(); } void print_bars(app_t *app) { @@ -120,7 +115,8 @@ void print_bars(app_t *app) { mvwprintw(app->win, 1, 2, "%s", top_text); /* add content to the bottom bar */ - mvwprintw(app->win, app->coordinates.cur_y - 2, 2, "F1 - Help | F9 - Quit"); + mvwprintw(app->win, app->coordinates.cur_y - 2, 2, + "F1 - Help | U - upload | F9 - Quit"); wattroff(app->win, A_REVERSE); } @@ -161,16 +157,17 @@ void app_draw_modal(app_t *app) { case S_FILE_DOWNLOAD: init_dwn_pr_modal(app); break; + case S_UPLOAD_FILE: + init_upload_dialogue_modal(app); + break; case WAIT_SERVER_INIT: case WAIT_SERVER: case WAIT_REGISTER: case WAIT_REGISTER_CONFIRMATION: case WAIT_CLIENT: - case UPLOAD_FILE: case S_FILE_LIST: case S_FILE_SELECT: case S_UPLOAD_PARAMS: - case S_UPLOAD_FILE: case S_UPLOAD_REQUESTED: case S_ASK_USER_BEFORE_LOGIN: case S_ERR: @@ -191,7 +188,9 @@ void app_draw_modal(app_t *app) { draw_dialogue(&(app->modal)); } -void destroy_app(app_t *app) { +void destroy_app(app_t *app, int32_t exit_code) { delwin(app->win); endwin(); + app->win = NULL; + exit(exit_code); } diff --git a/src/ui/app.h b/src/ui/app.h index 945d27d..c810972 100644 --- a/src/ui/app.h +++ b/src/ui/app.h @@ -35,7 +35,7 @@ typedef struct { app_t *init_app(); void init_nc(); -void destroy_app(app_t *app); +void destroy_app(app_t *app, int32_t exit_code); void draw_borders(app_t *app); void print_bars(app_t *app); void app_refresh(app_t *app); diff --git a/src/ui/modals/ask_server_addr.c b/src/ui/modals/ask_server_addr.c index 1e663c9..5c80b19 100644 --- a/src/ui/modals/ask_server_addr.c +++ b/src/ui/modals/ask_server_addr.c @@ -35,8 +35,7 @@ void asa_modal_dialogue_callback(callback_args_t *args) { app->query_args->state = S_WAIT_SERVER; break; case 1: - destroy_app(app); - exit(0); + destroy_app(app, 0); } } } diff --git a/src/ui/modals/download_pr.c b/src/ui/modals/download_pr.c index 4a77bec..e32de93 100644 --- a/src/ui/modals/download_pr.c +++ b/src/ui/modals/download_pr.c @@ -5,7 +5,7 @@ #include #include -void init_dwn_pr_modal_cb(callback_args_t *args) { +void dwn_pr_modal_cb(callback_args_t *args) { } dialogue_t *init_dwn_pr_modal(app_t *app) { @@ -23,7 +23,7 @@ dialogue_t *init_dwn_pr_modal(app_t *app) { init_dialogue(&(app->modal), "Download", text, &(app->coordinates)); dialogue_t *d = &(app->modal); - d->w.callback = init_dwn_pr_modal_cb; + d->w.callback = dwn_pr_modal_cb; d->g_content = init_group(&(d->win), &(d->w), content, horizontal); d->g_action = init_group(&(d->win), &(d->w), actions, horizontal); diff --git a/src/ui/modals/login_credentials.c b/src/ui/modals/login_credentials.c index b5dd5d9..32c8616 100644 --- a/src/ui/modals/login_credentials.c +++ b/src/ui/modals/login_credentials.c @@ -41,8 +41,7 @@ void init_login_credentials_modal_cb(callback_args_t *args) { print_bars(app); break; case 1: - destroy_app(app); - exit(0); + destroy_app(app, 0); } } } diff --git a/src/ui/modals/upload_dialogue.c b/src/ui/modals/upload_dialogue.c new file mode 100644 index 0000000..7a1f770 --- /dev/null +++ b/src/ui/modals/upload_dialogue.c @@ -0,0 +1,57 @@ +#include "../app.h" +#include "../widget/dialogue.h" +#include "../widget/group.h" +#include +#include +#include + +void upload_dialogue_modal_cb(callback_args_t *args) { + int32_t response; + callback_args_t d_args; + app_t *app = args->app; + dialogue_t *d = (dialogue_t *)app->active_widget; + memcpy(&d_args, args, sizeof(callback_args_t)); + d_args.app = NULL; + d_args.resp_data = &response; + d_args.widget = app->active_widget; + dialogue_default_callback(&d_args); + if (response > -1) { + switch (response) { + case 0: + app->query_args->state = S_WAIT_SERVER; + break; + case 1: + break; + } + } +} + +dialogue_t *init_upload_dialogue_modal(app_t *app) { + if (app == NULL) + return NULL; + group_el_init_t content[] = {{.type = w_input, + .label = "File description", + .length = 30}, /* length is ignored */ + {.type = w_end}}; + + group_el_init_t actions[] = { + {.type = w_button, .label = "Upload", .is_default = 1}, + {.type = w_button, .label = "Cancel", .is_default = 0}, + {.type = w_end}}; + + app->modal.w.parent_win = &app->win; + init_dialogue(&(app->modal), "Upload new file", "Enter essential data", + &(app->coordinates)); + dialogue_t *d = &(app->modal); + + d->w.callback = upload_dialogue_modal_cb; + d->g_content = init_group(&(d->win), &(d->w), content, horizontal); + d->g_action = init_group(&(d->win), &(d->w), actions, horizontal); + + app->query_args->progress_bar = d->g_content->elements[0].element; + app->query_args->active_dialogue = d; + + dialogue_init_active_id(d); + + return NULL; +} \ No newline at end of file diff --git a/src/ui/modals/upload_dialogue.h b/src/ui/modals/upload_dialogue.h new file mode 100644 index 0000000..27bbac6 --- /dev/null +++ b/src/ui/modals/upload_dialogue.h @@ -0,0 +1,9 @@ +#ifndef UPLOAD_DIALOGUE_H +#define UPLOAD_DIALOGUE_H + +#include "../widget/dialogue.h" +#include "../app.h" + +dialogue_t *init_upload_dialogue_modal(app_t *app); + +#endif \ No newline at end of file diff --git a/src/ui/widget.c b/src/ui/widget.c index e2dcfdf..d1b6f8f 100644 --- a/src/ui/widget.c +++ b/src/ui/widget.c @@ -58,14 +58,14 @@ int32_t get_max_line_len(const char *text, uint32_t *line_count) { mvwprintw(win, line_v_pos, x, "%s", l_buf); \ } -uint32_t print_multiline_text(WINDOW *win, const char *_text, const uint32_t y, +uint32_t print_multiline_text(WINDOW *win, const char *_text, + const uint32_t win_width, const uint32_t y, const uint32_t x, const uint16_t attrs) { uint16_t line_v_pos = y; int32_t c_line_len = 0; uint32_t m_line_len = 0; uint32_t i = 0; - uint32_t win_width = getmaxx(win) - 2; /* -2: borders */ char l_buf[DIALOGUE_TEXT]; char *text = malloc(strlen(_text) + 1); strcpy(text, _text); diff --git a/src/ui/widget.h b/src/ui/widget.h index be738a9..aafebca 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -58,7 +58,7 @@ enum pmt_attrs { void init_widget(widget_t *w, widget_t *w_parent, WINDOW **win, char *title); int32_t get_max_line_len(const char *text, uint32_t *line_count); -uint32_t print_multiline_text(WINDOW *win, const char *text, const uint32_t y, +uint32_t print_multiline_text(WINDOW *win, const char *text, const uint32_t win_width, const uint32_t y, const uint32_t x, const uint16_t attrs); #endif \ No newline at end of file diff --git a/src/ui/widget/dialogue.c b/src/ui/widget/dialogue.c index bf052ae..5cb051c 100644 --- a/src/ui/widget/dialogue.c +++ b/src/ui/widget/dialogue.c @@ -239,7 +239,7 @@ int32_t draw_dialogue(dialogue_t *d) { /* text */ wattroff(d->win, A_BOLD); /* mvwhline(d->win, d->w.y - 3, 1, 0, d->w.x - 2); */ - print_multiline_text(d->win, d->text, 2, 1, PMT_ALIGN_CENTER); + print_multiline_text(d->win, d->text, d->w.x, 2, 1, PMT_ALIGN_CENTER); wattroff(d->win, A_REVERSE); if (d->g_content != NULL) { diff --git a/src/ui/widget/file_list.c b/src/ui/widget/file_list.c index d71e2c4..f7ac1a0 100644 --- a/src/ui/widget/file_list.c +++ b/src/ui/widget/file_list.c @@ -144,5 +144,5 @@ void draw_file_list(ui_file_list_t *fl_ui) { mvwprintw(i_win, p_y++, p_x, "Size: %zu", active_el->size); mvwprintw(i_win, p_y++, p_x, "Owner: %s", active_el->owner); mvwprintw(i_win, p_y++, p_x, "Description: "); - print_multiline_text(i_win, active_el->description, p_y, p_x, 0); + print_multiline_text(i_win, active_el->description, sz_x, p_y, p_x, 0); } \ No newline at end of file diff --git a/src/ui/widget/file_list.h b/src/ui/widget/file_list.h index 896f314..a739744 100644 --- a/src/ui/widget/file_list.h +++ b/src/ui/widget/file_list.h @@ -2,6 +2,7 @@ #define FILE_LIST_H #include "../widget.h" #include + typedef struct { widget_t w; fl_item_t **current; diff --git a/src/ui/widget/group.c b/src/ui/widget/group.c index 2b8828c..a4d15dc 100644 --- a/src/ui/widget/group.c +++ b/src/ui/widget/group.c @@ -107,7 +107,7 @@ group_t *init_group(WINDOW **win, widget_t *w_parent, group_el_init_t *children, w = &(((ui_progress_bar_t *)elements[i].element)->w); break; } - // set dimensions + /* set dimensions */ elements[i].id = w->id; if (direction == horizontal) { w->m_x = group->w.m_x + 1 + group->w.x;