2 * This file is a part of hildon
4 * Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
6 * Contact: Rodrigo Novo <rodrigo.novo@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * SECTION:hildon-vvolumebar
27 * @short_description: A widget that displays a vertical volume bar.
28 * @see_also: #HildonVolumebar, #HildonHVolumebar
30 * #HildonVVolumebar is a subclass of #HildonVolumebar. It displays a
31 * vertical volume bar that allows increasing or decreasing volume
32 * within a predefined range, and muting when users click the mute icon.
36 * #HildonVVolumebar has been deprecated since Hildon 2.2 and should not
37 * be used in newly written code. See
38 * <link linkend="hildon-migrating-volume-bar">Migrating Volume Bars</link>
39 * section to know how to migrate this deprecated widget.
43 * Here is an example that creates a vertical volume bar and connects
47 * <title>HildonVVolumebar example</title>
49 * GtkWidget *volbar = hildon_vvolumebar_new ();
50 * g_signal_connect (G_OBJECT (volbar), "mute_toggled", G_CALLBACK (mute_toggle), NULL);
51 * g_signal_connect (G_OBJECT (volbar), "level_changed", G_CALLBACK (level_change), NULL);
56 #undef HILDON_DISABLE_DEPRECATED
62 #include "hildon-vvolumebar.h"
63 #include "hildon-volumebar-range.h"
64 #include "hildon-volumebar-private.h"
67 #define DEFAULT_BAR_WIDTH 60
69 #define MINIMUM_BAR_HEIGHT 165
73 #define DEFAULT_VERTICAL_TBUTTON_WIDTH 60
75 #define DEFAULT_VERTICAL_TBUTTON_HEIGHT 60
77 #define DEFAULT_ENDING_SIZE 0
79 /* Gap to leave for mute button */
81 #define HORIZONTAL_MUTE_GAP 0
83 #define VERTICAL_MUTE_GAP 0
85 static HildonVolumebarClass* parent_class;
88 hildon_vvolumebar_class_init (HildonVVolumebarClass * klass);
91 hildon_vvolumebar_init (HildonVVolumebar * vvolumebar);
94 hildon_vvolumebar_expose (GtkWidget * widget,
95 GdkEventExpose * event);
98 hildon_vvolumebar_size_request (GtkWidget * widget,
99 GtkRequisition * requisition);
102 hildon_vvolumebar_size_allocate (GtkWidget * widget,
103 GtkAllocation * allocation);
106 * hildon_vvolumebar_get_type:
108 * Initializes and returns the type of a hildon vvolumebar.
110 * Returns: GType of #HildonVVolumebar
113 hildon_vvolumebar_get_type (void)
115 static GType type = 0;
118 static const GTypeInfo info = {
119 sizeof (HildonVVolumebarClass),
120 NULL, /* base_init */
121 NULL, /* base_finalize */
122 (GClassInitFunc) hildon_vvolumebar_class_init, /* class_init */
123 NULL, /* class_finalize */
124 NULL, /* class_data */
125 sizeof (HildonVVolumebar),
127 (GInstanceInitFunc) hildon_vvolumebar_init,
130 g_type_register_static (HILDON_TYPE_VOLUMEBAR,
131 "HildonVVolumebar", &info, 0);
137 hildon_vvolumebar_class_init (HildonVVolumebarClass *klass)
139 GtkWidgetClass *volumebar_class = GTK_WIDGET_CLASS(klass);
141 parent_class = g_type_class_peek_parent(klass);
143 volumebar_class->size_request = hildon_vvolumebar_size_request;
144 volumebar_class->size_allocate = hildon_vvolumebar_size_allocate;
145 volumebar_class->expose_event = hildon_vvolumebar_expose;
149 hildon_vvolumebar_init (HildonVVolumebar *vvolumebar)
151 HildonVolumebarPrivate *priv;
153 priv = HILDON_VOLUMEBAR_GET_PRIVATE (vvolumebar);
156 priv->volumebar = HILDON_VOLUMEBAR_RANGE (hildon_volumebar_range_new
157 (GTK_ORIENTATION_VERTICAL));
159 gtk_widget_set_parent (GTK_WIDGET (priv->tbutton), GTK_WIDGET (vvolumebar));
160 gtk_widget_set_parent (GTK_WIDGET (priv->volumebar), GTK_WIDGET (vvolumebar));
162 gtk_scale_set_draw_value (GTK_SCALE (priv->volumebar), FALSE);
165 g_signal_connect_swapped(G_OBJECT(priv->volumebar), "value-changed",
166 G_CALLBACK(hildon_volumebar_level_change),
169 g_signal_connect_swapped(priv->tbutton, "toggled",
170 G_CALLBACK(hildon_volumebar_mute_toggled), vvolumebar);
172 /* FIXME Not sure why this is here */
173 gtk_widget_show (GTK_WIDGET (priv->volumebar));
177 * hildon_vvolumebar_new:
179 * Creates a new #HildonVVolumebar widget.
181 * Returns: a new #HildonVVolumebar
184 hildon_vvolumebar_new (void)
186 return GTK_WIDGET (g_object_new(HILDON_TYPE_VVOLUMEBAR, NULL));
190 hildon_vvolumebar_expose (GtkWidget *widget,
191 GdkEventExpose *event)
194 HildonVolumebarPrivate *priv;
196 priv = HILDON_VOLUMEBAR_GET_PRIVATE(HILDON_VOLUMEBAR(widget));
199 if (GTK_WIDGET_DRAWABLE (widget)) {
200 /* Paint background */
201 gtk_paint_box (widget->style, widget->window,
202 GTK_WIDGET_STATE (priv->volumebar), GTK_SHADOW_OUT,
203 NULL, widget, "background",
204 widget->allocation.x,
205 widget->allocation.y,
206 widget->allocation.width,
207 widget->allocation.height);
209 /* The contents of the widget can paint themselves */
210 (*GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
217 hildon_vvolumebar_size_request (GtkWidget *widget,
218 GtkRequisition *requisition)
220 requisition->height = MINIMUM_BAR_HEIGHT;
221 requisition->width = DEFAULT_BAR_WIDTH;
225 hildon_vvolumebar_size_allocate (GtkWidget *widget,
226 GtkAllocation *allocation)
228 HildonVolumebarPrivate *priv;
230 GtkAllocation range_allocation, button_allocation;
232 priv = HILDON_VOLUMEBAR_GET_PRIVATE(widget);
235 /* Center the widget horizontally */
236 if (allocation->width > DEFAULT_BAR_WIDTH) {
238 (allocation->width - DEFAULT_BAR_WIDTH) / 2;
239 allocation->width = DEFAULT_BAR_WIDTH;
242 GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);
244 if (priv->volumebar && GTK_WIDGET_VISIBLE (priv->volumebar)) {
245 /* Allocate space for the slider */
246 range_allocation.x = allocation->x;
247 range_allocation.y = allocation->y + DEFAULT_ENDING_SIZE;
249 range_allocation.width = DEFAULT_BAR_WIDTH;
251 if (priv->tbutton && GTK_WIDGET_VISIBLE (priv->tbutton))
253 /* Leave room for the mute button */
254 range_allocation.height = MAX (0,
256 - 2 * DEFAULT_ENDING_SIZE
257 - DEFAULT_VERTICAL_TBUTTON_HEIGHT
258 - VERTICAL_MUTE_GAP);
263 range_allocation.height = MAX (0,
265 - 2 * DEFAULT_ENDING_SIZE);
268 gtk_widget_size_allocate (GTK_WIDGET (priv->volumebar),
272 if (priv->tbutton && GTK_WIDGET_VISIBLE (priv->tbutton)) {
273 /* Allocate space for the mute button */
274 button_allocation.x = allocation->x + HORIZONTAL_MUTE_GAP;
275 button_allocation.y = allocation->y + allocation->height -
276 DEFAULT_VERTICAL_TBUTTON_HEIGHT -
277 VERTICAL_MUTE_GAP - 2 * DEFAULT_ENDING_SIZE;
278 button_allocation.width = DEFAULT_VERTICAL_TBUTTON_WIDTH;
279 button_allocation.height = DEFAULT_VERTICAL_TBUTTON_HEIGHT;
280 gtk_widget_size_allocate (GTK_WIDGET (priv->tbutton),