/* * Compile with: * gcc -o tree-swap tree-swap.c `pkg-config --cflags --libs gtk+-2.0` * */ #include enum { COL_NAME = 0, NUM_COLS } ; static GtkTreeModel * create_and_fill_model (void) { GtkTreeStore *store; GtkTreeIter a, b, c, x; store = gtk_tree_store_new (NUM_COLS, G_TYPE_STRING); gtk_tree_store_append (store, &a, NULL); gtk_tree_store_set (store, &a, COL_NAME, "a", -1); gtk_tree_store_append (store, &b, NULL); gtk_tree_store_set (store, &b, COL_NAME, "b", -1); gtk_tree_store_append (store, &c, NULL); gtk_tree_store_set (store, &c, COL_NAME, "c", -1); gtk_tree_store_append (store, &x, &c); gtk_tree_store_set (store, &x, COL_NAME, "1", -1); gtk_tree_store_append (store, &x, &c); gtk_tree_store_set (store, &x, COL_NAME, "2", -1); gtk_tree_store_append (store, &x, &c); gtk_tree_store_set (store, &x, COL_NAME, "3", -1); return GTK_TREE_MODEL (store); } static GtkWidget * create_view_and_model (void) { GtkTreeViewColumn *col; GtkCellRenderer *renderer; GtkTreeModel *model; GtkWidget *view; view = gtk_tree_view_new (); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "Name", renderer, "text", COL_NAME, NULL); model = create_and_fill_model (); gtk_tree_view_set_model (GTK_TREE_VIEW (view), model); g_object_unref (model); /* destroy model automatically with view */ return view; } static void move_up (GtkButton *button, gpointer data) { GtkTreeView *tree = GTK_TREE_VIEW (data); GtkTreeModel *model; GtkTreeSelection *sel; GtkTreePath *path; GtkTreeIter a, b; sel = gtk_tree_view_get_selection (tree); if (gtk_tree_selection_get_selected (sel, NULL, &a)) { model = gtk_tree_view_get_model (tree); path = gtk_tree_model_get_path (model, &a); gtk_tree_path_prev (path); gtk_tree_model_get_iter (model, &b, path); gtk_tree_store_swap (GTK_TREE_STORE (model), &a, &b); } } static void move_down (GtkButton *button, gpointer data) { GtkTreeView *tree = GTK_TREE_VIEW (data); GtkTreeModel *model; GtkTreeSelection *sel; GtkTreeIter a, b; sel = gtk_tree_view_get_selection (tree); if (gtk_tree_selection_get_selected (sel, NULL, &a)) { b = a; model = gtk_tree_view_get_model (tree); gtk_tree_model_iter_next (model, &b); gtk_tree_store_swap (GTK_TREE_STORE (model), &a, &b); } } int main (int argc, char **argv) { GtkWidget *window, *view, *vbox, *button; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (window, "delete_event", gtk_main_quit, NULL); /* dirty */ view = create_view_and_model (); vbox = gtk_vbox_new (FALSE, 5); gtk_box_pack_start (GTK_BOX (vbox), view, TRUE, TRUE, 0); button = gtk_button_new_with_label ("Move up"); g_signal_connect (button, "clicked", (GCallback)move_up, (gpointer) view); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); button = gtk_button_new_with_label ("Move down"); g_signal_connect (button, "clicked", (GCallback)move_down, (gpointer) view); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show_all (window); gtk_tree_view_expand_all (GTK_TREE_VIEW (view)); gtk_main (); return 0; }