]> git.ipfire.org Git - pakfire.git/commitdiff
progressbar: Make it resettable
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 10 Apr 2021 16:21:11 +0000 (16:21 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 10 Apr 2021 16:21:11 +0000 (16:21 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/progressbar.h
src/libpakfire/progressbar.c

index 2242cb161f874d2487f6a9bf1ecaf2605064d470..9e99674ff2dbc410928936dfb375b374615e166b 100644 (file)
@@ -39,6 +39,9 @@ int pakfire_progressbar_start(struct pakfire_progressbar* p, unsigned long value
 int pakfire_progressbar_update(struct pakfire_progressbar* p, unsigned long value);
 int pakfire_progressbar_increment(struct pakfire_progressbar* p);
 int pakfire_progressbar_finish(struct pakfire_progressbar* p);
+int pakfire_progressbar_reset(struct pakfire_progressbar* p);
+
+void pakfire_progressbar_set_max(struct pakfire_progressbar* p, unsigned long value);
 
 int pakfire_progressbar_add_string(struct pakfire_progressbar* p, const char* format, ...);
 int pakfire_progressbar_add_counter(struct pakfire_progressbar* p);
index 8793f5c8c1ed2e44cdadb31035daac1f568dc5cb..318f02942f52b902172febc9c27d1abf55fc0b44 100644 (file)
@@ -116,7 +116,7 @@ static void pakfire_progressbar_widget_free(struct pakfire_progressbar_widget* w
        free(widget);
 }
 
-static void pakfire_progressbar_free(struct pakfire_progressbar* p) {
+static void pakfire_progressbar_free_widgets(struct pakfire_progressbar* p) {
        struct pakfire_progressbar_widget* widget;
 
        // Free widgets
@@ -126,7 +126,10 @@ static void pakfire_progressbar_free(struct pakfire_progressbar* p) {
 
                pakfire_progressbar_widget_free(widget);
        }
+}
 
+static void pakfire_progressbar_free(struct pakfire_progressbar* p) {
+       pakfire_progressbar_free_widgets(p);
        pakfire_unref(p->pakfire);
        free(p);
 }
@@ -196,11 +199,8 @@ int pakfire_progressbar_start(struct pakfire_progressbar* p, unsigned long value
        // Set status
        p->status = PAKFIRE_PROGRESSBAR_RUNNING;
 
-       // Store maximum value
-       p->value_max = value;
-
-       // Redraw immediately
-       p->value_redraw = 0;
+       // Set maximum value
+       pakfire_progressbar_set_max(p, value);
 
        // Set start time
        int r = clock_gettime(CLOCK_MONOTONIC, &p->time_start);
@@ -250,6 +250,31 @@ int pakfire_progressbar_finish(struct pakfire_progressbar* p) {
        return 0;
 }
 
+int pakfire_progressbar_reset(struct pakfire_progressbar* p) {
+       // Free all widgets
+       pakfire_progressbar_free_widgets(p);
+
+       // Reset all values
+       p->value = 0;
+       p->value_max = 0;
+       p->value_redraw = 0;
+       p->update_interval = 0;
+       p->time_start.tv_sec = 0;
+       p->time_start.tv_nsec = 0;
+       p->time_redraw.tv_sec = 0;
+       p->time_redraw.tv_nsec = 0;
+
+       return 0;
+}
+
+void pakfire_progressbar_set_max(struct pakfire_progressbar* p, unsigned long value) {
+       // Store maximum value
+       p->value_max = value;
+
+       // Redraw immediately
+       p->value_redraw = 0;
+}
+
 static int pakfire_progressbar_add_widget(struct pakfire_progressbar* p,
                const char* (*print)(struct pakfire_progressbar* p,
                        struct pakfire_progressbar_widget* widget, unsigned int width, void* data),