diff src/gtkaccount.c @ 5826:bd0d0e89cac3

[gaim-migrate @ 6256] You can once again set your buddy icon. Of course, you* haven't been using CVS, so you've always been able to set your buddy icon. * Gaim developers not applicable committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Tue, 10 Jun 2003 01:09:26 +0000
parents 1ba7dbd50d85
children 8f5ccf9e590a
line wrap: on
line diff
--- a/src/gtkaccount.c	Mon Jun 09 20:34:58 2003 +0000
+++ b/src/gtkaccount.c	Tue Jun 10 01:09:26 2003 +0000
@@ -21,6 +21,10 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
 #include <gtk/gtk.h>
 
 #include "gtkaccount.h"
@@ -113,7 +117,10 @@
 	GtkWidget *new_mail_check;
 	GtkWidget *buddy_icon_hbox;
 	GtkWidget *buddy_icon_entry;
-
+	GtkWidget *buddy_icon_filesel;
+	GtkWidget *buddy_icon_preview;
+	GtkWidget *buddy_icon_text;
+	
 	/* Protocol Options */
 	GtkWidget *protocol_frame;
 	GtkWidget *register_check;
@@ -198,7 +205,103 @@
 		return;
 
 	gtk_widget_set_sensitive(dialog->ok_button,
-							 *gtk_entry_get_text(entry) != '\0');
+				 *gtk_entry_get_text(entry) != '\0');
+}
+	
+static void buddy_icon_filesel_delete_cb (GtkWidget *w, AccountPrefsDialog *dialog)
+{
+	gtk_widget_destroy(dialog->buddy_icon_filesel);
+	dialog->buddy_icon_filesel = NULL;
+}
+
+static void buddy_icon_filesel_choose (GtkWidget *w, AccountPrefsDialog *dialog)
+{
+	const char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog->buddy_icon_filesel));
+	if (dialog->account)
+		gaim_account_set_buddy_icon(dialog->account, filename);
+	gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry), filename);
+	gtk_widget_destroy(dialog->buddy_icon_filesel);
+}
+
+static void buddy_icon_preview_change_cb(GtkTreeSelection *sel, AccountPrefsDialog *dialog)
+{
+	GdkPixbuf *pixbuf, *scale;
+	int height, width;
+	char *basename, *markup, *size;
+	struct stat st;
+
+	const char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog->buddy_icon_filesel));
+	if (!filename || stat(filename, &st))
+		return;
+
+	pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
+	if (!pixbuf) {
+		gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->buddy_icon_preview), NULL);
+		gtk_label_set_markup(GTK_LABEL(dialog->buddy_icon_text), "");
+		return;
+	}
+	
+	width = gdk_pixbuf_get_width(pixbuf);
+	height = gdk_pixbuf_get_height(pixbuf);
+	basename = g_path_get_basename(filename);
+	size = gaim_get_size_string(st.st_size);
+	markup = g_strdup_printf(_("<b>File:</b> %s\n<b>File size:</b> %s\n<b>Image size:</b> %dx%d"),
+				 basename, size, width, height);
+	scale = gdk_pixbuf_scale_simple(pixbuf, width * 50 / height, 50, GDK_INTERP_BILINEAR);
+	gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->buddy_icon_preview), scale);
+	gtk_label_set_markup(GTK_LABEL(dialog->buddy_icon_text), markup);
+
+	g_object_unref(G_OBJECT(pixbuf));
+	g_object_unref(G_OBJECT(scale));
+	g_free(basename);
+	g_free(size);
+}
+
+static void buddy_icon_select_cb(GtkWidget *button, AccountPrefsDialog *dialog)
+{
+	GtkWidget *hbox;
+	GtkWidget *tv;
+	GtkTreeSelection *sel;
+
+	if (dialog->buddy_icon_filesel) {
+		gdk_window_show(GDK_WINDOW(dialog->buddy_icon_filesel));
+		return;
+	}
+	
+	dialog->buddy_icon_filesel = gtk_file_selection_new(_("Buddy Icon"));
+	dialog->buddy_icon_preview = gtk_image_new();
+	dialog->buddy_icon_text = gtk_label_new(NULL);
+	gtk_widget_set_size_request(GTK_WIDGET(dialog->buddy_icon_preview), -1, 50);
+	hbox = gtk_hbox_new(FALSE, 6);
+	gtk_box_pack_start(GTK_BOX(GTK_FILE_SELECTION(dialog->buddy_icon_filesel)->main_vbox), hbox,
+			   FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(hbox), dialog->buddy_icon_preview, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(hbox), dialog->buddy_icon_text, FALSE, FALSE, 0);
+	
+	tv = GTK_FILE_SELECTION(dialog->buddy_icon_filesel)->file_list;
+	sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv));
+	g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(buddy_icon_preview_change_cb), dialog);
+
+	g_signal_connect(G_OBJECT(dialog->buddy_icon_filesel), "delete-event", G_CALLBACK(buddy_icon_filesel_delete_cb), dialog);
+	g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog->buddy_icon_filesel)->cancel_button), "clicked",
+			 G_CALLBACK(buddy_icon_filesel_delete_cb), dialog);
+	g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(dialog->buddy_icon_filesel)->ok_button), "clicked", G_CALLBACK(buddy_icon_filesel_choose),
+			 dialog);
+
+	gtk_widget_show_all(dialog->buddy_icon_filesel);
+	if (dialog->account) {
+		gtk_file_selection_set_filename(GTK_FILE_SELECTION(dialog->buddy_icon_filesel), 
+						gaim_account_get_buddy_icon(dialog->account));
+		buddy_icon_preview_change_cb(NULL, dialog);
+	}
+	
+}
+
+static void buddy_icon_reset_cb(GtkWidget *button, AccountPrefsDialog *dialog)
+{
+	gtk_entry_set_text(GTK_ENTRY(dialog->buddy_icon_entry), "");
+	if (dialog->account)
+		gaim_account_set_buddy_icon(dialog->account, NULL);
 }
 
 static void
@@ -236,11 +339,11 @@
 
 	/* Screen Name */
 	dialog->screenname_entry = gtk_entry_new();
-
+	
 	add_pref_box(dialog, vbox, _("Screenname:"), dialog->screenname_entry);
-
+	
 	g_signal_connect(G_OBJECT(dialog->screenname_entry), "changed",
-					 G_CALLBACK(screenname_changed_cb), dialog);
+			 G_CALLBACK(screenname_changed_cb), dialog);
 
 	/* Do the user split thang */
 	if (dialog->plugin == NULL) /* Yeah right. */
@@ -400,14 +503,19 @@
 	gtk_widget_show(label);
 
 	dialog->buddy_icon_entry = gtk_entry_new();
+	gtk_entry_set_editable(GTK_ENTRY(dialog->buddy_icon_entry), FALSE);
 	gtk_box_pack_start(GTK_BOX(hbox), dialog->buddy_icon_entry, TRUE, TRUE, 0);
 	gtk_widget_show(dialog->buddy_icon_entry);
 
-	button = gtk_button_new_with_label(_("Browse"));
+	button = gtk_button_new_with_mnemonic(_("_Browse"));
 	gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       	g_signal_connect(G_OBJECT(button), "clicked",
+			 G_CALLBACK(buddy_icon_select_cb), dialog);
 	gtk_widget_show(button);
 
-	button = gtk_button_new_with_label(_("Reset"));
+	button = gtk_button_new_with_mnemonic(_("_Reset"));
+	g_signal_connect(G_OBJECT(button), "clicked",
+			 G_CALLBACK(buddy_icon_reset_cb), dialog);
 	gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
 	gtk_widget_show(button);
 
@@ -773,6 +881,9 @@
 	if (dialog->protocol_opt_entries != NULL)
 		g_list_free(dialog->protocol_opt_entries);
 
+	if (dialog->buddy_icon_filesel)
+		gtk_widget_destroy(dialog->buddy_icon_filesel);
+
 	g_free(dialog);
 }