From: Michael Tremer Date: Wed, 31 Mar 2021 22:30:06 +0000 (+0000) Subject: progressbar: Add bar widget X-Git-Tag: 0.9.28~1285^2~444 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bcfdc834371e2d60edb1ad6a5178801546ec0c5a;p=pakfire.git progressbar: Add bar widget Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index 3c287557c..c3a267026 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -41,7 +41,7 @@ struct pakfire_progressbar_widget { void* data; const char* (*print)(struct pakfire_progressbar* p, - struct pakfire_progressbar_widget* widget, int width, void* data); + struct pakfire_progressbar_widget* widget, unsigned int width, void* data); void (*free)(void* data); char buffer[1024]; @@ -226,7 +226,7 @@ int pakfire_progressbar_finish(struct pakfire_progressbar* p) { static int pakfire_progressbar_add_widget(struct pakfire_progressbar* p, const char* (*print)(struct pakfire_progressbar* p, - struct pakfire_progressbar_widget* widget, int width, void* data), + struct pakfire_progressbar_widget* widget, unsigned int width, void* data), void (*free)(void* data), int expandable, void* data) { // Allocate the widget struct pakfire_progressbar_widget* widget = calloc(1, sizeof(*widget)); @@ -300,9 +300,14 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) { STAILQ_FOREACH(widget, &p->widgets, nodes) { const char* element = NULL; + // Clear any previous content + if (*widget->buffer) + memset(widget->buffer, '\0', sizeof(widget->buffer)); + if (!widget->expandable) { element = widget->print(p, widget, 0, widget->data); - cols_left -= strlen(element); + if (element) + cols_left -= strlen(element); } elements[i++] = element; @@ -342,7 +347,7 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) { // String widget const char* pakfire_progressbar_string(struct pakfire_progressbar* p, - struct pakfire_progressbar_widget* widget, int width, void* data) { + struct pakfire_progressbar_widget* widget, unsigned int width, void* data) { return (const char*)data; } @@ -357,7 +362,7 @@ int pakfire_progressbar_add_string(struct pakfire_progressbar* p, const char* st // Counter const char* pakfire_progressbar_counter(struct pakfire_progressbar* p, - struct pakfire_progressbar_widget* widget, int width, void* data) { + struct pakfire_progressbar_widget* widget, unsigned int width, void* data) { int r = snprintf(widget->buffer, sizeof(widget->buffer), "%lu", p->value); if (r < 0) return NULL; @@ -372,7 +377,7 @@ int pakfire_progressbar_add_counter(struct pakfire_progressbar* p) { // Percentage const char* pakfire_progressbar_percentage(struct pakfire_progressbar* p, - struct pakfire_progressbar_widget* widget, int width, void* data) { + struct pakfire_progressbar_widget* widget, unsigned int width, void* data) { double percentage = p->value * 100.0 / p->value_max; int r = snprintf(widget->buffer, sizeof(widget->buffer), "%3.0f%%", percentage); @@ -385,3 +390,31 @@ const char* pakfire_progressbar_percentage(struct pakfire_progressbar* p, int pakfire_progressbar_add_percentage(struct pakfire_progressbar* p) { return pakfire_progressbar_add_widget(p, pakfire_progressbar_percentage, NULL, 0, NULL); } + +// Bar + +const char* pakfire_progressbar_bar(struct pakfire_progressbar* p, + struct pakfire_progressbar_widget* widget, unsigned int width, void* data) { + if (width >= sizeof(widget->buffer) || width < 2) + return NULL; + + unsigned int fill = p->value * (width - 2) / p->value_max; + + // Write brackets + widget->buffer[0] = '['; + widget->buffer[width-1] = ']'; + + // Write bar + for (unsigned int i = 1; i < width - 1; i++) { + if (i <= fill) + widget->buffer[i] = '#'; + else + widget->buffer[i] = '-'; + } + + return widget->buffer; +} + +int pakfire_progressbar_add_bar(struct pakfire_progressbar* p) { + return pakfire_progressbar_add_widget(p, pakfire_progressbar_bar, NULL, 0, NULL); +} diff --git a/tests/libpakfire/progressbar.c b/tests/libpakfire/progressbar.c index c68ad0bf1..7caa75810 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 a bar + ASSERT_SUCCESS(pakfire_progressbar_add_bar(p)); + // Add the percentage ASSERT_SUCCESS(pakfire_progressbar_add_percentage(p));