]> git.tdb.fi Git - ext/subsurface.git/blob - main.c
Split up profile frame generation into its own file.
[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 static void show_dive(int nr, struct dive *dive)
9 {
10         int i;
11         struct tm *tm;
12
13         tm = gmtime(&dive->when);
14
15         printf("At %02d:%02d:%02d %04d-%02d-%02d  (%d ft max, %d minutes)\n",
16                 tm->tm_hour, tm->tm_min, tm->tm_sec,
17                 tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
18                 to_feet(dive->maxdepth), dive->duration.seconds / 60);
19
20         if (!verbose)
21                 return;
22
23         for (i = 0; i < dive->samples; i++) {
24                 struct sample *s = dive->sample + i;
25
26                 printf("%4d:%02d: %3d ft, %2d C, %4d PSI\n",
27                         s->time.seconds / 60,
28                         s->time.seconds % 60,
29                         to_feet(s->depth),
30                         to_C(s->temperature),
31                         to_PSI(s->tankpressure));
32         }
33 }
34
35 static int sortfn(const void *_a, const void *_b)
36 {
37         const struct dive *a = *(void **)_a;
38         const struct dive *b = *(void **)_b;
39
40         if (a->when < b->when)
41                 return -1;
42         if (a->when > b->when)
43                 return 1;
44         return 0;
45 }
46
47 /*
48  * This doesn't really report anything at all. We just sort the
49  * dives, the GUI does the reporting
50  */
51 static void report_dives(void)
52 {
53         qsort(dive_table.dives, dive_table.nr, sizeof(struct dive *), sortfn);
54 }
55
56 static void parse_argument(const char *arg)
57 {
58         const char *p = arg+1;
59
60         do {
61                 switch (*p) {
62                 case 'v':
63                         verbose++;
64                         continue;
65                 default:
66                         fprintf(stderr, "Bad argument '%s'\n", arg);
67                         exit(1);
68                 }
69         } while (*++p);
70 }
71
72 static void on_destroy(GtkWidget* w, gpointer data)
73 {
74         gtk_main_quit();
75 }
76
77 static GtkTreeModel *fill_dive_list(void)
78 {
79         int i;
80         GtkListStore *store;
81         GtkTreeIter iter;
82
83         store = gtk_list_store_new(1, G_TYPE_STRING);
84
85         for (i = 0; i < dive_table.nr; i++) {
86                 struct dive *dive = dive_table.dives[i];
87
88                 gtk_list_store_append(store, &iter);
89                 gtk_list_store_set(store, &iter,
90                         0, dive->name,
91                         -1);
92         }
93
94         return GTK_TREE_MODEL(store);
95 }
96
97 static GtkWidget *create_dive_list(void)
98 {
99         GtkWidget *list;
100         GtkCellRenderer *renderer;
101         GtkTreeModel *model;
102
103         list = gtk_tree_view_new();
104
105         renderer = gtk_cell_renderer_text_new();
106         gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(list),
107                 -1, "Dive", renderer, "text", 0, NULL);
108
109         model = fill_dive_list();
110         gtk_tree_view_set_model(GTK_TREE_VIEW(list), model);
111         g_object_unref(model);
112         return list;
113 }
114
115 int main(int argc, char **argv)
116 {
117         int i;
118         GtkWidget *win;
119         GtkWidget *divelist;
120         GtkWidget *vbox;
121         GtkWidget *scrolled_window;
122         GtkWidget *frame;
123
124         parse_xml_init();
125
126         gtk_init(&argc, &argv);
127
128         for (i = 1; i < argc; i++) {
129                 const char *a = argv[i];
130
131                 if (a[0] == '-') {
132                         parse_argument(a);
133                         continue;
134                 }
135                 parse_xml_file(a);
136         }
137
138         report_dives();
139
140         win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
141         g_signal_connect(G_OBJECT(win), "destroy",      G_CALLBACK(on_destroy), NULL);
142
143         /* HBOX for the list of dives and cairo window */
144         vbox=gtk_hbox_new(FALSE, 5);
145         gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
146         gtk_container_add(GTK_CONTAINER(win), vbox);
147         gtk_widget_show(vbox);
148
149         /* Scrolled window for the list goes into the vbox.. */
150         scrolled_window=gtk_scrolled_window_new(NULL, NULL);
151         gtk_widget_set_usize(scrolled_window, 150, 350);
152         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
153         gtk_container_add(GTK_CONTAINER(vbox), scrolled_window);
154         gtk_widget_show(scrolled_window);
155
156         /* Frame for dive profile */
157         frame = dive_profile_frame();
158
159         gtk_container_add(GTK_CONTAINER(vbox), frame);
160
161         /* Create the atual divelist */
162         divelist = create_dive_list();
163
164         /* .. and connect it to the scrolled window */
165         gtk_container_add(GTK_CONTAINER(scrolled_window), divelist);
166
167         gtk_widget_set_app_paintable(win, TRUE);
168         gtk_widget_show_all(win);
169
170         gtk_main();
171         return 0;
172 }