59
60
struct _CheeseAvatarChooserPrivate
64
GtkWidget *take_button;
65
GtkWidget *take_again_button;
67
gulong photo_taken_id;
70
65
static GParamSpec *properties[PROP_LAST];
72
#define CHEESE_AVATAR_CHOOSER_GET_PRIVATE(o) \
73
(G_TYPE_INSTANCE_GET_PRIVATE ((o), CHEESE_TYPE_AVATAR_CHOOSER, \
74
CheeseAvatarChooserPrivate))
76
G_DEFINE_TYPE (CheeseAvatarChooser, cheese_avatar_chooser, GTK_TYPE_DIALOG);
79
* cheese_widget_photo_taken_cb:
80
* @camera: a #CheeseCamera
81
* @pixbuf: the #GdkPixbuf of the image that was just taken
82
* @choose: a #CheeseAvatarChooser
84
* Show the image that was just taken from the camera (as @pixbuf) in the
88
cheese_widget_photo_taken_cb (CheeseCamera *camera,
90
CheeseAvatarChooser *chooser)
92
CheeseAvatarChooserPrivate *priv = chooser->priv;
93
GtkAllocation allocation;
97
gtk_widget_get_allocation (priv->camera, &allocation);
98
gtk_widget_set_size_request (priv->image, allocation.width, allocation.height);
100
um_crop_area_set_picture (UM_CROP_AREA (priv->image), pixbuf);
101
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), IMAGE_PAGE);
102
gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser),
105
gtk_widget_set_sensitive (priv->take_button, TRUE);
107
gdk_threads_leave ();
109
g_object_notify_by_pspec (G_OBJECT (chooser), properties[PROP_PIXBUF]);
113
* take_button_clicked_cb:
114
* @button: the #GtkButton that was clicked
115
* @chooser: the #CheeseAvatarChooser
117
* Take a photo with the #CheeseCamera of @chooser. When the photo has been
118
* taken, call cheese_widget_photo_taken_cb().
121
take_button_clicked_cb (GtkButton *button,
122
CheeseAvatarChooser *chooser)
124
CheeseAvatarChooserPrivate *priv = chooser->priv;
127
camera = cheese_widget_get_camera (CHEESE_WIDGET (priv->camera));
128
if (priv->photo_taken_id == 0)
130
gtk_widget_set_sensitive (priv->take_button, FALSE);
131
priv->photo_taken_id = g_signal_connect (G_OBJECT (camera), "photo-taken",
132
G_CALLBACK (cheese_widget_photo_taken_cb), chooser);
134
if (cheese_camera_take_photo_pixbuf (CHEESE_CAMERA (camera)))
136
cheese_flash_fire (CHEESE_FLASH (priv->flash));
137
ca_gtk_play_for_widget (GTK_WIDGET (chooser), 0,
138
CA_PROP_EVENT_ID, "camera-shutter",
139
CA_PROP_MEDIA_ROLE, "event",
140
CA_PROP_EVENT_DESCRIPTION, _("Shutter sound"),
145
g_assert_not_reached ();
150
* take_again_button_clicked_cb:
151
* @button: the #GtkButton that was clicked
152
* @chooser: the #CheeseAvatarChooser
154
* Switch the @chooser back to the camera view, ready to take another photo.
157
take_again_button_clicked_cb (GtkButton *button,
158
CheeseAvatarChooser *chooser)
160
CheeseAvatarChooserPrivate *priv = chooser->priv;
162
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), WIDGET_PAGE);
163
gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser),
167
um_crop_area_set_picture (UM_CROP_AREA (priv->image), NULL);
169
g_object_notify_by_pspec (G_OBJECT (chooser), properties[PROP_PIXBUF]);
173
* @object: the #CheeseWidget on which the state changed
174
* @param_spec: the (unused) parameter specification
175
* @chooser: a #CheeseAvatarChooser
177
* Handle state changes on the #CheeseWidget, and update the UI appropriately.
180
state_change_cb (GObject *object,
181
GParamSpec *param_spec,
182
CheeseAvatarChooser *chooser)
184
CheeseAvatarChooserPrivate *priv = chooser->priv;
185
CheeseWidgetState state;
187
g_object_get (object, "state", &state, NULL);
191
case CHEESE_WIDGET_STATE_READY:
192
gtk_widget_set_sensitive (priv->take_button, TRUE);
193
gtk_widget_set_sensitive (priv->take_again_button, TRUE);
195
case CHEESE_WIDGET_STATE_ERROR:
196
gtk_widget_set_sensitive (priv->take_button, FALSE);
197
gtk_widget_set_sensitive (priv->take_again_button, FALSE);
199
case CHEESE_WIDGET_STATE_NONE:
202
g_assert_not_reached ();
208
* @child: the #CheeseWidget to pack into the container
209
* @button: the #GtkButton for taking a photo
210
* @extra: an extra #GtkWidget to pack alongside the @button, or NULL
212
* Create the widgets for the #CheeseAvatarChooser and pack them into a
215
* Returns: a #GtkBox containing the individual #CheeseAvatarChooser widgets
218
create_page (GtkWidget *child,
222
GtkWidget *vgrid, *hgrid, *align;
224
vgrid = gtk_grid_new ();
225
gtk_grid_attach (GTK_GRID (vgrid),
227
gtk_widget_set_hexpand (child, TRUE);
228
gtk_widget_set_vexpand (child, TRUE);
229
align = gtk_alignment_new (0.5, 0, 0, 0);
230
gtk_widget_set_valign (align, GTK_ALIGN_END);
231
gtk_grid_attach (GTK_GRID (vgrid),
233
hgrid = gtk_grid_new ();
234
gtk_grid_set_column_spacing (GTK_GRID (hgrid), 8);
235
gtk_container_add(GTK_CONTAINER(align), hgrid);
236
gtk_grid_attach (GTK_GRID (hgrid),
238
gtk_widget_set_halign (button, GTK_ALIGN_START);
241
gtk_grid_attach (GTK_GRID (hgrid),
243
gtk_widget_set_hexpand (extra, TRUE);
244
gtk_widget_set_vexpand (extra, TRUE);
67
G_DEFINE_TYPE_WITH_PRIVATE (CheeseAvatarChooser, cheese_avatar_chooser, GTK_TYPE_DIALOG);
70
update_select_button (CheeseAvatarWidget *widget,
72
CheeseAvatarChooser *chooser)
76
g_object_get (G_OBJECT (widget), "pixbuf", &pixbuf, NULL);
77
gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser),
81
g_object_unref (pixbuf);
251
85
cheese_avatar_chooser_init (CheeseAvatarChooser *chooser)
255
CheeseAvatarChooserPrivate *priv = chooser->priv = CHEESE_AVATAR_CHOOSER_GET_PRIVATE (chooser);
257
priv->flash = cheese_flash_new (GTK_WIDGET (chooser));
87
CheeseAvatarChooserPrivate *priv = chooser->priv = cheese_avatar_chooser_get_instance_private (chooser);
259
89
gtk_dialog_add_buttons (GTK_DIALOG (chooser),
261
91
GTK_RESPONSE_REJECT,
263
93
GTK_RESPONSE_ACCEPT,
265
95
gtk_window_set_title (GTK_WINDOW (chooser), _("Take a Photo"));
268
98
GTK_RESPONSE_ACCEPT,
271
priv->notebook = gtk_notebook_new ();
272
gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE);
273
gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE);
101
g_object_set (G_OBJECT (gtk_dialog_get_action_area (GTK_DIALOG (chooser))), "margin", 8, NULL);
103
priv->widget = cheese_avatar_widget_new ();
104
gtk_widget_show (priv->widget);
275
105
gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (chooser))),
280
priv->camera = cheese_widget_new ();
281
g_signal_connect (G_OBJECT (priv->camera), "notify::state",
282
G_CALLBACK (state_change_cb), chooser);
283
priv->take_button = gtk_button_new_with_mnemonic (_("_Take a Photo"));
284
g_signal_connect (G_OBJECT (priv->take_button), "clicked",
285
G_CALLBACK (take_button_clicked_cb), chooser);
286
gtk_widget_set_sensitive (priv->take_button, FALSE);
287
gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook),
288
create_page (priv->camera, priv->take_button, NULL),
289
gtk_label_new ("webcam"));
292
priv->image = um_crop_area_new ();
293
frame = gtk_frame_new (NULL);
294
gtk_container_add (GTK_CONTAINER (frame), priv->image);
295
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
296
priv->take_again_button = gtk_button_new_with_mnemonic (_("_Discard photo"));
297
g_signal_connect (G_OBJECT (priv->take_again_button), "clicked",
298
G_CALLBACK (take_again_button_clicked_cb), chooser);
299
gtk_widget_set_sensitive (priv->take_again_button, FALSE);
300
gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook),
301
create_page (frame, priv->take_again_button, NULL),
302
gtk_label_new ("image"));
304
gtk_window_set_default_size (GTK_WINDOW (chooser), 400, 300);
306
gtk_widget_show_all (gtk_dialog_get_content_area (GTK_DIALOG (chooser)));
310
cheese_avatar_chooser_finalize (GObject *object)
312
CheeseAvatarChooserPrivate *priv = ((CheeseAvatarChooser *) object)->priv;
314
g_clear_object (&priv->flash);
316
G_OBJECT_CLASS (cheese_avatar_chooser_parent_class)->finalize (object);
109
g_signal_connect (G_OBJECT (priv->widget), "notify::pixbuf",
110
G_CALLBACK (update_select_button), chooser);