4
4
// A simple level bar widget.
8
8
// GtkWidget *lb = gtk_level_bar_new();
9
9
// gtk_widget_show(lb);
11
11
// Set value [0.0, 1.0] and optional text. Text is disabled if NULL.
12
// gtk_level_bar_set_fraction(GTK_LEVEL_BAR(lb), 0.8, "80%");
12
// gtk_level_bar_set_fraction(GTK_LEVEL_BAR(lb), 0.8, "80%");
14
struct _GtkLevelBarPrivate
14
struct _GtkLevelBarPrivate {
21
static void gtk_level_bar_get_preferred_width(GtkWidget *widget, gint *minimum, gint *natural);
22
static void gtk_level_bar_get_preferred_height (GtkWidget *widget,gint *minimum,gint *natural);
24
static void gtk_level_bar_real_update (GtkLevelBar *progress);
25
static gboolean gtk_level_bar_draw (GtkWidget *widget, cairo_t *cr);
27
static void gtk_level_bar_finalize (GObject *object);
20
static void gtk_level_bar_get_preferred_width(GtkWidget *widget, gint *minimum, gint *natural);
21
static void gtk_level_bar_get_preferred_height (GtkWidget *widget,gint *minimum, gint *natural);
23
static void gtk_level_bar_real_update(GtkLevelBar *progress);
24
static gboolean gtk_level_bar_draw(GtkWidget *widget, cairo_t *cr);
26
static void gtk_level_bar_finalize(GObject *object);
29
28
G_DEFINE_TYPE(GtkLevelBar, gtk_level_bar, GTK_TYPE_WIDGET);
31
30
static void gtk_level_bar_class_init (GtkLevelBarClass *class) {
32
GObjectClass *gobject_class;
33
GtkWidgetClass *widget_class;
35
gobject_class = G_OBJECT_CLASS (class);
36
widget_class = (GtkWidgetClass *)class;
38
gobject_class->set_property = NULL;
39
gobject_class->get_property = NULL;
40
gobject_class->finalize = gtk_level_bar_finalize;
42
widget_class->draw = gtk_level_bar_draw;
43
widget_class->get_preferred_width = gtk_level_bar_get_preferred_width;
44
widget_class->get_preferred_height = gtk_level_bar_get_preferred_height;
46
g_type_class_add_private (class, sizeof (GtkLevelBarPrivate));
31
GObjectClass *gobject_class;
32
GtkWidgetClass *widget_class;
34
gobject_class = G_OBJECT_CLASS (class);
35
widget_class = (GtkWidgetClass *)class;
37
gobject_class->set_property = NULL;
38
gobject_class->get_property = NULL;
39
gobject_class->finalize = gtk_level_bar_finalize;
41
widget_class->draw = gtk_level_bar_draw;
42
widget_class->get_preferred_width = gtk_level_bar_get_preferred_width;
43
widget_class->get_preferred_height = gtk_level_bar_get_preferred_height;
45
g_type_class_add_private (class, sizeof (GtkLevelBarPrivate));
49
48
static void gtk_level_bar_init (GtkLevelBar *pbar) {
50
GtkLevelBarPrivate *priv;
52
pbar->priv = G_TYPE_INSTANCE_GET_PRIVATE(pbar, GTK_TYPE_LEVEL_BAR, GtkLevelBarPrivate);
59
gtk_widget_set_has_window(GTK_WIDGET (pbar), FALSE);
49
GtkLevelBarPrivate *priv;
51
pbar->priv = G_TYPE_INSTANCE_GET_PRIVATE(pbar, GTK_TYPE_LEVEL_BAR, GtkLevelBarPrivate);
58
gtk_widget_set_has_window(GTK_WIDGET (pbar), FALSE);
62
61
GtkWidget *gtk_level_bar_new(void) {
64
pbar = g_object_new(GTK_TYPE_LEVEL_BAR, NULL);
63
pbar = g_object_new(GTK_TYPE_LEVEL_BAR, NULL);
68
67
static void gtk_level_bar_real_update (GtkLevelBar *pbar) {
71
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
73
GtkLevelBarPrivate __attribute__ ((unused)) *priv = pbar->priv;
75
widget = GTK_WIDGET(pbar);
77
gtk_widget_queue_draw(widget);
70
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
72
GtkLevelBarPrivate __attribute__ ((unused)) *priv = pbar->priv;
74
widget = GTK_WIDGET(pbar);
76
gtk_widget_queue_draw(widget);
80
79
static void gtk_level_bar_finalize (GObject *object) {
81
GtkLevelBar *pbar = GTK_LEVEL_BAR (object);
82
GtkLevelBarPrivate __attribute__ ((unused)) *priv = pbar->priv;
83
G_OBJECT_CLASS(gtk_level_bar_parent_class)->finalize (object);
80
GtkLevelBar *pbar = GTK_LEVEL_BAR (object);
81
GtkLevelBarPrivate __attribute__ ((unused)) *priv = pbar->priv;
82
G_OBJECT_CLASS(gtk_level_bar_parent_class)->finalize (object);
86
85
static void gtk_level_bar_get_preferred_width (GtkWidget *widget,gint *minimum, gint *natural) {
96
95
static gboolean gtk_level_bar_draw(GtkWidget *widget, cairo_t *cr) {
97
// Draw level bar and optional text
98
GtkLevelBar *pbar = GTK_LEVEL_BAR (widget);
99
GtkLevelBarPrivate *priv = pbar->priv;
100
GtkStyleContext *context;
103
context = gtk_widget_get_style_context (widget);
105
width = gtk_widget_get_allocated_width(widget);
106
height = gtk_widget_get_allocated_height(widget);
109
gdouble bar_height = MIN(height , priv->bar_height);
112
gdouble y = (height - bar_height)/2;
115
gdouble w = priv->fraction/(1.00/width);
117
gtk_style_context_save(context);
118
// gtk_style_context_add_class(context, GTK_STYLE_CLASS_TROUGH);
119
gtk_render_background(context, cr, 0, 0, width, height);
120
gtk_render_frame(context, cr, 0, 0, width, height);
123
gtk_style_context_add_class(context, GTK_STYLE_CLASS_PROGRESSBAR);
125
if (priv->fraction > 0.001) {
126
// Render activity bar with current theme and colors
127
gtk_render_activity(context, cr, 0, y, w, bar_height);
130
gtk_style_context_restore(context);
96
// Draw level bar and optional text
97
GtkLevelBar *pbar = GTK_LEVEL_BAR (widget);
98
GtkLevelBarPrivate *priv = pbar->priv;
99
GtkStyleContext *context;
102
context = gtk_widget_get_style_context (widget);
104
width = gtk_widget_get_allocated_width(widget);
105
height = gtk_widget_get_allocated_height(widget);
108
gdouble bar_height = MIN(height , priv->bar_height);
111
gdouble y = (height - bar_height)/2;
114
gdouble w = priv->fraction/(1.00/width);
116
gtk_style_context_save(context);
117
// gtk_style_context_add_class(context, GTK_STYLE_CLASS_TROUGH);
118
gtk_render_background(context, cr, 0, 0, width, height);
119
gtk_render_frame(context, cr, 0, 0, width, height);
122
gtk_style_context_add_class(context, GTK_STYLE_CLASS_PROGRESSBAR);
124
if (priv->fraction > 0.001) {
125
// Render activity bar with current theme and colors
126
gtk_render_activity(context, cr, 0, y, w, bar_height);
129
gtk_style_context_restore(context);
133
132
if (priv->text) {
156
155
void gtk_level_bar_set_fraction(GtkLevelBar *pbar, gdouble fraction, const gchar *text) {
157
// Set fraction [0.0, 1.0] and optional text.
158
// Text is disabled/hidden if it's NULL.
159
GtkLevelBarPrivate* priv;
160
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
167
priv->text = g_strdup(text);
170
priv->fraction = CLAMP(fraction, 0.0, 1.0);
171
gtk_level_bar_real_update (pbar);
156
// Set fraction [0.0, 1.0] and optional text.
157
// Text is disabled/hidden if it's NULL.
158
GtkLevelBarPrivate* priv;
159
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
166
priv->text = g_strdup(text);
169
priv->fraction = CLAMP(fraction, 0.0, 1.0);
170
gtk_level_bar_real_update (pbar);
174
173
void gtk_level_bar_set_bar_height(GtkLevelBar *pbar, guint height) {
175
// Set bar height (thickness). Normally 8 pixels.
176
GtkLevelBarPrivate* priv;
177
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
174
// Set bar height (thickness). Normally 8 pixels.
175
GtkLevelBarPrivate* priv;
176
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
180
priv->bar_height = height;
181
gtk_level_bar_real_update (pbar);
179
priv->bar_height = height;
180
gtk_level_bar_real_update (pbar);
184
183
gdouble gtk_level_bar_get_fraction (GtkLevelBar *pbar) {
186
g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
187
return pbar->priv->fraction;
185
g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
186
return pbar->priv->fraction;
190
189
guint gtk_level_bar_get_bar_height(GtkLevelBar *pbar) {
192
g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
193
return pbar->priv->bar_height;
191
g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
192
return pbar->priv->bar_height;