diff options
author | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-10-23 12:13:51 -0400 |
---|---|---|
committer | Jasper St. Pierre <jstpierre@mecheye.net> | 2013-12-08 22:43:18 -0500 |
commit | ba8301f92fd2b6f3601b34c49236918d33e35e3a (patch) | |
tree | 4a5b962b2f549f34c73050d32b65fdadba09172d | |
parent | 10622bb8249f1a256a14b6371fd8ffeb8b730690 (diff) | |
download | gnome-control-center-wip/um-avatar-picker.tar.gz |
user-accounts: Replace um-photo-dialog with new um-avatar-pickerwip/um-avatar-picker
-rw-r--r-- | panels/user-accounts/Makefile.am | 2 | ||||
-rw-r--r-- | panels/user-accounts/um-photo-dialog.c | 716 | ||||
-rw-r--r-- | panels/user-accounts/um-photo-dialog.h | 39 | ||||
-rw-r--r-- | panels/user-accounts/um-user-panel.c | 39 |
4 files changed, 28 insertions, 768 deletions
diff --git a/panels/user-accounts/Makefile.am b/panels/user-accounts/Makefile.am index f2e815789..d37093142 100644 --- a/panels/user-accounts/Makefile.am +++ b/panels/user-accounts/Makefile.am @@ -42,8 +42,6 @@ libuser_accounts_la_SOURCES = \ um-password-dialog.c \ pw-utils.h \ pw-utils.c \ - um-photo-dialog.h \ - um-photo-dialog.c \ um-crop-area.h \ um-crop-area.c \ um-fingerprint-dialog.h \ diff --git a/panels/user-accounts/um-photo-dialog.c b/panels/user-accounts/um-photo-dialog.c deleted file mode 100644 index 81f990ac6..000000000 --- a/panels/user-accounts/um-photo-dialog.c +++ /dev/null @@ -1,716 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright 2009-2010 Red Hat, Inc, - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Written by: Matthias Clasen <mclasen@redhat.com> - */ - -#include "config.h" - -#include <stdlib.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <gtk/gtk.h> -#include <act/act.h> -#define GNOME_DESKTOP_USE_UNSTABLE_API -#include <libgnome-desktop/gnome-desktop-thumbnail.h> - -#ifdef HAVE_CHEESE -#include <cheese-avatar-chooser.h> -#include <cheese-camera-device.h> -#include <cheese-camera-device-monitor.h> -#endif /* HAVE_CHEESE */ - -#include "um-photo-dialog.h" -#include "um-crop-area.h" -#include "um-utils.h" - -#define ROW_SPAN 6 - -struct _UmPhotoDialog { - GtkWidget *photo_popup; - GtkWidget *popup_button; - GtkWidget *crop_area; - -#ifdef HAVE_CHEESE - CheeseCameraDeviceMonitor *monitor; - GtkWidget *take_photo_menuitem; - guint num_cameras; -#endif /* HAVE_CHEESE */ - - GnomeDesktopThumbnailFactory *thumb_factory; - - ActUser *user; -}; - -static void -crop_dialog_response (GtkWidget *dialog, - gint response_id, - UmPhotoDialog *um) -{ - GdkPixbuf *pb, *pb2; - - if (response_id != GTK_RESPONSE_ACCEPT) { - um->crop_area = NULL; - gtk_widget_destroy (dialog); - return; - } - - pb = um_crop_area_get_picture (UM_CROP_AREA (um->crop_area)); - pb2 = gdk_pixbuf_scale_simple (pb, 96, 96, GDK_INTERP_BILINEAR); - - set_user_icon_data (um->user, pb2); - - g_object_unref (pb2); - g_object_unref (pb); - - um->crop_area = NULL; - gtk_widget_destroy (dialog); -} - -static void -um_photo_dialog_crop (UmPhotoDialog *um, - GdkPixbuf *pixbuf) -{ - GtkWidget *dialog; - GtkWidget *frame; - - dialog = gtk_dialog_new_with_buttons ("", - GTK_WINDOW (gtk_widget_get_toplevel (um->popup_button)), - 0, - _("_Cancel"), - GTK_RESPONSE_REJECT, - _("Select"), - GTK_RESPONSE_ACCEPT, - NULL); - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - gtk_window_set_icon_name (GTK_WINDOW (dialog), "system-users"); - - g_signal_connect (G_OBJECT (dialog), "response", - G_CALLBACK (crop_dialog_response), um); - - /* Content */ - um->crop_area = um_crop_area_new (); - um_crop_area_set_min_size (UM_CROP_AREA (um->crop_area), 48, 48); - um_crop_area_set_constrain_aspect (UM_CROP_AREA (um->crop_area), TRUE); - um_crop_area_set_picture (UM_CROP_AREA (um->crop_area), pixbuf); - frame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (frame), um->crop_area); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN); - - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), - frame, - TRUE, TRUE, 8); - - gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 300); - - gtk_widget_show_all (dialog); -} - -static void -file_chooser_response (GtkDialog *chooser, - gint response, - UmPhotoDialog *um) -{ - gchar *filename; - GError *error; - GdkPixbuf *pixbuf; - - if (response != GTK_RESPONSE_ACCEPT) { - gtk_widget_destroy (GTK_WIDGET (chooser)); - return; - } - - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (chooser)); - - error = NULL; - pixbuf = gdk_pixbuf_new_from_file (filename, &error); - if (pixbuf == NULL) { - g_warning ("Failed to load %s: %s", filename, error->message); - g_error_free (error); - } - g_free (filename); - - gtk_widget_destroy (GTK_WIDGET (chooser)); - - um_photo_dialog_crop (um, pixbuf); - g_object_unref (pixbuf); -} - -static void -update_preview (GtkFileChooser *chooser, - GnomeDesktopThumbnailFactory *thumb_factory) -{ - gchar *uri; - - uri = gtk_file_chooser_get_preview_uri (chooser); - - if (uri) { - GdkPixbuf *pixbuf = NULL; - const gchar *mime_type = NULL; - GFile *file; - GFileInfo *file_info; - GtkWidget *preview; - - preview = gtk_file_chooser_get_preview_widget (chooser); - - file = g_file_new_for_uri (uri); - file_info = g_file_query_info (file, - G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, - G_FILE_QUERY_INFO_NONE, - NULL, NULL); - g_object_unref (file); - - if (file_info != NULL) { - mime_type = g_file_info_get_content_type (file_info); - g_object_unref (file_info); - } - - if (mime_type) { - pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumb_factory, - uri, - mime_type); - } - - gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser), - GTK_RESPONSE_ACCEPT, - (pixbuf != NULL)); - - if (pixbuf != NULL) { - gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf); - g_object_unref (pixbuf); - } - else { - gtk_image_set_from_icon_name (GTK_IMAGE (preview), - "dialog-question", - GTK_ICON_SIZE_DIALOG); - } - - g_free (uri); - } - - gtk_file_chooser_set_preview_widget_active (chooser, TRUE); -} - -static void -um_photo_dialog_select_file (UmPhotoDialog *um) -{ - GtkWidget *chooser; - const gchar *folder; - GtkWidget *preview; - - chooser = gtk_file_chooser_dialog_new (_("Browse for more pictures"), - GTK_WINDOW (gtk_widget_get_toplevel (um->popup_button)), - GTK_FILE_CHOOSER_ACTION_OPEN, - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_Open"), GTK_RESPONSE_ACCEPT, - NULL); - - gtk_window_set_modal (GTK_WINDOW (chooser), TRUE); - - preview = gtk_image_new (); - gtk_widget_set_size_request (preview, 128, -1); - gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (chooser), preview); - gtk_file_chooser_set_use_preview_label (GTK_FILE_CHOOSER (chooser), FALSE); - gtk_widget_show (preview); - g_signal_connect (chooser, "update-preview", - G_CALLBACK (update_preview), um->thumb_factory); - - folder = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES); - if (folder) - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), - folder); - - g_signal_connect (chooser, "response", - G_CALLBACK (file_chooser_response), um); - - gtk_window_present (GTK_WINDOW (chooser)); -} - -static void -none_icon_selected (GtkMenuItem *menuitem, - UmPhotoDialog *um) -{ - act_user_set_icon_file (um->user, ""); -} - -static void -file_icon_selected (GtkMenuItem *menuitem, - UmPhotoDialog *um) -{ - um_photo_dialog_select_file (um); -} - -#ifdef HAVE_CHEESE -static gboolean -destroy_chooser (GtkWidget *chooser) -{ - gtk_widget_destroy (chooser); - return FALSE; -} - -static void -webcam_response_cb (GtkDialog *dialog, - int response, - UmPhotoDialog *um) -{ - if (response == GTK_RESPONSE_ACCEPT) { - GdkPixbuf *pb, *pb2; - - g_object_get (G_OBJECT (dialog), "pixbuf", &pb, NULL); - pb2 = gdk_pixbuf_scale_simple (pb, 96, 96, GDK_INTERP_BILINEAR); - - set_user_icon_data (um->user, pb2); - - g_object_unref (pb2); - g_object_unref (pb); - } - if (response != GTK_RESPONSE_DELETE_EVENT && - response != GTK_RESPONSE_NONE) - g_idle_add ((GSourceFunc) destroy_chooser, dialog); -} - -static void -webcam_icon_selected (GtkMenuItem *menuitem, - UmPhotoDialog *um) -{ - GtkWidget *window; - - window = cheese_avatar_chooser_new (); - gtk_window_set_transient_for (GTK_WINDOW (window), - GTK_WINDOW (gtk_widget_get_toplevel (um->popup_button))); - gtk_window_set_modal (GTK_WINDOW (window), TRUE); - g_signal_connect (G_OBJECT (window), "response", - G_CALLBACK (webcam_response_cb), um); - gtk_widget_show (window); -} - -static void -update_photo_menu_status (UmPhotoDialog *um) -{ - if (um->num_cameras == 0) - gtk_widget_set_sensitive (um->take_photo_menuitem, FALSE); - else - gtk_widget_set_sensitive (um->take_photo_menuitem, TRUE); -} - -static void -device_added (CheeseCameraDeviceMonitor *monitor, - CheeseCameraDevice *device, - UmPhotoDialog *um) -{ - um->num_cameras++; - update_photo_menu_status (um); -} - -static void -device_removed (CheeseCameraDeviceMonitor *monitor, - const char *id, - UmPhotoDialog *um) -{ - um->num_cameras--; - update_photo_menu_status (um); -} - -#endif /* HAVE_CHEESE */ - -static void -stock_icon_selected (GtkMenuItem *menuitem, - UmPhotoDialog *um) -{ - const char *filename; - - filename = g_object_get_data (G_OBJECT (menuitem), "filename"); - act_user_set_icon_file (um->user, filename); -} - -static GtkWidget * -menu_item_for_filename (UmPhotoDialog *um, - const char *filename) -{ - GtkWidget *image, *menuitem; - GFile *file; - GIcon *icon; - - file = g_file_new_for_path (filename); - icon = g_file_icon_new (file); - g_object_unref (file); - image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_DIALOG); - g_object_unref (icon); - - menuitem = gtk_menu_item_new (); - gtk_container_add (GTK_CONTAINER (menuitem), image); - gtk_widget_show_all (menuitem); - - g_object_set_data_full (G_OBJECT (menuitem), "filename", - g_strdup (filename), (GDestroyNotify) g_free); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (stock_icon_selected), um); - - return menuitem; -} - -static void -setup_photo_popup (UmPhotoDialog *um) -{ - GtkWidget *menu, *menuitem, *image; - guint x, y; - const gchar * const * dirs; - guint i; - GDir *dir; - const char *face; - gboolean none_item_shown; - gboolean added_faces; - - menu = gtk_menu_new (); - - x = 0; - y = 0; - none_item_shown = added_faces = FALSE; - - dirs = g_get_system_data_dirs (); - for (i = 0; dirs[i] != NULL; i++) { - char *path; - - path = g_build_filename (dirs[i], "pixmaps", "faces", NULL); - dir = g_dir_open (path, 0, NULL); - if (dir == NULL) { - g_free (path); - continue; - } - - while ((face = g_dir_read_name (dir)) != NULL) { - char *filename; - - added_faces = TRUE; - - filename = g_build_filename (path, face, NULL); - menuitem = menu_item_for_filename (um, filename); - g_free (filename); - if (menuitem == NULL) - continue; - - gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (menuitem), - x, x + 1, y, y + 1); - gtk_widget_show (menuitem); - - x++; - if (x >= ROW_SPAN - 1) { - y++; - x = 0; - } - } - g_dir_close (dir); - g_free (path); - - if (added_faces) - break; - } - - if (!added_faces) - goto skip_faces; - - image = gtk_image_new_from_icon_name ("avatar-default", GTK_ICON_SIZE_DIALOG); - menuitem = gtk_menu_item_new (); - gtk_container_add (GTK_CONTAINER (menuitem), image); - gtk_widget_show_all (menuitem); - gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (menuitem), - x, x + 1, y, y + 1); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (none_icon_selected), um); - gtk_widget_show (menuitem); - none_item_shown = TRUE; - y++; - -skip_faces: - if (!none_item_shown) { - menuitem = gtk_menu_item_new_with_label (_("Disable image")); - gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (menuitem), - 0, ROW_SPAN - 1, y, y + 1); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (none_icon_selected), um); - gtk_widget_show (menuitem); - y++; - } - - /* Separator */ - menuitem = gtk_separator_menu_item_new (); - gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (menuitem), - 0, ROW_SPAN - 1, y, y + 1); - gtk_widget_show (menuitem); - - y++; - -#ifdef HAVE_CHEESE - um->take_photo_menuitem = gtk_menu_item_new_with_label (_("Take a photo…")); - gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (um->take_photo_menuitem), - 0, ROW_SPAN - 1, y, y + 1); - g_signal_connect (G_OBJECT (um->take_photo_menuitem), "activate", - G_CALLBACK (webcam_icon_selected), um); - gtk_widget_set_sensitive (um->take_photo_menuitem, FALSE); - gtk_widget_show (um->take_photo_menuitem); - - um->monitor = cheese_camera_device_monitor_new (); - g_signal_connect (G_OBJECT (um->monitor), "added", - G_CALLBACK (device_added), um); - g_signal_connect (G_OBJECT (um->monitor), "removed", - G_CALLBACK (device_removed), um); - cheese_camera_device_monitor_coldplug (um->monitor); - - y++; -#endif /* HAVE_CHEESE */ - - menuitem = gtk_menu_item_new_with_label (_("Browse for more pictures…")); - gtk_menu_attach (GTK_MENU (menu), GTK_WIDGET (menuitem), - 0, ROW_SPAN - 1, y, y + 1); - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (file_icon_selected), um); - gtk_widget_show (menuitem); - - um->photo_popup = menu; -} - -static void -popup_icon_menu (GtkToggleButton *button, UmPhotoDialog *um) -{ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) && !gtk_widget_get_visible (um->photo_popup)) { - gtk_menu_popup (GTK_MENU (um->photo_popup), - NULL, NULL, - (GtkMenuPositionFunc) popup_menu_below_button, um->popup_button, - 0, gtk_get_current_event_time ()); - } else { - gtk_menu_popdown (GTK_MENU (um->photo_popup)); - } -} - -static gboolean -on_popup_button_button_pressed (GtkToggleButton *button, - GdkEventButton *event, - UmPhotoDialog *um) -{ - if (event->button == 1) { - if (!gtk_widget_get_visible (um->photo_popup)) { - popup_icon_menu (button, um); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE); - } else { - gtk_menu_popdown (GTK_MENU (um->photo_popup)); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE); - } - - return TRUE; - } - - return FALSE; -} - -static void -on_photo_popup_unmap (GtkWidget *popup_menu, - UmPhotoDialog *um) -{ - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (um->popup_button), FALSE); -} - -static void -popup_button_draw (GtkWidget *widget, - cairo_t *cr, - UmPhotoDialog *um) -{ - if (gtk_widget_get_state (gtk_bin_get_child (GTK_BIN (widget))) != GTK_STATE_PRELIGHT && - !gtk_widget_is_focus (widget)) { - return; - } - - down_arrow (gtk_widget_get_style_context (widget), - cr, - gtk_widget_get_allocated_width (widget) - 12, - gtk_widget_get_allocated_height (widget) - 12, - 12, 12); -} - -static void -popup_button_focus_changed (GObject *button, - GParamSpec *pspec, - UmPhotoDialog *um) -{ - gtk_widget_queue_draw (gtk_bin_get_child (GTK_BIN (button))); -} - -UmPhotoDialog * -um_photo_dialog_new (GtkWidget *button) -{ - UmPhotoDialog *um; - - um = g_new0 (UmPhotoDialog, 1); - - um->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL); - - /* Set up the popup */ - um->popup_button = button; - setup_photo_popup (um); - g_signal_connect (button, "toggled", - G_CALLBACK (popup_icon_menu), um); - g_signal_connect (button, "button-press-event", - G_CALLBACK (on_popup_button_button_pressed), um); - g_signal_connect (button, "notify::is-focus", - G_CALLBACK (popup_button_focus_changed), um); - g_signal_connect_after (button, "draw", - G_CALLBACK (popup_button_draw), um); - - g_signal_connect (um->photo_popup, "unmap", - G_CALLBACK (on_photo_popup_unmap), um); - - return um; -} - -void -um_photo_dialog_free (UmPhotoDialog *um) -{ - gtk_widget_destroy (um->photo_popup); - - if (um->thumb_factory) - g_object_unref (um->thumb_factory); -#ifdef HAVE_CHEESE - if (um->monitor) - g_object_unref (um->monitor); -#endif - if (um->user) - g_object_unref (um->user); - - g_free (um); -} - -static void -clear_tip (GtkMenuItem *item, - gpointer user_data) -{ - GList *children; - GtkWidget *image; - GIcon *icon, *icon2; - const char *filename; - - /* Not a stock icon? */ - filename = g_object_get_data (G_OBJECT (item), "filename"); - if (filename == NULL) - return; - - children = gtk_container_get_children (GTK_CONTAINER (item)); - image = children->data; - g_assert (image != NULL); - g_list_free (children); - - gtk_image_get_gicon (GTK_IMAGE (image), &icon, NULL); - - if (G_IS_EMBLEMED_ICON (icon)) - icon2 = g_emblemed_icon_get_icon (G_EMBLEMED_ICON (icon)); - else - return; - - gtk_image_set_from_gicon (GTK_IMAGE (image), icon2, GTK_ICON_SIZE_DIALOG); - g_object_unref (icon); -} - -static void -set_tip (GtkWidget *item, - const char *tip, - GEmblem *emblem) -{ - GList *children; - GtkWidget *image; - GIcon *icon, *icon2; - - children = gtk_container_get_children (GTK_CONTAINER (item)); - image = children->data; - g_assert (image != NULL); - g_list_free (children); - - gtk_image_get_gicon (GTK_IMAGE (image), &icon, NULL); - if (G_IS_EMBLEMED_ICON (icon)) { - return; - } - - icon2 = g_emblemed_icon_new (icon, emblem); - gtk_image_set_from_gicon (GTK_IMAGE (image), icon2, GTK_ICON_SIZE_DIALOG); - - gtk_widget_set_tooltip_text (GTK_WIDGET (item), tip); -} - -void -um_photo_dialog_set_user (UmPhotoDialog *um, - ActUser *user) -{ - ActUserManager *manager; - GSList *list, *l; - ActUser *u; - GIcon *icon; - GEmblem *emblem; - GList *children, *c; - - g_return_if_fail (um != NULL); - - if (um->user) { - g_object_unref (um->user); - um->user = NULL; - } - um->user = user; - - if (um->user) { - g_object_ref (um->user); - - children = gtk_container_get_children (GTK_CONTAINER (um->photo_popup)); - g_list_foreach (children, (GFunc) clear_tip, NULL); - - manager = act_user_manager_get_default (); - list = act_user_manager_list_users (manager); - - icon = g_themed_icon_new ("avatar-default"); - emblem = g_emblem_new (icon); - g_object_unref (icon); - - for (l = list; l; l = l->next) { - const char *filename; - - u = l->data; - if (u == user) - continue; - filename = act_user_get_icon_file (u); - if (filename == NULL) - continue; - for (c = children; c; c = c->next) { - const char *f; - - f = g_object_get_data (G_OBJECT (c->data), "filename"); - if (f == NULL) - continue; - if (strcmp (f, filename) == 0) { - char *tip; - - tip = g_strdup_printf (_("Used by %s"), - act_user_get_real_name (u)); - set_tip (GTK_WIDGET (c->data), tip, emblem); - g_free (tip); - break; - } - } - } - g_slist_free (list); - - g_object_unref (emblem); - } -} - diff --git a/panels/user-accounts/um-photo-dialog.h b/panels/user-accounts/um-photo-dialog.h deleted file mode 100644 index fd1a3f222..000000000 --- a/panels/user-accounts/um-photo-dialog.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright 2009-2010 Red Hat, Inc, - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Written by: Matthias Clasen <mclasen@redhat.com> - */ - -#ifndef __UM_PHOTO_DIALOG_H__ -#define __UM_PHOTO_DIALOG_H__ - -#include <gtk/gtk.h> -#include <act/act.h> - -G_BEGIN_DECLS - -typedef struct _UmPhotoDialog UmPhotoDialog; - -UmPhotoDialog *um_photo_dialog_new (GtkWidget *button); -void um_photo_dialog_free (UmPhotoDialog *dialog); -void um_photo_dialog_set_user (UmPhotoDialog *dialog, - ActUser *user); - -G_END_DECLS - -#endif diff --git a/panels/user-accounts/um-user-panel.c b/panels/user-accounts/um-user-panel.c index 516d96d20..9b5b06b07 100644 --- a/panels/user-accounts/um-user-panel.c +++ b/panels/user-accounts/um-user-panel.c @@ -46,7 +46,7 @@ #include "um-account-dialog.h" #include "cc-language-chooser.h" #include "um-password-dialog.h" -#include "um-photo-dialog.h" +#include "um-avatar-picker.h" #include "um-fingerprint-dialog.h" #include "um-utils.h" #include "um-resources.h" @@ -70,7 +70,6 @@ struct _CcUserPanelPrivate { GtkWidget *language_chooser; UmPasswordDialog *password_dialog; - UmPhotoDialog *photo_dialog; UmHistoryDialog *history_dialog; gint other_accounts; @@ -676,8 +675,6 @@ show_user (ActUser *user, CcUserPanelPrivate *d) gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf); g_object_unref (pixbuf); - um_photo_dialog_set_user (d->photo_dialog, user); - widget = get_widget (d, "full-name-entry"); cc_editable_entry_set_text (CC_EDITABLE_ENTRY (widget), act_user_get_real_name (user)); gtk_widget_set_tooltip_text (widget, act_user_get_user_name (user)); @@ -1395,12 +1392,35 @@ setup_main_window (CcUserPanelPrivate *d) } static void +pick_avatar (GtkWidget *button, + CcUserPanel *self) +{ + CcUserPanelPrivate *d = self->priv; + GtkWidget *picker; + int response; + + picker = um_avatar_picker_new (); + gtk_window_set_transient_for (GTK_WINDOW (picker), GTK_WINDOW (gtk_widget_get_toplevel (d->main_box))); + response = gtk_dialog_run (GTK_DIALOG (picker)); + + if (response == GTK_RESPONSE_ACCEPT) { + GdkPixbuf *pixbuf; + ActUser *user; + + user = get_selected_user (d); + pixbuf = um_avatar_picker_get_avatar (UM_AVATAR_PICKER (picker)); + set_user_icon_data (user, pixbuf); + } + + gtk_widget_destroy (picker); +} + +static void cc_user_panel_init (CcUserPanel *self) { CcUserPanelPrivate *d; GError *error; volatile GType type G_GNUC_UNUSED; - GtkWidget *button; GtkStyleContext *context; d = self->priv = UM_USER_PANEL_PRIVATE (self); @@ -1426,13 +1446,14 @@ cc_user_panel_init (CcUserPanel *self) } d->password_dialog = um_password_dialog_new (); - button = get_widget (d, "user-icon-button"); - d->photo_dialog = um_photo_dialog_new (button); d->main_box = get_widget (d, "accounts-vbox"); gtk_container_add (GTK_CONTAINER (self), d->main_box); d->history_dialog = um_history_dialog_new (); setup_main_window (d); + g_signal_connect (get_widget (d, "user-icon-button"), "clicked", + G_CALLBACK (pick_avatar), self); + context = gtk_widget_get_style_context (get_widget (d, "list-scrolledwindow")); gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM); context = gtk_widget_get_style_context (get_widget (d, "add-remove-toolbar")); @@ -1456,10 +1477,6 @@ cc_user_panel_dispose (GObject *object) um_password_dialog_free (priv->password_dialog); priv->password_dialog = NULL; } - if (priv->photo_dialog) { - um_photo_dialog_free (priv->photo_dialog); - priv->photo_dialog = NULL; - } if (priv->history_dialog) { um_history_dialog_free (priv->history_dialog); priv->history_dialog = NULL; |