From: Michael Tremer Date: Wed, 31 Mar 2021 21:52:36 +0000 (+0000) Subject: progressbar: Add counter widget X-Git-Tag: 0.9.28~1285^2~446 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7eeaca28dad050381d3cf6abb19b30b55cb35e2;p=pakfire.git progressbar: Add counter widget Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/progressbar.h b/src/libpakfire/include/pakfire/progressbar.h index 41d71dd63..3a7121e57 100644 --- a/src/libpakfire/include/pakfire/progressbar.h +++ b/src/libpakfire/include/pakfire/progressbar.h @@ -41,6 +41,7 @@ int pakfire_progressbar_increment(struct pakfire_progressbar* p); 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); #endif diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index 6df0d47e7..6b42fa3a3 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -40,7 +40,8 @@ struct pakfire_progressbar_widget { int expandable; void* data; - const char* (*print)(struct pakfire_progressbar* p, int width, void* data); + const char* (*print)(struct pakfire_progressbar* p, + struct pakfire_progressbar_widget* widget, int width, void* data); void (*free)(void* data); char buffer[1024]; @@ -224,7 +225,8 @@ 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, int width, void* data), + const char* (*print)(struct pakfire_progressbar* p, + struct pakfire_progressbar_widget* widget, int width, void* data), void (*free)(void* data), int expandable, void* data) { // Allocate the widget struct pakfire_progressbar_widget* widget = calloc(1, sizeof(*widget)); @@ -261,7 +263,7 @@ static int pakfire_progressbar_needs_redraw(struct pakfire_progressbar* p) { goto REDRAW; // Redraw when we hit the timeout - if (timespec_lt(&now, &p->time_redraw)) + if (timespec_lt(&p->time_redraw, &now)) goto REDRAW; // Redraw when we are finished @@ -299,7 +301,7 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) { const char* element = NULL; if (!widget->expandable) { - element = widget->print(p, 0, widget->data); + element = widget->print(p, widget, 0, widget->data); cols_left -= strlen(element); } @@ -319,26 +321,28 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) { const char* element = elements[i]; if (!widget->expandable) { - element = widget->print(p, width, widget->data); + element = widget->print(p, widget, width, widget->data); } elements[i++] = element; } // Reset the line - fputs("\r ", p->terminal.f); + fputs("\r", p->terminal.f); // Print all elements - for (unsigned int i = 0; i < p->num_widgets; i++) + for (unsigned int i = 0; i < p->num_widgets; i++) { + fputs(" ", p->terminal.f); fputs(elements[i], p->terminal.f); + } return 0; } // String widget -const char* pakfire_progressbar_string_print( - struct pakfire_progressbar* p, int width, void* data) { +const char* pakfire_progressbar_string_print(struct pakfire_progressbar* p, + struct pakfire_progressbar_widget* widget, int width, void* data) { return (const char*)data; } @@ -349,3 +353,18 @@ int pakfire_progressbar_add_string(struct pakfire_progressbar* p, const char* st return pakfire_progressbar_add_widget(p, pakfire_progressbar_string_print, free, 0, s); } + +// Counter + +const char* pakfire_progressbar_counter_print(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) + return NULL; + + return widget->buffer; +} + +int pakfire_progressbar_add_counter(struct pakfire_progressbar* p) { + return pakfire_progressbar_add_widget(p, pakfire_progressbar_counter_print, free, 0, NULL); +} diff --git a/tests/libpakfire/progressbar.c b/tests/libpakfire/progressbar.c index 28af34ede..ae6df2fc2 100644 --- a/tests/libpakfire/progressbar.c +++ b/tests/libpakfire/progressbar.c @@ -36,6 +36,9 @@ static int test_run(const struct test* t) { // Add a string ASSERT_SUCCESS(pakfire_progressbar_add_string(p, "STRING")); + // Add a counter + ASSERT_SUCCESS(pakfire_progressbar_add_counter(p)); + ASSERT_SUCCESS(pakfire_progressbar_start(p, 1000)); for (unsigned int i = 0; i < 1000; i++) {