]> git.draconx.ca Git - liblbx.git/blob - src/gui/lbxgui.c
lbxgui: New tool.
[liblbx.git] / src / gui / lbxgui.c
1 #include <stdlib.h>
2 #include <gtk/gtk.h>
3
4 #include "lbx.h"
5
6 static GtkTreeStore *archives;
7 static GtkBuilder *builder;
8
9 int load_archive(const char *path)
10 {
11         gchar *basename;
12         GtkTreeIter iter1, iter2;
13         unsigned nfiles;
14         LBX *lbx;
15
16         lbx = lbx_fopen(path);
17         if (!lbx)
18                 return -1;
19
20         basename = g_path_get_basename(path);
21         gtk_tree_store_append(archives, &iter1, NULL);
22         gtk_tree_store_set(archives, &iter1, 0, basename, -1);
23         g_free(basename);
24
25         nfiles = lbx_numfiles(lbx);
26         for (unsigned i = 0; i < nfiles; i++) {
27                 struct lbx_statbuf stat;
28
29                 lbx_stat(lbx, i, &stat);
30                 gtk_tree_store_append(archives, &iter2, &iter1);
31                 gtk_tree_store_set(archives, &iter2, 0, stat.name, -1);
32         }
33
34         lbx_close(lbx);
35         return 0;
36 }
37
38 void open_archive(GtkWidget *widget)
39 {
40         GtkFileFilter *lbxfilter, *allfilter;
41         GtkFileChooser *chooser;
42         GtkTreeIter iter;
43
44         chooser = GTK_FILE_CHOOSER(gtk_file_chooser_dialog_new(
45                 "Load Archive",
46                 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
47                 GTK_FILE_CHOOSER_ACTION_OPEN,
48                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
49                 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
50                 NULL));
51
52         lbxfilter = gtk_file_filter_new();
53         gtk_file_filter_set_name(lbxfilter, "LBX Archives (*.lbx)");
54         gtk_file_filter_add_pattern(lbxfilter, "*.lbx");
55
56         allfilter = gtk_file_filter_new();
57         gtk_file_filter_set_name(allfilter, "All Files");
58         gtk_file_filter_add_pattern(allfilter, "*");
59
60         gtk_file_chooser_add_filter(chooser, lbxfilter);
61         gtk_file_chooser_add_filter(chooser, allfilter);
62
63         if (gtk_dialog_run(GTK_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) {
64                 gchar *name = gtk_file_chooser_get_filename(chooser);
65                 load_archive(name);
66
67                 g_free(name);
68         }
69
70         gtk_widget_destroy(GTK_WIDGET(chooser));
71 }
72
73 static void interface_init(void)
74 {
75         GtkTreeViewColumn *column;
76         GtkCellRenderer *renderer;
77         GtkTreeView *tree;
78
79         tree = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview"));
80         gtk_tree_view_set_model(tree, GTK_TREE_MODEL(archives));
81
82         renderer = gtk_cell_renderer_text_new();
83         column = gtk_tree_view_column_new();
84         gtk_tree_view_column_pack_start(column, renderer, TRUE);
85         gtk_tree_view_column_add_attribute(column, renderer, "text", 0);
86         gtk_tree_view_append_column(tree, column);
87 }
88
89 int main(int argc, char **argv)
90 {
91         GtkWidget *window;
92         GError *err = NULL;
93
94         if (!gtk_init_with_args(&argc, &argv, NULL, NULL, NULL, &err)) {
95                 fprintf(stderr, "%s\n", err->message);
96                 return EXIT_FAILURE;
97         }
98
99         archives = gtk_tree_store_new(1, G_TYPE_STRING);
100         while (*argv)
101                 load_archive(*argv++);
102
103         builder = gtk_builder_new();
104         if (!gtk_builder_add_from_file(builder, "src/gui/lbxgui.glade", &err)) {
105                 fprintf(stderr, "%s\n", err->message);
106                 return EXIT_FAILURE;
107         }
108
109         window = GTK_WIDGET(gtk_builder_get_object(builder, "mainwindow"));
110
111         interface_init();
112         gtk_builder_connect_signals(builder, window);
113         gtk_widget_show_all(window);
114         gtk_main();
115 }