]> Pileus Git - ~andy/gtk/blob - tests/testtreeflow.c
Add gdk_drawable_set_cairo_target().
[~andy/gtk] / tests / testtreeflow.c
1 #include <config.h>
2 #include <gtk/gtk.h>
3
4 GtkTreeModel *model = NULL;
5 static GRand *grand = NULL;
6 GtkTreeSelection *selection = NULL;
7 enum
8 {
9   TEXT_COLUMN,
10   NUM_COLUMNS
11 };
12
13 static char *words[] =
14 {
15   "Boom",
16   "Borp",
17   "Multiline\ntext",
18   "Bingo",
19   "Veni\nVedi\nVici",
20   NULL
21 };
22
23
24 #define NUM_WORDS 5
25 #define NUM_ROWS 100
26
27
28 static void
29 initialize_model (void)
30 {
31   gint i;
32   GtkTreeIter iter;
33
34   model = (GtkTreeModel *) gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING);
35   grand = g_rand_new ();
36   for (i = 0; i < NUM_ROWS; i++)
37     {
38       gtk_list_store_append (GTK_LIST_STORE (model), &iter);
39       gtk_list_store_set (GTK_LIST_STORE (model), &iter,
40                           TEXT_COLUMN, words[g_rand_int_range (grand, 0, NUM_WORDS)],
41                           -1);
42     }
43 }
44
45 static void
46 futz_row (void)
47 {
48   gint i;
49   GtkTreePath *path;
50   GtkTreeIter iter;
51   GtkTreeIter iter2;
52
53   i = g_rand_int_range (grand, 0,
54                         gtk_tree_model_iter_n_children (model, NULL));
55   path = gtk_tree_path_new ();
56   gtk_tree_path_append_index (path, i);
57   gtk_tree_model_get_iter (model, &iter, path);
58   gtk_tree_path_free (path);
59
60   if (gtk_tree_selection_iter_is_selected (selection, &iter))
61     return;
62   switch (g_rand_int_range (grand, 0, 3))
63     {
64     case 0:
65       /* insert */
66             gtk_list_store_insert_after (GTK_LIST_STORE (model),
67                                            &iter2, &iter);
68             gtk_list_store_set (GTK_LIST_STORE (model), &iter2,
69                                   TEXT_COLUMN, words[g_rand_int_range (grand, 0, NUM_WORDS)],
70                                   -1);
71       break;
72     case 1:
73       /* delete */
74       if (gtk_tree_model_iter_n_children (model, NULL) == 0)
75         return;
76       gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
77       break;
78     case 2:
79       /* modify */
80       return;
81       if (gtk_tree_model_iter_n_children (model, NULL) == 0)
82         return;
83       gtk_list_store_set (GTK_LIST_STORE (model), &iter,
84                           TEXT_COLUMN, words[g_rand_int_range (grand, 0, NUM_WORDS)],
85                           -1);
86       break;
87     }
88 }
89
90 static gboolean
91 futz (void)
92 {
93   gint i;
94
95   for (i = 0; i < 15; i++)
96     futz_row ();
97   g_print ("Number of rows: %d\n", gtk_tree_model_iter_n_children (model, NULL));
98   return TRUE;
99 }
100
101 int
102 main (int argc, char *argv[])
103 {
104   GtkWidget *window;
105   GtkWidget *vbox;
106   GtkWidget *scrolled_window;
107   GtkWidget *tree_view;
108   GtkWidget *hbox;
109   GtkWidget *button;
110   GtkTreePath *path;
111
112   gtk_init (&argc, &argv);
113
114   path = gtk_tree_path_new_from_string ("80");
115   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
116   gtk_window_set_title (GTK_WINDOW (window), "Reflow test");
117   g_signal_connect (window, "destroy", gtk_main_quit, NULL);
118   vbox = gtk_vbox_new (FALSE, 8);
119   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
120   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Incremental Reflow Test"), FALSE, FALSE, 0);
121   gtk_container_add (GTK_CONTAINER (window), vbox);
122   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
123   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
124                                   GTK_POLICY_AUTOMATIC,
125                                   GTK_POLICY_AUTOMATIC);
126   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
127   
128   initialize_model ();
129   tree_view = gtk_tree_view_new_with_model (model);
130   gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (tree_view), path, NULL, TRUE, 0.5, 0.0);
131   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
132   gtk_tree_selection_select_path (selection, path);
133   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
134   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
135   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
136                                                -1,
137                                                NULL,
138                                                gtk_cell_renderer_text_new (),
139                                                "text", TEXT_COLUMN,
140                                                NULL);
141   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
142   hbox = gtk_hbox_new (FALSE, FALSE);
143   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
144   button = gtk_button_new_with_mnemonic ("<b>_Futz!!</b>");
145   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
146   gtk_label_set_use_markup (GTK_LABEL (GTK_BIN (button)->child), TRUE);
147   g_signal_connect (button, "clicked", G_CALLBACK (futz), NULL);
148   g_signal_connect (button, "realize", G_CALLBACK (gtk_widget_grab_focus), NULL);
149   gtk_window_set_default_size (GTK_WINDOW (window), 300, 400);
150   gtk_widget_show_all (window);
151   g_timeout_add (1000, (GSourceFunc) futz, NULL);
152   gtk_main ();
153   return 0;
154 }