changeset 7179:819905ce7bc0

[gaim-migrate @ 7747] The protocol icon for an account in the accounts window will now "pulse" when signing the account on. It provides a nice visual effect showing that an account is attempting to connect, without hiding any information or taking up additional screen real-estate. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Mon, 06 Oct 2003 22:13:08 +0000
parents eb3356588ef5
children a9c90a88c5ee
files ChangeLog src/gtkaccount.c
diffstat 2 files changed, 99 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Oct 06 21:55:43 2003 +0000
+++ b/ChangeLog	Mon Oct 06 22:13:08 2003 +0000
@@ -13,6 +13,8 @@
 	  the information doesn't exist if the profile is empty (parts by
 	  Nathan Poznick)
 	* Added startup notification support for window managers that support it.
+	* The protocol icon for an account in the accounts window will now
+	  "pulse" when signing the account on.
 	* Zephyr formatting fixes (Arun A Tharuvai)
 	* Zephyr can connect to chats (Karsten Huneycutt)
 	* SSL support can now be provided by third party plugins.
--- a/src/gtkaccount.c	Mon Oct 06 21:55:43 2003 +0000
+++ b/src/gtkaccount.c	Mon Oct 06 22:13:08 2003 +0000
@@ -49,6 +49,7 @@
 	COLUMN_AUTOLOGIN,
 	COLUMN_PROTOCOL,
 	COLUMN_DATA,
+	COLUMN_PULSE_DATA,
 	NUM_COLUMNS
 };
 
@@ -132,6 +133,17 @@
 
 } AccountPrefsDialog;
 
+typedef struct
+{
+	GdkPixbuf *online_pixbuf;
+	gboolean pulse_to_grey;
+	float pulse_value;
+	int timeout;
+	GaimAccount *account;
+	GtkTreeModel *model;
+
+} GaimGtkPulseData;
+
 
 static AccountsWindow *accounts_window = NULL;
 
@@ -1291,11 +1303,43 @@
 /**************************************************************************
  * Accounts Dialog
  **************************************************************************/
+static void
+account_pulse_update(GaimGtkPulseData *pulse_data)
+{
+	GdkPixbuf *pixbuf;
+	GtkTreeIter iter;
+	size_t index = g_list_index(gaim_accounts_get_all(), pulse_data->account);
+
+	if (gtk_tree_model_iter_nth_child(pulse_data->model, &iter, NULL, index))
+	{
+		pixbuf = gdk_pixbuf_copy(pulse_data->online_pixbuf);
+
+		gdk_pixbuf_saturate_and_pixelate(pixbuf, pixbuf,
+										 pulse_data->pulse_value, FALSE);
+
+		if (pulse_data->pulse_to_grey)
+			pulse_data->pulse_value += 0.20;
+		else
+			pulse_data->pulse_value -= 0.20;
+
+		if (pulse_data->pulse_value >= 1)
+			pulse_data->pulse_to_grey = FALSE;
+		else if (pulse_data->pulse_value <= 0)
+			pulse_data->pulse_to_grey = TRUE;
+
+		gtk_list_store_set(GTK_LIST_STORE(pulse_data->model), &iter,
+						   COLUMN_ICON, pixbuf, -1);
+
+		if (pixbuf != NULL)
+			g_object_unref(G_OBJECT(pixbuf));
+	}
+}
 
 static void
 signed_on_off_cb(GaimConnection *gc, AccountsWindow *dialog)
 {
 	GaimAccount *account = gaim_connection_get_account(gc);
+	GaimGtkPulseData *pulse_data;
 	GtkTreeModel *model = GTK_TREE_MODEL(dialog->model);
 	GtkTreeIter iter;
 	GdkPixbuf *pixbuf, *scale = NULL;
@@ -1303,6 +1347,19 @@
 
 	if (gtk_tree_model_iter_nth_child(model, &iter, NULL, index))
 	{
+		gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter,
+						   COLUMN_PULSE_DATA, &pulse_data, -1);
+
+		if (pulse_data != NULL)
+		{
+			if (pulse_data->timeout > 0)
+				g_source_remove(pulse_data->timeout);
+
+			g_object_unref(G_OBJECT(pulse_data->online_pixbuf));
+
+			g_free(pulse_data);
+		}
+
 		pixbuf = create_prpl_icon(account);
 
 		if (pixbuf != NULL)
@@ -1317,6 +1374,7 @@
 		gtk_list_store_set(dialog->model, &iter,
 						   COLUMN_ICON, scale,
 						   COLUMN_ONLINE, gaim_account_is_connected(account),
+						   COLUMN_PULSE_DATA, NULL,
 						   -1);
 
 		if (pixbuf != NULL) g_object_unref(G_OBJECT(pixbuf));
@@ -1581,6 +1639,7 @@
 	GaimAccount *account;
 	GtkTreeModel *model = GTK_TREE_MODEL(dialog->model);
 	GtkTreeIter iter;
+	GaimGtkPulseData *pulse_data;
 	gboolean online;
 
 	gtk_tree_model_get_iter_from_string(model, &iter, path_str);
@@ -1589,10 +1648,44 @@
 					   COLUMN_ONLINE, &online,
 					   -1);
 
-	if (online) {
+	if (online)
+	{
 		account->gc->wants_to_die = TRUE;
 		gaim_account_disconnect(account);
-	} else {
+	}
+	else
+	{
+		GdkPixbuf *pixbuf;
+
+		pulse_data = g_new0(GaimGtkPulseData, 1);
+		pulse_data->pulse_to_grey = TRUE;
+		pulse_data->pulse_value   = 0;
+		pulse_data->account       = account;
+		pulse_data->model         = model;
+
+		pixbuf = create_prpl_icon(account);
+
+		if (pixbuf != NULL)
+		{
+			pulse_data->online_pixbuf =
+				gdk_pixbuf_scale_simple(pixbuf, 16, 16, GDK_INTERP_BILINEAR);
+
+			g_object_unref(G_OBJECT(pixbuf));
+		}
+
+		if (pulse_data->online_pixbuf == NULL)
+		{
+			g_free(pulse_data);
+		}
+		else
+		{
+			pulse_data->timeout = g_timeout_add(100,
+					(GSourceFunc)account_pulse_update, pulse_data);
+
+			gtk_list_store_set(GTK_LIST_STORE(model), &iter,
+							   COLUMN_PULSE_DATA, pulse_data);
+		}
+
 		gaim_account_connect(account);
 	}
 }
@@ -1758,7 +1851,8 @@
 	dialog->model = gtk_list_store_new(NUM_COLUMNS,
 									   GDK_TYPE_PIXBUF, G_TYPE_STRING,
 									   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
-									   G_TYPE_STRING, G_TYPE_POINTER);
+									   G_TYPE_STRING, G_TYPE_POINTER,
+									   G_TYPE_POINTER);
 
 	/* And now the actual treeview */
 	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->model));