Mercurial > pidgin.yaz
diff 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 |
line wrap: on
line diff
--- a/pidgin/gtksmiley.c Sun Jul 12 05:42:40 2009 +0000 +++ b/pidgin/gtksmiley.c Sun Jul 12 05:43:38 2009 +0000 @@ -49,6 +49,7 @@ GdkPixbuf *custom_pixbuf; gpointer data; /** @since 2.6.0 */ gsize datasize; /** @since 2.6.0 */ + gint entry_len; /** @since 2.6.0 */ }; typedef struct @@ -73,6 +74,7 @@ static void pidgin_smiley_destroy(PidginSmiley *smiley) { + g_object_set_data(G_OBJECT(smiley->smiley), "edit-dialog", NULL); gtk_widget_destroy(smiley->parent); g_free(smiley->filename); if (smiley->custom_pixbuf) @@ -226,18 +228,6 @@ PurpleSmiley *emoticon; entry = gtk_entry_get_text(GTK_ENTRY(s->smile)); - if (!entry || !*entry) { - /* - * TODO: We should enable/disable the add button based on - * whether the user has entered all required data. That - * would eliminate the need for this check and provide a - * better user experience. - */ - purple_notify_error(s->parent, _("Custom Smiley"), - _("More Data needed"), - _("Please provide a shortcut to associate with the smiley.")); - return; - } emoticon = purple_smileys_find_by_shortcut(entry); if (emoticon && emoticon != s->smiley) { @@ -267,15 +257,6 @@ } purple_smiley_set_shortcut(s->smiley, entry); } else { - if ((s->filename == NULL && s->custom_pixbuf == NULL) - || *entry == 0) { - purple_notify_error(s->parent, _("Custom Smiley"), - _("More Data needed"), - s->filename ? _("Please provide a shortcut to associate with the smiley.") - : _("Please select an image for the smiley.")); - return; - } - purple_debug_info("gtksmiley", "adding a new smiley\n"); if (s->filename == NULL) { @@ -355,6 +336,9 @@ if (pixbuf) g_object_unref(G_OBJECT(pixbuf)); gtk_widget_grab_focus(s->smile); + + if (s->entry_len > 0) + gtk_dialog_set_response_sensitive(GTK_DIALOG(s->parent), GTK_RESPONSE_ACCEPT, TRUE); } static void @@ -368,6 +352,36 @@ gtk_widget_show_all(file_chooser); } +static void +smiley_name_insert_cb(GtkEditable *editable, + gchar *new_text, + gint new_text_length, + gint *position, + gpointer user_data) +{ + PidginSmiley *s = user_data; + if (new_text_length != -1) + s->entry_len += new_text_length; + else + s->entry_len += strlen(new_text); + + if (s->filename != NULL || s->custom_pixbuf != NULL || s->smiley != NULL) + gtk_dialog_set_response_sensitive(GTK_DIALOG(s->parent), GTK_RESPONSE_ACCEPT, TRUE); +} + +static void +smiley_name_delete_cb(GtkEditable *editable, + gint start_pos, + gint end_pos, + gpointer user_data) +{ + PidginSmiley *s = user_data; + s->entry_len -= end_pos - start_pos; + + if (s->entry_len <= 0) + gtk_dialog_set_response_sensitive(GTK_DIALOG(s->parent), GTK_RESPONSE_ACCEPT, FALSE); +} + PidginSmiley * pidgin_smiley_edit(GtkWidget *widget, PurpleSmiley *smiley) { @@ -389,9 +403,11 @@ smiley ? GTK_STOCK_SAVE : GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, NULL); s->parent = window; + g_object_set_data(G_OBJECT(smiley), "edit-dialog", window); gtk_container_set_border_width(GTK_CONTAINER(window), PIDGIN_HIG_BORDER); + gtk_dialog_set_default_response(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT); g_signal_connect(window, "response", G_CALLBACK(do_add_select_cb), s); /* The vbox */ @@ -441,10 +457,17 @@ s->smile = gtk_entry_new(); gtk_entry_set_activates_default(GTK_ENTRY(s->smile), TRUE); pidgin_set_accessible_label(s->smile, label); - if (smiley) - gtk_entry_set_text(GTK_ENTRY(s->smile), purple_smiley_get_shortcut(smiley)); + if (smiley) { + const char *shortcut = purple_smiley_get_shortcut(smiley); + gtk_entry_set_text(GTK_ENTRY(s->smile), shortcut); + s->entry_len = strlen(shortcut); + } + else + gtk_dialog_set_response_sensitive(GTK_DIALOG(window), GTK_RESPONSE_ACCEPT, FALSE); - g_signal_connect(s->smile, "activate", G_CALLBACK(do_add), s); + /* gtk_entry_get_text_length is 2.14+, so we'll just keep track ourselves */ + g_signal_connect(G_OBJECT(s->smile), "insert-text", G_CALLBACK(smiley_name_insert_cb), s); + g_signal_connect(G_OBJECT(s->smile), "delete-text", G_CALLBACK(smiley_name_delete_cb), s); gtk_box_pack_end(GTK_BOX(hbox), s->smile, FALSE, FALSE, 0); gtk_widget_show(s->smile); @@ -470,8 +493,15 @@ if (editor->custom_pixbuf) g_object_unref(G_OBJECT(editor->custom_pixbuf)); editor->custom_pixbuf = image ? g_object_ref(G_OBJECT(image)) : NULL; - if (image) + if (image) { gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image); + if (editor->entry_len > 0) + gtk_dialog_set_response_sensitive(GTK_DIALOG(editor->parent), + GTK_RESPONSE_ACCEPT, TRUE); + } + else + gtk_dialog_set_response_sensitive(GTK_DIALOG(editor->parent), + GTK_RESPONSE_ACCEPT, FALSE); } void @@ -622,8 +652,12 @@ smiley_edit_iter(SmileyManager *dialog, GtkTreeIter *iter) { PurpleSmiley *smiley = NULL; + GtkWidget *window = NULL; gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), iter, SMILEY, &smiley, -1); - pidgin_smiley_edit(gtk_widget_get_toplevel(GTK_WIDGET(dialog->treeview)), smiley); + if ((window = g_object_get_data(G_OBJECT(smiley), "edit-dialog")) != NULL) + gtk_window_present(GTK_WINDOW(window)); + else + pidgin_smiley_edit(gtk_widget_get_toplevel(GTK_WIDGET(dialog->treeview)), smiley); g_object_unref(G_OBJECT(smiley)); }