Hi Mike, I gave what you said a try and it looks to work well enough. Then, how do you get a box around a selected cell. It seems to me if you let the built in renderer do it's thing and then get a cairo_t to just draw a rectangle after, it should work, right? OK, a bit of a hack but it works on my computer. GTK3.18. On a newer version of GTK I get a deprecated warning about gdk_cairo_create() but it still works.
Eric //gcc -Wall stripe_list2.c -o stripe_list2 `pkg-config --cflags --libs gtk+-3.0` #include<gtk/gtk.h> #include<stdlib.h> enum { ID, PROGRAM, COLOR, COLOR2, COLUMNS }; static gint row_g=0; static gint column_g=0; static void get_path(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer renderer1) { g_print("Get Path\n"); gchar *string=gtk_tree_path_to_string(path); g_print("%s %s\n", string, gtk_tree_view_column_get_title(column)); row_g=atoi(string); g_free(string); gint c1=0; if(g_strcmp0("ID", gtk_tree_view_column_get_title(column))==0) c1=2; if(g_strcmp0("Program", gtk_tree_view_column_get_title(column))==0) c1=3; column_g=c1-2; GtkTreeIter iter; GtkTreeModel *tree_model=gtk_tree_view_get_model(tree_view); gtk_tree_model_get_iter(tree_model, &iter, path); gtk_list_store_set(GTK_LIST_STORE(tree_model), &iter, c1, "SpringGreen", -1); gtk_widget_queue_draw(GTK_WIDGET(tree_view)); } static gboolean draw_rectangle(GtkWidget *tree_view, cairo_t *cr, gpointer data) { GtkTreePath *path=gtk_tree_path_new_from_indices(row_g, -1); g_print("Draw Rectangle %i %i\n", row_g, column_g); GdkWindow *win=gtk_tree_view_get_bin_window(GTK_TREE_VIEW(tree_view)); cairo_t *cr2=gdk_cairo_create(win); GdkRectangle rect; cairo_set_line_width(cr2, 4.0); cairo_set_source_rgba(cr2, 1.0, 1.0, 1.0, 1.0); GtkTreeViewColumn *column=gtk_tree_view_get_column(GTK_TREE_VIEW(tree_view), column_g); gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tree_view), path, column, &rect); cairo_rectangle(cr2, rect.x+2, rect.y+2, rect.width-2, rect.height-2); cairo_stroke(cr2); cairo_destroy(cr2); gtk_tree_path_free(path); return TRUE; } int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Stripes"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 300); gtk_widget_set_name(window, "main_window"); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); GtkTreeIter iter; GtkListStore *store=gtk_list_store_new(COLUMNS, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, ID, 0, PROGRAM, "Gedit", COLOR, "cyan", COLOR2, "chartreuse", -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, ID, 1, PROGRAM, "Gimp", COLOR, "yellow", COLOR2, "chartreuse", -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, ID, 2, PROGRAM, "Inkscape", COLOR, "cyan", COLOR2, "chartreuse", -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, ID, 3, PROGRAM, "Firefox", COLOR, "yellow", COLOR2, "fuchsia", -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, ID, 4, PROGRAM, "Calculator", COLOR, "cyan", COLOR2, "chartreuse", -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, ID, 5, PROGRAM, "Devhelp", COLOR, "yellow", COLOR2, "chartreuse", -1); GtkWidget *tree=gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); gtk_widget_set_name(tree, "test_tree"); gtk_widget_set_hexpand(tree, TRUE); gtk_widget_set_vexpand(tree, FALSE); g_object_set(tree, "activate-on-single-click", TRUE, NULL); g_signal_connect_after(tree, "draw", G_CALLBACK(draw_rectangle), NULL); GtkTreeSelection *selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE); GtkCellRenderer *renderer1=gtk_cell_renderer_text_new(); g_object_set(renderer1, "editable", FALSE, NULL); g_signal_connect(tree, "row-activated", G_CALLBACK(get_path), renderer1); //Bind the COLOR column to the "cell-background" property. GtkTreeViewColumn *column1 = gtk_tree_view_column_new_with_attributes("ID", renderer1, "text", ID, "cell-background", COLOR, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column1); GtkTreeViewColumn *column2 = gtk_tree_view_column_new_with_attributes("Program", renderer1, "text", PROGRAM, "cell-background", COLOR2, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column2); GtkWidget *label=gtk_label_new("Test Label"); gtk_widget_set_name(label, "test_label"); gtk_widget_set_hexpand(label, TRUE); GtkWidget *grid=gtk_grid_new(); gtk_grid_set_row_homogeneous(GTK_GRID(grid), TRUE); gtk_widget_set_name(grid, "test_grid"); gtk_grid_attach(GTK_GRID(grid), tree, 0, 0, 1, 9); gtk_grid_attach(GTK_GRID(grid), label, 0, 10, 1, 1); gtk_container_add(GTK_CONTAINER(window), grid); gtk_widget_show_all(window); gtk_main(); return 0; } _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list