diff options
author | Felipe Borges <felipeborges@gnome.org> | 2018-07-23 15:04:23 +0200 |
---|---|---|
committer | Felipe Borges <felipeborges@gnome.org> | 2018-07-25 10:21:38 +0200 |
commit | d9780c89f3a8bc753a50dbbdb384f861257a43fe (patch) | |
tree | 3cf6e2b04d4b1036be231bf6dad3c1ae2fe97949 | |
parent | ddfbec6ed41f4aa041664a6d5b90aca75970e008 (diff) | |
download | gnome-initial-setup-wip/feborges/avatar-chooser.tar.gz |
account: Introduce the new avatar chooserwip/feborges/avatar-chooser
Fixes #5
-rw-r--r-- | gnome-initial-setup/pages/account/gis-account-avatar-chooser.ui | 33 | ||||
-rw-r--r-- | gnome-initial-setup/pages/account/um-photo-dialog.c | 189 |
2 files changed, 79 insertions, 143 deletions
diff --git a/gnome-initial-setup/pages/account/gis-account-avatar-chooser.ui b/gnome-initial-setup/pages/account/gis-account-avatar-chooser.ui index c906d0b..3b119af 100644 --- a/gnome-initial-setup/pages/account/gis-account-avatar-chooser.ui +++ b/gnome-initial-setup/pages/account/gis-account-avatar-chooser.ui @@ -2,5 +2,38 @@ <interface> <!-- interface-requires gtk+ 3.8 --> <template class="UmPhotoDialog" parent="GtkPopover"> + <property name="height-request">360</property> + <property name="width-request">480</property> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="orientation">GTK_ORIENTATION_VERTICAL</property> + <child> + <object class="GtkFlowBox" id="flowbox"> + <property name="visible">True</property> + <property name="border-width">20</property> + <property name="selection-mode">none</property> + </object> + </child> + <child> + <object class="GtkBox"> + <property name="visible">True</property> + <property name="halign">GTK_ALIGN_CENTER</property> + <property name="border-width">10</property> + <property name="spacing">10</property> + <child> + <object class="GtkButton" id="take_picture_button"> + <property name="visible">True</property> + <property name="label" translatable="yes">Take a Picture…</property> + <signal name="clicked" handler="webcam_icon_selected" swapped="yes"/> + </object> + </child> + </object> + <packing> + <property name="pack-type">GTK_PACK_END</property> + </packing> + </child> + </object> + </child> </template> </interface> diff --git a/gnome-initial-setup/pages/account/um-photo-dialog.c b/gnome-initial-setup/pages/account/um-photo-dialog.c index e01c5dc..aeda217 100644 --- a/gnome-initial-setup/pages/account/um-photo-dialog.c +++ b/gnome-initial-setup/pages/account/um-photo-dialog.c @@ -43,8 +43,9 @@ struct _UmPhotoDialog { GtkPopover parent; - GtkWidget *photo_popup; GtkWidget *popup_button; + GtkWidget *flowbox; + GtkWidget *take_picture_button; #ifdef HAVE_CHEESE CheeseCameraDeviceMonitor *monitor; @@ -52,19 +53,14 @@ struct _UmPhotoDialog { guint num_cameras; #endif /* HAVE_CHEESE */ + GListStore *faces; + SelectAvatarCallback *callback; gpointer data; }; G_DEFINE_TYPE (UmPhotoDialog, um_photo_dialog, GTK_TYPE_POPOVER) -static void -none_icon_selected (GtkMenuItem *menuitem, - UmPhotoDialog *um) -{ - um->callback (NULL, NULL, um->data); -} - #ifdef HAVE_CHEESE static gboolean destroy_chooser (GtkWidget *chooser) @@ -95,27 +91,28 @@ webcam_response_cb (GtkDialog *dialog, } static void -webcam_icon_selected (GtkMenuItem *menuitem, - UmPhotoDialog *um) +webcam_icon_selected (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 (gtk_widget_get_toplevel (GTK_WIDGET (um)))); 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); + + gtk_popover_popdown (GTK_POPOVER (um)); } static void update_photo_menu_status (UmPhotoDialog *um) { if (um->num_cameras == 0) - gtk_widget_set_sensitive (um->take_photo_menuitem, FALSE); + gtk_widget_set_sensitive (um->take_picture_button, FALSE); else - gtk_widget_set_sensitive (um->take_photo_menuitem, TRUE); + gtk_widget_set_sensitive (um->take_picture_button, TRUE); } static void @@ -139,40 +136,39 @@ device_removed (CheeseCameraDeviceMonitor *monitor, #endif /* HAVE_CHEESE */ static void -stock_icon_selected (GtkMenuItem *menuitem, - UmPhotoDialog *um) +face_widget_activated (GtkFlowBox *flowbox, + GtkFlowBoxChild *child, + UmPhotoDialog *um) { const char *filename; + GtkWidget *image; + + image = gtk_bin_get_child (GTK_BIN (child)); + filename = g_object_get_data (G_OBJECT (image), "filename"); - filename = g_object_get_data (G_OBJECT (menuitem), "filename"); um->callback (NULL, filename, um->data); + + gtk_popover_popdown (GTK_POPOVER (um)); } static GtkWidget * -menu_item_for_filename (UmPhotoDialog *um, - const char *filename) +create_face_widget (gpointer item, + gpointer user_data) { - GtkWidget *image, *menuitem; - GFile *file; + GtkWidget *image; GIcon *icon; - file = g_file_new_for_path (filename); - icon = g_file_icon_new (file); - g_object_unref (file); + icon = g_file_icon_new (G_FILE (item)); image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_DIALOG); gtk_image_set_pixel_size (GTK_IMAGE (image), AVATAR_PIXEL_SIZE); g_object_unref (icon); - menuitem = gtk_menu_item_new (); - gtk_container_add (GTK_CONTAINER (menuitem), image); - gtk_widget_show_all (menuitem); + gtk_widget_show (image); - 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); + g_object_set_data (G_OBJECT (image), + "filename", g_file_get_path (G_FILE (item))); - return menuitem; + return image; } static void @@ -182,19 +178,21 @@ setup_photo_popup (UmPhotoDialog *um) GFileInfo *info; GFileEnumerator *enumerator; GFileType type; + GFile *face_file; const gchar *target; - GtkWidget *menu, *menuitem, *image; - guint x, y; const gchar * const * dirs; guint i; - gboolean none_item_shown; gboolean added_faces; - menu = gtk_menu_new (); + um->faces = g_list_store_new (G_TYPE_FILE); + gtk_flow_box_bind_model (GTK_FLOW_BOX (um->flowbox), + G_LIST_MODEL (um->faces), + create_face_widget, + um, + NULL); - x = 0; - y = 0; - none_item_shown = added_faces = FALSE; + g_signal_connect (um->flowbox, "child-activated", + G_CALLBACK (face_widget_activated), um); dirs = g_get_system_data_dirs (); for (i = 0; dirs[i] != NULL; i++) { @@ -235,19 +233,10 @@ setup_photo_popup (UmPhotoDialog *um) } filename = g_build_filename (path, g_file_info_get_name (info), NULL); - menuitem = menu_item_for_filename (um, filename); + face_file = g_file_new_for_path (filename); g_free (filename); - 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_list_store_append (um->faces, face_file); g_object_unref (info); } @@ -260,48 +249,8 @@ setup_photo_popup (UmPhotoDialog *um) 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); + gtk_widget_set_visible (um->take_picture_button, TRUE); um->monitor = cheese_camera_device_monitor_new (); g_signal_connect (G_OBJECT (um->monitor), "added", @@ -309,24 +258,13 @@ skip_faces: g_signal_connect (G_OBJECT (um->monitor), "removed", G_CALLBACK (device_removed), um); cheese_camera_device_monitor_coldplug (um->monitor); - - y++; #endif /* HAVE_CHEESE */ - - 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)); - } + gtk_popover_popup (GTK_POPOVER (um)); } static gboolean @@ -335,11 +273,11 @@ on_popup_button_button_pressed (GtkToggleButton *button, UmPhotoDialog *um) { if (event->button == 1) { - if (!gtk_widget_get_visible (um->photo_popup)) { + if (!gtk_widget_get_visible (GTK_WIDGET (um))) { 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_popover_popdown (GTK_POPOVER (um)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE); } @@ -349,38 +287,6 @@ on_popup_button_button_pressed (GtkToggleButton *button, 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, SelectAvatarCallback callback, @@ -399,13 +305,6 @@ um_photo_dialog_new (GtkWidget *button, 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); um->callback = callback; um->data = data; @@ -439,5 +338,9 @@ um_photo_dialog_class_init (UmPhotoDialogClass *klass) gtk_widget_class_set_template_from_resource (wclass, "/org/gnome/initial-setup/gis-account-avatar-chooser.ui"); + gtk_widget_class_bind_template_child (wclass, UmPhotoDialog, flowbox); + gtk_widget_class_bind_template_child (wclass, UmPhotoDialog, take_picture_button); + gtk_widget_class_bind_template_callback (wclass, webcam_icon_selected); + oclass->dispose = um_photo_dialog_dispose; } |