Mercurial > pidgin.yaz
comparison pidgin/gtksmiley.c @ 27666:a08e84032814
merge of '2348ff22f0ff3453774b8b25b36238465580c609'
and 'e76f11543c2a4aa05bdf584f087cbe3439029661'
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sun, 12 Jul 2009 05:43:38 +0000 |
parents | 9aea1eb8aa66 |
children | a6cfb7bf8c88 |
comparison
equal
deleted
inserted
replaced
27186:048bcf41deef | 27666:a08e84032814 |
---|---|
47 GtkWidget *smiley_image; | 47 GtkWidget *smiley_image; |
48 gchar *filename; | 48 gchar *filename; |
49 GdkPixbuf *custom_pixbuf; | 49 GdkPixbuf *custom_pixbuf; |
50 gpointer data; /** @since 2.6.0 */ | 50 gpointer data; /** @since 2.6.0 */ |
51 gsize datasize; /** @since 2.6.0 */ | 51 gsize datasize; /** @since 2.6.0 */ |
52 gint entry_len; /** @since 2.6.0 */ | |
52 }; | 53 }; |
53 | 54 |
54 typedef struct | 55 typedef struct |
55 { | 56 { |
56 GtkWidget *window; | 57 GtkWidget *window; |
71 static GSList *gtk_smileys = NULL; | 72 static GSList *gtk_smileys = NULL; |
72 | 73 |
73 static void | 74 static void |
74 pidgin_smiley_destroy(PidginSmiley *smiley) | 75 pidgin_smiley_destroy(PidginSmiley *smiley) |
75 { | 76 { |
77 g_object_set_data(G_OBJECT(smiley->smiley), "edit-dialog", NULL); | |
76 gtk_widget_destroy(smiley->parent); | 78 gtk_widget_destroy(smiley->parent); |
77 g_free(smiley->filename); | 79 g_free(smiley->filename); |
78 if (smiley->custom_pixbuf) | 80 if (smiley->custom_pixbuf) |
79 g_object_unref(G_OBJECT(smiley->custom_pixbuf)); | 81 g_object_unref(G_OBJECT(smiley->custom_pixbuf)); |
80 g_free(smiley); | 82 g_free(smiley); |
224 { | 226 { |
225 const gchar *entry; | 227 const gchar *entry; |
226 PurpleSmiley *emoticon; | 228 PurpleSmiley *emoticon; |
227 | 229 |
228 entry = gtk_entry_get_text(GTK_ENTRY(s->smile)); | 230 entry = gtk_entry_get_text(GTK_ENTRY(s->smile)); |
229 if (!entry || !*entry) { | |
230 /* | |
231 * TODO: We should enable/disable the add button based on | |
232 * whether the user has entered all required data. That | |
233 * would eliminate the need for this check and provide a | |
234 * better user experience. | |
235 */ | |
236 purple_notify_error(s->parent, _("Custom Smiley"), | |
237 _("More Data needed"), | |
238 _("Please provide a shortcut to associate with the smiley.")); | |
239 return; | |
240 } | |
241 | 231 |
242 emoticon = purple_smileys_find_by_shortcut(entry); | 232 emoticon = purple_smileys_find_by_shortcut(entry); |
243 if (emoticon && emoticon != s->smiley) { | 233 if (emoticon && emoticon != s->smiley) { |
244 gchar *msg; | 234 gchar *msg; |
245 msg = g_strdup_printf(_("A custom smiley for '%s' already exists. " | 235 msg = g_strdup_printf(_("A custom smiley for '%s' already exists. " |
265 } | 255 } |
266 purple_smiley_set_data(s->smiley, (guchar*)data, len); | 256 purple_smiley_set_data(s->smiley, (guchar*)data, len); |
267 } | 257 } |
268 purple_smiley_set_shortcut(s->smiley, entry); | 258 purple_smiley_set_shortcut(s->smiley, entry); |
269 } else { | 259 } else { |
270 if ((s->filename == NULL && s->custom_pixbuf == NULL) | |
271 || *entry == 0) { | |
272 purple_notify_error(s->parent, _("Custom Smiley"), | |
273 _("More Data needed"), | |
274 s->filename ? _("Please provide a shortcut to associate with the smiley.") | |
275 : _("Please select an image for the smiley.")); | |
276 return; | |
277 } | |
278 | |
279 purple_debug_info("gtksmiley", "adding a new smiley\n"); | 260 purple_debug_info("gtksmiley", "adding a new smiley\n"); |
280 | 261 |
281 if (s->filename == NULL) { | 262 if (s->filename == NULL) { |
282 gchar *buffer = NULL; | 263 gchar *buffer = NULL; |
283 gsize size = 0; | 264 gsize size = 0; |
353 pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, 64, 64, FALSE, NULL); | 334 pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, 64, 64, FALSE, NULL); |
354 gtk_image_set_from_pixbuf(GTK_IMAGE(s->smiley_image), pixbuf); | 335 gtk_image_set_from_pixbuf(GTK_IMAGE(s->smiley_image), pixbuf); |
355 if (pixbuf) | 336 if (pixbuf) |
356 g_object_unref(G_OBJECT(pixbuf)); | 337 g_object_unref(G_OBJECT(pixbuf)); |
357 gtk_widget_grab_focus(s->smile); | 338 gtk_widget_grab_focus(s->smile); |
339 | |
340 if (s->entry_len > 0) | |
341 gtk_dialog_set_response_sensitive(GTK_DIALOG(s->parent), GTK_RESPONSE_ACCEPT, TRUE); | |
358 } | 342 } |
359 | 343 |
360 static void | 344 static void |
361 open_image_selector(GtkWidget *widget, PidginSmiley *psmiley) | 345 open_image_selector(GtkWidget *widget, PidginSmiley *psmiley) |
362 { | 346 { |
364 file_chooser = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtk_widget_get_toplevel(widget)), | 348 file_chooser = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtk_widget_get_toplevel(widget)), |
365 do_add_file_cb, psmiley); | 349 do_add_file_cb, psmiley); |
366 gtk_window_set_title(GTK_WINDOW(file_chooser), _("Custom Smiley")); | 350 gtk_window_set_title(GTK_WINDOW(file_chooser), _("Custom Smiley")); |
367 gtk_window_set_role(GTK_WINDOW(file_chooser), "file-selector-custom-smiley"); | 351 gtk_window_set_role(GTK_WINDOW(file_chooser), "file-selector-custom-smiley"); |
368 gtk_widget_show_all(file_chooser); | 352 gtk_widget_show_all(file_chooser); |
353 } | |
354 | |
355 static void | |
356 smiley_name_insert_cb(GtkEditable *editable, | |
357 gchar *new_text, | |
358 gint new_text_length, | |
359 gint *position, | |
360 gpointer user_data) | |
361 { | |
362 PidginSmiley *s = user_data; | |
363 if (new_text_length != -1) | |
364 s->entry_len += new_text_length; | |
365 else | |
366 s->entry_len += strlen(new_text); | |
367 | |
368 if (s->filename != NULL || s->custom_pixbuf != NULL || s->smiley != NULL) | |
369 gtk_dialog_set_response_sensitive(GTK_DIALOG(s->parent), GTK_RESPONSE_ACCEPT, TRUE); | |
370 } | |
371 | |
372 static void | |
373 smiley_name_delete_cb(GtkEditable *editable, | |
374 gint start_pos, | |
375 gint end_pos, | |
376 gpointer user_data) | |
377 { | |
378 PidginSmiley *s = user_data; | |
379 s->entry_len -= end_pos - start_pos; | |
380 | |
381 if (s->entry_len <= 0) | |
382 gtk_dialog_set_response_sensitive(GTK_DIALOG(s->parent), GTK_RESPONSE_ACCEPT, FALSE); | |
369 } | 383 } |
370 | 384 |
371 PidginSmiley * | 385 PidginSmiley * |
372 pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley) | 386 pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley) |
373 { | 387 { |
387 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, | 401 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, |
388 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, | 402 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
389 smiley ? GTK_STOCK_SAVE : GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, | 403 smiley ? GTK_STOCK_SAVE : GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, |
390 NULL); | 404 NULL); |
391 s->parent = window; | 405 s->parent = window; |
406 g_object_set_data(G_OBJECT(smiley), "edit-dialog", window); | |
392 | 407 |
393 gtk_container_set_border_width(GTK_CONTAINER(window), PIDGIN_HIG_BORDER); | 408 gtk_container_set_border_width(GTK_CONTAINER(window), PIDGIN_HIG_BORDER); |
394 | 409 |
410 gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT); | |
395 g_signal_connect(window, "response", G_CALLBACK(do_add_select_cb), s); | 411 g_signal_connect(window, "response", G_CALLBACK(do_add_select_cb), s); |
396 | 412 |
397 /* The vbox */ | 413 /* The vbox */ |
398 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); | 414 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); |
399 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(window)->vbox), vbox); | 415 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(window)->vbox), vbox); |
439 gtk_widget_show(label); | 455 gtk_widget_show(label); |
440 | 456 |
441 s->smile = gtk_entry_new(); | 457 s->smile = gtk_entry_new(); |
442 gtk_entry_set_activates_default(GTK_ENTRY(s->smile), TRUE); | 458 gtk_entry_set_activates_default(GTK_ENTRY(s->smile), TRUE); |
443 pidgin_set_accessible_label(s->smile, label); | 459 pidgin_set_accessible_label(s->smile, label); |
444 if (smiley) | 460 if (smiley) { |
445 gtk_entry_set_text(GTK_ENTRY(s->smile), purple_smiley_get_shortcut(smiley)); | 461 const char *shortcut = purple_smiley_get_shortcut(smiley); |
446 | 462 gtk_entry_set_text(GTK_ENTRY(s->smile), shortcut); |
447 g_signal_connect(s->smile, "activate", G_CALLBACK(do_add), s); | 463 s->entry_len = strlen(shortcut); |
464 } | |
465 else | |
466 gtk_dialog_set_response_sensitive(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT, FALSE); | |
467 | |
468 /* gtk_entry_get_text_length is 2.14+, so we'll just keep track ourselves */ | |
469 g_signal_connect(G_OBJECT(s->smile), "insert-text", G_CALLBACK(smiley_name_insert_cb), s); | |
470 g_signal_connect(G_OBJECT(s->smile), "delete-text", G_CALLBACK(smiley_name_delete_cb), s); | |
448 | 471 |
449 gtk_box_pack_end(GTK_BOX(hbox), s->smile, FALSE, FALSE, 0); | 472 gtk_box_pack_end(GTK_BOX(hbox), s->smile, FALSE, FALSE, 0); |
450 gtk_widget_show(s->smile); | 473 gtk_widget_show(s->smile); |
451 | 474 |
452 gtk_widget_show(hbox); | 475 gtk_widget_show(hbox); |
468 pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image) | 491 pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image) |
469 { | 492 { |
470 if (editor->custom_pixbuf) | 493 if (editor->custom_pixbuf) |
471 g_object_unref(G_OBJECT(editor->custom_pixbuf)); | 494 g_object_unref(G_OBJECT(editor->custom_pixbuf)); |
472 editor->custom_pixbuf = image ? g_object_ref(G_OBJECT(image)) : NULL; | 495 editor->custom_pixbuf = image ? g_object_ref(G_OBJECT(image)) : NULL; |
473 if (image) | 496 if (image) { |
474 gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image); | 497 gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image); |
498 if (editor->entry_len > 0) | |
499 gtk_dialog_set_response_sensitive(GTK_DIALOG(editor->parent), | |
500 GTK_RESPONSE_ACCEPT, TRUE); | |
501 } | |
502 else | |
503 gtk_dialog_set_response_sensitive(GTK_DIALOG(editor->parent), | |
504 GTK_RESPONSE_ACCEPT, FALSE); | |
475 } | 505 } |
476 | 506 |
477 void | 507 void |
478 pidgin_smiley_editor_set_data(PidginSmiley *editor, gpointer *data, gsize datasize) | 508 pidgin_smiley_editor_set_data(PidginSmiley *editor, gpointer *data, gsize datasize) |
479 { | 509 { |
620 | 650 |
621 static void | 651 static void |
622 smiley_edit_iter(SmileyManager *dialog, GtkTreeIter *iter) | 652 smiley_edit_iter(SmileyManager *dialog, GtkTreeIter *iter) |
623 { | 653 { |
624 PurpleSmiley *smiley = NULL; | 654 PurpleSmiley *smiley = NULL; |
655 GtkWidget *window = NULL; | |
625 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), iter, SMILEY, &smiley, -1); | 656 gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), iter, SMILEY, &smiley, -1); |
626 pidgin_smiley_edit(gtk_widget_get_toplevel(GTK_WIDGET(dialog->treeview)), smiley); | 657 if ((window = g_object_get_data(G_OBJECT(smiley), "edit-dialog")) != NULL) |
658 gtk_window_present(GTK_WINDOW(window)); | |
659 else | |
660 pidgin_smiley_edit(gtk_widget_get_toplevel(GTK_WIDGET(dialog->treeview)), smiley); | |
627 g_object_unref(G_OBJECT(smiley)); | 661 g_object_unref(G_OBJECT(smiley)); |
628 } | 662 } |
629 | 663 |
630 static void smiley_edit_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) | 664 static void smiley_edit_cb(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) |
631 { | 665 { |