]> git.0d.be Git - empathy.git/commitdiff
Show status messages in compact view (#614052)
authorWill Thompson <will.thompson@collabora.co.uk>
Fri, 26 Mar 2010 20:09:45 +0000 (20:09 +0000)
committerWill Thompson <will.thompson@collabora.co.uk>
Tue, 30 Mar 2010 10:30:19 +0000 (11:30 +0100)
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
libempathy-gtk/empathy-contact-list-store.c
libempathy-gtk/empathy-contact-list-store.h
libempathy-gtk/empathy-contact-list-view.c

index 29c6bde92e716b578b89fb56eeac4bdb05744f63..200420f17eafa2cdcf3918e5353c866d92431ee2 100644 (file)
 #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,
index 9feb4461fd5bf0c52e9e62a85be4a97cccdf3aa2..7ff41d69af38eb5368d99388ae9171cea79dc94c 100644 (file)
@@ -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;
index 1b36ea651a79fc4af49d867dee66472b6821ee56..26a2cc2b292e0cf5d2144bf9e31c7f2b5b67a766 100644 (file)
@@ -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,
index 8e8342275c08d92dca732bceff9497dfaf4e4e02..9d85ecb8733cdd5e41bcfc35c727882c37d552af 100644 (file)
@@ -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);
 }
 
@@ -1223,10 +1213,16 @@ 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 ();