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];
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));
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;
// 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;
}
// 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;
// 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);
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);
+}