+#include <stdlib.h>
+#include <gtk/gtk.h>
+
+#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();
+}