]> git.0d.be Git - empathy.git/commitdiff
factor out compare_separator_and_groups
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 9 Mar 2010 13:20:21 +0000 (14:20 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Mon, 15 Mar 2010 08:28:41 +0000 (09:28 +0100)
libempathy-gtk/empathy-contact-list-store.c

index ccca221d96eb947c1d124826b414e6579d096200..0d3c44447225f32a5b2e99be7133b4082e0b124a 100644 (file)
@@ -1536,13 +1536,51 @@ contact_list_store_get_group (EmpathyContactListStore *store,
        }
 }
 
        }
 }
 
+static gint
+compare_separator_and_groups (gboolean is_separator_a,
+                             gboolean is_separator_b,
+                             gboolean is_favourite_a,
+                             gboolean is_favourite_b,
+                             const gchar *name_a,
+                             const gchar *name_b,
+                             EmpathyContact *contact_a,
+                             EmpathyContact *contact_b)
+{
+       if (is_separator_a || is_separator_b) {
+               /* We have at least one separator */
+               if (is_separator_a) {
+                       return -1;
+               } else if (is_separator_b) {
+                       return 1;
+               }
+       }
+
+       /* Favorites are displayed first */
+       if (is_favourite_a && !is_favourite_b) {
+               return -1;
+       } else if (!is_favourite_a && is_favourite_b) {
+               return 1;
+       /* One group and one contact */
+       } else if (!contact_a && contact_b) {
+               return 1;
+       } else if (contact_a && !contact_b) {
+               return -1;
+       } else if (!contact_a && !contact_b) {
+               /* Two groups */
+               return g_utf8_collate (name_a, name_b);
+       }
+
+       /* Two contacts, ordering depends of the sorting policy */
+       return 0;
+}
+
 static gint
 contact_list_store_state_sort_func (GtkTreeModel *model,
                                    GtkTreeIter  *iter_a,
                                    GtkTreeIter  *iter_b,
                                    gpointer      user_data)
 {
 static gint
 contact_list_store_state_sort_func (GtkTreeModel *model,
                                    GtkTreeIter  *iter_a,
                                    GtkTreeIter  *iter_b,
                                    gpointer      user_data)
 {
-       gint            ret_val = 0;
+       gint            ret_val;
        gchar          *name_a, *name_b;
        gboolean        is_separator_a, is_separator_b;
        gboolean        is_favourite_a, is_favourite_b;
        gchar          *name_a, *name_b;
        gboolean        is_separator_a, is_separator_b;
        gboolean        is_favourite_a, is_favourite_b;
@@ -1561,27 +1599,10 @@ contact_list_store_state_sort_func (GtkTreeModel *model,
                            EMPATHY_CONTACT_LIST_STORE_COL_IS_FAVOURITE, &is_favourite_b,
                            -1);
 
                            EMPATHY_CONTACT_LIST_STORE_COL_IS_FAVOURITE, &is_favourite_b,
                            -1);
 
-       /* Separator, favourites group, or other group? */
-       if (is_separator_a || is_separator_b) {
-               if (is_separator_a) {
-                       ret_val = -1;
-               } else if (is_separator_b) {
-                       ret_val = 1;
-               }
-       } else if (is_favourite_a && !is_favourite_b) {
-               ret_val = -1;
-       } else if (!is_favourite_a && is_favourite_b) {
-               ret_val = 1;
-       } else if (!contact_a && contact_b) {
-               ret_val = 1;
-       } else if (contact_a && !contact_b) {
-               ret_val = -1;
-       } else if (!contact_a && !contact_b) {
-               /* Handle groups */
-               ret_val = g_utf8_collate (name_a, name_b);
-       }
+       ret_val = compare_separator_and_groups (is_separator_a, is_separator_b,
+               is_favourite_a, is_favourite_b, name_a, name_b, contact_a, contact_b);
 
 
-       if (ret_val) {
+       if (ret_val != 0) {
                goto free_and_out;
        }
 
                goto free_and_out;
        }
 
@@ -1637,28 +1658,11 @@ contact_list_store_name_sort_func (GtkTreeModel *model,
                            EMPATHY_CONTACT_LIST_STORE_COL_IS_FAVOURITE, &is_favourite_b,
                            -1);
 
                            EMPATHY_CONTACT_LIST_STORE_COL_IS_FAVOURITE, &is_favourite_b,
                            -1);
 
-       /* If contact is NULL it means it's a group. */
+       ret_val = compare_separator_and_groups (is_separator_a, is_separator_b,
+               is_favourite_a, is_favourite_b, name_a, name_b, contact_a, contact_b);
 
 
-       if (is_separator_a || is_separator_b) {
-               if (is_separator_a) {
-                       ret_val = -1;
-               } else if (is_separator_b) {
-                       ret_val = 1;
-               }
-       } else if (is_favourite_a && !is_favourite_b) {
-               ret_val = -1;
-       } else if (!is_favourite_a && is_favourite_b) {
-               ret_val = 1;
-       } else if (!contact_a && contact_b) {
-               ret_val = 1;
-       } else if (contact_a && !contact_b) {
-               ret_val = -1;
-       } else {
+       if (ret_val == 0)
                ret_val = g_utf8_collate (name_a, name_b);
                ret_val = g_utf8_collate (name_a, name_b);
-       }
-
-       g_free (name_a);
-       g_free (name_b);
 
        if (contact_a) {
                g_object_unref (contact_a);
 
        if (contact_a) {
                g_object_unref (contact_a);