2
* This file is part of hildon-home
4
* Copyright (C) 2008, 2009, 2010 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 License
8
* as published by the Free Software Foundation; either version 2.1 of
9
* the License, or (at your option) any later version.
11
* This library is distributed in the hope that it will be useful, but
12
* 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 Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
27
#include <glib/gi18n.h>
30
#include <hildon/hildon-file-chooser-dialog.h>
31
#include <hildon/hildon-file-selection.h>
34
#include "hd-available-backgrounds.h"
35
#include "hd-backgrounds.h"
37
#include "hd-change-background-dialog.h"
38
#include "hd-dbus-utils.h"
40
/* Add Image dialog */
41
#define RESPONSE_ADD 1
44
#define USER_IMAGES_FOLDER "MyDocs", ".images"
46
#define HD_CHANGE_BACKGROUND_DIALOG_GET_PRIVATE(object) \
47
(G_TYPE_INSTANCE_GET_PRIVATE ((object), HD_TYPE_CHANGE_BACKGROUND_DIALOG, HDChangeBackgroundDialogPrivate))
55
struct _HDChangeBackgroundDialogPrivate
57
HDAvailableBackgrounds *backgrounds;
61
GtkTreePath *custom_image;
64
GFile *current_background;
66
guint scroll_to_selected_id;
68
GCancellable *cancellable;
71
G_DEFINE_TYPE (HDChangeBackgroundDialog, hd_change_background_dialog, GTK_TYPE_DIALOG);
74
scroll_to_selected (gpointer data)
76
HDChangeBackgroundDialogPrivate *priv = HD_CHANGE_BACKGROUND_DIALOG (data)->priv;
79
priv->scroll_to_selected_id = 0;
81
if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (priv->selector),
85
hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (priv->selector),
95
backgrounds_selection_changed (HDAvailableBackgrounds *backgrounds,
97
HDChangeBackgroundDialog *dialog)
99
HDChangeBackgroundDialogPrivate *priv = dialog->priv;
101
hildon_touch_selector_select_iter (HILDON_TOUCH_SELECTOR (priv->selector),
106
priv->scroll_to_selected_id = gdk_threads_add_idle (scroll_to_selected,
111
_hd_background_selector_changed (HildonTouchSelector* widget,
113
HDChangeBackgroundDialog *dialog)
115
GtkTreeModel *model = NULL;
117
gboolean is_ovi = FALSE;
119
model = hildon_touch_selector_get_model (widget, column);
121
!hildon_touch_selector_get_selected (widget, column, &iter))
123
g_debug ("%s: Couldn't get selected item", __FUNCTION__);
126
gtk_tree_model_get (model,
128
HD_BACKGROUND_COL_OVI, &is_ovi,
132
hd_utils_open_link (HD_OVI_LINK_BACKGROUNDS);
137
hd_change_background_dialog_constructed (GObject *object)
139
HDChangeBackgroundDialog *dialog = HD_CHANGE_BACKGROUND_DIALOG (object);
140
HDChangeBackgroundDialogPrivate *priv = dialog->priv;
142
if (G_OBJECT_CLASS (hd_change_background_dialog_parent_class)->constructed)
143
G_OBJECT_CLASS (hd_change_background_dialog_parent_class)->constructed (object);
145
hd_available_backgrounds_run (priv->backgrounds,
148
g_signal_connect (priv->backgrounds, "selection-changed",
149
G_CALLBACK (backgrounds_selection_changed),
152
g_signal_connect (priv->selector, "changed",
153
G_CALLBACK (_hd_background_selector_changed),
158
hd_change_background_dialog_dispose (GObject *object)
160
HDChangeBackgroundDialogPrivate *priv = HD_CHANGE_BACKGROUND_DIALOG (object)->priv;
162
if (priv->backgrounds)
163
priv->backgrounds = (g_object_unref (priv->backgrounds), NULL);
165
if (priv->scroll_to_selected_id)
166
priv->scroll_to_selected_id = (g_source_remove (priv->scroll_to_selected_id), 0);
168
if (priv->cancellable)
169
priv->cancellable = (g_object_unref (priv->cancellable), NULL);
171
G_OBJECT_CLASS (hd_change_background_dialog_parent_class)->dispose (object);
175
hd_change_background_dialog_finalize (GObject *object)
177
HDChangeBackgroundDialogPrivate *priv = HD_CHANGE_BACKGROUND_DIALOG (object)->priv;
179
if (priv->custom_image)
180
priv->custom_image = (gtk_tree_path_free (priv->custom_image), NULL);
182
G_OBJECT_CLASS (hd_change_background_dialog_parent_class)->finalize (object);
186
hd_change_background_dialog_set_property (GObject *object,
191
HDChangeBackgroundDialogPrivate *priv = HD_CHANGE_BACKGROUND_DIALOG (object)->priv;
195
case PROP_CURRENT_VIEW:
196
priv->current_view = g_value_get_uint (value);
200
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
204
#ifdef HAVE_HILDON_FM
206
add_image_dialog_response (GtkDialog *dialog,
208
HDChangeBackgroundDialog *cb_dialog)
210
HDChangeBackgroundDialogPrivate *priv = HD_CHANGE_BACKGROUND_DIALOG (cb_dialog)->priv;
212
if (response_id == GTK_RESPONSE_OK)
214
/* An image was selected */
217
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
223
image_file = g_file_new_for_uri (uri);
225
hd_available_backgrounds_set_user_selected (priv->backgrounds,
232
gtk_widget_destroy (GTK_WIDGET (dialog));
237
background_set_cb (gpointer data)
239
if (GTK_IS_WIDGET (data))
240
gtk_widget_destroy (GTK_WIDGET (data));
246
hd_change_background_dialog_response (GtkDialog *dialog,
249
HDChangeBackgroundDialogPrivate *priv = HD_CHANGE_BACKGROUND_DIALOG (dialog)->priv;
251
if (response_id == RESPONSE_ADD)
253
#ifdef HAVE_HILDON_FM
254
GtkWidget *add_image;
255
GtkFileFilter *filter;
256
gchar *images_folder;
258
/* Create the Add Image dialog */
259
add_image = hildon_file_chooser_dialog_new_with_properties (GTK_WINDOW (dialog),
260
"action", GTK_FILE_CHOOSER_ACTION_OPEN,
261
"title", dgettext (GETTEXT_PACKAGE, "home_ti_add_image"),
262
"empty-text", dgettext (GETTEXT_PACKAGE, "home_li_no_images"),
263
"open-button-text", dgettext ("hildon-libs", "wdgt_bd_done"),
264
"select-multiple", FALSE,
265
"selection-mode", HILDON_FILE_SELECTION_MODE_THUMBNAILS,
269
/* Filter for shown mime-types: JPG, GIF, PNG, BMP, TIFF, sketch.png */
270
filter = gtk_file_filter_new ();
271
gtk_file_filter_add_mime_type (filter, "image/jpeg");
272
gtk_file_filter_add_mime_type (filter, "image/gif");
273
gtk_file_filter_add_mime_type (filter, "image/png");
274
gtk_file_filter_add_mime_type (filter, "image/bmp");
275
gtk_file_filter_add_mime_type (filter, "image/tiff");
276
gtk_file_filter_add_mime_type (filter, "sketch/png");
277
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (add_image),
280
/* Current folder by default: Images folder */
281
images_folder = g_build_filename (g_get_home_dir (),
284
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (add_image),
286
g_free (images_folder);
288
/* Connect signal handler */
289
g_signal_connect (add_image, "response",
290
G_CALLBACK (add_image_dialog_response),
293
/* Show Add Image dialog */
294
gtk_dialog_run (GTK_DIALOG (add_image));
297
else if (response_id == GTK_RESPONSE_ACCEPT)
301
if (hildon_touch_selector_get_selected (HILDON_TOUCH_SELECTOR (priv->selector),
306
HDBackground *background;
309
model = hd_available_backgrounds_get_model (priv->backgrounds);
311
gtk_tree_model_get (model, &iter,
312
HD_BACKGROUND_COL_OVI, &is_ovi,
316
/* We shouldn't really get here, but just in case. */
317
gtk_widget_destroy (GTK_WIDGET (dialog));
321
/* Get selected background image */
322
gtk_tree_model_get (model, &iter,
323
HD_BACKGROUND_COL_OBJECT, &background,
326
hildon_gtk_window_set_progress_indicator (GTK_WINDOW (dialog),
328
gtk_widget_set_sensitive (GTK_WIDGET (dialog), FALSE);
330
hd_background_set_for_current_view (background,
334
hd_backgrounds_add_done_cb (hd_backgrounds_get (),
341
gtk_widget_destroy (GTK_WIDGET (dialog));
346
if (priv->cancellable)
347
g_cancellable_cancel (priv->cancellable);
349
gtk_widget_destroy (GTK_WIDGET (dialog));
354
hd_change_background_dialog_class_init (HDChangeBackgroundDialogClass *klass)
356
GObjectClass *object_class = G_OBJECT_CLASS (klass);
357
GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass);
359
object_class->constructed = hd_change_background_dialog_constructed;
360
object_class->dispose = hd_change_background_dialog_dispose;
361
object_class->finalize = hd_change_background_dialog_finalize;
363
object_class->set_property = hd_change_background_dialog_set_property;
365
dialog_class->response = hd_change_background_dialog_response;
367
g_object_class_install_property (object_class,
369
g_param_spec_uint ("current-view",
371
"ID of the currently shown view",
375
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
377
g_type_class_add_private (klass, sizeof (HDChangeBackgroundDialogPrivate));
381
hd_change_background_dialog_init (HDChangeBackgroundDialog *dialog)
383
HDChangeBackgroundDialogPrivate *priv = HD_CHANGE_BACKGROUND_DIALOG_GET_PRIVATE (dialog);
384
HildonTouchSelectorColumn *column;
385
GtkCellRenderer *renderer;
389
priv->backgrounds = hd_available_backgrounds_new ();
390
priv->cancellable = g_cancellable_new ();
392
/* Set dialog title */
393
gtk_window_set_title (GTK_WINDOW (dialog), dgettext ("maemo-af-desktop", "home_ti_change_backgr"));
396
gtk_dialog_add_button (GTK_DIALOG (dialog), dgettext ("hildon-libs", "wdgt_bd_add"), RESPONSE_ADD);
397
gtk_dialog_add_button (GTK_DIALOG (dialog), dgettext ("hildon-libs", "wdgt_bd_done"), GTK_RESPONSE_ACCEPT);
399
/* Create the touch selector */
400
priv->selector = hildon_touch_selector_new ();
402
/* Create empty column */
403
column = hildon_touch_selector_append_column (HILDON_TOUCH_SELECTOR (priv->selector),
404
hd_available_backgrounds_get_model (priv->backgrounds),
407
/* Add the thumbnail renderer */
408
renderer = gtk_cell_renderer_pixbuf_new ();
409
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column),
412
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (column),
414
"pixbuf", HD_BACKGROUND_COL_THUMBNAIL);
416
/* Add the label renderer */
417
renderer = gtk_cell_renderer_text_new ();
418
g_object_set (renderer, "xpad", HILDON_MARGIN_DOUBLE, NULL);
419
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (column),
422
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (column),
424
"text", HD_BACKGROUND_COL_LABEL);
426
g_object_set (column,
427
"text-column", HD_BACKGROUND_COL_LABEL,
430
gtk_widget_show (priv->selector);
431
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), priv->selector);
433
gtk_widget_set_size_request (GTK_WIDGET (dialog), -1, 358);
437
hd_change_background_dialog_new (guint current_view)
441
window = g_object_new (HD_TYPE_CHANGE_BACKGROUND_DIALOG,
442
"current-view", current_view,