summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Borges <felipeborges@gnome.org>2018-07-23 15:04:23 +0200
committerFelipe Borges <felipeborges@gnome.org>2018-07-25 10:21:38 +0200
commitd9780c89f3a8bc753a50dbbdb384f861257a43fe (patch)
tree3cf6e2b04d4b1036be231bf6dad3c1ae2fe97949
parentddfbec6ed41f4aa041664a6d5b90aca75970e008 (diff)
downloadgnome-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.ui33
-rw-r--r--gnome-initial-setup/pages/account/um-photo-dialog.c189
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;
}