2 * This file is a part of hildon
4 * Copyright (C) 2005, 2008 Nokia Corporation.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * SECTION:hildon-picker-dialog
23 * @short_description: A utility widget that shows a #HildonTouchSelector widget
25 * HildonPickerDialog is a utility widget that shows a #HildonTouchSelector widget in
26 * a new dialog (a #HildonDialog)
38 #include "hildon-touch-selector.h"
39 #include "hildon-picker-dialog.h"
41 #define _(String) dgettext("hildon-libs", String)
43 #define HILDON_PICKER_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HILDON_TYPE_PICKER_DIALOG, HildonPickerDialogPrivate))
45 G_DEFINE_TYPE (HildonPickerDialog, hildon_picker_dialog, HILDON_TYPE_DIALOG)
47 #define HILDON_TOUCH_SELECTOR_HEIGHT 320
49 struct _HildonPickerDialogPrivate
61 PROP_DONE_BUTTON_TEXT,
71 #define DEFAULT_DONE_BUTTON_TEXT _("wdgt_bd_done")
74 hildon_picker_dialog_set_property (GObject * object,
80 hildon_picker_dialog_get_property (GObject * object,
82 GValue * value, GParamSpec * pspec);
85 /* private functions */
86 static gboolean requires_done_button (HildonPickerDialog * dialog);
89 _select_on_selector_changed_cb (HildonTouchSelector * dialog,
90 gint column, gpointer data);
93 _hildon_picker_dialog_set_selector (HildonPickerDialog * dialog,
94 HildonTouchSelector * selector);
97 _update_title_on_selector_changed_cb (HildonTouchSelector * selector,
98 gint column, gpointer data);
101 hildon_picker_dialog_class_init (HildonPickerDialogClass * class)
103 GObjectClass *gobject_class;
104 GtkObjectClass *object_class;
105 GtkWidgetClass *widget_class;
106 GtkContainerClass *container_class;
108 gobject_class = (GObjectClass *) class;
109 object_class = (GtkObjectClass *) class;
110 widget_class = (GtkWidgetClass *) class;
111 container_class = (GtkContainerClass *) class;
114 gobject_class->set_property = hildon_picker_dialog_set_property;
115 gobject_class->get_property = hildon_picker_dialog_get_property;
119 /* HildonPickerDialog */
120 class->set_selector = _hildon_picker_dialog_set_selector;
130 g_object_class_install_property (gobject_class,
131 PROP_DONE_BUTTON_TEXT,
132 g_param_spec_string ("done-button-text",
135 DEFAULT_DONE_BUTTON_TEXT,
140 g_type_class_add_private (object_class, sizeof (HildonPickerDialogPrivate));
145 hildon_picker_dialog_init (HildonPickerDialog * dialog)
147 dialog->priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
149 dialog->priv->selector = NULL;
150 dialog->priv->button =
151 hildon_dialog_add_button (HILDON_DIALOG (dialog), "", GTK_RESPONSE_OK);
152 gtk_widget_grab_default (dialog->priv->button);
154 dialog->priv->signal_id = 0;
159 hildon_picker_dialog_set_property (GObject * object,
161 const GValue * value, GParamSpec * pspec)
164 case PROP_DONE_BUTTON_TEXT:
165 hildon_picker_dialog_set_done_label (HILDON_PICKER_DIALOG (object),
166 g_value_get_string (value));
169 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
175 hildon_picker_dialog_get_property (GObject * object,
177 GValue * value, GParamSpec * pspec)
179 HildonPickerDialog *dialog;
181 dialog = HILDON_PICKER_DIALOG (object);
184 case PROP_DONE_BUTTON_TEXT:
185 g_value_set_string (value, hildon_picker_dialog_get_done_label (dialog));
188 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
193 /* ------------------------------ PRIVATE METHODS ---------------------------- */
195 _select_on_selector_changed_cb (HildonTouchSelector * selector,
196 gint column, gpointer data)
198 HildonPickerDialog *dialog = NULL;
200 g_return_if_fail (HILDON_IS_PICKER_DIALOG (data));
202 dialog = HILDON_PICKER_DIALOG (data);
204 gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
208 _update_title_on_selector_changed_cb (HildonTouchSelector * selector,
209 gint column, gpointer data)
211 HildonPickerDialog *dialog = NULL;
212 gchar *new_title = NULL;
214 g_return_if_fail (HILDON_IS_PICKER_DIALOG (data));
216 dialog = HILDON_PICKER_DIALOG (data);
218 new_title = hildon_touch_selector_get_current_text (selector);
220 gtk_window_set_title (GTK_WINDOW (dialog), new_title);
227 hildon_picker_dialog_set_done_label (HildonPickerDialog * dialog,
230 HildonPickerDialogPrivate *priv;
232 g_return_if_fail (HILDON_IS_PICKER_DIALOG (dialog));
233 g_return_if_fail (label != NULL);
235 priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
237 gtk_button_set_label (GTK_BUTTON (priv->button), label);
241 hildon_picker_dialog_get_done_label (HildonPickerDialog * dialog)
243 HildonPickerDialogPrivate *priv;
245 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), NULL);
247 priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
249 return gtk_button_get_label (GTK_BUTTON (priv->button));
253 requires_done_button (HildonPickerDialog * dialog)
255 return hildon_touch_selector_has_multiple_selection
256 (HILDON_TOUCH_SELECTOR (dialog->priv->selector));
259 /* ------------------------------ PUBLIC METHODS ---------------------------- */
262 * hildon_picker_dialog_new:
263 * @parent: the parent window
265 * Creates a new #HildonPickerDialog
267 * Returns: a new #HildonPickerDialog
270 hildon_picker_dialog_new (GtkWindow * parent)
272 GtkDialog *dialog = NULL;
274 dialog = g_object_new (HILDON_TYPE_PICKER_DIALOG, NULL);
277 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
280 return GTK_WIDGET (dialog);
285 _hildon_picker_dialog_set_selector (HildonPickerDialog * dialog,
286 HildonTouchSelector * selector)
288 if (dialog->priv->selector != NULL) {
289 gtk_container_remove (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
290 dialog->priv->selector);
291 g_object_unref (dialog->priv->selector);
292 gtk_widget_set_size_request (GTK_WIDGET (dialog->priv->selector), -1, 320);
293 dialog->priv->selector = NULL;
296 dialog->priv->selector = GTK_WIDGET (selector);
298 if (dialog->priv->selector != NULL) {
299 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
300 dialog->priv->selector, TRUE, TRUE, 0);
302 /* NOTE: this is a little hackish, but required at this moment
303 in order to ensure a correct height visualization */
304 gtk_widget_set_size_request (GTK_WIDGET (dialog->priv->selector), -1,
305 HILDON_TOUCH_SELECTOR_HEIGHT);
307 gtk_widget_show (dialog->priv->selector);
308 g_object_ref (dialog->priv->selector);
311 if (dialog->priv->signal_id) {
312 g_signal_handler_disconnect (dialog->priv->selector,
313 dialog->priv->signal_id);
316 if (requires_done_button (dialog)) {
317 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), TRUE);
318 gtk_widget_show (GTK_DIALOG (dialog)->action_area);
319 /* update the title */
320 dialog->priv->signal_id =
321 g_signal_connect (G_OBJECT (dialog->priv->selector), "changed",
322 G_CALLBACK (_update_title_on_selector_changed_cb),
325 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
326 gtk_widget_hide (GTK_DIALOG (dialog)->action_area);
327 dialog->priv->signal_id =
328 g_signal_connect (G_OBJECT (dialog->priv->selector), "changed",
329 G_CALLBACK (_select_on_selector_changed_cb), dialog);
336 hildon_picker_dialog_set_selector (HildonPickerDialog * dialog,
337 HildonTouchSelector * selector)
339 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), FALSE);
340 g_return_val_if_fail (HILDON_IS_TOUCH_SELECTOR (selector), FALSE);
342 return HILDON_PICKER_DIALOG_GET_CLASS (dialog)->set_selector (dialog, selector);
345 HildonTouchSelector *
346 hildon_picker_dialog_get_selector (HildonPickerDialog * dialog)
348 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), NULL);
350 return HILDON_TOUCH_SELECTOR (dialog->priv->selector);