ekiga r6383 - trunk/lib/engine/gui/gtk-frontend



Author: jpuydt
Date: Mon Jun  9 18:51:07 2008
New Revision: 6383
URL: http://svn.gnome.org/viewvc/ekiga?rev=6383&view=rev

Log:
Enhanced display of the number of displayed items vs total in each group


Modified:
   trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp

Modified: trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
==============================================================================
--- trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp	(original)
+++ trunk/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp	Mon Jun  9 18:51:07 2008
@@ -100,13 +100,29 @@
   COLUMN_PRESENCE,
   COLUMN_ACTIVE,
   COLUMN_GROUP_SIZE,
+  COLUMN_OFFLINE,
   COLUMN_NUMBER
 };
 
 /*
- * Callbacks
+ * Helpers
  */
 
+/* DESCRIPTION : Called whenever a (online/total) count has to be updated
+ * BEHAVIOUR   : Updates things...
+ * PRE         : Both arguments have to be correct
+ */
+static void update_offline_count (RosterViewGtk* self,
+				  GtkTreeIter* iter);
+
+/* DESCRIPTION : Called when the user changes the preference for offline
+ * BEHAVIOUR   : Updates things...
+ * PRE         : The gpointer must be a RosterViewGtk
+ */
+static void show_offline_contacts_changed_nt (gpointer id,
+					      GmConfEntry *entry,
+					      gpointer data);
+
 /* DESCRIPTION  : Called when the user right-clicks on a heap, group or
  *                presentity.
  * BEHAVIOR     : Update the menu and displays it as a popup.
@@ -116,6 +132,14 @@
 			     GdkEventButton *event,
 			     gpointer data);
 
+/* DESCRIPTION : Called to decide whether to show a line ; used to hide/show
+ *               offline contacts on demand.
+ * BEHAVIOUR   : Returns TRUE if the line should be shown.
+ * PRE         : The gpointer must point to a RosterViewGtk object.
+ */
+static gboolean tree_model_filter_hide_show_offline (GtkTreeModel *model,
+						     GtkTreeIter *iter,
+						     gpointer data);
 
 /* DESCRIPTION  : Called for a given renderer in order to show or hide it.
  * BEHAVIOR     : Only show the renderer if current iter points to a line of
@@ -289,14 +313,41 @@
 
 
 
-/* Implementation of the callbacks */
+/* Implementation of the helpers */
+
+static void
+update_offline_count (RosterViewGtk* self,
+		      GtkTreeIter* iter)
+{
+  GtkTreeModel *model = NULL;
+  GtkTreeModel *filtered = NULL;
+  GtkTreeIter filtered_iter;
+  gint total = 0;
+  gint not_offline = 0;
+  gchar *size = NULL;
+
+  model = GTK_TREE_MODEL (self->priv->store);
+  filtered = gtk_tree_view_get_model (self->priv->tree_view);
+  gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (filtered), &filtered_iter, iter);
+  not_offline = gtk_tree_model_iter_n_children (filtered, &filtered_iter);
+  total = gtk_tree_model_iter_n_children (model, iter);
+  size = g_strdup_printf ("(%d/%d)", not_offline, total);
+  gtk_tree_store_set (GTK_TREE_STORE (model), iter,
+		      COLUMN_GROUP_SIZE, size,
+		      -1);
+  g_free (size);
+
+}
 
-static void 
-show_offline_contacts_changed_nt (G_GNUC_UNUSED gpointer id, 
-                                  GmConfEntry *entry, 
+static void
+show_offline_contacts_changed_nt (G_GNUC_UNUSED gpointer id,
+                                  GmConfEntry *entry,
                                   gpointer data)
 {
   RosterViewGtk *self = NULL;
+  GtkTreeModel *model = NULL;
+  GtkTreeIter heap_iter;
+  GtkTreeIter iter;
   gboolean show_offline_contacts = false;
 
   g_return_if_fail (data != NULL);
@@ -306,9 +357,30 @@
   if (gm_conf_entry_get_type (entry) == GM_CONF_BOOL) {
 
     show_offline_contacts = gm_conf_entry_get_bool (entry);
+    if (show_offline_contacts != self->priv->show_offline_contacts) {
+
+      self->priv->show_offline_contacts = show_offline_contacts;
+
+      /* beware: model is filtered here */
+      model = gtk_tree_view_get_model (self->priv->tree_view);
+      gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (model));
 
-    self->priv->show_offline_contacts = show_offline_contacts;
-    self->priv->core.visit_clusters (sigc::bind_return (sigc::bind (sigc::ptr_fun (on_cluster_added), (gpointer) self), true));
+      /* beware: model is unfiltered here */
+      model = GTK_TREE_MODEL (self->priv->store);
+      if (gtk_tree_model_get_iter_first (model, &heap_iter)) {
+
+	do {
+
+	  if (gtk_tree_model_iter_nth_child (model, &iter, &heap_iter, 0)) {
+
+	    do {
+
+	      update_offline_count (self, &iter);
+	    } while (gtk_tree_model_iter_next (model, &iter)); 
+	  }
+	} while (gtk_tree_model_iter_next (model, &heap_iter));
+      }
+    }
   }
 }
 
@@ -447,6 +519,27 @@
   return TRUE;
 }
 
+static gboolean
+tree_model_filter_hide_show_offline (GtkTreeModel *model,
+				     GtkTreeIter *iter,
+				     gpointer data)
+{
+  RosterViewGtk *self = NULL;
+  gboolean offline = TRUE;
+  gint column_type;
+
+  self = ROSTER_VIEW_GTK (data);
+
+  gtk_tree_model_get (model, iter,
+		      COLUMN_OFFLINE, &offline,
+		      COLUMN_TYPE, &column_type,
+		      -1);
+  if (column_type != TYPE_PRESENTITY)
+    return TRUE;
+  else
+    return self->priv->show_offline_contacts || offline;
+}
+
 
 static void
 show_cell_data_func (GtkTreeViewColumn * /*column*/,
@@ -592,34 +685,30 @@
     roster_view_gtk_find_iter_for_group (self, &heap_iter, *group, &group_iter);
     roster_view_gtk_find_iter_for_presentity (self, &group_iter, presentity, &iter);
 
-    if (active || self->priv->show_offline_contacts) 
-      gtk_tree_store_set (self->priv->store, &iter,
-                          COLUMN_TYPE, TYPE_PRESENTITY,
-                          COLUMN_PRESENTITY, &presentity,
-                          COLUMN_NAME, presentity.get_name ().c_str (),
-                          COLUMN_STATUS, presentity.get_status ().c_str (),
-                          COLUMN_PRESENCE, presentity.get_presence ().c_str (),
-                          COLUMN_ACTIVE, (!active || away) ? "gray" : "black", 
-                          -1);
-    else
-      gtk_tree_store_remove (self->priv->store, &iter);
+    gtk_tree_store_set (self->priv->store, &iter,
+			COLUMN_TYPE, TYPE_PRESENTITY,
+			COLUMN_OFFLINE, active,
+			COLUMN_PRESENTITY, &presentity,
+			COLUMN_NAME, presentity.get_name ().c_str (),
+			COLUMN_STATUS, presentity.get_status ().c_str (),
+			COLUMN_PRESENCE, presentity.get_presence ().c_str (),
+			COLUMN_ACTIVE, (!active || away) ? "gray" : "black", 
+			-1);
   }
 
   if (groups.empty ()) {
 
     roster_view_gtk_find_iter_for_group (self, &heap_iter, _("Unsorted"), &group_iter);
     roster_view_gtk_find_iter_for_presentity (self, &group_iter, presentity, &iter);
-    if (active || self->priv->show_offline_contacts) 
-      gtk_tree_store_set (self->priv->store, &iter,
-                          COLUMN_TYPE, TYPE_PRESENTITY,
-                          COLUMN_PRESENTITY, &presentity,
-                          COLUMN_NAME, presentity.get_name ().c_str (),
-                          COLUMN_STATUS, presentity.get_status ().c_str (),
-                          COLUMN_PRESENCE, presentity.get_presence ().c_str (),
-                          COLUMN_ACTIVE, active ? "black" : "gray", 
-                          -1);
-    else
-      gtk_tree_store_remove (self->priv->store, &iter);
+    gtk_tree_store_set (self->priv->store, &iter,
+			COLUMN_TYPE, TYPE_PRESENTITY,
+			COLUMN_OFFLINE, active,
+			COLUMN_PRESENTITY, &presentity,
+			COLUMN_NAME, presentity.get_name ().c_str (),
+			COLUMN_STATUS, presentity.get_status ().c_str (),
+			COLUMN_PRESENCE, presentity.get_presence ().c_str (),
+			COLUMN_ACTIVE, active ? "black" : "gray", 
+			-1);
   }
 
   roster_view_gtk_update_groups (self, &heap_iter);
@@ -817,7 +906,6 @@
 
   gboolean go_on = FALSE;
   gchar *name = NULL;
-  gchar *size = NULL;
 
   model = GTK_TREE_MODEL (view->priv->store);
 
@@ -829,13 +917,8 @@
       // folded or unfolded
       if (gtk_tree_model_iter_has_child (model, &iter)) {
 
-	size = g_strdup_printf ("%d", gtk_tree_model_iter_n_children (model,
-								      &iter));
-	gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
-			    COLUMN_GROUP_SIZE, size,
-			    -1);
-	g_free (size);
 
+	update_offline_count (view, &iter);
         gtk_tree_model_get (model, &iter,
                             COLUMN_NAME, &name, -1);
         if (name) {
@@ -981,6 +1064,7 @@
 
   sigc::connection conn;
 
+  GtkTreeModel *filtered = NULL;
   GtkTreeSelection *selection = NULL;
   GtkTreeViewColumn *col = NULL;
   GtkCellRenderer *renderer = NULL;
@@ -1007,10 +1091,18 @@
                                           G_TYPE_STRING,    // status
                                           G_TYPE_STRING,    // presence
                                           G_TYPE_STRING,    // color if active
-					  G_TYPE_STRING);   // group size
+					  G_TYPE_STRING,    // group size
+					  G_TYPE_BOOLEAN);  // offline
 
+  filtered = gtk_tree_model_filter_new (GTK_TREE_MODEL (self->priv->store),
+					NULL);
   self->priv->tree_view =
-    GTK_TREE_VIEW (gtk_tree_view_new_with_model (GTK_TREE_MODEL (self->priv->store)));
+    GTK_TREE_VIEW (gtk_tree_view_new_with_model (filtered));
+  g_object_unref (filtered);
+  gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filtered),
+					  tree_model_filter_hide_show_offline,
+					  self, NULL);
+
   gtk_tree_view_set_headers_visible (self->priv->tree_view, FALSE);
 
   gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->priv->vbox));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]