[empathy] Show status messages in compact view (#614052)



commit 802baeadd5caf73b813462791b29d052a7134cd6
Author: Will Thompson <will thompson collabora co uk>
Date:   Fri Mar 26 20:09:45 2010 +0000

    Show status messages in compact view (#614052)
    
    Previously, when the contact list was in compact mode your contacts'
    status mesasges were not shown. With this patch, status messages are
    shown in the space to the right of the contact's name, in the same
    small, grey font as in the expanded view.
    
    Only custom messages are shown; fallback strings like _("Available") are
    redundant and made the list way too hard to read, so are not shown.
    
    This patch does show that most of my contacts are too boring to have
    status messages...

 libempathy-gtk/empathy-cell-renderer-text.c |   59 ++++++++++++++++++++-------
 libempathy-gtk/empathy-contact-list-store.c |   12 ++++--
 libempathy-gtk/empathy-contact-list-store.h |    3 +-
 libempathy-gtk/empathy-contact-list-view.c  |   16 +++-----
 4 files changed, 60 insertions(+), 30 deletions(-)
---
diff --git a/libempathy-gtk/empathy-cell-renderer-text.c b/libempathy-gtk/empathy-cell-renderer-text.c
index 29c6bde..200420f 100644
--- a/libempathy-gtk/empathy-cell-renderer-text.c
+++ b/libempathy-gtk/empathy-cell-renderer-text.c
@@ -31,13 +31,14 @@
 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyCellRendererText)
 typedef struct {
 	gchar    *name;
+	TpConnectionPresenceType presence_type;
 	gchar    *status;
 	gboolean  is_group;
 
 	gboolean  is_valid;
 	gboolean  is_selected;
 
-	gboolean  show_status;
+	gboolean  compact;
 } EmpathyCellRendererTextPriv;
 
 static void cell_renderer_text_finalize          (GObject                     *object);
@@ -71,9 +72,10 @@ static void cell_renderer_text_update_text       (EmpathyCellRendererText      *
 enum {
 	PROP_0,
 	PROP_NAME,
+	PROP_PRESENCE_TYPE,
 	PROP_STATUS,
 	PROP_IS_GROUP,
-	PROP_SHOW_STATUS,
+	PROP_COMPACT
 };
 
 G_DEFINE_TYPE (EmpathyCellRendererText, empathy_cell_renderer_text, GTK_TYPE_CELL_RENDERER_TEXT);
@@ -100,17 +102,27 @@ empathy_cell_renderer_text_class_init (EmpathyCellRendererTextClass *klass)
 		G_PARAM_READWRITE);
 	g_object_class_install_property (object_class, PROP_NAME, spec);
 
-	spec = g_param_spec_string ("status", "Status",
-		"Contact status string", NULL, G_PARAM_READWRITE);
+	spec = g_param_spec_uint ("presence-type", "TpConnectionPresenceType",
+		"The contact's presence type",
+		0, G_MAXUINT, /* Telepathy enum, can be extended */
+		TP_CONNECTION_PRESENCE_TYPE_UNKNOWN,
+		G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_PRESENCE_TYPE,
+		spec);
+
+	spec = g_param_spec_string ("status", "Status message",
+		"Contact's custom status message", NULL, G_PARAM_READWRITE);
 	g_object_class_install_property (object_class, PROP_STATUS, spec);
 
 	spec = g_param_spec_boolean ("is_group", "Is group",
 		"Whether this cell is a group", FALSE, G_PARAM_READWRITE);
 	g_object_class_install_property (object_class, PROP_IS_GROUP, spec);
 
-	spec = g_param_spec_boolean ("show-status", "Show status",
-		"Whether to show the status line", TRUE, G_PARAM_READWRITE);
-	g_object_class_install_property (object_class, PROP_SHOW_STATUS, spec);
+	spec = g_param_spec_boolean ("compact", "Compact",
+		"TRUE to show the status alongside the contact name;"
+		"FALSE to show it on its own line",
+		FALSE, G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_COMPACT, spec);
 
 	g_type_class_add_private (object_class, sizeof (EmpathyCellRendererTextPriv));
 }
@@ -128,7 +140,7 @@ empathy_cell_renderer_text_init (EmpathyCellRendererText *cell)
 
 	priv->name = g_strdup ("");
 	priv->status = g_strdup ("");
-	priv->show_status = TRUE;
+	priv->compact = FALSE;
 }
 
 static void
@@ -162,14 +174,17 @@ cell_renderer_text_get_property (GObject    *object,
 	case PROP_NAME:
 		g_value_set_string (value, priv->name);
 		break;
+	case PROP_PRESENCE_TYPE:
+		g_value_set_uint (value, priv->presence_type);
+		break;
 	case PROP_STATUS:
 		g_value_set_string (value, priv->status);
 		break;
 	case PROP_IS_GROUP:
 		g_value_set_boolean (value, priv->is_group);
 		break;
-	case PROP_SHOW_STATUS:
-		g_value_set_boolean (value, priv->show_status);
+	case PROP_COMPACT:
+		g_value_set_boolean (value, priv->compact);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -198,6 +213,10 @@ cell_renderer_text_set_property (GObject      *object,
 		g_strdelimit (priv->name, "\n\r\t", ' ');
 		priv->is_valid = FALSE;
 		break;
+	case PROP_PRESENCE_TYPE:
+		priv->presence_type = g_value_get_uint (value);
+		priv->is_valid = FALSE;
+		break;
 	case PROP_STATUS:
 		g_free (priv->status);
 		str = g_value_get_string (value);
@@ -209,8 +228,8 @@ cell_renderer_text_set_property (GObject      *object,
 		priv->is_group = g_value_get_boolean (value);
 		priv->is_valid = FALSE;
 		break;
-	case PROP_SHOW_STATUS:
-		priv->show_status = g_value_get_boolean (value);
+	case PROP_COMPACT:
+		priv->compact = g_value_get_boolean (value);
 		priv->is_valid = FALSE;
 		break;
 	default:
@@ -320,10 +339,20 @@ cell_renderer_text_update_text (EmpathyCellRendererText *cell,
 		pango_attr_list_insert (attr_list, attr_color);
 	}
 
-	if (!priv->status || !priv->status[0] || !priv->show_status) {
-		str = g_strdup (priv->name);
+	if (priv->compact) {
+		if (EMP_STR_EMPTY (priv->status)) {
+			str = g_strdup (priv->name);
+		} else {
+			str = g_strdup_printf ("%s %s", priv->name, priv->status);
+		}
 	} else {
-		str = g_strdup_printf ("%s\n%s", priv->name, priv->status);
+		const gchar *status = priv->status;
+
+		if (EMP_STR_EMPTY (priv->status)) {
+			status = empathy_presence_get_default_message (priv->presence_type);
+		}
+
+		str = g_strdup_printf ("%s\n%s", priv->name, status);
 	}
 
 	g_object_set (cell,
diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c
index 9feb446..7ff41d6 100644
--- a/libempathy-gtk/empathy-contact-list-store.c
+++ b/libempathy-gtk/empathy-contact-list-store.c
@@ -833,8 +833,9 @@ contact_list_store_setup (EmpathyContactListStore *store)
 		GDK_TYPE_PIXBUF,      /* Avatar pixbuf */
 		G_TYPE_BOOLEAN,       /* Avatar pixbuf visible */
 		G_TYPE_STRING,        /* Name */
+		G_TYPE_UINT,          /* Presence type */
 		G_TYPE_STRING,        /* Status string */
-		G_TYPE_BOOLEAN,       /* Show status */
+		G_TYPE_BOOLEAN,       /* Compact view */
 		EMPATHY_TYPE_CONTACT, /* Contact type */
 		G_TYPE_BOOLEAN,       /* Is group */
 		G_TYPE_BOOLEAN,       /* Is active */
@@ -1277,8 +1278,11 @@ contact_list_store_contact_update (EmpathyContactListStore *store,
 				    EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR, pixbuf_avatar,
 				    EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR_VISIBLE, show_avatar,
 				    EMPATHY_CONTACT_LIST_STORE_COL_NAME, empathy_contact_get_name (contact),
-				    EMPATHY_CONTACT_LIST_STORE_COL_STATUS, empathy_contact_get_status (contact),
-				    EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE, !priv->is_compact,
+				    EMPATHY_CONTACT_LIST_STORE_COL_PRESENCE_TYPE,
+				      empathy_contact_get_presence (contact),
+				    EMPATHY_CONTACT_LIST_STORE_COL_STATUS,
+				      empathy_contact_get_presence_message (contact),
+				    EMPATHY_CONTACT_LIST_STORE_COL_COMPACT, priv->is_compact,
 				    EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, FALSE,
 				    EMPATHY_CONTACT_LIST_STORE_COL_IS_ONLINE, now_online,
 				    EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, FALSE,
@@ -1751,7 +1755,7 @@ contact_list_store_update_list_mode_foreach (GtkTreeModel           *model,
 	gtk_tree_store_set (GTK_TREE_STORE (store), iter,
 			    EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, pixbuf_status,
 			    EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR_VISIBLE, show_avatar,
-			    EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE, !priv->is_compact,
+			    EMPATHY_CONTACT_LIST_STORE_COL_COMPACT, priv->is_compact,
 			    -1);
 
 	return FALSE;
diff --git a/libempathy-gtk/empathy-contact-list-store.h b/libempathy-gtk/empathy-contact-list-store.h
index 1b36ea6..26a2cc2 100644
--- a/libempathy-gtk/empathy-contact-list-store.h
+++ b/libempathy-gtk/empathy-contact-list-store.h
@@ -53,8 +53,9 @@ typedef enum {
 	EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR,
 	EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR_VISIBLE,
 	EMPATHY_CONTACT_LIST_STORE_COL_NAME,
+	EMPATHY_CONTACT_LIST_STORE_COL_PRESENCE_TYPE,
 	EMPATHY_CONTACT_LIST_STORE_COL_STATUS,
-	EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE,
+	EMPATHY_CONTACT_LIST_STORE_COL_COMPACT,
 	EMPATHY_CONTACT_LIST_STORE_COL_CONTACT,
 	EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP,
 	EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE,
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index 8e83422..9d85ecb 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -1027,22 +1027,12 @@ contact_list_view_text_cell_data_func (GtkTreeViewColumn     *tree_column,
 {
 	gboolean is_group;
 	gboolean is_active;
-	gboolean show_status;
-	gchar *name;
 
 	gtk_tree_model_get (model, iter,
 			    EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group,
 			    EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE, &is_active,
-			    EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE, &show_status,
-			    EMPATHY_CONTACT_LIST_STORE_COL_NAME, &name,
 			    -1);
 
-	g_object_set (cell,
-		      "show-status", show_status,
-		      "text", name,
-		      NULL);
-	g_free (name);
-
 	contact_list_view_cell_set_background (view, cell, is_group, is_active);
 }
 
@@ -1224,9 +1214,15 @@ contact_list_view_setup (EmpathyContactListView *view)
 	gtk_tree_view_column_add_attribute (col, cell,
 					    "name", EMPATHY_CONTACT_LIST_STORE_COL_NAME);
 	gtk_tree_view_column_add_attribute (col, cell,
+					    "text", EMPATHY_CONTACT_LIST_STORE_COL_NAME);
+	gtk_tree_view_column_add_attribute (col, cell,
+					    "presence-type", EMPATHY_CONTACT_LIST_STORE_COL_PRESENCE_TYPE);
+	gtk_tree_view_column_add_attribute (col, cell,
 					    "status", EMPATHY_CONTACT_LIST_STORE_COL_STATUS);
 	gtk_tree_view_column_add_attribute (col, cell,
 					    "is_group", EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP);
+	gtk_tree_view_column_add_attribute (col, cell,
+					    "compact", EMPATHY_CONTACT_LIST_STORE_COL_COMPACT);
 
 	/* Audio Call Icon */
 	cell = empathy_cell_renderer_activatable_new ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]