]> git.ipfire.org Git - pakfire.git/commitdiff
progressbar: Add counter widget
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 21:52:36 +0000 (21:52 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 21:52:36 +0000 (21:52 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/progressbar.h
src/libpakfire/progressbar.c
tests/libpakfire/progressbar.c

index 41d71dd6349289ada3226a42b4eae51c5abded7c..3a7121e573b5d09e589d76cbf0a882f8b8a4e9b8 100644 (file)
@@ -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
 
index 6df0d47e78d6cfff8caf5e1f73eef6ecdf1ddc0f..6b42fa3a37ec4de00a580cd6b7cf187c930ff5e1 100644 (file)
@@ -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);
+}
index 28af34ede3a5cbd8e4949d5a8927bd89977c0864..ae6df2fc25ea65db9be4b6725fc40c8d382e8cf2 100644 (file)
@@ -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++) {