]> git.ipfire.org Git - pakfire.git/commitdiff
progressbar: Add percentage widget
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 22:00:07 +0000 (22:00 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 22:00:07 +0000 (22:00 +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 3a7121e573b5d09e589d76cbf0a882f8b8a4e9b8..a363c43f98a26f72cc37f8a09d7927c0df5b954d 100644 (file)
@@ -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
 
index 6b42fa3a37ec4de00a580cd6b7cf187c930ff5e1..3c287557cdf38406486f189146acf9e68714aa50 100644 (file)
@@ -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);
 }
index ae6df2fc25ea65db9be4b6725fc40c8d382e8cf2..c68ad0bf1fcd011b38c3c05ce4e1237ace7306e3 100644 (file)
@@ -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++) {