diff pidgin/gtkstatusbox.c @ 20407:1122d47583a1

explicit merge of 'd42ad2da81f881b2fbd2fb080cc70a843bc70d02' and '8582c561c020d2d1e8d358e2e7cd9e3da113ed9e' to branch 'im.pidgin.cpw.khc.msnp14'
author Ka-Hing Cheung <khc@hxbc.us>
date Wed, 02 May 2007 05:25:27 +0000
parents cf62255b0a74
children 89328a54948b 6b4e778ee4b4
line wrap: on
line diff
--- a/pidgin/gtkstatusbox.c	Sun Apr 15 20:12:06 2007 +0000
+++ b/pidgin/gtkstatusbox.c	Wed May 02 05:25:27 2007 +0000
@@ -1,6 +1,6 @@
 /*
  * @file gtkstatusbox.c GTK+ Status Selection Widget
- * @ingroup gtkui
+ * @ingroup pidgin
  *
  * pidgin
  *
@@ -106,13 +106,23 @@
 	/** A plain-English description of this item */
 	DESC_COLUMN,
 
-	/*
+	/**
 	 * This value depends on TYPE_COLUMN.  For POPULAR types,
 	 * this is the creation time.  For PRIMITIVE types,
 	 * this is the PurpleStatusPrimitive.
 	 */
 	DATA_COLUMN,
 
+	/**
+ 	 * This column stores the GdkPixbuf for the status emblem. Currently only 'saved' is stored
+ 	 */
+	EMBLEM_COLUMN,
+
+	/**
+ 	* This column stores whether to show the emblem.
+ 	*/
+	EMBLEM_VISIBLE_COLUMN,
+
 	NUM_COLUMNS
 };
 
@@ -540,6 +550,32 @@
 	                               );
 }
 
+static GdkPixbuf *
+pidgin_status_box_get_pixbuf(PidginStatusBox *status_box, PurpleStatusPrimitive prim)
+{
+	GdkPixbuf *pixbuf;
+	GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL);
+	if (prim == PURPLE_STATUS_UNAVAILABLE)
+		pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_BUSY,
+						 icon_size, "PidginStatusBox");
+	else if (prim == PURPLE_STATUS_AWAY)
+		pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AWAY,
+						 icon_size, "PidginStatusBox");
+	else if (prim == PURPLE_STATUS_EXTENDED_AWAY)
+		pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_XA,
+						 icon_size, "PidginStatusBox");
+	else if (prim == PURPLE_STATUS_INVISIBLE)
+		pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_INVISIBLE,
+						 icon_size, "PidginStatusBox");
+	else if (prim == PURPLE_STATUS_OFFLINE)
+		pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_OFFLINE,
+						 icon_size, "PidginStatusBox");
+	else
+		pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AVAILABLE,
+						 icon_size, "PidginStatusBox");
+	return pixbuf;
+}
+
 /**
  * This updates the text displayed on the status box so that it shows
  * the current status.  This is the only function in this file that
@@ -636,7 +672,6 @@
 	  {
 	    PurpleStatusType *status_type;
 	    PurpleStatusPrimitive prim;
-	    GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL);
 	    if (account_status) {
 	    	status_type = purple_status_get_type(purple_account_get_active_status(acct));
 	        prim = purple_status_type_get_primitive(status_type);
@@ -644,21 +679,7 @@
 	    	prim = purple_savedstatus_get_type(saved_status);
 	    }
 
-	    if (prim == PURPLE_STATUS_UNAVAILABLE)
-	      	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_BUSY,
-		   			         icon_size, "PidginStatusBox");
-	    else if (prim == PURPLE_STATUS_AWAY)
-	      	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AWAY,
-		 			         icon_size, "PidginStatusBox");
-	    else if (prim == PURPLE_STATUS_EXTENDED_AWAY)
-	      	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_XA,
-					         icon_size, "PidginStatusBox");
-	    else if (prim == PURPLE_STATUS_OFFLINE)
-	      	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_OFFLINE,
-					         icon_size, "PidginStatusBox");
-	    else
-	      	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AVAILABLE,
-					         icon_size, "PidginStatusBox");
+		pixbuf = pidgin_status_box_get_pixbuf(status_box, prim);
 #if 0
 		if (account_status)
 			pixbuf = pidgin_create_prpl_icon_with_status(acct,
@@ -876,17 +897,15 @@
 static void
 add_popular_statuses(PidginStatusBox *statusbox)
 {
-	GtkIconSize icon_size;
 	GList *list, *cur;
 	GdkPixbuf *pixbuf;
+	PidginStatusBoxItemType type = PIDGIN_STATUS_BOX_TYPE_POPULAR;
 
 	list = purple_savedstatuses_get_popular(6);
 	if (list == NULL)
 		/* Odd... oh well, nothing we can do about it. */
 		return;
 
-	icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL);
-
 	pidgin_status_box_add_separator(statusbox);
 
 	for (cur = list; cur != NULL; cur = cur->next)
@@ -899,21 +918,8 @@
 		/* Get an appropriate status icon */
 		prim = purple_savedstatus_get_type(saved);
 
-		if (prim == PURPLE_STATUS_UNAVAILABLE)
-			pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox),
-					PIDGIN_STOCK_STATUS_BUSY, icon_size, "PidginStatusBox");
-		else if (prim == PURPLE_STATUS_AWAY)
-			pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox),
-					PIDGIN_STOCK_STATUS_AWAY, icon_size, "PidginStatusBox");
-		else if (prim == PURPLE_STATUS_EXTENDED_AWAY)
-			pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox),
-					PIDGIN_STOCK_STATUS_XA, icon_size, "PidginStatusBox");
-		else if (prim == PURPLE_STATUS_OFFLINE)
-			pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox),
-					PIDGIN_STOCK_STATUS_OFFLINE, icon_size, "PidginStatusBox");
-		else
-			pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox),
-					PIDGIN_STOCK_STATUS_AVAILABLE, icon_size, "PidginStatusBox");
+
+		pixbuf = pidgin_status_box_get_pixbuf(statusbox, prim);
 
 		if (purple_savedstatus_is_transient(saved))
 		{
@@ -931,23 +937,10 @@
 				stripped = purple_markup_strip_html(message);
 				purple_util_chrreplace(stripped, '\n', ' ');
 			}
-#if 0
-			/* Overlay a disk in the bottom left corner */
-			emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox),
-						GTK_STOCK_SAVE, icon_size, "PidginStatusBox");
-			if (emblem != NULL)
-			{
-				width = gdk_pixbuf_get_width(pixbuf) / 2;
-				height = gdk_pixbuf_get_height(pixbuf) / 2;
-				gdk_pixbuf_composite(emblem, pixbuf, 0, height,
-							width, height, 0, height,
-							0.5, 0.5, GDK_INTERP_BILINEAR, 255);
-				g_object_unref(G_OBJECT(emblem));
-			}
-#endif
+			type = PIDGIN_STATUS_BOX_TYPE_SAVED_POPULAR;
 		}
 
-		pidgin_status_box_add(statusbox, PIDGIN_STATUS_BOX_TYPE_POPULAR,
+		pidgin_status_box_add(statusbox, type,
 				pixbuf, purple_savedstatus_get_title(saved), stripped,
 				GINT_TO_POINTER(purple_savedstatus_get_creation_time(saved)));
 		g_free(stripped);
@@ -1019,28 +1012,13 @@
 	{
 		PurpleStatusType *status_type = (PurpleStatusType *)l->data;
 		PurpleStatusPrimitive prim;
-		GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL);
 
 		if (!purple_status_type_is_user_settable(status_type))
 			continue;
 
             	prim = purple_status_type_get_primitive(status_type);
 
-            	if (prim == PURPLE_STATUS_UNAVAILABLE)
-                	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_BUSY,
-                       		                          icon_size, "PidginStatusBox");
-            	else if (prim == PURPLE_STATUS_AWAY)
-                	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AWAY,
-                       		                          icon_size, "PidginStatusBox");
-            	else if (prim == PURPLE_STATUS_EXTENDED_AWAY)
-                	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_XA,
-                        	                         icon_size, "PidginStatusBox");
-            	else if (prim == PURPLE_STATUS_OFFLINE)
-                	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_OFFLINE,
-                        	                         icon_size, "PidginStatusBox");
-            	else
-                	pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AVAILABLE,
-                        	                         icon_size, "PidginStatusBox");
+                pixbuf = pidgin_status_box_get_pixbuf(status_box, prim);
 
 		pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box),
 					PIDGIN_STATUS_BOX_TYPE_PRIMITIVE, pixbuf,
@@ -1083,7 +1061,7 @@
 			                                  icon_size, "PidginStatusBox");
 			pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_STATUS_OFFLINE,
 			                                  icon_size, "PidginStatusBox");
-			pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_STATUS_AVAILABLE_I,
+			pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_STATUS_INVISIBLE,
 			                                  icon_size, "PidginStatusBox");
 
 			pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_PRIMITIVE, pixbuf, _("Available"), NULL, GINT_TO_POINTER(PURPLE_STATUS_AVAILABLE));
@@ -1099,8 +1077,8 @@
 		add_popular_statuses(status_box);
 
 		pidgin_status_box_add_separator(PIDGIN_STATUS_BOX(status_box));
-		pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_CUSTOM, pixbuf, _("New..."), NULL, NULL);
-		pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_SAVED, pixbuf, _("Saved..."), NULL, NULL);
+		pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_CUSTOM, NULL, _("New..."), NULL, NULL);
+		pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_SAVED, NULL, _("Saved..."), NULL, NULL);
 		if (pixbuf)	g_object_unref(G_OBJECT(pixbuf));
 
 		status_menu_refresh_iter(status_box);
@@ -1606,6 +1584,7 @@
 {
 	GtkCellRenderer *text_rend;
 	GtkCellRenderer *icon_rend;
+	GtkCellRenderer *emblem_rend;
 	GtkTextBuffer *buffer;
 	GtkWidget *toplevel;
 	GtkTreeSelection *sel;
@@ -1621,9 +1600,11 @@
 	status_box->vsep = gtk_vseparator_new();
 	status_box->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
 
-	status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
-	status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
-;
+	status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, 
+					       G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN);
+	status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, 
+							G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN);
+
 	gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store));
 	gtk_list_store_append(status_box->store, &(status_box->iter));
 
@@ -1638,7 +1619,7 @@
 
 	text_rend = gtk_cell_renderer_text_new();
 	icon_rend = gtk_cell_renderer_pixbuf_new();
-
+	emblem_rend = gtk_cell_renderer_pixbuf_new();
 	status_box->popup_window = gtk_window_new (GTK_WINDOW_POPUP);
 
 	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (status_box));
@@ -1689,8 +1670,10 @@
 			status_box->column);
 	gtk_tree_view_column_pack_start(status_box->column, icon_rend, FALSE);
 	gtk_tree_view_column_pack_start(status_box->column, text_rend, TRUE);
+	gtk_tree_view_column_pack_start(status_box->column, emblem_rend, FALSE);
 	gtk_tree_view_column_set_attributes(status_box->column, icon_rend, "pixbuf", ICON_COLUMN, NULL);
 	gtk_tree_view_column_set_attributes(status_box->column, text_rend, "markup", TEXT_COLUMN, NULL);
+	gtk_tree_view_column_set_attributes(status_box->column, emblem_rend, "stock-id", EMBLEM_COLUMN, "visible", EMBLEM_VISIBLE_COLUMN, NULL);
 	gtk_container_add(GTK_CONTAINER(status_box->scrolled_window), status_box->tree_view);
 	gtk_widget_show(status_box->tree_view);
 	gtk_tree_view_set_search_column(GTK_TREE_VIEW(status_box->tree_view), TEXT_COLUMN);
@@ -2002,6 +1985,8 @@
 			TITLE_COLUMN, title,
 			DESC_COLUMN, desc,
 			DATA_COLUMN, data,
+			EMBLEM_VISIBLE_COLUMN, type == PIDGIN_STATUS_BOX_TYPE_SAVED_POPULAR,
+			EMBLEM_COLUMN, GTK_STOCK_SAVE,
 			-1);
 	g_free(text);
 }
@@ -2062,11 +2047,10 @@
 	if (status_box->buddy_icon == NULL)
 	{
 		/* Show a placeholder icon */
-		gchar *filename;
-		filename = g_build_filename(DATADIR, "pixmaps",
-				"pidgin", "insert-image.png", NULL);
-		status_box->buddy_icon = gdk_pixbuf_new_from_file(filename, NULL);
-		g_free(filename);
+		GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL);
+		status_box->buddy_icon = gtk_widget_render_icon(GTK_WIDGET(status_box),
+		                                                PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR,
+		                                                icon_size, "PidginStatusBox");
 	}
 
 	if (status_box->buddy_icon != NULL) {