]> Pileus Git - ~andy/gtk/blob - tests/testtreeflow.c
50abad740720e4be0cb024c4b38c484865ba05a3
[~andy/gtk] / tests / testtreeflow.c
1 #include <gtk/gtk.h>
2
3 GtkTreeModel *model = NULL;
4 GRand *rand = NULL;
5 GtkTreeSelection *selection = NULL;
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   if (gtk_tree_selection_iter_is_selected (selection, &iter))
60     return;
61   switch (g_rand_int_range (rand, 0, 3))
62     {
63     case 0:
64       /* insert */
65             gtk_list_store_insert_after (GTK_LIST_STORE (model),
66                                            &iter2, &iter);
67             gtk_list_store_set (GTK_LIST_STORE (model), &iter2,
68                                   TEXT_COLUMN, words[g_rand_int_range (rand, 0, NUM_WORDS)],
69                                   -1);
70       break;
71     case 1:
72       /* delete */
73       if (gtk_tree_model_iter_n_children (model, NULL) == 0)
74         return;
75       gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
76       break;
77     case 2:
78       /* modify */
79       return;
80       if (gtk_tree_model_iter_n_children (model, NULL) == 0)
81         return;
82       gtk_list_store_set (GTK_LIST_STORE (model), &iter,
83                           TEXT_COLUMN, words[g_rand_int_range (rand, 0, NUM_WORDS)],
84                           -1);
85       break;
86     }
87 }
88
89 static gboolean
90 futz (void)
91 {
92   gint i;
93
94   for (i = 0; i < 15; i++)
95     futz_row ();
96   g_print ("Number of rows: %d\n", gtk_tree_model_iter_n_children (model, NULL));
97   return TRUE;
98 }
99
100 int
101 main (int argc, char *argv[])
102 {
103   GtkWidget *window;
104   GtkWidget *vbox;
105   GtkWidget *scrolled_window;
106   GtkWidget *tree_view;
107   GtkWidget *hbox;
108   GtkWidget *button;
109   GtkTreePath *path;
110
111   gtk_init (&argc, &argv);
112
113   path = gtk_tree_path_new_from_string ("80");
114   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
115   gtk_window_set_title (GTK_WINDOW (window), "Reflow test");
116   g_signal_connect (window, "destroy", gtk_main_quit, NULL);
117   vbox = gtk_vbox_new (FALSE, 8);
118   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
119   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Incremental Reflow Test"), FALSE, FALSE, 0);
120   gtk_container_add (GTK_CONTAINER (window), vbox);
121   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
122   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
123                                   GTK_POLICY_AUTOMATIC,
124                                   GTK_POLICY_AUTOMATIC);
125   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
126   
127   initialize_model ();
128   tree_view = gtk_tree_view_new_with_model (model);
129   gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (tree_view), path, NULL, TRUE, 0.5, 0.0);
130   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
131   gtk_tree_selection_select_path (selection, path);
132   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
133   gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
134   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
135                                                -1,
136                                                NULL,
137                                                gtk_cell_renderer_text_new (),
138                                                "text", TEXT_COLUMN,
139                                                NULL);
140   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
141   hbox = gtk_hbox_new (FALSE, FALSE);
142   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
143   button = gtk_button_new_with_mnemonic ("<b>_Futz!!</b>");
144   gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
145   gtk_label_set_use_markup (GTK_LABEL (GTK_BIN (button)->child), TRUE);
146   g_signal_connect (button, "clicked", G_CALLBACK (futz), NULL);
147   g_signal_connect (button, "realize", G_CALLBACK (gtk_widget_grab_focus), NULL);
148   gtk_window_set_default_size (GTK_WINDOW (window), 300, 400);
149   gtk_widget_show_all (window);
150   g_timeout_add (1000, (GSourceFunc) futz, NULL);
151   gtk_main ();
152   return 0;
153 }