4 * Do not copy any code from here (:. I won't mention my name here.
10 #include "eggtreemodelunion.h"
25 add_row (GtkWidget
*button
, gpointer data
)
29 GtkTreeModel
*model
= gtk_tree_view_get_model (GTK_TREE_VIEW (data
));
31 sprintf (buf
, "%d", g_random_int ());
33 if (GTK_IS_LIST_STORE (model
)) {
34 GtkListStore
*l
= GTK_LIST_STORE (model
);
36 gtk_list_store_append (l
, &iter
);
37 gtk_list_store_set (l
, &iter
, 0, buf
, -1);
38 } else if (GTK_IS_TREE_STORE (model
)) {
40 GtkTreeStore
*l
= GTK_TREE_STORE (model
);
41 GtkTreeSelection
*sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW (data
));
43 if (gtk_tree_selection_get_selected (sel
, NULL
, &parent
))
44 gtk_tree_store_append (l
, &iter
, &parent
);
46 gtk_tree_store_append (l
, &iter
, NULL
);
48 gtk_tree_store_set (l
, &iter
, 0, buf
, -1);
53 delete_row (GtkWidget
*button
, gpointer data
)
56 GtkTreeModel
*model
= NULL
;
57 GtkTreeSelection
*sel
;
58 GtkTreeView
*tv
= GTK_TREE_VIEW (data
);
60 sel
= gtk_tree_view_get_selection (tv
);
61 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
)) {
62 if (GTK_IS_LIST_STORE (model
))
63 gtk_list_store_remove (GTK_LIST_STORE (model
), &iter
);
64 else if (GTK_IS_TREE_STORE (model
))
65 gtk_tree_store_remove (GTK_TREE_STORE (model
), &iter
);
70 create_view_box (GtkTreeModel
*model
)
72 ViewBox
*vb
= g_new0 (ViewBox
, 1);
74 vb
->hbox
= gtk_hbox_new (FALSE
, 2);
75 gtk_container_set_border_width (GTK_CONTAINER (vb
->hbox
), 5);
77 vb
->tv
= gtk_tree_view_new_with_model (model
);
78 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (vb
->tv
), FALSE
);
79 gtk_widget_set_size_request (vb
->tv
, 80, 100);
80 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (vb
->tv
),
82 gtk_cell_renderer_text_new (),
84 gtk_box_pack_start (GTK_BOX (vb
->hbox
), vb
->tv
, FALSE
, FALSE
, 0);
86 vb
->vbox
= gtk_vbox_new (TRUE
, 2);
87 gtk_box_pack_start (GTK_BOX (vb
->hbox
), vb
->vbox
, FALSE
, FALSE
, 0);
89 vb
->add
= gtk_button_new_from_stock (GTK_STOCK_ADD
);
90 g_signal_connect (vb
->add
, "clicked",
91 G_CALLBACK (add_row
), vb
->tv
);
92 gtk_box_pack_start (GTK_BOX (vb
->vbox
), vb
->add
, TRUE
, FALSE
, 0);
94 vb
->delete = gtk_button_new_from_stock (GTK_STOCK_DELETE
);
95 g_signal_connect (vb
->delete, "clicked",
96 G_CALLBACK (delete_row
), GTK_TREE_VIEW (vb
->tv
));
97 gtk_box_pack_start (GTK_BOX (vb
->vbox
), vb
->delete, TRUE
, FALSE
, 0);
102 static GtkTreeModel
*
103 create_model (GtkListStore
**l1
, GtkTreeStore
**l2
, GtkListStore
**l3
)
105 GtkTreeIter iter
, iter2
;
108 *l1
= gtk_list_store_new (1, G_TYPE_STRING
);
109 *l2
= gtk_tree_store_new (1, G_TYPE_STRING
);
110 *l3
= gtk_list_store_new (1, G_TYPE_STRING
);
112 u
= egg_tree_model_union_new (1, G_TYPE_STRING
);
114 egg_tree_model_union_append (EGG_TREE_MODEL_UNION (u
),
115 GTK_TREE_MODEL (*l1
));
116 egg_tree_model_union_prepend (EGG_TREE_MODEL_UNION (u
),
117 GTK_TREE_MODEL (*l2
));
118 egg_tree_model_union_insert (EGG_TREE_MODEL_UNION (u
),
119 GTK_TREE_MODEL (*l3
), 1);
121 gtk_list_store_append (*l1
, &iter
);
122 gtk_list_store_set (*l1
, &iter
, 0, "blaat", -1);
124 gtk_list_store_append (*l1
, &iter
);
125 gtk_list_store_set (*l1
, &iter
, 0, "foobar", -1);
127 gtk_tree_store_append (*l2
, &iter
, NULL
);
128 gtk_tree_store_set (*l2
, &iter
, 0, "BLAAT", -1);
130 gtk_tree_store_append (*l2
, &iter2
, &iter
);
131 gtk_tree_store_set (*l2
, &iter2
, 0, "ha ha ha", -1);
133 gtk_tree_store_append (*l2
, &iter
, &iter2
);
134 gtk_tree_store_set (*l2
, &iter
, 0, "I hate you guys", -1);
136 gtk_tree_store_append (*l2
, &iter
, NULL
);
137 gtk_tree_store_set (*l2
, &iter
, 0, "FOOBAR", -1);
139 gtk_list_store_append (*l3
, &iter
);
140 gtk_list_store_set (*l3
, &iter
, 0, "------", -1);
147 main (int argc
, char **argv
)
156 GtkListStore
*l1
, *l3
;
159 gtk_init (&argc
, &argv
);
161 window
= gtk_window_new (GTK_WINDOW_TOPLEVEL
);
162 gtk_window_set_title (GTK_WINDOW (window
), "Union test");
163 g_signal_connect (window
, "delete_event",
164 G_CALLBACK (gtk_main_quit
), window
);
165 gtk_container_set_border_width (GTK_CONTAINER (window
), 5);
167 hbox
= gtk_hbox_new (FALSE
, 2);
168 gtk_container_add (GTK_CONTAINER (window
), hbox
);
170 vbox
= gtk_vbox_new (TRUE
, 5);
171 gtk_box_pack_start (GTK_BOX (hbox
), vbox
, FALSE
, FALSE
, 0);
173 model
= create_model (&l1
, &l2
, &l3
);
176 gtk_box_pack_start (GTK_BOX (vbox
), create_view_box (GTK_TREE_MODEL (l1
))->hbox
,
178 gtk_box_pack_start (GTK_BOX (vbox
), create_view_box (GTK_TREE_MODEL (l2
))->hbox
,
180 gtk_box_pack_start (GTK_BOX (vbox
), create_view_box (GTK_TREE_MODEL (l3
))->hbox
,
183 sw
= gtk_scrolled_window_new (NULL
, NULL
);
184 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw
),
185 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
186 gtk_container_set_border_width (GTK_CONTAINER (sw
), 5);
187 gtk_box_pack_start (GTK_BOX (hbox
), sw
, TRUE
, TRUE
, 0);
189 treeview
= gtk_tree_view_new_with_model (model
);
190 gtk_widget_set_size_request (treeview
, 90, -1);
191 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview
),
193 gtk_cell_renderer_text_new (),
195 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview
), FALSE
);
196 gtk_container_add (GTK_CONTAINER (sw
), treeview
);
198 gtk_widget_show_all (window
);