#include #include static GtkTreeIter iter50; static GtkTreePath *item50; static GtkWidget *tree; static void add_entries (GtkTreeStore *store, GtkTreeIter *parent) { GtkTreeIter iter; int i; for (i = 0; i < 100; i++) { char string[ 256 ]; gtk_tree_store_append (store, &iter, parent); sprintf (string, "item %d", i); gtk_tree_store_set (store, &iter, 0, string, -1); if (i == 50) { item50 = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &iter); iter50 = iter; } } } static void button_clicked (GtkWidget *widget, gpointer data) { GtkTreePath *path = item50; int depth = gtk_tree_path_get_depth (path); gint *indices = gtk_tree_path_get_indices (path); GtkTreePath *temp = gtk_tree_path_new (); int i; /* Workaround */ /* for (i = 0; i < depth - 1; i++) { gtk_tree_path_append_index (temp, indices [i]); gtk_tree_view_collapse_row (GTK_TREE_VIEW (tree), temp); } temp = gtk_tree_path_new (); */ for (i = 0; i < depth - 1; i++) { gtk_tree_path_append_index (temp, indices [i]); gtk_tree_view_expand_row (GTK_TREE_VIEW (tree), temp, FALSE); } gtk_tree_path_free (temp); gtk_tree_view_set_cursor (GTK_TREE_VIEW (tree), path, 0, FALSE); } int main (int argc, char **argv) { GtkWidget *window; GtkWidget *scrolled; GtkTreeStore *store; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeIter iter; GtkWidget *button; GtkWidget *vbox; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), 0); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), 0); vbox = gtk_vbox_new (FALSE, 0); button = gtk_button_new_with_label ("Scroll to item 50"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (button_clicked), 0); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); scrolled = gtk_scrolled_window_new (0, 0); store = gtk_tree_store_new (1, G_TYPE_STRING); tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)), GTK_SELECTION_MULTIPLE); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Column", renderer, "text", 0, 0); gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); gtk_container_add (GTK_CONTAINER (scrolled), tree); gtk_container_add (GTK_CONTAINER (vbox), scrolled); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_tree_store_append (store, &iter, 0); gtk_tree_store_set (store, &iter, 0, "oranges", -1); add_entries (store, &iter); add_entries (store, &iter50); gtk_tree_store_append (store, &iter, 0); gtk_tree_store_set (store, &iter, 0, "apples", -1); gtk_widget_show_all (window); gtk_main (); return 0; }