From: Michael Tremer Date: Wed, 31 Mar 2021 22:00:07 +0000 (+0000) Subject: progressbar: Add percentage widget X-Git-Tag: 0.9.28~1285^2~445 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b5c989795d24e6fd37d26b04e657ff5296768f1;p=pakfire.git progressbar: Add percentage widget Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/progressbar.h b/src/libpakfire/include/pakfire/progressbar.h index 3a7121e57..a363c43f9 100644 --- a/src/libpakfire/include/pakfire/progressbar.h +++ b/src/libpakfire/include/pakfire/progressbar.h @@ -42,6 +42,7 @@ int pakfire_progressbar_finish(struct pakfire_progressbar* p); int pakfire_progressbar_add_string(struct pakfire_progressbar* p, const char* string); int pakfire_progressbar_add_counter(struct pakfire_progressbar* p); +int pakfire_progressbar_add_percentage(struct pakfire_progressbar* p); #endif diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index 6b42fa3a3..3c287557c 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -341,7 +341,7 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) { // String widget -const char* pakfire_progressbar_string_print(struct pakfire_progressbar* p, +const char* pakfire_progressbar_string(struct pakfire_progressbar* p, struct pakfire_progressbar_widget* widget, int width, void* data) { return (const char*)data; } @@ -351,12 +351,12 @@ int pakfire_progressbar_add_string(struct pakfire_progressbar* p, const char* st if (!s) return ENOMEM; - return pakfire_progressbar_add_widget(p, pakfire_progressbar_string_print, free, 0, s); + return pakfire_progressbar_add_widget(p, pakfire_progressbar_string, free, 0, s); } // Counter -const char* pakfire_progressbar_counter_print(struct pakfire_progressbar* p, +const char* pakfire_progressbar_counter(struct pakfire_progressbar* p, struct pakfire_progressbar_widget* widget, int width, void* data) { int r = snprintf(widget->buffer, sizeof(widget->buffer), "%lu", p->value); if (r < 0) @@ -366,5 +366,22 @@ const char* pakfire_progressbar_counter_print(struct pakfire_progressbar* p, } int pakfire_progressbar_add_counter(struct pakfire_progressbar* p) { - return pakfire_progressbar_add_widget(p, pakfire_progressbar_counter_print, free, 0, NULL); + return pakfire_progressbar_add_widget(p, pakfire_progressbar_counter, NULL, 0, NULL); +} + +// Percentage + +const char* pakfire_progressbar_percentage(struct pakfire_progressbar* p, + struct pakfire_progressbar_widget* widget, int width, void* data) { + double percentage = p->value * 100.0 / p->value_max; + + int r = snprintf(widget->buffer, sizeof(widget->buffer), "%3.0f%%", percentage); + if (r < 0) + return NULL; + + return widget->buffer; +} + +int pakfire_progressbar_add_percentage(struct pakfire_progressbar* p) { + return pakfire_progressbar_add_widget(p, pakfire_progressbar_percentage, NULL, 0, NULL); } diff --git a/tests/libpakfire/progressbar.c b/tests/libpakfire/progressbar.c index ae6df2fc2..c68ad0bf1 100644 --- a/tests/libpakfire/progressbar.c +++ b/tests/libpakfire/progressbar.c @@ -39,6 +39,9 @@ static int test_run(const struct test* t) { // Add a counter ASSERT_SUCCESS(pakfire_progressbar_add_counter(p)); + // Add the percentage + ASSERT_SUCCESS(pakfire_progressbar_add_percentage(p)); + ASSERT_SUCCESS(pakfire_progressbar_start(p, 1000)); for (unsigned int i = 0; i < 1000; i++) {