CC=gcc
CFLAGS=-Wall -Wno-pointer-sign -g
-OBJS=main.o dive.o profile.o info.o divelist.o parse-xml.o save-xml.o
+OBJS=main.o dive.o profile.o info.o cylinders.o divelist.o parse-xml.o save-xml.o
divelog: $(OBJS)
$(CC) $(LDFLAGS) -o divelog $(OBJS) \
info.o: info.c dive.h display.h divelist.h
$(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` -c info.c
+cylinders.o: cylinders.c dive.h display.h divelist.h
+ $(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` -c cylinders.c
+
divelist.o: divelist.c dive.h display.h divelist.h
$(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` -c divelist.c
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include "dive.h"
+#include "display.h"
+#include "divelist.h"
+
+static struct tank_info {
+ const char *name;
+ int size; /* cuft or mliter depending on psi */
+ int psi; /* If zero, size is in mliter */
+} tank_info[] = {
+ { "None", },
+ { "10.0 l", 10000 },
+ { "11.1 l", 11100 },
+ { "AL72", 72, 3000 },
+ { "AL80", 80, 3000 },
+ { "LP85", 85, 2640 },
+ { "LP95", 95, 2640 },
+ { "HP100", 100, 3442 },
+ { "HP119", 119, 3442 },
+ { NULL, }
+};
+
+static void fill_tank_list(GtkListStore *store)
+{
+ GtkTreeIter iter;
+
+ struct tank_info *info = tank_info;
+
+ while (info->name) {
+ int size = info->size;
+ int psi = info->psi;
+ int mbar = 0, ml = size;
+
+ /* Is it in cuft and psi? */
+ if (psi) {
+ double bar = 0.0689475729 * psi;
+ double airvolume = 28316.8466 * size;
+ double atm = bar / 1.01325;
+
+ ml = airvolume / atm + 0.5;
+ mbar = bar*1000 + 0.5;
+ }
+
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set(store, &iter,
+ 0, info->name,
+ 1, ml,
+ 2, mbar,
+ -1);
+ info++;
+ }
+}
+
+static void cylinder_widget(GtkWidget *box, int nr, GtkListStore *model)
+{
+ GtkWidget *frame, *hbox, *size;
+ GtkCellRenderer *cell;
+ char buffer[80];
+
+ snprintf(buffer, sizeof(buffer), "Cylinder %d", nr);
+ frame = gtk_frame_new(buffer);
+ gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0);
+
+ hbox = gtk_hbox_new(TRUE, 3);
+ gtk_container_add(GTK_CONTAINER(frame), hbox);
+
+ size = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model));
+ cell = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(size), cell, TRUE);
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(size), cell, "text", 0, NULL );
+
+ gtk_box_pack_start(GTK_BOX(hbox), size, FALSE, FALSE, 0);
+}
+
+static GtkListStore *create_tank_size_model(void)
+{
+ GtkListStore *model;
+
+ model = gtk_list_store_new(3,
+ G_TYPE_STRING, /* Tank name */
+ G_TYPE_INT, /* Tank size in mliter */
+ G_TYPE_INT, /* Tank working pressure in mbar */
+ -1);
+
+ fill_tank_list(model);
+ return model;
+}
+
+GtkWidget *cylinder_management_widget(void)
+{
+ int i;
+ GtkWidget *vbox;
+ GtkListStore *model;
+
+ vbox = gtk_vbox_new(TRUE, 3);
+
+ model = create_tank_size_model();
+ for (i = 0; i < MAX_CYLINDERS; i++)
+ cylinder_widget(vbox, i, model);
+
+ return vbox;
+}
box = gtk_hbox_new(TRUE, 10);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), box);
- gtk_widget_show(box);
label = gtk_label_new(name);
gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0);
- gtk_widget_show(label);
va_start(args, name);
for (;;) {
gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), enabled);
g_signal_connect(button, "toggled", G_CALLBACK(callback_fn), NULL);
- gtk_widget_show(button);
}
va_end(args);
}
"Fahrenheit", set_fahrenheit, (output_units.temperature == FAHRENHEIT),
NULL);
- gtk_widget_show(dialog);
+ gtk_widget_show_all(dialog);
result = gtk_dialog_run(GTK_DIALOG(dialog));
if (result == GTK_RESPONSE_ACCEPT) {
output_units = menu_units;
GtkWidget *notebook;
GtkWidget *frame;
GtkWidget *dive_info;
+ GtkWidget *cylinder_management;
GtkWidget *menubar;
GtkWidget *vbox;
/* Frame for extended dive info */
dive_info = extended_dive_info_widget();
- gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dive_info, gtk_label_new("Extended Dive Info"));
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dive_info, gtk_label_new("Dive Notes"));
+
+ /* Frame for extended dive info */
+ cylinder_management = cylinder_management_widget();
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), cylinder_management, gtk_label_new("Cylinders"));
gtk_widget_set_app_paintable(win, TRUE);
gtk_widget_show_all(win);