]> git.0d.be Git - empathy.git/commitdiff
individual-store: keep track of the number of events associated with each row
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 7 Jun 2011 12:53:45 +0000 (14:53 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Wed, 8 Jun 2011 09:14:20 +0000 (11:14 +0200)
libempathy-gtk/empathy-individual-store.c
libempathy-gtk/empathy-individual-store.h
src/empathy-main-window.c

index ac1a96c0231ef880c505c3df899be5c06dd5df45..e4e644424533c6acf643ab65be5ac95f9a478b67 100644 (file)
@@ -1572,6 +1572,7 @@ individual_store_setup (EmpathyIndividualStore *self)
     G_TYPE_BOOLEAN,             /* Can make video calls */
     G_TYPE_BOOLEAN,             /* Is a fake group */
     G_TYPE_STRV,                /* Client types */
+    G_TYPE_UINT,                /* Event count */
   };
 
   priv = GET_PRIV (self);
index ae5f3c5802fb9718be2793ec56ca9dc06d5ad1c2..418761ead5ea5b618d89f32f3d76280f16fce1e7 100644 (file)
@@ -65,6 +65,7 @@ typedef enum
   EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL,
   EMPATHY_INDIVIDUAL_STORE_COL_IS_FAKE_GROUP,
   EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES,
+  EMPATHY_INDIVIDUAL_STORE_COL_EVENT_COUNT,
   EMPATHY_INDIVIDUAL_STORE_COL_COUNT,
 } EmpathyIndividualStoreCol;
 
index 9cc65ba61ad3a9887f1b4e93b34b2f6a8d04715a..a9e76a286dfade1e653ebc0e95899e1be3bac718 100644 (file)
@@ -431,12 +431,94 @@ main_window_auth_display (EmpathyMainWindow *window,
        g_hash_table_insert (priv->auths, event, info_bar);
 }
 
+static void
+modify_event_count (GtkTreeModel *model,
+                   GtkTreeIter *iter,
+                   EmpathyEvent *event,
+                   gboolean increase)
+{
+       FolksIndividual *individual;
+       EmpathyContact *contact;
+       guint count;
+
+       gtk_tree_model_get (model, iter,
+                           EMPATHY_INDIVIDUAL_STORE_COL_INDIVIDUAL, &individual,
+                           EMPATHY_INDIVIDUAL_STORE_COL_EVENT_COUNT, &count,
+                           -1);
+
+       if (individual == NULL)
+               return;
+
+       increase ? count++ : count--;
+
+       contact = empathy_contact_dup_from_folks_individual (individual);
+       if (contact == event->contact) {
+               gtk_tree_store_set (GTK_TREE_STORE (model), iter,
+                                   EMPATHY_INDIVIDUAL_STORE_COL_EVENT_COUNT, count, -1);
+       }
+
+       tp_clear_object (&contact);
+       g_object_unref (individual);
+}
+
+static gboolean
+increase_event_count_foreach (GtkTreeModel *model,
+                             GtkTreePath *path,
+                             GtkTreeIter *iter,
+                             gpointer user_data)
+{
+       EmpathyEvent *event = user_data;
+
+       modify_event_count (model, iter, event, TRUE);
+
+       return FALSE;
+}
+
+static void
+increase_event_count (EmpathyMainWindow *self,
+                     EmpathyEvent *event)
+{
+       EmpathyMainWindowPriv *priv = GET_PRIV (self);
+       GtkTreeModel *model;
+
+       model = GTK_TREE_MODEL (priv->individual_store);
+
+       gtk_tree_model_foreach (model, increase_event_count_foreach, event);
+}
+
+static gboolean
+decrease_event_count_foreach (GtkTreeModel *model,
+                             GtkTreePath *path,
+                             GtkTreeIter *iter,
+                             gpointer user_data)
+{
+       EmpathyEvent *event = user_data;
+
+       modify_event_count (model, iter, event, FALSE);
+
+       return FALSE;
+}
+
+static void
+decrease_event_count (EmpathyMainWindow *self,
+                     EmpathyEvent *event)
+{
+       EmpathyMainWindowPriv *priv = GET_PRIV (self);
+       GtkTreeModel *model;
+
+       model = GTK_TREE_MODEL (priv->individual_store);
+
+       gtk_tree_model_foreach (model, decrease_event_count_foreach, event);
+}
+
 static void
 main_window_event_added_cb (EmpathyEventManager *manager,
                            EmpathyEvent        *event,
                            EmpathyMainWindow   *window)
 {
        if (event->contact) {
+               increase_event_count (window, event);
+
                main_window_flash_start (window);
        } else if (event->type == EMPATHY_EVENT_TYPE_AUTH) {
                main_window_auth_display (window, event);
@@ -460,6 +542,8 @@ main_window_event_removed_cb (EmpathyEventManager *manager,
                return;
        }
 
+       decrease_event_count (window, event);
+
        data.on = FALSE;
        data.event = event;
        data.window = window;