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 (see #GtkDialog for more information about this issue)
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, GTK_TYPE_DIALOG)
47 struct _HildonPickerDialogPrivate
53 GtkWidget *title_label;
62 PROP_DONE_BUTTON_TEXT,
72 #define DEFAULT_DONE_BUTTON_TEXT "Done"
75 hildon_picker_dialog_set_property (GObject * object,
81 hildon_picker_dialog_get_property (GObject * object,
83 GValue * value, GParamSpec * pspec);
85 static void hildon_picker_dialog_realize (GtkWidget * widget);
87 /* private functions */
88 static gboolean requires_done_button (HildonPickerDialog * dialog);
91 _select_on_selector_changed_cb (HildonTouchSelector * dialog,
92 gint column, gpointer data);
95 _hildon_picker_dialog_set_selector (HildonPickerDialog * dialog,
96 HildonTouchSelector * selector);
99 _update_title_on_selector_changed_cb (HildonTouchSelector * selector,
100 gint column, gpointer data);
103 hildon_picker_dialog_class_init (HildonPickerDialogClass * class)
105 GObjectClass *gobject_class;
106 GtkObjectClass *object_class;
107 GtkWidgetClass *widget_class;
108 GtkContainerClass *container_class;
110 gobject_class = (GObjectClass *) class;
111 object_class = (GtkObjectClass *) class;
112 widget_class = (GtkWidgetClass *) class;
113 container_class = (GtkContainerClass *) class;
116 gobject_class->set_property = hildon_picker_dialog_set_property;
117 gobject_class->get_property = hildon_picker_dialog_get_property;
120 widget_class->realize = hildon_picker_dialog_realize;
122 /* HildonPickerDialog */
123 class->set_selector = _hildon_picker_dialog_set_selector;
133 g_object_class_install_property (gobject_class,
134 PROP_DONE_BUTTON_TEXT,
135 g_param_spec_string ("done-button-text",
138 DEFAULT_DONE_BUTTON_TEXT,
143 g_type_class_add_private (object_class, sizeof (HildonPickerDialogPrivate));
148 hildon_picker_dialog_init (HildonPickerDialog * dialog)
150 GtkWidget *separator = NULL;
152 dialog->priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
154 dialog->priv->selector = NULL;
155 dialog->priv->button =
156 gtk_dialog_add_button (GTK_DIALOG (dialog), "", GTK_RESPONSE_OK);
157 gtk_widget_grab_default (dialog->priv->button);
159 dialog->priv->title_label = gtk_label_new ("default value");
160 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
161 dialog->priv->title_label, FALSE, FALSE, 0);
162 separator = gtk_hseparator_new ();
163 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
164 separator, FALSE, FALSE, 0);
166 dialog->priv->signal_id = 0;
168 /* gtk_widget_show (dialog->priv->title_label); */
169 /* gtk_widget_show (separator); */
174 hildon_picker_dialog_set_property (GObject * object,
176 const GValue * value, GParamSpec * pspec)
179 case PROP_DONE_BUTTON_TEXT:
180 hildon_picker_dialog_set_done_label (HILDON_PICKER_DIALOG (object),
181 g_value_get_string (value));
184 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
190 hildon_picker_dialog_get_property (GObject * object,
192 GValue * value, GParamSpec * pspec)
194 HildonPickerDialog *dialog;
196 dialog = HILDON_PICKER_DIALOG (object);
199 case PROP_DONE_BUTTON_TEXT:
200 g_value_set_string (value, hildon_picker_dialog_get_done_label (dialog));
203 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
210 hildon_picker_dialog_realize (GtkWidget * widget)
212 GTK_WIDGET_CLASS (hildon_picker_dialog_parent_class)->realize (widget);
214 /* gdk_window_set_decorations (widget->window, GDK_DECOR_BORDER); */
217 /* ------------------------------ PRIVATE METHODS ---------------------------- */
219 _select_on_selector_changed_cb (HildonTouchSelector * selector,
220 gint column, gpointer data)
222 HildonPickerDialog *dialog = NULL;
224 g_return_if_fail (HILDON_IS_PICKER_DIALOG (data));
226 dialog = HILDON_PICKER_DIALOG (data);
228 gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
232 _update_title_on_selector_changed_cb (HildonTouchSelector * selector,
233 gint column, gpointer data)
235 HildonPickerDialog *dialog = NULL;
236 gchar *new_title = NULL;
238 g_return_if_fail (HILDON_IS_PICKER_DIALOG (data));
240 dialog = HILDON_PICKER_DIALOG (data);
242 new_title = hildon_touch_selector_get_current_text (selector);
244 if (dialog->priv->title_label != NULL) {
245 /* gtk_label_set_text (GTK_LABEL(selector->priv->title_label), new_title); */
247 gtk_window_set_title (GTK_WINDOW (dialog), new_title);
254 hildon_picker_dialog_set_done_label (HildonPickerDialog * dialog,
257 HildonPickerDialogPrivate *priv;
259 g_return_if_fail (HILDON_IS_PICKER_DIALOG (dialog));
260 g_return_if_fail (label != NULL);
262 priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
264 gtk_button_set_label (GTK_BUTTON (priv->button), label);
268 hildon_picker_dialog_get_done_label (HildonPickerDialog * dialog)
270 HildonPickerDialogPrivate *priv;
272 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), NULL);
274 priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
276 return gtk_button_get_label (GTK_BUTTON (priv->button));
280 requires_done_button (HildonPickerDialog * dialog)
282 return hildon_touch_selector_has_multiple_selection
283 (HILDON_TOUCH_SELECTOR (dialog->priv->selector));
286 /* ------------------------------ PUBLIC METHODS ---------------------------- */
289 * hildon_picker_dialog_new:
290 * @parent: the parent window
292 * Creates a new #HildonPickerDialog
294 * Returns: a new #HildonPickerDialog
297 hildon_picker_dialog_new (GtkWindow * parent)
299 GtkDialog *dialog = NULL;
301 dialog = g_object_new (HILDON_TYPE_PICKER_DIALOG, NULL);
304 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
307 return GTK_WIDGET (dialog);
312 _hildon_picker_dialog_set_selector (HildonPickerDialog * dialog,
313 HildonTouchSelector * selector)
315 if (dialog->priv->selector != NULL) {
316 gtk_container_remove (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
317 dialog->priv->selector);
318 g_object_unref (dialog->priv->selector);
319 dialog->priv->selector = NULL;
322 dialog->priv->selector = GTK_WIDGET (selector);
324 if (dialog->priv->selector != NULL) {
325 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
326 dialog->priv->selector, TRUE, TRUE, 0);
327 gtk_widget_show (dialog->priv->selector);
328 g_object_ref (dialog->priv->selector);
331 if (dialog->priv->signal_id) {
332 g_signal_handler_disconnect (dialog->priv->selector,
333 dialog->priv->signal_id);
336 if (requires_done_button (dialog)) {
337 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), TRUE);
338 gtk_widget_show (GTK_DIALOG (dialog)->action_area);
339 /* update the title */
340 dialog->priv->signal_id =
341 g_signal_connect (G_OBJECT (dialog->priv->selector), "changed",
342 G_CALLBACK (_update_title_on_selector_changed_cb),
345 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
346 gtk_widget_hide (GTK_DIALOG (dialog)->action_area);
347 dialog->priv->signal_id =
348 g_signal_connect (G_OBJECT (dialog->priv->selector), "changed",
349 G_CALLBACK (_select_on_selector_changed_cb), dialog);
356 hildon_picker_dialog_set_selector (HildonPickerDialog * dialog,
357 HildonTouchSelector * selector)
359 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), FALSE);
360 g_return_val_if_fail (HILDON_IS_TOUCH_SELECTOR (selector), FALSE);
362 return HILDON_PICKER_DIALOG_GET_CLASS (dialog)->set_selector (dialog, selector);
365 HildonTouchSelector *
366 hildon_picker_dialog_get_selector (HildonPickerDialog * dialog)
368 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), NULL);
370 return HILDON_TOUCH_SELECTOR (dialog->priv->selector);