#define NCURSES_WIDECHAR 1 #include #include #include #include #include #include "ui.h" const char *uload = "█"; PROGRESS_BAR* new_progress_bar(WINDOW* scr, float total) { PROGRESS_BAR *bar = (PROGRESS_BAR*)malloc(sizeof(PROGRESS_BAR)); bar->scr = scr; bar->total = total; bar->current = 0; return bar; } void bar_step(PROGRESS_BAR* bar, float step){ bar->current += step; int x, y; int hx, hy; getmaxyx(bar->scr, y, x); hx = x/2; hy = y/2; float total = (bar->current/bar->total); wmove(bar->scr, hy-1, 0); for (int i = 0; i < ((float)x*total); i++) wprintw(bar->scr, uload); wmove(bar->scr, hy, hx-4); wprintw(bar->scr,"%03.0f%% ", total*100); int len = floor(log10(abs((int)bar->total))) + 3; wmove(bar->scr, hy+1, hx - len); wprintw(bar->scr, "%.0f/%.0f", bar->current, bar->total); wmove(bar->scr,0,0); wrefresh(bar->scr); } TEXT_BOX* new_text_box(WINDOW* scr, int length) { TEXT_BOX *text = (TEXT_BOX*)malloc(sizeof(TEXT_BOX)); text->scr = scr; text->length = length; text->current = 0; text->text = malloc(sizeof(char)*(length+1)); memset(text->text, '\0', length); return text; } void get_char(TEXT_BOX* text) { while(1){ wchar_t c; get_wch((wint_t*)&c); switch(c) { case KEY_BACKSPACE: if (text->current > 0) { text->text[text->current--] = '\0'; } break; default: if (text->current < (text->length-2)) { text->text[text->current] = c; text->text[++text->current] = '\0'; } } move(0,0); wrefresh(text->scr); wprintw(text->scr, "%*ls", text->current,text->text); } }