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