[empathy] roster-view: store all the children in EmpathyRosterGroup, not only the displayed one
- From: Guillaume Desmottes <gdesmott src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [empathy] roster-view: store all the children in EmpathyRosterGroup, not only the displayed one
- Date: Thu, 14 Jun 2012 07:51:13 +0000 (UTC)
commit 674890e965f49fe00b3cc7365ce6d860583d0c88
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date: Tue Jun 12 14:26:29 2012 +0200
roster-view: store all the children in EmpathyRosterGroup, not only the displayed one
When checking if a contact is already in the 'top' list, we don't care if it's
actually displayed or not.
This makes the whole code more logic as only storing the displayed widgets in
EmpathyRosterGroup was a bit weird.
libempathy-gtk/empathy-roster-view.c | 101 +++++++++++++++++++++++-----------
1 files changed, 69 insertions(+), 32 deletions(-)
---
diff --git a/libempathy-gtk/empathy-roster-view.c b/libempathy-gtk/empathy-roster-view.c
index 4f89e4e..4b59316 100644
--- a/libempathy-gtk/empathy-roster-view.c
+++ b/libempathy-gtk/empathy-roster-view.c
@@ -211,7 +211,7 @@ lookup_roster_group (EmpathyRosterView *self,
return g_hash_table_lookup (self->priv->roster_groups, group);
}
-static void
+static EmpathyRosterGroup *
ensure_roster_group (EmpathyRosterView *self,
const gchar *group)
{
@@ -219,7 +219,7 @@ ensure_roster_group (EmpathyRosterView *self,
roster_group = (GtkWidget *) lookup_roster_group (self, group);
if (roster_group != NULL)
- return;
+ return EMPATHY_ROSTER_GROUP (roster_group);
roster_group = empathy_roster_group_new (group);
@@ -231,6 +231,27 @@ ensure_roster_group (EmpathyRosterView *self,
g_hash_table_insert (self->priv->roster_groups, g_strdup (group),
roster_group);
+
+ return EMPATHY_ROSTER_GROUP (roster_group);
+}
+
+static void
+update_group_widgets (EmpathyRosterView *self,
+ EmpathyRosterGroup *group,
+ EmpathyRosterContact *contact,
+ gboolean add)
+{
+ guint old_count, count;
+
+ old_count = empathy_roster_group_get_widgets_count (group);
+
+ if (add)
+ count = empathy_roster_group_add_widget (group, GTK_WIDGET (contact));
+ else
+ count = empathy_roster_group_remove_widget (group, GTK_WIDGET (contact));
+
+ if (count != old_count)
+ egg_list_box_child_changed (EGG_LIST_BOX (self), GTK_WIDGET (group));
}
static void
@@ -240,16 +261,23 @@ add_to_group (EmpathyRosterView *self,
{
GtkWidget *contact;
GHashTable *contacts;
+ EmpathyRosterGroup *roster_group = NULL;
contacts = g_hash_table_lookup (self->priv->roster_contacts, individual);
if (contacts == NULL)
return;
if (tp_strdiff (group, NO_GROUP))
- ensure_roster_group (self, group);
+ roster_group = ensure_roster_group (self, group);
contact = add_roster_contact (self, individual, group);
g_hash_table_insert (contacts, g_strdup (group), contact);
+
+ if (roster_group != NULL)
+ {
+ update_group_widgets (self, roster_group,
+ EMPATHY_ROSTER_CONTACT (contact), TRUE);
+ }
}
static void
@@ -301,30 +329,6 @@ individual_added (EmpathyRosterView *self,
}
static void
-update_group_widgets_count (EmpathyRosterView *self,
- EmpathyRosterGroup *group,
- EmpathyRosterContact *contact,
- gboolean displayed)
-{
- if (displayed)
- {
- if (empathy_roster_group_add_widget (group, GTK_WIDGET (contact)) == 1)
- {
- egg_list_box_child_changed (EGG_LIST_BOX (self),
- GTK_WIDGET (group));
- }
- }
- else
- {
- if (empathy_roster_group_remove_widget (group, GTK_WIDGET (contact)) == 0)
- {
- egg_list_box_child_changed (EGG_LIST_BOX (self),
- GTK_WIDGET (group));
- }
- }
-}
-
-static void
set_event_icon_on_individual (EmpathyRosterView *self,
FolksIndividual *individual,
const gchar *icon)
@@ -457,7 +461,7 @@ individual_removed (EmpathyRosterView *self,
group = lookup_roster_group (self, group_name);
if (group != NULL)
{
- update_group_widgets_count (self, group,
+ update_group_widgets (self, group,
EMPATHY_ROSTER_CONTACT (contact), FALSE);
}
@@ -689,8 +693,31 @@ static void
add_to_displayed (EmpathyRosterView *self,
EmpathyRosterContact *contact)
{
+ FolksIndividual *individual;
+ GHashTable *contacts;
+ GHashTableIter iter;
+ gpointer v;
+
+ if (g_hash_table_lookup (self->priv->displayed_contacts, contact) != NULL)
+ return;
+
g_hash_table_add (self->priv->displayed_contacts, contact);
update_empty (self, FALSE);
+
+ /* Groups of this contact may now be displayed if we just displays the first
+ * child in this group. */
+ individual = empathy_roster_contact_get_individual (contact);
+ contacts = g_hash_table_lookup (self->priv->roster_contacts, individual);
+ if (contacts == NULL)
+ return;
+
+ g_hash_table_iter_init (&iter, contacts);
+ while (g_hash_table_iter_next (&iter, NULL, &v))
+ {
+ GtkWidget *group = GTK_WIDGET (v);
+
+ egg_list_box_child_changed (EGG_LIST_BOX (self), group);
+ }
}
static void
@@ -752,8 +779,6 @@ filter_contact (EmpathyRosterView *self,
if (group != NULL)
{
- update_group_widgets_count (self, group, contact, displayed);
-
/* When searching, always display even if the group is closed */
if (!is_searching (self) &&
!gtk_expander_get_expanded (GTK_EXPANDER (group)))
@@ -777,7 +802,19 @@ static gboolean
filter_group (EmpathyRosterView *self,
EmpathyRosterGroup *group)
{
- return empathy_roster_group_get_widgets_count (group);
+ GList *widgets, *l;
+
+ /* Display the group if it contains at least one displayed contact */
+ widgets = empathy_roster_group_get_widgets (group);
+ for (l = widgets; l != NULL; l = g_list_next (l))
+ {
+ EmpathyRosterContact *contact = l->data;
+
+ if (contact_should_be_displayed (self, contact))
+ return TRUE;
+ }
+
+ return FALSE;
}
static gboolean
@@ -860,7 +897,7 @@ remove_from_group (EmpathyRosterView *self,
if (roster_group != NULL)
{
- update_group_widgets_count (self, roster_group,
+ update_group_widgets (self, roster_group,
EMPATHY_ROSTER_CONTACT (contact), FALSE);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]