#include #include #include #include #include #include "nfd.h" #include "nuklear.h" #include "process_url.h" #include "constants.h" #include "icon.h" #include "logger.h" #include "ui.h" #include "utils/size_info.h" #include "utils/time_info.h" #include "utils/utils.h" static nk_size pct; static bool show_app_about; static nfdchar_t *outPath; static struct nk_rect about_dialog_bounds = {128, -16, 768, 696}; void load_ui(struct ui_struct *ui) { static char text[USHRT_MAX], box_buffer[UINT16_MAX], status_string[UCHAR_MAX]; float logGroup_height = nk_window_get_height(ui->ctx) - 85 - 45 - 50 - 35 - 80; ui->logger->extend_box = (logGroup_height - 15) < ((ui->logger->box_lines + 1) * (ui->logger->font_height + 2)); poll_status(ui->stat); if (ui->stat->total) { pct = ((nk_size)ui->stat->cur) * (nk_size)100 / ((nk_size)ui->stat->total); if (ui->stat->type == SIZE_BYTES) { size_info_t info_cur = num2sizeinfo(ui->stat->cur); size_info_t info_total = num2sizeinfo(ui->stat->total); sprintf(status_string, "%.2Lf%s/%.2Lf%s, %hhu%%", info_cur.n, info_cur.unit_str, info_total.n, info_total.unit_str, (unsigned char)pct); } else if (ui->stat->type == TIME_SECS) { char *cur_ts = malloc(9), *total_ts = malloc(9); sec2timestamp(ui->stat->cur, (char **)&cur_ts); sec2timestamp(ui->stat->total, (char **)&total_ts); sprintf(status_string, "%s/%s, %hhu%%", cur_ts, total_ts, (unsigned char)pct); FREE_AND_NULLIFY(cur_ts); FREE_AND_NULLIFY(total_ts); } } if (ui->stat->is_done) { // (ui->stat->total) = 0; // To prevent nuklear further updating // status_string ui->stat->type = TIME_SECS; // Set for the callback stat } nk_menubar_begin(ui->ctx); nk_layout_row_begin(ui->ctx, NK_STATIC, 35, 1); nk_layout_row_push(ui->ctx, 100); if (nk_menu_begin_label(ui->ctx, "MENU", NK_TEXT_CENTERED, nk_vec2(100, 200))) { nk_layout_row_dynamic(ui->ctx, 35, 1); if (nk_menu_item_label(ui->ctx, "About", NK_TEXT_CENTERED)) show_app_about = nk_true; nk_menu_end(ui->ctx); } nk_layout_row_end(ui->ctx); nk_menubar_end(ui->ctx); if (show_app_about) { /* about popup */ if (nk_popup_begin(ui->ctx, NK_POPUP_DYNAMIC, "About", NK_WINDOW_CLOSABLE | NK_WINDOW_MOVABLE | NK_WINDOW_DYNAMIC, about_dialog_bounds)) { about_dialog_bounds = nk_window_get_bounds(ui->ctx); /* Pure magic calculated from experiments. * I'll guess that 6 is the x border size, * but really have no idea what 85 is. * What's worse, it's related w/ font size. Jeez. */ about_dialog_bounds.x -= 6; about_dialog_bounds.y -= 45; // DEBUG_PRINT("w: %f, h: %f\n", nk_window_get_bounds(ui->ctx).x, // nk_window_get_bounds(ui->ctx).y); nk_layout_row_dynamic(ui->ctx, 30, 1); for (int i = 0; icon[i]; i++) nk_label(ui->ctx, icon[i], NK_TEXT_CENTERED); SPACER; nk_label(ui->ctx, "Cross-platform multi-threaded downloader", NK_TEXT_CENTERED); nk_label(ui->ctx, "By Mole Shang <135e2@135e2.dev>", NK_TEXT_CENTERED); nk_label(ui->ctx, "", NK_TEXT_CENTERED); nk_popup_end(ui->ctx); } else show_app_about = nk_false; } nk_layout_row_dynamic(ui->ctx, 80, 1); nk_label(ui->ctx, "Hinata", NK_TEXT_CENTERED); nk_layout_row_template_begin(ui->ctx, 45); nk_layout_row_template_push_static(ui->ctx, 5); nk_layout_row_template_push_dynamic(ui->ctx); nk_layout_row_template_push_static(ui->ctx, 5); nk_layout_row_template_push_static(ui->ctx, 100); nk_layout_row_template_push_static(ui->ctx, 5); nk_layout_row_template_end(ui->ctx); SPACER; nk_edit_string_zero_terminated(ui->ctx, NK_EDIT_FIELD | NK_EDIT_AUTO_SELECT, text, USHRT_MAX - 1, nk_filter_ascii); SPACER; if (nk_button_label(ui->ctx, "Down.")) { // Clear logger text clear_log(); if (NFD_PickFolder(&outPath, NULL) == NFD_OKAY && outPath) { DEBUG_PRINT("nfd gets outPath: %s\n", (char *)outPath); append_log("Got URL: %s\n", text); add_url(text, (char *)outPath, NULL, NULL, NULL); } else { LOG("NFD", "Please specify a valid file PATH to write to!\n"); } } SPACER; nk_layout_row_dynamic(ui->ctx, 50, 1); nk_label(ui->ctx, status_string, NK_TEXT_CENTERED); nk_layout_row_template_begin(ui->ctx, 35); nk_layout_row_template_push_static(ui->ctx, 5); nk_layout_row_template_push_dynamic(ui->ctx); nk_layout_row_template_push_static(ui->ctx, 5); nk_layout_row_template_end(ui->ctx); SPACER; if (nk_progress(ui->ctx, &pct, MAX_VALUE, !NK_MODIFIABLE)) { // the value of the progress bar changed, the new value is stored in // currentValue } SPACER; nk_layout_row_dynamic(ui->ctx, logGroup_height, 1); ui->ctx->style.window.group_padding = nk_vec2(0, 0); if (nk_group_scrolled_begin(ui->ctx, ui->logger->scrollbar, "LogGroup", 0)) { nk_layout_row_dynamic( ui->ctx, MAX(logGroup_height - 15, (ui->logger->box_lines + 1) * (ui->logger->font_height + 2)), 1); nk_edit_buffer(ui->ctx, NK_EDIT_BOX | NK_EDIT_READ_ONLY | NK_EDIT_MULTILINE, ui->logger->text_edit, nk_filter_default); nk_group_scrolled_end(ui->ctx); } }