Disable type-ahead search for all the tree views.
authorSoeren Sandmann <sandmann@redhat.com>
Mon, 13 Jun 2005 00:33:51 +0000 (00:33 +0000)
committerSøren Sandmann Pedersen <ssp@src.gnome.org>
Mon, 13 Jun 2005 00:33:51 +0000 (00:33 +0000)
Sun Jun 12 20:30:37 2005  Soeren Sandmann  <sandmann@redhat.com>

* sysprof.c (build_gui): Disable type-ahead search for all the
tree views.

* sysprof.c (on_object_selection_changed): Call it from here

* sysprof.c (expand_descendants_tree): New function that
determines what nodes to expand in the descendatns view.

* TODO

ChangeLog
sysprof.c

index 1d07e36..793df35 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Sun Jun 12 20:30:37 2005  Soeren Sandmann  <sandmann@redhat.com>
+
+       * sysprof.c (build_gui): Disable type-ahead search for all the
+       tree views.
+       
+       * sysprof.c (on_object_selection_changed): Call it from here
+
+       * sysprof.c (expand_descendants_tree): New function that
+       determines what nodes to expand in the descendatns view. 
+
 Sun Jun 12 13:37:15 2005  Soeren Sandmann  <sandmann@redhat.com>
 
        * TODO: Updates
index 852760d..4ca3332 100644 (file)
--- a/sysprof.c
+++ b/sysprof.c
@@ -1116,11 +1116,101 @@ on_delete (GtkWidget *window)
 }
 
 static void
+expand_descendants_tree (Application *app)
+{
+    GtkTreeModel *model = gtk_tree_view_get_model (app->descendants_view);
+    GtkTreeIter iter;
+    GList *all_paths = NULL;
+    int n_rows;
+    int max_rows = 40; /* FIXME */
+    double top_value = 0.0;
+    GtkTreePath *first_path;
+    GList *list;
+
+    first_path = gtk_tree_path_new_first();
+
+    all_paths = g_list_prepend (all_paths, first_path);
+
+    n_rows = 1;
+
+    gtk_tree_model_get_iter (model, &iter, first_path);
+    gtk_tree_model_get (model, &iter,
+                       OBJECT_TOTAL, &top_value,
+                       -1);
+    
+    while (all_paths && n_rows < max_rows)
+    {
+       GtkTreeIter best_iter;
+       GtkTreePath *best_path;
+       double best_value;
+       int n_children;
+       int i;
+
+       best_value = 0.0;
+       best_path = NULL;
+
+       for (list = all_paths; list != NULL; list = list->next)
+       {
+           GtkTreePath *path = list->data;
+           GtkTreeIter iter;
+           double value;
+           g_assert (path != NULL);
+           if (gtk_tree_model_get_iter (model, &iter, path))
+           {
+               gtk_tree_model_get (model, &iter,
+                                   OBJECT_TOTAL, &value,
+                                   -1);
+           }
+           if (value >= best_value)
+           {
+               best_value = value;
+               best_path = path;
+
+               gtk_tree_model_get_iter (model, &best_iter, path);
+           }
+       }
+
+       gtk_tree_model_get_iter (model, &iter, best_path);
+
+       n_children = gtk_tree_model_iter_n_children (model, &best_iter);
+       
+       if (n_children && (best_value / top_value) > 0.04 &&
+           (n_children + gtk_tree_path_get_depth (best_path)) / (double)max_rows < (best_value / top_value) )
+       {
+           gtk_tree_view_expand_row (GTK_TREE_VIEW (app->descendants_view), best_path, FALSE);
+           n_rows += n_children;
+
+           if (gtk_tree_path_get_depth (best_path) < 4)
+           {
+               GtkTreePath *path = gtk_tree_path_copy (best_path);
+               gtk_tree_path_down (path);
+
+               for (i = 0; i < n_children; ++i)
+               {
+                   all_paths = g_list_prepend (all_paths, path);
+
+                   path = gtk_tree_path_copy (path);
+                   gtk_tree_path_next (path);
+               }
+               gtk_tree_path_free (path);
+           }
+       }
+
+       all_paths = g_list_remove (all_paths, best_path);
+       gtk_tree_path_free (best_path);
+    }
+
+    for (list = all_paths; list != NULL; list = list->next)
+       gtk_tree_path_free (list->data);
+    
+    g_list_free (all_paths);
+}
+
+static void
 on_object_selection_changed (GtkTreeSelection *selection,
                             gpointer data)
 {
     Application *app = data;
-    GtkTreePath *path;
 
     set_busy (app->main_window, TRUE);
 
@@ -1128,14 +1218,9 @@ on_object_selection_changed (GtkTreeSelection *selection,
     
     fill_descendants_tree (app);
     fill_callers_list (app);
-    
-    /* Expand the toplevel of the descendant tree so we see the immediate
-     * descendants.
-     */
-    path = gtk_tree_path_new_from_indices (0, -1);
-    gtk_tree_view_expand_row (
-       GTK_TREE_VIEW (app->descendants_view), path, FALSE);
-    gtk_tree_path_free (path);
+
+    if (get_current_object (app))
+       expand_descendants_tree (app);
     
     set_busy (app->main_window, FALSE);
 }
@@ -1355,32 +1440,32 @@ build_gui (Application *app)
     
     /* object view */
     app->object_view = (GtkTreeView *)glade_xml_get_widget (xml, "object_view");
+    gtk_tree_view_set_enable_search (app->object_view, FALSE);
     col = add_plain_text_column (app->object_view, _("Functions"), OBJECT_NAME);
     add_double_format_column (app->object_view, _("Self"), OBJECT_SELF, "%.2f ");
     add_double_format_column (app->object_view, _("Total"), OBJECT_TOTAL, "%.2f ");
     selection = gtk_tree_view_get_selection (app->object_view);
     g_signal_connect (selection, "changed", G_CALLBACK (on_object_selection_changed), app);
-    
     gtk_tree_view_column_set_expand (col, TRUE);
     
     /* callers view */
     app->callers_view = (GtkTreeView *)glade_xml_get_widget (xml, "callers_view");
+    gtk_tree_view_set_enable_search (app->callers_view, FALSE);
     col = add_plain_text_column (app->callers_view, _("Callers"), CALLERS_NAME);
     add_double_format_column (app->callers_view, _("Self"), CALLERS_SELF, "%.2f ");
     add_double_format_column (app->callers_view, _("Total"), CALLERS_TOTAL, "%.2f ");
     g_signal_connect (app->callers_view, "row-activated",
                      G_CALLBACK (on_callers_row_activated), app);
-    
     gtk_tree_view_column_set_expand (col, TRUE);
     
     /* descendants view */
     app->descendants_view = (GtkTreeView *)glade_xml_get_widget (xml, "descendants_view");
+    gtk_tree_view_set_enable_search (app->descendants_view, FALSE);
     col = add_plain_text_column (app->descendants_view, _("Descendants"), DESCENDANTS_NAME);
     add_double_format_column (app->descendants_view, _("Self"), DESCENDANTS_SELF, "%.2f ");
     add_double_format_column (app->descendants_view, _("Cumulative"), DESCENDANTS_NON_RECURSE, "%.2f ");
     g_signal_connect (app->descendants_view, "row-activated",
                      G_CALLBACK (on_descendants_row_activated), app);
-
     gtk_tree_view_column_set_expand (col, TRUE);
     
     gtk_widget_grab_focus (GTK_WIDGET (app->object_view));