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 {