rendered paste body#include <gtk/gtk.h>#include <stdio.h>#include <stdlib.h>struct data { const char *row; const char *item; int qty; float price;};static struct data row_data[] = { { "row0","item 12", 3, 4.3 }, { "row1","item 23", 44,34.4}, { "row2","item 33", 34,25.4}, { "row3","item 43", 37,64.4}, { "row4","item 53", 12,14.4}, { "row5","item 68", 42,34.4}, { "row6","item 75", 72,74.4}, {NULL}};static struct data row2_data[] = { {"row7", "item 127", 105, 115.5}, {"row8","item 124", 117, 118.6}, {"row9", "item 123", 120, 121.73}, {NULL}}; static GtkTargetEntry tentry = {"text/plain",0,0 };void on_drag_data_get( GtkWidget *widget, GdkDragContext *drag_context, GtkSelectionData *sdata, guint info, guint time, gpointer user_data){ GtkTreeIter iter; GtkTreeModel *list_store; GtkTreeSelection *selector; printf("on_drag_data_get\n"); selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); gtk_tree_selection_get_selected(selector,&list_store,&iter); if(&iter == NULL) return; GValue value={0,}; char *cptr; int i; i=0; //for(i=0;i<4;i++){ gtk_tree_model_get_value(list_store,&iter,i,&value); cptr = (gchar *) g_strdup_value_contents (&value); printf("got - %s\n",cptr); g_value_unset(&value); gtk_selection_data_set_text(sdata,cptr,-1); free(cptr); //}}void on_drag_data_received(GtkWidget *widget, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *sdata, guint info, guint time, gpointer user_data){ GtkTreeModel *list_store; GtkTreeIter iter; printf("on_drag_data_received\n"); /* Remove row from the source treeview */ GtkTreeSelection *selector; selector = gtk_tree_view_get_selection(GTK_TREE_VIEW(user_data)); gtk_tree_selection_get_selected(selector,&list_store,&iter); gtk_list_store_remove(GTK_LIST_STORE(list_store),&iter); /* Now add to the other treeview */ GtkTreeModel *list_store2; GtkTreeIter iter2; list_store2 = gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); gtk_list_store_append(GTK_LIST_STORE(list_store2),&iter2); /* Hard code this for now */ gtk_list_store_set(GTK_LIST_STORE(list_store2),&iter2, 0,row_data[1].row, 1,row_data[1].item, 2,row_data[1].qty, 3,row_data[1].price,-1); /* lets just see what we got */ guchar *rx = gtk_selection_data_get_text(sdata); if(rx){ printf("Received = %s\n",rx); g_free(rx); }}void on_selection_changed (GtkTreeSelection *treeselection,gpointer user_data){ GtkTreeIter iter; GtkTreeModel *list_store; printf("on_selection_changed: "); gtk_tree_selection_get_selected(treeselection, &list_store,&iter); if(&iter==NULL)return; if(list_store==NULL)return; GValue value={0,}; char *cptr; int i; for(i=0;i<4;i++){ gtk_tree_model_get_value(list_store,&iter,i,&value); cptr = (gchar *) g_strdup_value_contents (&value); g_value_unset(&value); if(cptr)printf("%s, ",cptr); free(cptr); } printf("\n");}GtkWidget *add_treeview(GtkWidget *box, struct data array[], int size){ GtkWidget *swindow; swindow = gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swindow), GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); /* Add this window to the box */ gtk_box_pack_start(GTK_BOX(box), swindow,TRUE,TRUE,2); /* Create the treeview and its list store */ GtkListStore *list_store; list_store = gtk_list_store_new(4, G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INT,G_TYPE_FLOAT); GtkWidget *tree_view; tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store)); /* Add the treeview to the scrolled window */ gtk_container_add(GTK_CONTAINER(swindow),tree_view); /* Add the columns */ GtkCellRenderer *renderer; GtkTreeViewColumn *column; char column_names[4][20] = { "Row #", "Description", "Qty", "Price"}; int i; for(i=0;i<4;i++){ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes ( column_names[i],renderer,"text",i,NULL); gtk_tree_view_column_set_sort_column_id (column, i); gtk_tree_view_append_column (GTK_TREE_VIEW(tree_view), column); } gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view),TRUE); /* Add the data */ GtkTreeIter iter; for(i=0;i<size;i++){ gtk_list_store_append(list_store,&iter); gtk_list_store_set(list_store,&iter, 0,array[i].row, 1,array[i].item, 2,array[i].qty, 3,array[i].price,-1); } g_signal_connect( gtk_tree_view_get_selection (GTK_TREE_VIEW(tree_view)), "changed",G_CALLBACK(on_selection_changed),NULL); return tree_view;}int main(int argc, char **argv){ GtkWidget *window; gtk_init(&argc,&argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window),666,266); g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_exit),NULL); GtkWidget *vbox = gtk_vbox_new(FALSE,10); gtk_container_add(GTK_CONTAINER(window),vbox); GtkWidget *title = gtk_label_new("Drag and Drop Between 2 Treeviews - C Port by Vikram Ambrose"); gtk_box_pack_start(GTK_BOX(vbox),title,FALSE,FALSE,1); GtkWidget *hbox = gtk_hbox_new(TRUE,1); gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,1); GtkWidget *view1; view1 = add_treeview(hbox,row_data,7); gtk_drag_source_set(view1,GDK_BUTTON1_MASK, &tentry,1, GDK_ACTION_COPY|GDK_ACTION_MOVE); g_signal_connect(view1,"drag-data-get", G_CALLBACK(on_drag_data_get),NULL); GtkWidget *view2; view2 = add_treeview(hbox,row2_data,3); gtk_drag_dest_set(view2,GTK_DEST_DEFAULT_ALL,&tentry,1, GDK_ACTION_COPY|GDK_ACTION_MOVE); g_signal_connect(view2,"drag-data-received", G_CALLBACK(on_drag_data_received),view1); gtk_widget_show_all(window); gtk_main(); return 0;}