]> git.draconx.ca Git - liblbx.git/commitdiff
lbxgui: New tool.
authorNick Bowler <nbowler@draconx.ca>
Sun, 7 Feb 2010 04:55:42 +0000 (23:55 -0500)
committerNick Bowler <nbowler@draconx.ca>
Mon, 8 Feb 2010 17:00:55 +0000 (12:00 -0500)
.gitignore
Makefile.am
configure.ac
src/gui/Makefile.inc [new file with mode: 0644]
src/gui/lbxgui.c [new file with mode: 0644]
src/gui/lbxgui.glade [new file with mode: 0644]

index fbef22223a4cf2ce56136147e1d70cf46c92778d..78d219c2c38ea73c95d143f7632b09ed194a081c 100644 (file)
@@ -4,6 +4,7 @@
 
 lbxtool
 lbximg
+lbxgui
 
 config.status
 config.cache
index 13f63546de23620463e9e1752163b765335e2f79..78541b1d59b652d66a1ab25dc3d843ce9dc32546 100644 (file)
@@ -19,5 +19,6 @@ bin_PROGRAMS    =
 
 include doc/Makefile.inc
 include src/Makefile.inc
+include src/gui/Makefile.inc
 
 SUBDIRS = lib .
index bf0a5f417e7ff9be122e784ec83bb042dd2e220a..a53e22a21b81c89fa41968ac3f3e7e3e1de096f6 100644 (file)
@@ -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 (file)
index 0000000..ac8260f
--- /dev/null
@@ -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 (file)
index 0000000..6705d72
--- /dev/null
@@ -0,0 +1,115 @@
+#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();
+}
diff --git a/src/gui/lbxgui.glade b/src/gui/lbxgui.glade
new file mode 100644 (file)
index 0000000..b9f9e89
--- /dev/null
@@ -0,0 +1,75 @@
+<?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>