2008-09-24 Claudio Saavedra <csaavedra@igalia.com>
[hildon] / src / hildon-check-button.c
1 /*
2  * This file is a part of hildon
3  *
4  * Copyright (C) 2008 Nokia Corporation, all rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser Public License as published by
8  * the Free Software Foundation; version 2 of the license.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU Lesser Public License for more details.
14  *
15  */
16
17 /**
18  * SECTION:hildon-check-button
19  * @short_description: Button with a check box inside
20  *
21  * This is a standard #GtkButton which contains a check box and a
22  * label. Functions are provided to get and set the value of the check
23  * box. Note that this button does NOT support an image, so don't use
24  * gtk_button_set_image()
25  *
26  * <example>
27  * <title>Using a Hildon check button</title>
28  * <programlisting>
29  * void
30  * button_clicked (GtkButton *button, gpointer user_data)
31  * {
32  *     gboolean active;
33  * <!-- -->
34  *     active = hildon_check_button_get_active (button);
35  *     if (active)
36  *        g_debug ("Button is active");
37  *     else
38  *        g_debug ("Button is not active");
39  * }
40  * <!-- -->
41  * GtkWidget *
42  * create_button (void)
43  * {
44  *     GtkWidget *button;
45  * <!-- -->
46  *     button = hildon_check_button_new (HILDON_SIZE_AUTO);
47  *     gtk_button_set_label (GTK_BUTTON (button), "Click me");
48  * <!-- -->
49  *     g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), NULL);
50  * <!-- -->
51  *     return button;
52  * }
53  * </programlisting>
54  * </example>
55
56  */
57
58 #include                                        "hildon-check-button.h"
59
60 static void
61 check_button_clicked                            (GtkButton             *button,
62                                                  GtkCellRendererToggle *renderer)
63 {
64     gboolean current = gtk_cell_renderer_toggle_get_active (renderer);
65     gtk_cell_renderer_toggle_set_active (renderer, !current);
66 }
67
68 /**
69  * hildon_check_button_set_active:
70  * @button: A #GtkButton created with hildon_check_button_new()
71  * @is_active: new state for the check box
72  *
73  * Sets the state of the check box.
74  **/
75 void
76 hildon_check_button_set_active                  (GtkButton *button,
77                                                  gboolean   is_active)
78 {
79     GtkCellRendererToggle *toggle_renderer;
80     gboolean prev_is_active;
81
82     g_return_if_fail (GTK_IS_BUTTON (button));
83     toggle_renderer = GTK_CELL_RENDERER_TOGGLE (g_object_get_data (G_OBJECT (button), "toggle-renderer"));
84     g_return_if_fail (GTK_IS_CELL_RENDERER_TOGGLE (toggle_renderer));
85
86     prev_is_active = gtk_cell_renderer_toggle_get_active (toggle_renderer);
87
88     if (prev_is_active != is_active) {
89       gtk_cell_renderer_toggle_set_active (toggle_renderer, is_active);
90       gtk_widget_queue_draw (GTK_WIDGET (button));
91     }
92 }
93
94 /**
95  * hildon_check_button_get_active:
96  * @button: A #GtkButton created with hildon_check_button_new()
97  *
98  * Gets the state of the check box.
99  *
100  * Return value: %TRUE if the check box is active, %FALSE otherwise.
101  **/
102 gboolean
103 hildon_check_button_get_active                  (GtkButton *button)
104 {
105     GtkCellRendererToggle *toggle_renderer;
106
107     g_return_val_if_fail (GTK_IS_BUTTON (button), FALSE);
108     toggle_renderer = GTK_CELL_RENDERER_TOGGLE (g_object_get_data (G_OBJECT (button), "toggle-renderer"));
109     g_return_val_if_fail (GTK_IS_CELL_RENDERER_TOGGLE (toggle_renderer), FALSE);
110
111     return gtk_cell_renderer_toggle_get_active (toggle_renderer);
112 }
113
114 /**
115  * hildon_check_button_new:
116  * @size: Flags indicating the size of the new button
117  *
118  * This function creates a #GtkButton containing a label and a check
119  * box.
120  *
121  * Return value: A newly created #GtkButton widget with a check box.
122  **/
123 GtkWidget *
124 hildon_check_button_new                         (HildonSizeType size)
125 {
126     GtkWidget *button = gtk_button_new ();
127     GtkWidget *cell_view = gtk_cell_view_new ();
128     GtkCellRenderer *toggle_renderer = gtk_cell_renderer_toggle_new ();
129
130     /* Set the size of the button */
131     hildon_gtk_widget_set_theme_size (button, size);
132
133     /* Toggle the check box when the button is clicked */
134     g_signal_connect (button, "clicked", G_CALLBACK (check_button_clicked), toggle_renderer);
135
136     /* Make sure that the check box is always shown, no matter the value of gtk-button-images */
137     g_signal_connect (cell_view, "notify::visible", G_CALLBACK (gtk_widget_show), NULL);
138
139     /* Store the renderer for later use */
140     g_object_set_data (G_OBJECT (button), "toggle-renderer", toggle_renderer);
141
142     /* Pack everything */
143     gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cell_view), toggle_renderer, FALSE);
144     gtk_button_set_image (GTK_BUTTON (button), cell_view);
145
146     return button;
147 }