#include #include static GtkWidget *main_window = NULL; enum { COLUMN_NAME = 0 }; void cell_data_func(GtkCellLayout *cell_layout, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { GtkTreePath *tree_path; gchar *str; gint row; const GdkColor *fg_color; const GdkColor *bg_color; const GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF }; const GdkColor colors[] = { { 0, 0x0000, 0x0000, 0xFFFF }, { 0, 0xFFFF, 0x0000, 0x0000 }, { 0, 0xFFFF, 0x0000, 0xFFFF }, { 0, 0x0000, 0xFFFF, 0x0000 }, { 0, 0x0000, 0xFFFF, 0xFFFF }, { 0, 0xFFFF, 0xFFFF, 0x0000 } }; int col; str = gtk_tree_model_get_string_from_iter(model, iter); row = atoi(str); g_free(str); tree_path = gtk_tree_model_get_path(model, iter); col = row % ((sizeof(colors) / sizeof(colors[0])) * 2); if (col < (sizeof(colors) / sizeof(colors[0]))) { fg_color = &colors[col]; bg_color = &white; } else { col -= (sizeof(colors) / sizeof(colors[0])); fg_color = &white; bg_color = &colors[col]; } gtk_tree_path_free(tree_path); g_object_set(G_OBJECT(renderer), "foreground-gdk", fg_color, "background-gdk", bg_color, "xalign", (gfloat)0.5, NULL); } gint compare_name(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) { gint result; gchar *name1; gchar *name2; gtk_tree_model_get(model, a, COLUMN_NAME, &name1, -1); gtk_tree_model_get(model, b, COLUMN_NAME, &name2, -1); result = g_utf8_collate(name1, name2); g_free(name1); g_free(name2); return result; } GtkListStore *create_list_store(const gchar *path) { GtkListStore *list_store; GtkTreeIter iter; GDir *dir; const char *name; list_store = gtk_list_store_new(1, G_TYPE_STRING); dir = g_dir_open(path, 0, NULL); if (dir != NULL) { while ((name = g_dir_read_name(dir)) != NULL) { gtk_list_store_append(list_store, &iter); gtk_list_store_set(list_store, &iter, COLUMN_NAME, name, -1); } g_dir_close(dir); } gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(list_store), COLUMN_NAME, compare_name, NULL, NULL); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(list_store), COLUMN_NAME, GTK_SORT_ASCENDING); return list_store; } GtkWidget *create_icon_view(void) { GtkWidget *icon_view; GList *list; GList *cur; icon_view = gtk_icon_view_new(); gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(icon_view), -1); gtk_icon_view_set_text_column(GTK_ICON_VIEW(icon_view), COLUMN_NAME); gtk_icon_view_set_selection_mode(GTK_ICON_VIEW(icon_view), GTK_SELECTION_MULTIPLE); gtk_icon_view_set_orientation(GTK_ICON_VIEW(icon_view), GTK_ORIENTATION_VERTICAL); gtk_icon_view_set_row_spacing(GTK_ICON_VIEW(icon_view), 3); gtk_icon_view_set_column_spacing(GTK_ICON_VIEW(icon_view), 3); list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(icon_view)); for (cur = g_list_first(list); cur != NULL; cur = g_list_next(cur)) { if (GTK_OBJECT_TYPE(GTK_OBJECT(cur->data)) != GTK_TYPE_CELL_RENDERER_TEXT) { continue; } gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(icon_view), GTK_CELL_RENDERER(cur->data), cell_data_func, NULL, NULL); } g_list_free(list); return icon_view; } int main(int argc, char **argv) { GtkWidget *scrolled_window; GtkWidget *icon_view; GtkListStore *list_store; gchar *path; gtk_init(&argc, &argv); main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(main_window), "GtkIconView - Font Color"); gtk_widget_set_size_request(main_window, 400, 300); g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(main_window), scrolled_window); path = g_get_current_dir(); icon_view = create_icon_view(); list_store = create_list_store(path); gtk_icon_view_set_model(GTK_ICON_VIEW(icon_view), GTK_TREE_MODEL(list_store)); g_object_unref(G_OBJECT(list_store)); gtk_container_add(GTK_CONTAINER(scrolled_window), icon_view); g_free(path); gtk_widget_show_all(main_window); gtk_main(); return 0; }