#include #include #include "lbx.h" static GtkTreeStore *archives; static GtkBuilder *builder; int load_archive(const char *path) { gchar *basename; GtkTreeIter iter1, iter2; unsigned nfiles; LBX *lbx; lbx = lbx_fopen(path); if (!lbx) return -1; basename = g_path_get_basename(path); gtk_tree_store_append(archives, &iter1, NULL); gtk_tree_store_set(archives, &iter1, 0, basename, -1); g_free(basename); nfiles = lbx_numfiles(lbx); for (unsigned i = 0; i < nfiles; i++) { struct lbx_statbuf stat; lbx_stat(lbx, i, &stat); gtk_tree_store_append(archives, &iter2, &iter1); gtk_tree_store_set(archives, &iter2, 0, stat.name, -1); } lbx_close(lbx); return 0; } void open_archive(GtkWidget *widget) { GtkFileFilter *lbxfilter, *allfilter; GtkFileChooser *chooser; GtkTreeIter iter; chooser = GTK_FILE_CHOOSER(gtk_file_chooser_dialog_new( "Load Archive", GTK_WINDOW(gtk_widget_get_toplevel(widget)), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL)); lbxfilter = gtk_file_filter_new(); gtk_file_filter_set_name(lbxfilter, "LBX Archives (*.lbx)"); gtk_file_filter_add_pattern(lbxfilter, "*.lbx"); allfilter = gtk_file_filter_new(); gtk_file_filter_set_name(allfilter, "All Files"); gtk_file_filter_add_pattern(allfilter, "*"); gtk_file_chooser_add_filter(chooser, lbxfilter); gtk_file_chooser_add_filter(chooser, allfilter); if (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) { gchar *name = gtk_file_chooser_get_filename(chooser); load_archive(name); g_free(name); } gtk_widget_destroy(GTK_WIDGET(chooser)); } static void interface_init(void) { GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeView *tree; tree = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview")); gtk_tree_view_set_model(tree, GTK_TREE_MODEL(archives)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", 0); gtk_tree_view_append_column(tree, column); } int main(int argc, char **argv) { GtkWidget *window; GError *err = NULL; if (!gtk_init_with_args(&argc, &argv, NULL, NULL, NULL, &err)) { fprintf(stderr, "%s\n", err->message); return EXIT_FAILURE; } archives = gtk_tree_store_new(1, G_TYPE_STRING); while (*argv) load_archive(*argv++); builder = gtk_builder_new(); if (!gtk_builder_add_from_file(builder, "src/gui/lbxgui.glade", &err)) { fprintf(stderr, "%s\n", err->message); return EXIT_FAILURE; } window = GTK_WIDGET(gtk_builder_get_object(builder, "mainwindow")); interface_init(); gtk_builder_connect_signals(builder, window); gtk_widget_show_all(window); gtk_main(); }