diff options
| author | Orangerot <purple@orangerot.dev> | 2023-04-05 19:00:08 +0200 | 
|---|---|---|
| committer | Orangerot <purple@orangerot.dev> | 2023-04-05 19:00:08 +0200 | 
| commit | d18510ad1200eaf94360d3226a1f2a9dc2cf156d (patch) | |
| tree | c0111693aea3d89508936c8afccaab3cc93c57e8 | |
| parent | 3f95106227800045fc96d1ac698997f3ee9462d3 (diff) | |
grid view shows file name and icon from model
| -rw-r--r-- | dicons.c | 71 | 
1 files changed, 57 insertions, 14 deletions
| @@ -1,30 +1,73 @@  #include <gtk/gtk.h>  #include <gio/gio.h> + +static GListModel *create_desktop_list(void) +{ +    GListStore *store; + +    store = g_list_store_new(G_TYPE_FILE_INFO); + +    GFile *path = g_file_parse_name("~/desktop"); +    GFileEnumerator *children = g_file_enumerate_children(path, "standard::*,ownser::user", 0, 0, 0); +     +    GFileInfo *info; +    while ( (info = g_file_enumerator_next_file(children, 0, 0)) ) { +        g_list_store_append(store, info); +    } + +    return G_LIST_MODEL(store); + +} + +static void setup_listitem_cb(GtkListItemFactory *factory, GtkListItem *list_item) +{ +    GtkWidget *box; +    GtkWidget *image; +    GtkWidget *label; + +    box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12); +    image = gtk_image_new(); +    gtk_image_set_icon_size(GTK_IMAGE(image), GTK_ICON_SIZE_LARGE); +    gtk_box_append(GTK_BOX(box), image); +    label = gtk_label_new(""); +    gtk_box_append(GTK_BOX(box), label); +    gtk_list_item_set_child(list_item, box); +} + +static void bind_listitem_cb(GtkListItemFactory *factory, GtkListItem *list_item) +{ +    GtkWidget *image; +    GtkWidget *label; +    GFileInfo *file_info; + +    image = gtk_widget_get_first_child(gtk_list_item_get_child(list_item)); +    label = gtk_widget_get_next_sibling(image); +    file_info = gtk_list_item_get_item(list_item); + +    gtk_image_set_from_gicon(GTK_IMAGE(image), g_file_info_get_icon(file_info)); +    gtk_label_set_label(GTK_LABEL(label), g_file_info_get_display_name(file_info)); +} +  static void activate (GtkApplication* app, gpointer user_data)  { -    GtkWidget *window, *iconview; +    GtkWidget *window, *gridview; +    GListModel *model; +    GtkListItemFactory *factory;      window = gtk_application_window_new(app);      gtk_window_set_title(GTK_WINDOW (window), "Window");      gtk_window_set_default_size(GTK_WINDOW (window), 200, 200); -    // iconview = gtk_grid_view_new(gtk_single_selection_new(0), ); -    // gtk_window_set_child(GTK_WINDOW (window), iconview); +    factory = gtk_signal_list_item_factory_new(); +    g_signal_connect(factory, "setup", G_CALLBACK(setup_listitem_cb), NULL); +    g_signal_connect(factory, "bind", G_CALLBACK(bind_listitem_cb), NULL); -    GFile *path = g_file_parse_name("~/desktop"); -    GFileEnumerator *children = g_file_enumerate_children(path, "standard::*,ownser::user", 0, 0, 0); -     -    GtkIconTheme *theme = gtk_icon_theme_get_for_display(gtk_widget_get_display(window)); +    model = create_desktop_list(); -    GFileInfo *info; -    while ( (info = g_file_enumerator_next_file(children, 0, 0)) ) { -        GIcon *icon = g_file_info_get_icon(info); -        const char *name = g_file_info_get_name(info); -        GtkIconPaintable *pixbuf = gtk_icon_theme_lookup_by_gicon(theme, icon, 48, 1, 0, 0); +    gridview = gtk_grid_view_new(GTK_SELECTION_MODEL(gtk_single_selection_new(model)), factory); -        printf("%s\n", name); -    } +    gtk_window_set_child(GTK_WINDOW (window), gridview);      gtk_window_present(GTK_WINDOW (window));  } | 
