8
8
// GtkWidget *lb = gtk_level_bar_new();
9
9
// gtk_widget_show(lb);
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%");
11
// Set value [0.0, 1.0].
12
// gtk_level_bar_set_fraction(GTK_LEVEL_BAR(lb), 0.8);
13
// gtk_level_bar_set_scale(GTK_LEVEL_BAR(lb), SCALE_PRECENT);
14
15
struct _GtkLevelBarPrivate {
18
enum SCALE_TYPE scale_type;
20
21
static void gtk_level_bar_get_preferred_width(GtkWidget *widget, gint *minimum, gint *natural);
133
128
gtk_style_context_restore(context);
130
cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
131
cairo_set_font_size(cr, height*0.3);
134
gtk_style_context_get_border_color(context, GTK_STATE_NORMAL, &color);
135
gdk_cairo_set_source_rgba(cr, &color);
138
// Calculate total width of scale
139
cairo_text_extents_t extents;
140
cairo_text_extents(cr, "0.0", &extents);
141
gint total_w = 9 * (extents.x_advance + extents.width);
144
// g_print("Bar width=%d total_w=%d bearing=%3.1f advance=%3.1f char.width=%3.1f\n", width, total_w, extents.x_bearing, extents.x_advance, extents.width);
146
// Draw all or only each second value?
147
gboolean draw_all = (total_w - extents.width) < width;
150
if (priv->scale_type == SCALE_VALUE) {
151
// Draw scale: 0.1 0.2 0.3 0.4...0.9
153
for (i=0; i < 10; i++) {
156
if (draw_all || (i % 2 == 0))
157
s = g_strdup_printf("%2.1f", (gdouble)i/10.0);
161
cairo_text_extents_t extents;
162
cairo_text_extents(cr, s, &extents);
164
gdouble xx = (width/10) * i;
165
gdouble yy = height/2-(extents.height/2 + extents.y_bearing);
167
cairo_move_to(cr, xx, yy);
168
cairo_show_text(cr, s);
173
} else if (priv->scale_type == SCALE_PERCENT) {
174
// Draw scale: 10% . 20% . 30% . 40% . 50%...90%
176
for (i=0; i < 10; i++) {
179
s = g_strdup_printf("%2.0f%%", (gdouble)i*10.0);
181
s = g_strdup_printf("%3s", ".");
183
cairo_text_extents_t extents;
184
cairo_text_extents(cr, s, &extents);
186
gdouble xx = (width/10) * i;
187
gdouble yy = height/2-(extents.height/2 + extents.y_bearing);
189
cairo_move_to(cr, xx, yy);
190
cairo_show_text(cr, s);
136
198
if (priv->text) {
137
199
cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
152
214
cairo_move_to(cr, xx, yy);
153
215
cairo_show_text(cr, priv->text);
159
void gtk_level_bar_set_fraction(GtkLevelBar *pbar, gdouble fraction, const gchar *text) {
160
// Set fraction [0.0, 1.0] and optional text.
161
// Text is disabled/hidden if it's NULL.
222
void gtk_level_bar_set_fraction(GtkLevelBar *pbar, gdouble fraction) {
223
// Set fraction [0.0, 1.0]
162
224
GtkLevelBarPrivate* priv;
163
225
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
164
226
priv = pbar->priv;
170
priv->text = g_strdup(text);
173
228
priv->fraction = CLAMP(fraction, 0.0, 1.0);
174
229
gtk_level_bar_real_update (pbar);
232
gdouble gtk_level_bar_get_fraction(GtkLevelBar *pbar) {
234
g_return_val_if_fail(GTK_IS_LEVEL_BAR (pbar), 0);
235
return pbar->priv->fraction;
177
238
void gtk_level_bar_set_bar_height(GtkLevelBar *pbar, guint height) {
178
239
// Set bar height (thickness). Normally 8 pixels.
179
GtkLevelBarPrivate* priv;
180
g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
240
g_return_if_fail(GTK_IS_LEVEL_BAR (pbar));
241
GtkLevelBarPrivate* priv = pbar->priv;
183
242
priv->bar_height = height;
184
gtk_level_bar_real_update (pbar);
187
gdouble gtk_level_bar_get_fraction (GtkLevelBar *pbar) {
189
g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
190
return pbar->priv->fraction;
244
gtk_level_bar_real_update(pbar);
193
247
guint gtk_level_bar_get_bar_height(GtkLevelBar *pbar) {
194
248
// Get bar thickness
195
g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
249
g_return_val_if_fail(GTK_IS_LEVEL_BAR(pbar), 0);
196
250
return pbar->priv->bar_height;
253
void gtk_level_bar_set_scale(GtkLevelBar *pbar, enum SCALE_TYPE scale_type) {
255
g_return_if_fail(GTK_IS_LEVEL_BAR(pbar));
256
GtkLevelBarPrivate* priv = pbar->priv;
257
priv->scale_type = scale_type;
259
gtk_level_bar_real_update(pbar);
262
enum SCALE_TYPE gtk_level_bar_get_scale(GtkLevelBar *pbar) {
264
g_return_val_if_fail(GTK_IS_LEVEL_BAR(pbar), SCALE_NONE);
265
GtkLevelBarPrivate* priv = pbar->priv;
266
return priv->scale_type;