diff --git a/src/main.c b/src/main.c index dcae9b5..fed60d0 100644 --- a/src/main.c +++ b/src/main.c @@ -41,7 +41,7 @@ int main(int argc, char **argv) { init_query_args(q_args, app->params); q_args->buf = malloc(INBUFSIZE); app->query_args = q_args; - q_args->file_list_ui = init_file_list(&(app->left_win)); + q_args->file_list_ui = init_file_list(&(app->left_win), &(app->right_win)); /* init client to connect to the server */ app->params->sd = init_client(); diff --git a/src/ui/widget.c b/src/ui/widget.c index 914269f..e2dcfdf 100644 --- a/src/ui/widget.c +++ b/src/ui/widget.c @@ -2,6 +2,7 @@ #include "../main.h" #include #include +#include #include extern uint32_t m_id; @@ -57,15 +58,35 @@ 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 win_width, const uint32_t y, +uint32_t print_multiline_text(WINDOW *win, const char *_text, 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); + + uint l_size = 0; + for (uint m = 0; text[m] != '\0'; m++) { + if (text[m] != '\n') { + if (l_size >= win_width) { + uint j = m; + while (text[j] != ' ') { + j--; + } + text[j] = '\n'; + l_size = 0; + } else { + l_size++; + } + } else { + l_size = 0; + } + } if (attrs & PMT_POS_CENTER) { m_line_len = get_max_line_len(text, NULL); @@ -81,6 +102,8 @@ uint32_t print_multiline_text(WINDOW *win, const char *text, PRINT_TEXT(win, l_buf, text, i, c_line_len, win_width, line_v_pos, attrs) + free(text); + return 1; } diff --git a/src/ui/widget.h b/src/ui/widget.h index 9052f20..be738a9 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -58,8 +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 win_width, const uint32_t y, +uint32_t print_multiline_text(WINDOW *win, const char *text, 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 5cb051c..bf052ae 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, d->w.x, 2, 1, PMT_ALIGN_CENTER); + print_multiline_text(d->win, d->text, 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 55081bc..d71e2c4 100644 --- a/src/ui/widget/file_list.c +++ b/src/ui/widget/file_list.c @@ -52,7 +52,7 @@ void file_list_cb(callback_args_t *args) { } } -ui_file_list_t *init_file_list(WINDOW **win) { +ui_file_list_t *init_file_list(WINDOW **win, WINDOW *const* info_win) { ui_file_list_t *fl_ui = malloc(sizeof(ui_file_list_t)); init_widget(&(fl_ui->w), NULL, win, ""); fl_ui->current_idx = 0; @@ -61,6 +61,7 @@ ui_file_list_t *init_file_list(WINDOW **win) { fl_ui->current_count = 0; fl_ui->full_count = 0; fl_ui->activate_last = false; + fl_ui->info_win = info_win; return fl_ui; } @@ -81,6 +82,7 @@ void draw_file_list(ui_file_list_t *fl_ui) { p_y = 1; p_x = 1; fl_item_t *el = *(fl_ui->start); + fl_item_t *active_el = *(fl_ui->start); int32_t cur_el_idx = 0; WINDOW *win = *(fl_ui->w.parent_win); curs_set(0); @@ -102,6 +104,7 @@ void draw_file_list(ui_file_list_t *fl_ui) { } if (cur_el_idx == fl_ui->current_idx) { wattrset(win, A_BOLD | A_REVERSE); + active_el = el; } p_x = 1; mvwprintw(win, p_y, p_x, "%s%n", el->name, &p_x); @@ -130,4 +133,16 @@ void draw_file_list(ui_file_list_t *fl_ui) { wattrset(win, A_BOLD); mvwprintw(win, p_y, p_x, "%*s%s%*s", l_pad, "", p_info, l_pad, ""); wattroff(win, A_BOLD); + + + /* draw file info */ + p_y = 1; + p_x = 1; + WINDOW *i_win = *fl_ui->info_win; + wclear(i_win); + + 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); } \ No newline at end of file diff --git a/src/ui/widget/file_list.h b/src/ui/widget/file_list.h index c91df5d..896f314 100644 --- a/src/ui/widget/file_list.h +++ b/src/ui/widget/file_list.h @@ -12,10 +12,11 @@ typedef struct { uint32_t pages; uint32_t current_page; uint32_t activate_last : 1; + WINDOW *const* info_win; } ui_file_list_t; void draw_file_list(ui_file_list_t *fl_ui); void redraw_file_list(ui_file_list_t *fl_ui); -ui_file_list_t *init_file_list(WINDOW **win); +ui_file_list_t *init_file_list(WINDOW **win, WINDOW *const* info_win); void file_list_cb(callback_args_t *args); #endif \ No newline at end of file