diff options
-rw-r--r-- | libempathy-gtk/empathy-contact-list-store.c | 78 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-list-store.h | 1 | ||||
-rw-r--r-- | libempathy-gtk/empathy-contact-list-view.c | 13 | ||||
-rw-r--r-- | libempathy/empathy-tp-contact-list.c | 19 |
4 files changed, 76 insertions, 35 deletions
diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c index 7ff41d69a..6b35b0824 100644 --- a/libempathy-gtk/empathy-contact-list-store.c +++ b/libempathy-gtk/empathy-contact-list-store.c @@ -1038,6 +1038,7 @@ contact_list_store_add_contact (EmpathyContactListStore *store, GList *groups = NULL, *l; TpConnection *connection; EmpathyContactListFlags flags = 0; + char *protocol_name; priv = GET_PRIV (store); @@ -1055,12 +1056,23 @@ contact_list_store_add_contact (EmpathyContactListStore *store, flags = empathy_contact_manager_get_flags_for_connection ( EMPATHY_CONTACT_MANAGER (priv->list), connection); } + + tp_connection_parse_object_path (connection, &protocol_name, NULL); + if (!groups) { #if HAVE_FAVOURITE_CONTACTS GtkTreeIter iter_group; - contact_list_store_get_group (store, EMPATHY_CONTACT_LIST_STORE_UNGROUPED, - &iter_group, NULL, NULL, TRUE); + if (!tp_strdiff (protocol_name, "local-xmpp")) { + /* these are People Nearby */ + contact_list_store_get_group (store, + EMPATHY_CONTACT_LIST_STORE_PEOPLE_NEARBY, + &iter_group, NULL, NULL, TRUE); + } else { + contact_list_store_get_group (store, + EMPATHY_CONTACT_LIST_STORE_UNGROUPED, + &iter_group, NULL, NULL, TRUE); + } gtk_tree_store_insert_after (GTK_TREE_STORE (store), &iter, &iter_group, NULL); @@ -1090,6 +1102,8 @@ contact_list_store_add_contact (EmpathyContactListStore *store, add_contact_to_store (GTK_TREE_STORE (store), &iter, contact, flags); } + g_free (protocol_name); + /* Else add to each group. */ for (l = groups; l; l = l->next) { GtkTreeIter iter_group; @@ -1531,6 +1545,20 @@ contact_list_store_get_group (EmpathyContactListStore *store, } static gint +get_position (const char **strv, + const char *str) +{ + int i; + + for (i = 0; strv[i] != NULL; i++) { + if (!tp_strdiff (strv[i], str)) + return i; + } + + return -1; +} + +static gint compare_separator_and_groups (gboolean is_separator_a, gboolean is_separator_b, const gchar *name_a, @@ -1540,6 +1568,18 @@ compare_separator_and_groups (gboolean is_separator_a, gboolean fake_group_a, gboolean fake_group_b) { + /* these two lists are the sorted list of fake groups to include at the + * top and bottom of the roster */ + const char *top_groups[] = { + EMPATHY_CONTACT_LIST_STORE_FAVORITE, + NULL + }; + + const char *bottom_groups[] = { + EMPATHY_CONTACT_LIST_STORE_UNGROUPED, + NULL + }; + if (is_separator_a || is_separator_b) { /* We have at least one separator */ if (is_separator_a) { @@ -1555,18 +1595,34 @@ compare_separator_and_groups (gboolean is_separator_a, } else if (contact_a && !contact_b) { return -1; } else if (!contact_a && !contact_b) { - /* Two groups. The 'Ungrouped' fake group is display at the bottom of the - * contact list and the 'Favorites' at the top. */ - if (fake_group_a && !tp_strdiff (name_a, EMPATHY_CONTACT_LIST_STORE_UNGROUPED)) - return 1; - else if (fake_group_b && !tp_strdiff (name_b, EMPATHY_CONTACT_LIST_STORE_UNGROUPED)) - return -1; - else if (fake_group_a && !tp_strdiff (name_a, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) + gboolean a_in_top, b_in_top, a_in_bottom, b_in_bottom; + + a_in_top = fake_group_a && + tp_strv_contains (top_groups, name_a); + b_in_top = fake_group_b && + tp_strv_contains (top_groups, name_b); + a_in_bottom = fake_group_b && + tp_strv_contains (bottom_groups, name_a); + b_in_bottom = fake_group_b && + tp_strv_contains (bottom_groups, name_b); + + if (a_in_top && b_in_top) { + /* compare positions */ + return CLAMP (get_position (top_groups, name_a) - + get_position (top_groups, name_b), + -1, 1); + } else if (a_in_bottom && b_in_bottom) { + /* compare positions */ + return CLAMP (get_position (bottom_groups, name_a) - + get_position (bottom_groups, name_b), + -1, 1); + } else if (a_in_top || b_in_bottom) { return -1; - else if (fake_group_b && !tp_strdiff (name_b, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) + } else if (b_in_top || a_in_bottom) { return 1; - else + } else { return g_utf8_collate (name_a, name_b); + } } /* Two contacts, ordering depends of the sorting policy */ diff --git a/libempathy-gtk/empathy-contact-list-store.h b/libempathy-gtk/empathy-contact-list-store.h index 26a2cc2b2..b8008cadb 100644 --- a/libempathy-gtk/empathy-contact-list-store.h +++ b/libempathy-gtk/empathy-contact-list-store.h @@ -70,6 +70,7 @@ typedef enum { #define EMPATHY_CONTACT_LIST_STORE_UNGROUPED _("Ungrouped") #define EMPATHY_CONTACT_LIST_STORE_FAVORITE _("Favorite People") +#define EMPATHY_CONTACT_LIST_STORE_PEOPLE_NEARBY _("People Nearby") struct _EmpathyContactListStore { GtkTreeStore parent; diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c index 9d85ecb87..05823435a 100644 --- a/libempathy-gtk/empathy-contact-list-view.c +++ b/libempathy-gtk/empathy-contact-list-view.c @@ -942,11 +942,14 @@ contact_list_view_group_icon_cell_data_func (GtkTreeViewColumn *tree_column, if (!is_group) goto out; - if (tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) - goto out; - - pixbuf = empathy_pixbuf_from_icon_name ("emblem-favorite", - GTK_ICON_SIZE_MENU); + if (!tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) { + pixbuf = empathy_pixbuf_from_icon_name ("emblem-favorite", + GTK_ICON_SIZE_MENU); + } + else if (!tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_PEOPLE_NEARBY)) { + pixbuf = empathy_pixbuf_from_icon_name ("im-local-xmpp", + GTK_ICON_SIZE_MENU); + } out: g_object_set (cell, diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c index 9288baa4c..95ec3bea2 100644 --- a/libempathy/empathy-tp-contact-list.c +++ b/libempathy/empathy-tp-contact-list.c @@ -43,7 +43,6 @@ typedef struct { EmpathyTpContactFactory *factory; TpConnection *connection; - const gchar *protocol_group; TpChannel *publish; TpChannel *subscribe; @@ -860,7 +859,6 @@ static void tp_contact_list_constructed (GObject *list) { EmpathyTpContactListPriv *priv = GET_PRIV (list); - gchar *protocol_name = NULL; priv->factory = empathy_tp_contact_factory_dup_singleton (priv->connection); @@ -902,15 +900,6 @@ tp_contact_list_constructed (GObject *list) tp_contact_list_new_channel_cb, NULL, NULL, list, NULL); - - /* Check for protocols that does not support contact groups. We can - * put all contacts into a special group in that case. - * FIXME: Default group should be an information in the profile */ - tp_connection_parse_object_path (priv->connection, &protocol_name, NULL); - if (!tp_strdiff (protocol_name, "local-xmpp")) { - priv->protocol_group = _("People nearby"); - } - g_free (protocol_name); } static void @@ -1112,10 +1101,6 @@ tp_contact_list_get_all_groups (EmpathyContactList *list) l->data = g_strdup (l->data); } - if (priv->protocol_group) { - ret = g_list_prepend (ret, g_strdup (priv->protocol_group)); - } - return ret; } @@ -1141,10 +1126,6 @@ tp_contact_list_get_groups (EmpathyContactList *list, } } - if (priv->protocol_group) { - ret = g_list_prepend (ret, g_strdup (priv->protocol_group)); - } - return ret; } |