From 56d402a0f11e7e4dd7f0ddf6882ace22c63d0a8c Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sat, 6 Feb 2010 23:55:42 -0500 Subject: [PATCH] lbxgui: New tool. --- .gitignore | 1 + Makefile.am | 1 + configure.ac | 6 +++ src/gui/Makefile.inc | 10 ++++ src/gui/lbxgui.c | 115 +++++++++++++++++++++++++++++++++++++++++++ src/gui/lbxgui.glade | 75 ++++++++++++++++++++++++++++ 6 files changed, 208 insertions(+) create mode 100644 src/gui/Makefile.inc create mode 100644 src/gui/lbxgui.c create mode 100644 src/gui/lbxgui.glade diff --git a/.gitignore b/.gitignore index fbef222..78d219c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ lbxtool lbximg +lbxgui config.status config.cache diff --git a/Makefile.am b/Makefile.am index 13f6354..78541b1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -19,5 +19,6 @@ bin_PROGRAMS = include doc/Makefile.inc include src/Makefile.inc +include src/gui/Makefile.inc SUBDIRS = lib . diff --git a/configure.ac b/configure.ac index bf0a5f4..a53e22a 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,12 @@ gl_INIT CHECK_LIBPNG([1.2], [have_libpng=yes], [have_libpng=no]) AM_CONDITIONAL([BUILD_LBXIMG], [test x"$have_libpng" = x"yes"]) +# A horrible combination of bugs makes this necessary for GTK+ detection. +unset POSIXLY_CORRECT + +AM_PATH_GTK_2_0([2.12.0], [have_gtk=yes], [have_gtk=no]) +AM_CONDITIONAL([BUILD_LBXGUI], [test x"$have_gtk" = x"yes"]) + AC_CONFIG_FILES([ Makefile lib/Makefile diff --git a/src/gui/Makefile.inc b/src/gui/Makefile.inc new file mode 100644 index 0000000..ac8260f --- /dev/null +++ b/src/gui/Makefile.inc @@ -0,0 +1,10 @@ +if BUILD_LBXGUI + +bin_PROGRAMS += lbxgui +lbxgui_SOURCES = src/gui/lbxgui.c +lbxgui_LDADD = liblbx.la $(GTK_LIBS) +lbxgui_CPPFLAGS = -I$(top_srcdir)/src +lbxgui_CFLAGS = $(GTK_CFLAGS) +lbxgui_LDFLAGS = $(AM_LDFLAGS) -export-dynamic + +endif diff --git a/src/gui/lbxgui.c b/src/gui/lbxgui.c new file mode 100644 index 0000000..6705d72 --- /dev/null +++ b/src/gui/lbxgui.c @@ -0,0 +1,115 @@ +#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(); +} diff --git a/src/gui/lbxgui.glade b/src/gui/lbxgui.glade new file mode 100644 index 0000000..b9f9e89 --- /dev/null +++ b/src/gui/lbxgui.glade @@ -0,0 +1,75 @@ + + + + + + lbxgui + 500 + 400 + + + + True + vertical + + + True + + + True + _File + True + + + True + + + gtk-open + True + True + True + + + + + + + gtk-quit + True + True + True + + + + + + + + + + False + 0 + + + + + True + True + never + automatic + + + True + True + False + + + + + 1 + + + + + + -- 2.43.2