]> git.ipfire.org Git - pakfire.git/commitdiff
progressbar: Add bar widget
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 22:30:06 +0000 (22:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 31 Mar 2021 22:30:06 +0000 (22:30 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/progressbar.c
tests/libpakfire/progressbar.c

index 3c287557cdf38406486f189146acf9e68714aa50..c3a2670260c733e69c5ab8125cea8d381ec56347 100644 (file)
@@ -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);
+}
index c68ad0bf1fcd011b38c3c05ce4e1237ace7306e3..7caa7581078983d77b18cac701b6b6e13978a7e7 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 a bar
+       ASSERT_SUCCESS(pakfire_progressbar_add_bar(p));
+
        // Add the percentage
        ASSERT_SUCCESS(pakfire_progressbar_add_percentage(p));