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

index c3a2670260c733e69c5ab8125cea8d381ec56347..3293928f95c0b7d9a04f7d7f9819a8a700e668cc 100644 (file)
@@ -163,6 +163,16 @@ struct pakfire_progressbar* pakfire_progressbar_unref(struct pakfire_progressbar
        return NULL;
 }
 
+static time_t pakfire_progressbar_elapsed_time(struct pakfire_progressbar* p) {
+       struct timespec now;
+
+       int r = clock_gettime(CLOCK_MONOTONIC, &now);
+       if (r)
+               return r;
+
+       return now.tv_sec - p->time_start.tv_sec;
+}
+
 int pakfire_progressbar_start(struct pakfire_progressbar* p, unsigned long value) {
        if (p->status != PAKFIRE_PROGRESSBAR_INIT)
                return EINVAL;
@@ -325,7 +335,7 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) {
        STAILQ_FOREACH(widget, &p->widgets, nodes) {
                const char* element = elements[i];
 
-               if (!widget->expandable) {
+               if (widget->expandable) {
                        element = widget->print(p, widget, width, widget->data);
                }
 
@@ -416,5 +426,24 @@ const char* pakfire_progressbar_bar(struct pakfire_progressbar* p,
 }
 
 int pakfire_progressbar_add_bar(struct pakfire_progressbar* p) {
-       return pakfire_progressbar_add_widget(p, pakfire_progressbar_bar, NULL, 0, NULL);
+       return pakfire_progressbar_add_widget(p, pakfire_progressbar_bar, NULL, 1, NULL);
+}
+
+// Timer
+
+const char* pakfire_progressbar_timer(struct pakfire_progressbar* p,
+               struct pakfire_progressbar_widget* widget, unsigned int width, void* data) {
+       time_t t = pakfire_progressbar_elapsed_time(p);
+       if (t < 0)
+               return NULL;
+
+       int r = snprintf(widget->buffer, sizeof(widget->buffer), "%02lu:%02lu", t / 60, t % 60);
+       if (r < 0)
+               return NULL;
+
+       return widget->buffer;
+}
+
+int pakfire_progressbar_add_timer(struct pakfire_progressbar* p) {
+       return pakfire_progressbar_add_widget(p, pakfire_progressbar_timer, NULL, 0, NULL);
 }
index 7caa7581078983d77b18cac701b6b6e13978a7e7..8a1dc72cac4da6052a432f7e415cf0bef65ea3ee 100644 (file)
@@ -45,6 +45,9 @@ static int test_run(const struct test* t) {
        // Add the percentage
        ASSERT_SUCCESS(pakfire_progressbar_add_percentage(p));
 
+       // Add a timer
+       ASSERT_SUCCESS(pakfire_progressbar_add_timer(p));
+
        ASSERT_SUCCESS(pakfire_progressbar_start(p, 1000));
 
        for (unsigned int i = 0; i < 1000; i++) {