2 * This file is a part of hildon
4 * Copyright (C) 2008, 2009 Nokia Corporation, all rights reserved.
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.
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.
18 * SECTION:hildon-edit-toolbar
19 * @short_description: Toolbar for edition of user data.
21 * The #HildonEditToolbar is a toolbar which contains a label and two
22 * buttons, one of them being an arrow pointing backwards.
24 * The label is a description of the action that the user is supposed
25 * to do. The button is to be pressed when the user completes the
26 * action. The arrow is used to go back to the previous view
27 * discarding any changes.
29 * Note that those widgets don't do anything themselves by default. To
30 * actually peform actions the developer must provide callbacks for
33 * To add a #HildonEditToolbar to a window use
34 * hildon_window_set_edit_toolbar().
36 * This toolbar is meant to replace the window title bar by emulating
37 * its appearance, so you should put the window in full screen mode
38 * with gtk_window_fullscreen().
41 * <title>HildonEditToolbar example</title>
45 * // Declare more widgets here ...
47 * window = hildon_stackable_window_new ();
48 * toolbar = hildon_edit_toolbar_new_with_text ("Choose items to delete", "Delete");
49 * // Create more widgets here ...
51 * // Add toolbar to window
52 * hildon_window_set_edit_toolbar (HILDON_WINDOW (window), HILDON_EDIT_TOOLBAR (toolbar));
54 * // Add other widgets ...
56 * g_signal_connect (toolbar, "button-clicked", G_CALLBACK (delete_button_clicked), someparameter);
57 * g_signal_connect_swapped (toolbar, "arrow-clicked", G_CALLBACK (gtk_widget_destroy), window);
59 * gtk_widget_show_all (window);
60 * gtk_window_fullscreen (GTK_WINDOW (window));
65 #include "hildon-edit-toolbar.h"
66 #include "hildon-edit-toolbar-private.h"
67 #include "hildon-private.h"
68 #include "hildon-gtk.h"
70 G_DEFINE_TYPE (HildonEditToolbar, hildon_edit_toolbar, GTK_TYPE_HBOX);
72 #define TOOLBAR_LEFT_PADDING 24
73 #define TOOLBAR_RIGHT_PADDING 8
75 #define HILDON_EDIT_TOOLBAR_ANIMATION_FRAMERATE ((float)1000/150)
76 #define HILDON_EDIT_TOOLBAR_ANIMATION_TMPL "indicator_update%d"
77 #define HILDON_EDIT_TOOLBAR_ANIMATION_NFRAMES 8
79 #define HILDON_EDIT_TOOLBAR_GET_PRIVATE(obj) \
80 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
81 HILDON_TYPE_EDIT_TOOLBAR, HildonEditToolbarPrivate));
83 typedef struct _HildonEditToolbarPrivate HildonEditToolbarPrivate;
85 struct _HildonEditToolbarPrivate
100 static guint toolbar_signals [N_SIGNALS] = { 0 };
103 hildon_edit_toolbar_style_set (GtkWidget *widget,
104 GtkStyle *previous_style)
107 HildonEditToolbarPrivate *priv = HILDON_EDIT_TOOLBAR_GET_PRIVATE (widget);
109 if (GTK_WIDGET_CLASS (hildon_edit_toolbar_parent_class)->style_set)
110 GTK_WIDGET_CLASS (hildon_edit_toolbar_parent_class)->style_set (widget, previous_style);
112 gtk_widget_style_get (widget,
113 "arrow-width", &width,
114 "arrow-height", &height,
117 gtk_widget_set_size_request (GTK_WIDGET (priv->arrow), width, height);
121 hildon_edit_toolbar_expose (GtkWidget *widget,
122 GdkEventExpose *event)
124 if (GTK_WIDGET_DRAWABLE (widget)) {
125 gtk_paint_flat_box (widget->style,
129 &event->area, widget, "edit-toolbar",
130 widget->allocation.x, widget->allocation.y,
131 widget->allocation.width, widget->allocation.height);
134 if (GTK_WIDGET_CLASS (hildon_edit_toolbar_parent_class)->expose_event)
135 return GTK_WIDGET_CLASS (hildon_edit_toolbar_parent_class)->expose_event (widget, event);
141 hildon_edit_toolbar_class_init (HildonEditToolbarClass *klass)
143 GObjectClass *gobject_class = (GObjectClass *) klass;
144 GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
146 widget_class->style_set = hildon_edit_toolbar_style_set;
147 widget_class->expose_event = hildon_edit_toolbar_expose;
149 g_type_class_add_private (klass, sizeof (HildonEditToolbarPrivate));
151 gtk_widget_class_install_style_property (
155 "Width of the arrow button",
156 "Width of the arrow button",
160 gtk_widget_class_install_style_property (
164 "Height of the arrow button",
165 "Height of the arrow button",
170 * HildonEditToolbar::button-clicked:
171 * @widget: the object which received the signal.
173 * Emitted when the toolbar button has been activated (pressed and released).
177 toolbar_signals[BUTTON_CLICKED] =
178 g_signal_new ("button_clicked",
179 G_OBJECT_CLASS_TYPE (gobject_class),
182 g_cclosure_marshal_VOID__VOID,
186 * HildonEditToolbar::arrow-clicked:
187 * @widget: the object which received the signal.
189 * Emitted when the toolbar back button (arrow) has been activated
190 * (pressed and released).
194 toolbar_signals[ARROW_CLICKED] =
195 g_signal_new ("arrow_clicked",
196 G_OBJECT_CLASS_TYPE (gobject_class),
199 g_cclosure_marshal_VOID__VOID,
204 button_clicked_cb (GtkButton *self,
205 HildonEditToolbar *toolbar)
207 g_signal_emit (toolbar, toolbar_signals[BUTTON_CLICKED], 0);
211 arrow_clicked_cb (GtkButton *self,
212 HildonEditToolbar *toolbar)
214 g_signal_emit (toolbar, toolbar_signals[ARROW_CLICKED], 0);
218 hildon_edit_toolbar_init (HildonEditToolbar *self)
220 HildonEditToolbarPrivate *priv = HILDON_EDIT_TOOLBAR_GET_PRIVATE (self);
221 GtkWidget *separator;
223 GtkBox *hbox = GTK_BOX (self);
225 priv->hbox = GTK_BOX (gtk_hbox_new (FALSE, 0));
226 align = GTK_ALIGNMENT (gtk_alignment_new (0, 0.5, 1, 1));
227 priv->label = GTK_LABEL (gtk_label_new (NULL));
228 priv->animation = hildon_private_create_animation (
229 HILDON_EDIT_TOOLBAR_ANIMATION_FRAMERATE,
230 HILDON_EDIT_TOOLBAR_ANIMATION_TMPL,
231 HILDON_EDIT_TOOLBAR_ANIMATION_NFRAMES);
232 priv->button = GTK_BUTTON (hildon_gtk_button_new (HILDON_SIZE_AUTO));
233 separator = gtk_vseparator_new ();
234 priv->arrow = GTK_BUTTON (gtk_button_new ());
236 g_object_set (priv->button, "can-focus", FALSE, NULL);
237 g_object_set (priv->arrow, "can-focus", FALSE, NULL);
239 g_signal_connect (priv->button, "clicked", G_CALLBACK (button_clicked_cb), self);
240 g_signal_connect (priv->arrow, "clicked", G_CALLBACK (arrow_clicked_cb), self);
242 gtk_box_set_spacing (hbox, 0);
243 gtk_alignment_set_padding (align, 0, 0, TOOLBAR_LEFT_PADDING, TOOLBAR_RIGHT_PADDING);
245 gtk_widget_set_name (GTK_WIDGET (self), "toolbar-edit-mode");
246 gtk_widget_set_name (GTK_WIDGET (priv->arrow), "hildon-edit-toolbar-arrow");
248 gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (priv->hbox));
249 gtk_box_pack_start (priv->hbox, GTK_WIDGET (priv->label), TRUE, TRUE, 0);
250 gtk_box_pack_start (priv->hbox, priv->animation, TRUE, TRUE, 10);
251 gtk_box_pack_start (priv->hbox, GTK_WIDGET (priv->button), FALSE, FALSE, 0);
253 gtk_widget_set_no_show_all (priv->animation, TRUE);
255 gtk_box_pack_start (hbox, GTK_WIDGET (align), TRUE, TRUE, 0);
256 gtk_box_pack_start (hbox, separator, FALSE, FALSE, 0);
257 gtk_box_pack_start (hbox, GTK_WIDGET (priv->arrow), FALSE, FALSE, 0);
259 gtk_misc_set_alignment (GTK_MISC (priv->label), 0, 0.5);
260 gtk_misc_set_alignment (GTK_MISC (priv->animation), 0, 0.5);
262 gtk_widget_show_all (GTK_WIDGET (align));
263 gtk_widget_show_all (separator);
264 gtk_widget_show_all (GTK_WIDGET (priv->arrow));
268 * hildon_edit_toolbar_set_label:
269 * @toolbar: a #HildonEditToolbar
270 * @label: a new text for the toolbar label
272 * Sets the label of @toolbar to @label. This will clear any
273 * previously set value.
278 hildon_edit_toolbar_set_label (HildonEditToolbar *toolbar,
281 HildonEditToolbarPrivate *priv;
282 g_return_if_fail (HILDON_IS_EDIT_TOOLBAR (toolbar));
283 priv = HILDON_EDIT_TOOLBAR_GET_PRIVATE (toolbar);
284 gtk_label_set_text (priv->label, label);
288 * hildon_edit_toolbar_set_button_label:
289 * @toolbar: a #HildonEditToolbar
290 * @label: a new text for the label of the toolbar button
292 * Sets the label of the toolbar button to @label. This will clear any
293 * previously set value.
298 hildon_edit_toolbar_set_button_label (HildonEditToolbar *toolbar,
301 HildonEditToolbarPrivate *priv;
302 g_return_if_fail (HILDON_IS_EDIT_TOOLBAR (toolbar));
303 priv = HILDON_EDIT_TOOLBAR_GET_PRIVATE (toolbar);
304 gtk_button_set_label (priv->button, label);
308 * hildon_edit_toolbar_new:
310 * Creates a new #HildonEditToolbar.
312 * Returns: a new #HildonEditToolbar
317 hildon_edit_toolbar_new (void)
319 return g_object_new (HILDON_TYPE_EDIT_TOOLBAR, NULL);
323 * hildon_edit_toolbar_new_with_text:
324 * @label: Text for the toolbar label.
325 * @button: Text for the toolbar button.
327 * Creates a new #HildonEditToolbar, with the toolbar label set to
328 * @label and the button label set to @button.
330 * Returns: a new #HildonEditToolbar
335 hildon_edit_toolbar_new_with_text (const gchar *label,
338 GtkWidget *toolbar = g_object_new (HILDON_TYPE_EDIT_TOOLBAR, NULL);
340 hildon_edit_toolbar_set_label (HILDON_EDIT_TOOLBAR (toolbar), label);
341 hildon_edit_toolbar_set_button_label (HILDON_EDIT_TOOLBAR (toolbar), button);
347 hildon_edit_toolbar_set_progress_indicator (HildonEditToolbar *toolbar,
350 HildonEditToolbarPrivate *priv;
351 g_return_if_fail (HILDON_IS_EDIT_TOOLBAR (toolbar));
352 priv = HILDON_EDIT_TOOLBAR_GET_PRIVATE (toolbar);
354 gtk_widget_show (priv->animation);
355 gtk_box_set_child_packing (priv->hbox, GTK_WIDGET (priv->label),
356 FALSE, FALSE, 0, GTK_PACK_START);
358 gtk_box_set_child_packing (priv->hbox, GTK_WIDGET (priv->label),
359 TRUE, TRUE, 0, GTK_PACK_START);
360 gtk_widget_hide (priv->animation);