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)); } |