]> git.tdb.fi Git - ext/subsurface.git/blob - main.c
Add some extended dive info fields
[ext/subsurface.git] / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 #include "dive.h"
6 #include "display.h"
7
8 GtkWidget *main_window;
9
10 static int sortfn(const void *_a, const void *_b)
11 {
12         const struct dive *a = *(void **)_a;
13         const struct dive *b = *(void **)_b;
14
15         if (a->when < b->when)
16                 return -1;
17         if (a->when > b->when)
18                 return 1;
19         return 0;
20 }
21
22 /*
23  * This doesn't really report anything at all. We just sort the
24  * dives, the GUI does the reporting
25  */
26 static void report_dives(void)
27 {
28         qsort(dive_table.dives, dive_table.nr, sizeof(struct dive *), sortfn);
29 }
30
31 static void parse_argument(const char *arg)
32 {
33         const char *p = arg+1;
34
35         do {
36                 switch (*p) {
37                 case 'v':
38                         verbose++;
39                         continue;
40                 default:
41                         fprintf(stderr, "Bad argument '%s'\n", arg);
42                         exit(1);
43                 }
44         } while (*++p);
45 }
46
47 static void on_destroy(GtkWidget* w, gpointer data)
48 {
49         gtk_main_quit();
50 }
51
52 static GtkWidget *dive_profile;
53
54 void repaint_dive(void)
55 {
56         update_dive_info(current_dive);
57         gtk_widget_queue_draw(dive_profile);
58 }
59
60 static char *existing_filename;
61
62 static void file_open(GtkWidget *w, gpointer data)
63 {
64         GtkWidget *dialog;
65         dialog = gtk_file_chooser_dialog_new("Open File",
66                 GTK_WINDOW(main_window),
67                 GTK_FILE_CHOOSER_ACTION_OPEN,
68                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
69                 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
70                 NULL);
71
72         if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
73                 char *filename;
74                 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
75                 printf("Open: '%s'\n", filename);
76                 g_free(filename);
77         }
78         gtk_widget_destroy(dialog);
79 }
80
81 static void file_save(GtkWidget *w, gpointer data)
82 {
83         GtkWidget *dialog;
84         dialog = gtk_file_chooser_dialog_new("Save File",
85                 GTK_WINDOW(main_window),
86                 GTK_FILE_CHOOSER_ACTION_SAVE,
87                 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
88                 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
89                 NULL);
90         gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
91         if (!existing_filename) {
92                 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "Untitled document");
93         } else
94                 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), existing_filename);
95
96         if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
97                 char *filename;
98                 filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
99                 printf("Save: '%s'\n", filename);
100                 g_free(filename);
101         }
102         gtk_widget_destroy(dialog);
103 }
104
105 static GtkItemFactoryEntry menu_items[] = {
106         { "/_File",             NULL,           NULL,           0, "<Branch>" },
107         { "/File/_Open",        "<control>O",   file_open,      0, "<StockItem>", GTK_STOCK_OPEN },
108         { "/File/_Save",        "<control>S",   file_save,      0, "<StockItem>", GTK_STOCK_SAVE },
109 };
110 static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
111
112 /* This is just directly from the gtk menubar tutorial. */
113 static GtkWidget *get_menubar_menu(GtkWidget *window)
114 {
115         GtkItemFactory *item_factory;
116         GtkAccelGroup *accel_group;
117
118         accel_group = gtk_accel_group_new();
119         item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
120
121         gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL);
122         gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
123         return gtk_item_factory_get_widget(item_factory, "<main>");
124 }
125
126 int main(int argc, char **argv)
127 {
128         int i;
129         GtkWidget *win;
130         GtkWidget *divelist;
131         GtkWidget *table;
132         GtkWidget *notebook;
133         GtkWidget *frame;
134         GtkWidget *menubar;
135         GtkWidget *vbox;
136
137         parse_xml_init();
138
139         gtk_init(&argc, &argv);
140
141         for (i = 1; i < argc; i++) {
142                 const char *a = argv[i];
143
144                 if (a[0] == '-') {
145                         parse_argument(a);
146                         continue;
147                 }
148                 parse_xml_file(a);
149         }
150
151         report_dives();
152
153         win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
154         g_signal_connect(G_OBJECT(win), "destroy",      G_CALLBACK(on_destroy), NULL);
155         main_window = win;
156
157         vbox = gtk_vbox_new(FALSE, 0);
158         gtk_container_add(GTK_CONTAINER(win), vbox);
159
160         menubar = get_menubar_menu(win);
161         gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
162
163         /* Table for the list of dives, cairo window, and dive info */
164         table = gtk_table_new(2, 2, FALSE);
165         gtk_container_set_border_width(GTK_CONTAINER(table), 5);
166         gtk_box_pack_end(GTK_BOX(vbox), table, TRUE, TRUE, 0);
167         gtk_widget_show(table);
168
169         /* Create the atual divelist */
170         divelist = create_dive_list();
171         gtk_table_attach(GTK_TABLE(table), divelist, 0, 1, 0, 2,
172                 0, GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0);
173
174         /* Frame for minimal dive info */
175         frame = dive_info_frame();
176         gtk_table_attach(GTK_TABLE(table), frame, 1, 2, 0, 1,
177                  GTK_FILL | GTK_SHRINK | GTK_EXPAND, 0, 0, 0);
178
179         /* Notebook for dive info vs profile vs .. */
180         notebook = gtk_notebook_new();
181         gtk_table_attach_defaults(GTK_TABLE(table), notebook, 1, 2, 1, 2);
182
183         /* Frame for dive profile */
184         frame = dive_profile_frame();
185         gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, gtk_label_new("Dive Profile"));
186         dive_profile = frame;
187
188         /* Frame for extended dive info */
189         frame = extended_dive_info_frame();
190         gtk_notebook_append_page(GTK_NOTEBOOK(notebook), frame, gtk_label_new("Extended dive Info"));
191
192         gtk_widget_set_app_paintable(win, TRUE);
193         gtk_widget_show_all(win);
194
195         gtk_main();
196         return 0;
197 }