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));
 }