libui/zOLD_unix/progressbar.c

75 lines
1.6 KiB
C
Raw Normal View History

2015-06-11 18:07:06 -05:00
// 11 june 2015
#include "uipriv_unix.h"
2018-07-01 16:35:34 -05:00
// LONGTERM:
// - in GTK+ 3.22 at least, running both a GtkProgressBar and a GtkCellRendererProgress in pulse mode with our code will cause the former to slow down and eventually stop, and I can't tell why at all
2015-08-27 22:00:34 -05:00
struct uiProgressBar {
uiUnixControl c;
2015-06-11 18:07:06 -05:00
GtkWidget *widget;
2015-06-27 18:46:11 -05:00
GtkProgressBar *pbar;
2016-06-16 16:43:04 -05:00
gboolean indeterminate;
guint pulser;
2015-06-11 18:07:06 -05:00
};
uiUnixControlAllDefaultsExceptDestroy(uiProgressBar)
static void uiProgressBarDestroy(uiControl *c)
{
uiProgressBar *p = uiProgressBar(c);
// be sure to stop the timeout now
if (p->indeterminate)
g_source_remove(p->pulser);
g_object_unref(p->widget);
uiFreeControl(uiControl(p));
}
2015-06-11 18:07:06 -05:00
2016-06-15 11:51:12 -05:00
int uiProgressBarValue(uiProgressBar *p)
{
if (p->indeterminate)
return -1;
2016-06-15 11:51:12 -05:00
return (int) (gtk_progress_bar_get_fraction(p->pbar) * 100);
}
2016-06-16 16:43:04 -05:00
static gboolean pulse(void* data)
2015-06-11 18:07:06 -05:00
{
2016-06-16 16:43:04 -05:00
uiProgressBar *p = uiProgressBar(data);
gtk_progress_bar_pulse(p->pbar);
2016-06-16 16:43:04 -05:00
return TRUE;
}
void uiProgressBarSetValue(uiProgressBar *p, int value)
{
if (value == -1) {
if (!p->indeterminate) {
2016-06-16 16:43:04 -05:00
p->indeterminate = TRUE;
// TODO verify the timeout
p->pulser = g_timeout_add(100, pulse, p);
}
return;
}
2016-06-16 16:43:04 -05:00
if (p->indeterminate) {
p->indeterminate = FALSE;
g_source_remove(p->pulser);
}
if (value < 0 || value > 100)
uiprivUserBug("Value %d is out of range for a uiProgressBar.", value);
gtk_progress_bar_set_fraction(p->pbar, ((gdouble) value) / 100);
}
2015-06-11 18:07:06 -05:00
uiProgressBar *uiNewProgressBar(void)
{
2015-08-27 22:00:34 -05:00
uiProgressBar *p;
2015-06-11 18:07:06 -05:00
uiUnixNewControl(uiProgressBar, p);
2015-06-11 18:07:06 -05:00
2015-06-27 18:46:11 -05:00
p->widget = gtk_progress_bar_new();
p->pbar = GTK_PROGRESS_BAR(p->widget);
2015-06-11 18:07:06 -05:00
2015-08-27 22:00:34 -05:00
return p;
2015-06-11 18:07:06 -05:00
}