162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <linux/kernel.h> 362306a36Sopenharmony_ci#include "../progress.h" 462306a36Sopenharmony_ci#include "../libslang.h" 562306a36Sopenharmony_ci#include "../ui.h" 662306a36Sopenharmony_ci#include "tui.h" 762306a36Sopenharmony_ci#include "units.h" 862306a36Sopenharmony_ci#include "../browser.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic void __tui_progress__init(struct ui_progress *p) 1162306a36Sopenharmony_ci{ 1262306a36Sopenharmony_ci p->next = p->step = p->total / (SLtt_Screen_Cols - 2) ?: 1; 1362306a36Sopenharmony_ci} 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic int get_title(struct ui_progress *p, char *buf, size_t size) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci char buf_cur[20]; 1862306a36Sopenharmony_ci char buf_tot[20]; 1962306a36Sopenharmony_ci int ret; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci ret = unit_number__scnprintf(buf_cur, sizeof(buf_cur), p->curr); 2262306a36Sopenharmony_ci ret += unit_number__scnprintf(buf_tot, sizeof(buf_tot), p->total); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci return ret + scnprintf(buf, size, "%s [%s/%s]", 2562306a36Sopenharmony_ci p->title, buf_cur, buf_tot); 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic void tui_progress__update(struct ui_progress *p) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci char buf[100], *title = (char *) p->title; 3162306a36Sopenharmony_ci int bar, y; 3262306a36Sopenharmony_ci /* 3362306a36Sopenharmony_ci * FIXME: We should have a per UI backend way of showing progress, 3462306a36Sopenharmony_ci * stdio will just show a percentage as NN%, etc. 3562306a36Sopenharmony_ci */ 3662306a36Sopenharmony_ci if (use_browser <= 0) 3762306a36Sopenharmony_ci return; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci if (p->total == 0) 4062306a36Sopenharmony_ci return; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci if (p->size) { 4362306a36Sopenharmony_ci get_title(p, buf, sizeof(buf)); 4462306a36Sopenharmony_ci title = buf; 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci ui__refresh_dimensions(false); 4862306a36Sopenharmony_ci mutex_lock(&ui__lock); 4962306a36Sopenharmony_ci y = SLtt_Screen_Rows / 2 - 2; 5062306a36Sopenharmony_ci SLsmg_set_color(0); 5162306a36Sopenharmony_ci SLsmg_draw_box(y, 0, 3, SLtt_Screen_Cols); 5262306a36Sopenharmony_ci SLsmg_gotorc(y++, 1); 5362306a36Sopenharmony_ci SLsmg_write_string(title); 5462306a36Sopenharmony_ci SLsmg_fill_region(y, 1, 1, SLtt_Screen_Cols - 2, ' '); 5562306a36Sopenharmony_ci SLsmg_set_color(HE_COLORSET_SELECTED); 5662306a36Sopenharmony_ci bar = ((SLtt_Screen_Cols - 2) * p->curr) / p->total; 5762306a36Sopenharmony_ci SLsmg_fill_region(y, 1, 1, bar, ' '); 5862306a36Sopenharmony_ci SLsmg_refresh(); 5962306a36Sopenharmony_ci mutex_unlock(&ui__lock); 6062306a36Sopenharmony_ci} 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic void tui_progress__finish(void) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci int y; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci if (use_browser <= 0) 6762306a36Sopenharmony_ci return; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci ui__refresh_dimensions(false); 7062306a36Sopenharmony_ci mutex_lock(&ui__lock); 7162306a36Sopenharmony_ci y = SLtt_Screen_Rows / 2 - 2; 7262306a36Sopenharmony_ci SLsmg_set_color(0); 7362306a36Sopenharmony_ci SLsmg_fill_region(y, 0, 3, SLtt_Screen_Cols, ' '); 7462306a36Sopenharmony_ci SLsmg_refresh(); 7562306a36Sopenharmony_ci mutex_unlock(&ui__lock); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic struct ui_progress_ops tui_progress__ops = { 7962306a36Sopenharmony_ci .init = __tui_progress__init, 8062306a36Sopenharmony_ci .update = tui_progress__update, 8162306a36Sopenharmony_ci .finish = tui_progress__finish, 8262306a36Sopenharmony_ci}; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_civoid tui_progress__init(void) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci ui_progress__ops = &tui_progress__ops; 8762306a36Sopenharmony_ci} 88