~audio-recorder/audio-recorder/trunk

« back to all changes in this revision

Viewing changes to src/gtklevelbar.c

  • Committer: Osmo Antero
  • Date: 2012-04-01 17:50:18 UTC
  • Revision ID: osmoma@gmail.com-20120401175018-8s296s7i5b6xnjwe
Version 0.8 with some clean ups.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 
4
4
// A simple level bar widget.
5
5
// By Osmo Antero.
6
 
// 
 
6
//
7
7
// Sample call:
8
8
// GtkWidget *lb = gtk_level_bar_new();
9
9
// gtk_widget_show(lb);
10
 
// 
 
10
//
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%");
13
13
 
14
 
struct _GtkLevelBarPrivate
15
 
{
16
 
  gdouble fraction;
17
 
  guint bar_height;
18
 
  gchar *text;
 
14
struct _GtkLevelBarPrivate {
 
15
    gdouble fraction;
 
16
    guint bar_height;
 
17
    gchar *text;
19
18
};
20
19
 
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);
23
 
 
24
 
static void     gtk_level_bar_real_update      (GtkLevelBar *progress);
25
 
static gboolean gtk_level_bar_draw             (GtkWidget      *widget, cairo_t        *cr);
26
 
 
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);
 
22
 
 
23
static void gtk_level_bar_real_update(GtkLevelBar *progress);
 
24
static gboolean gtk_level_bar_draw(GtkWidget *widget, cairo_t *cr);
 
25
 
 
26
static void gtk_level_bar_finalize(GObject *object);
28
27
 
29
28
G_DEFINE_TYPE(GtkLevelBar, gtk_level_bar, GTK_TYPE_WIDGET);
30
29
 
31
30
static void gtk_level_bar_class_init (GtkLevelBarClass *class) {
32
 
  GObjectClass *gobject_class;
33
 
  GtkWidgetClass *widget_class;
34
 
 
35
 
  gobject_class = G_OBJECT_CLASS (class);
36
 
  widget_class = (GtkWidgetClass *)class;
37
 
 
38
 
  gobject_class->set_property = NULL;
39
 
  gobject_class->get_property = NULL;
40
 
  gobject_class->finalize = gtk_level_bar_finalize;
41
 
 
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;
45
 
 
46
 
  g_type_class_add_private (class, sizeof (GtkLevelBarPrivate));
 
31
    GObjectClass *gobject_class;
 
32
    GtkWidgetClass *widget_class;
 
33
 
 
34
    gobject_class = G_OBJECT_CLASS (class);
 
35
    widget_class = (GtkWidgetClass *)class;
 
36
 
 
37
    gobject_class->set_property = NULL;
 
38
    gobject_class->get_property = NULL;
 
39
    gobject_class->finalize = gtk_level_bar_finalize;
 
40
 
 
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;
 
44
 
 
45
    g_type_class_add_private (class, sizeof (GtkLevelBarPrivate));
47
46
}
48
47
 
49
48
static void gtk_level_bar_init (GtkLevelBar *pbar) {
50
 
  GtkLevelBarPrivate *priv;
51
 
 
52
 
  pbar->priv = G_TYPE_INSTANCE_GET_PRIVATE(pbar, GTK_TYPE_LEVEL_BAR, GtkLevelBarPrivate);
53
 
  priv = pbar->priv;
54
 
 
55
 
  priv->fraction = 0.0;
56
 
  priv->bar_height = 8;
57
 
  priv->text = NULL;
58
 
 
59
 
  gtk_widget_set_has_window(GTK_WIDGET (pbar), FALSE);
 
49
    GtkLevelBarPrivate *priv;
 
50
 
 
51
    pbar->priv = G_TYPE_INSTANCE_GET_PRIVATE(pbar, GTK_TYPE_LEVEL_BAR, GtkLevelBarPrivate);
 
52
    priv = pbar->priv;
 
53
 
 
54
    priv->fraction = 0.0;
 
55
    priv->bar_height = 8;
 
56
    priv->text = NULL;
 
57
 
 
58
    gtk_widget_set_has_window(GTK_WIDGET (pbar), FALSE);
60
59
}
61
60
 
62
61
GtkWidget *gtk_level_bar_new(void) {
63
 
  GtkWidget *pbar;
64
 
  pbar = g_object_new(GTK_TYPE_LEVEL_BAR, NULL);
65
 
  return pbar;
 
62
    GtkWidget *pbar;
 
63
    pbar = g_object_new(GTK_TYPE_LEVEL_BAR, NULL);
 
64
    return pbar;
66
65
}
67
66
 
68
67
static void gtk_level_bar_real_update (GtkLevelBar *pbar) {
69
 
  GtkWidget *widget;
70
 
 
71
 
  g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
72
 
 
73
 
  GtkLevelBarPrivate __attribute__ ((unused)) *priv = pbar->priv;
74
 
 
75
 
  widget = GTK_WIDGET(pbar);
76
 
 
77
 
  gtk_widget_queue_draw(widget);
 
68
    GtkWidget *widget;
 
69
 
 
70
    g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
 
71
 
 
72
    GtkLevelBarPrivate __attribute__ ((unused)) *priv = pbar->priv;
 
73
 
 
74
    widget = GTK_WIDGET(pbar);
 
75
 
 
76
    gtk_widget_queue_draw(widget);
78
77
}
79
78
 
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);
84
83
}
85
84
 
86
85
static void gtk_level_bar_get_preferred_width (GtkWidget *widget,gint *minimum, gint *natural) {
94
93
}
95
94
 
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;
101
 
  int width, height;
102
 
 
103
 
  context = gtk_widget_get_style_context (widget);
104
 
 
105
 
  width = gtk_widget_get_allocated_width(widget);
106
 
  height = gtk_widget_get_allocated_height(widget);
107
 
 
108
 
  // Bar thickness
109
 
  gdouble bar_height = MIN(height , priv->bar_height);
110
 
 
111
 
  // Vertical pos
112
 
  gdouble y = (height - bar_height)/2;
113
 
 
114
 
  // Pulse width
115
 
  gdouble w = priv->fraction/(1.00/width);
116
 
 
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);
121
 
 
122
 
  // Progressbar style
123
 
   gtk_style_context_add_class(context, GTK_STYLE_CLASS_PROGRESSBAR);
124
 
 
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);
128
 
   }
129
 
 
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;
 
100
    int width, height;
 
101
 
 
102
    context = gtk_widget_get_style_context (widget);
 
103
 
 
104
    width = gtk_widget_get_allocated_width(widget);
 
105
    height = gtk_widget_get_allocated_height(widget);
 
106
 
 
107
    // Bar thickness
 
108
    gdouble bar_height = MIN(height , priv->bar_height);
 
109
 
 
110
    // Vertical pos
 
111
    gdouble y = (height - bar_height)/2;
 
112
 
 
113
    // Pulse width
 
114
    gdouble w = priv->fraction/(1.00/width);
 
115
 
 
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);
 
120
 
 
121
    // Progressbar style
 
122
    gtk_style_context_add_class(context, GTK_STYLE_CLASS_PROGRESSBAR);
 
123
 
 
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);
 
127
    }
 
128
 
 
129
    gtk_style_context_restore(context);
131
130
 
132
131
    // Set text
133
132
    if (priv->text) {
154
153
}
155
154
 
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));
161
 
  priv = pbar->priv;
162
 
 
163
 
  g_free(priv->text);
164
 
  priv->text= NULL;
165
 
 
166
 
  if (text) {
167
 
    priv->text = g_strdup(text);
168
 
  }
169
 
 
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));
 
160
    priv = pbar->priv;
 
161
 
 
162
    g_free(priv->text);
 
163
    priv->text= NULL;
 
164
 
 
165
    if (text) {
 
166
        priv->text = g_strdup(text);
 
167
    }
 
168
 
 
169
    priv->fraction = CLAMP(fraction, 0.0, 1.0);
 
170
    gtk_level_bar_real_update (pbar);
172
171
}
173
172
 
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));
178
 
  priv = pbar->priv;
 
174
    // Set bar height (thickness). Normally 8 pixels.
 
175
    GtkLevelBarPrivate* priv;
 
176
    g_return_if_fail (GTK_IS_LEVEL_BAR (pbar));
 
177
    priv = pbar->priv;
179
178
 
180
 
  priv->bar_height = height;
181
 
  gtk_level_bar_real_update (pbar);
 
179
    priv->bar_height = height;
 
180
    gtk_level_bar_real_update (pbar);
182
181
}
183
182
 
184
183
gdouble gtk_level_bar_get_fraction (GtkLevelBar *pbar) {
185
 
  // Get fraction
186
 
  g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
187
 
  return pbar->priv->fraction;
 
184
    // Get fraction
 
185
    g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
 
186
    return pbar->priv->fraction;
188
187
}
189
188
 
190
189
guint gtk_level_bar_get_bar_height(GtkLevelBar *pbar) {
191
 
  // Get bar thickness
192
 
  g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
193
 
  return pbar->priv->bar_height;
 
190
    // Get bar thickness
 
191
    g_return_val_if_fail (GTK_IS_LEVEL_BAR (pbar), 0);
 
192
    return pbar->priv->bar_height;
194
193
}
195
194
 
196
195