--- /dev/null
+#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();
+}
--- /dev/null
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkWindow" id="mainwindow">
+ <property name="title" translatable="yes">lbxgui</property>
+ <property name="default_width">500</property>
+ <property name="default_height">400</property>
+ <signal name="destroy" handler="gtk_main_quit"/>
+ <child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkMenuBar" id="menubar">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkMenuItem" id="filemenu">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_File</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImageMenuItem" id="menu-openarchive">
+ <property name="label">gtk-open</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <accelerator key="o" signal="activate"/>
+ <signal name="activate" handler="open_archive"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImageMenuItem" id="menu-quit">
+ <property name="label">gtk-quit</property>
+ <property name="visible">True</property>
+ <property name="use_underline">True</property>
+ <property name="use_stock">True</property>
+ <signal name="activate" handler="gtk_main_quit"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkTreeView" id="treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>