From 505b19ef1cd82dd94c701c3229cbab6626855167 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 22 Mar 2010 16:19:14 +1100 Subject: Make People Nearby into a Fake Group like Ungrouped and Favourites --- libempathy-gtk/empathy-contact-list-store.c | 18 ++++++++++++++++-- libempathy-gtk/empathy-contact-list-store.h | 1 + libempathy/empathy-tp-contact-list.c | 19 ------------------- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c index 9feb4461f..25a2e7ad2 100644 --- a/libempathy-gtk/empathy-contact-list-store.c +++ b/libempathy-gtk/empathy-contact-list-store.c @@ -1037,6 +1037,7 @@ contact_list_store_add_contact (EmpathyContactListStore *store, GList *groups = NULL, *l; TpConnection *connection; EmpathyContactListFlags flags = 0; + char *protocol_name; priv = GET_PRIV (store); @@ -1054,12 +1055,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); @@ -1089,6 +1101,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; diff --git a/libempathy-gtk/empathy-contact-list-store.h b/libempathy-gtk/empathy-contact-list-store.h index 1b36ea651..7fa400e3d 100644 --- a/libempathy-gtk/empathy-contact-list-store.h +++ b/libempathy-gtk/empathy-contact-list-store.h @@ -69,6 +69,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/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c index b273ad20e..49168cdb1 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; @@ -783,7 +782,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); @@ -825,15 +823,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 @@ -1035,10 +1024,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; } @@ -1064,10 +1049,6 @@ tp_contact_list_get_groups (EmpathyContactList *list, } } - if (priv->protocol_group) { - ret = g_list_prepend (ret, g_strdup (priv->protocol_group)); - } - return ret; } -- cgit v1.2.3 From 9cd08545e92314b01ca95b5432ef612720e24afb Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 22 Mar 2010 16:20:04 +1100 Subject: Add an icon for People Nearby --- libempathy-gtk/empathy-contact-list-view.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c index 8e8342275..5aab817d7 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, -- cgit v1.2.3 From 1a665bc714aa3c9789c3f0c46307f3e93679f15e Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 22 Mar 2010 17:02:21 +1100 Subject: Clean up sorting function to take top/bottom lists of fake groups Even if we choose not to sort People Nearby, this patch is useful because it makes how the sorting of groups is done much clearer and allows us to add other fake groups in the future. --- libempathy-gtk/empathy-contact-list-store.c | 61 ++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c index 25a2e7ad2..55cddd4cc 100644 --- a/libempathy-gtk/empathy-contact-list-store.c +++ b/libempathy-gtk/empathy-contact-list-store.c @@ -1540,6 +1540,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, @@ -1550,6 +1564,19 @@ 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, + EMPATHY_CONTACT_LIST_STORE_PEOPLE_NEARBY, + 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) { @@ -1565,18 +1592,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)) + 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_a && !tp_strdiff (name_a, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) - 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 */ -- cgit v1.2.3 From fff76809babe6a154cd548e9bc3aa43199e9eda9 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Tue, 30 Mar 2010 21:35:17 +1100 Subject: Remove People Nearby from sorted groups list --- libempathy-gtk/empathy-contact-list-store.c | 1 - 1 file changed, 1 deletion(-) diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c index 55cddd4cc..152dd61b7 100644 --- a/libempathy-gtk/empathy-contact-list-store.c +++ b/libempathy-gtk/empathy-contact-list-store.c @@ -1568,7 +1568,6 @@ compare_separator_and_groups (gboolean is_separator_a, * top and bottom of the roster */ const char *top_groups[] = { EMPATHY_CONTACT_LIST_STORE_FAVORITE, - EMPATHY_CONTACT_LIST_STORE_PEOPLE_NEARBY, NULL }; -- cgit v1.2.3