# HG changeset patch # User Elliott Sales de Andrade # Date 1246583882 0 # Node ID 5dcee348bc22bfe678f42d4712f60a0254ded87c # Parent 627d23bfdb0501bb80ce93332571cd1b76646f30 Automatically enable and disable the Add/Save button in the PidginSmiley edit window. That should take care of that TODO comment and "provide a better user experience". diff -r 627d23bfdb05 -r 5dcee348bc22 pidgin/gtksmiley.c --- a/pidgin/gtksmiley.c Thu Jul 02 04:26:00 2009 +0000 +++ b/pidgin/gtksmiley.c Fri Jul 03 01:18:02 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 @@ -226,18 +227,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 +256,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 +335,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 +351,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) { @@ -441,10 +454,18 @@ 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);