#include #include "window_main.h" #include "walls_ui.h" #include "db.h" #include "walls_model.h" inline static void filetree_create_model(GtkTreeView *filetree) { GtkTreeModel *tree_model; GtkTreeIter toplevel, child; GArray *array; struct directory_t *dir; //treestore = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); tree_model = GTK_TREE_MODEL(walls_model_new()); /*array = NULL; if(db_get_top_level_directories(&array)) { for(int i = 0; ; i++) { dir = &g_array_index(array, struct directory_t, i); if(!dir->name) break; gtk_tree_store_append(treestore, &toplevel, NULL); g_printf("%s: %d\n", dir->name, dir->dirid); gtk_tree_store_set(treestore, &toplevel, 0, dir->name, 1, dir->dirid, -1); gtk_tree_store_append(treestore, &child, &toplevel); gtk_tree_store_set(treestore, &child, 0, "_walls_temp_", -1); } for(int i = 0; ; i++) { dir = &g_array_index(array, struct directory_t, i); if(!dir->name) break; g_free(dir->name); } g_array_free(array, TRUE); }*/ gtk_tree_view_set_model(filetree, GTK_TREE_MODEL(tree_model)); } inline static void filetree_init(GtkTreeView *filetree) { GtkTreeViewColumn *col1, *col2, *col3, *col4; GtkCellRenderer *renderer; col1 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col1, "Name"); gtk_tree_view_append_column(filetree, col1); col2 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col2, "Size"); gtk_tree_view_append_column(filetree, col2); col3 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col3, "Width"); gtk_tree_view_append_column(filetree, col3); col4 = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col4, "Height"); gtk_tree_view_append_column(filetree, col4); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(col1, renderer, TRUE); gtk_tree_view_column_add_attribute(col1, renderer, "text", 0); filetree_create_model(filetree); } G_MODULE_EXPORT gboolean on_filetree_test_expand_row(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { printf("on_filetree_test_expand_row\n"); if(gtk_tree_path_get_depth(path) == 0) { return TRUE; } return FALSE; } G_MODULE_EXPORT void on_filetree_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data) { printf("expanded\n"); GtkTreeModel *model; GtkTreeIter newiter; GtkTreeIter child; GArray *array; gchar **split; GValue value; sqlite_uint64 dirid; gboolean temp_found = FALSE; model = gtk_tree_view_get_model(treeview); if(gtk_tree_model_iter_children(model, &child, iter) == TRUE) { memset(&value, 0, sizeof(GValue)); gtk_tree_model_get_value(model, &child, 0, &value); if(g_strcmp0("_walls_temp_", g_value_get_string(&value)) == 0) temp_found = TRUE; else return; } memset(&value, 0, sizeof(GValue)); gtk_tree_model_get_value(model, iter, 0, &value); split = g_strsplit(g_value_get_string(&value), ":", 2); dirid = g_ascii_strtoull(split[0], NULL, 10); g_strfreev(split); array = NULL; if(db_get_wallpapers(dirid, &array)) { for(int i = 0; i < array->len; i++) { struct wallpaper_t *wp = &g_array_index(array, struct wallpaper_t, i); gtk_tree_store_append((GtkTreeStore*)model, &newiter, iter); gtk_tree_store_set((GtkTreeStore*)model, &newiter, 0, wp->filepath, -1); } g_array_free(array, TRUE); if(gtk_tree_model_iter_children(model, &child, iter) == TRUE) { if(temp_found) gtk_tree_store_remove((GtkTreeStore*)model, &child); } } } int gui_main(int argc, char **argv) { GtkWidget *window; GtkWidget *filetree; GtkBuilder *builder ; GError *error = NULL; if(!db_open()) return 1; gtk_init(&argc, &argv); builder = gtk_builder_new(); //if(!gtk_builder_add_from_file(builder, "walls.ui", &error)) { if(!gtk_builder_add_from_string(builder, ui_string, -1, &error)) { g_warning("%s", error->message); g_free(error); return 1; } window = GTK_WIDGET(gtk_builder_get_object(builder, "window")); gtk_window_set_title(GTK_WINDOW(window), "walls"); filetree = GTK_WIDGET(gtk_builder_get_object(builder, "filetree")); filetree_init(GTK_TREE_VIEW(filetree)); gtk_builder_connect_signals(builder, NULL); g_object_unref(G_OBJECT(builder)); gtk_widget_show_all(window); gtk_main(); db_close(); return 0; }