summaryrefslogtreecommitdiffstats
path: root/equipment.c
diff options
context:
space:
mode:
Diffstat (limited to 'equipment.c')
-rw-r--r--equipment.c1555
1 files changed, 0 insertions, 1555 deletions
diff --git a/equipment.c b/equipment.c
index 5485b2101..9d6ab40f9 100644
--- a/equipment.c
+++ b/equipment.c
@@ -13,453 +13,10 @@
#include <stdarg.h>
#include <time.h>
#include "gettext.h"
-#define QT_TR_NOOP(arg) arg
#include "dive.h"
#include "display.h"
-#if USE_GTK_UI
-#include "display-gtk.h"
-#endif
#include "divelist.h"
-#include "conversions.h"
-#if USE_GTK_UI
-#include "display-gtk.h"
-static GtkListStore *cylinder_model, *weightsystem_model;
-
-enum {
- CYL_DESC,
- CYL_SIZE,
- CYL_WORKP,
- CYL_STARTP,
- CYL_ENDP,
- CYL_O2,
- CYL_HE,
- CYL_COLUMNS
-};
-
-enum {
- WS_DESC,
- WS_WEIGHT,
- WS_COLUMNS
-};
-
-struct equipment_list {
- int max_index;
- GtkListStore *model;
- GtkTreeView *tree_view;
- GtkWidget *edit, *add, *del;
-};
-
-static struct equipment_list cylinder_list[2], weightsystem_list[2];
-
-struct dive edit_dive;
-
-struct cylinder_widget {
- int index, changed;
- const char *name;
- GtkWidget *hbox;
- GtkComboBox *description;
- GtkSpinButton *size, *pressure;
- GtkWidget *start, *end, *pressure_button;
- GtkWidget *o2, *he, *gasmix_button;
- int w_idx;
-};
-
-struct ws_widget {
- int index, changed;
- const char *name;
- GtkWidget *hbox;
- GtkComboBox *description;
- GtkSpinButton *weight;
- int w_idx;
-};
-#endif /* USE_GTK_UI */
-
-/* we want bar - so let's not use our unit functions */
-int convert_pressure(int mbar, double *p)
-{
- int decimals = 1;
- double pressure;
-
- if (prefs.units.pressure == PSI) {
- pressure = mbar_to_PSI(mbar);
- decimals = 0;
- } else {
- pressure = mbar / 1000.0;
- }
-
- *p = pressure;
- return decimals;
-}
-
-void convert_volume_pressure(int ml, int mbar, double *v, double *p)
-{
- double volume, pressure;
-
- volume = ml / 1000.0;
- if (mbar) {
- if (prefs.units.volume == CUFT) {
- volume = ml_to_cuft(ml);
- volume *= bar_to_atm(mbar / 1000.0);
- }
-
- if (prefs.units.pressure == PSI)
- pressure = mbar_to_PSI(mbar);
- else
- pressure = mbar / 1000.0;
- *p = pressure;
- } else {
- *p = 0;
- }
- *v = volume;
-}
-
-int convert_weight(int grams, double *m)
-{
- int decimals = 1; /* not sure - do people do less than whole lbs/kg ? */
- double weight;
-
- if (prefs.units.weight == LBS)
- weight = grams_to_lbs(grams);
- else
- weight = grams / 1000.0;
- *m = weight;
- return decimals;
-}
-
-#if USE_GTK_UI
-static void set_cylinder_description(struct cylinder_widget *cylinder, const char *desc)
-{
- set_active_text(cylinder->description, desc);
-}
-
-
-static void set_cylinder_type_spinbuttons(struct cylinder_widget *cylinder, int ml, int mbar)
-{
- double volume, pressure;
-
- convert_volume_pressure(ml, mbar, &volume, &pressure);
- gtk_spin_button_set_value(cylinder->size, volume);
- gtk_spin_button_set_value(cylinder->pressure, pressure);
-}
-
-static void set_cylinder_pressure_spinbuttons(struct cylinder_widget *cylinder, cylinder_t *cyl)
-{
- int set;
- unsigned int start, end;
- double pressure;
-
- start = cyl->start.mbar;
- end = cyl->end.mbar;
- set = start || end;
- if (!set) {
- start = cyl->sample_start.mbar;
- end = cyl->sample_end.mbar;
- }
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cylinder->pressure_button), set);
- gtk_widget_set_sensitive(cylinder->start, set);
- gtk_widget_set_sensitive(cylinder->end, set);
-
- convert_pressure(start, &pressure);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(cylinder->start), pressure);
- convert_pressure(end, &pressure);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(cylinder->end), pressure);
-}
-
-static void set_weight_description(struct ws_widget *ws_widget, const char *desc)
-{
- set_active_text(ws_widget->description, desc);
-}
-
-static void set_weight_weight_spinbutton(struct ws_widget *ws_widget, int grams)
-{
- double weight;
-
- convert_weight(grams, &weight);
- gtk_spin_button_set_value(ws_widget->weight, weight);
-}
-
-/*
- * The gtk_tree_model_foreach() interface is bad. It could have
- * returned whether the callback ever returned true
- */
-static GtkTreeIter *found_match = NULL;
-static GtkTreeIter match_iter;
-
-static bool match_desc(GtkTreeModel *model, GtkTreePath *path,
- GtkTreeIter *iter, gpointer data)
-{
- int match;
- gchar *name;
- const char *desc = data;
-
- gtk_tree_model_get(model, iter, 0, &name, -1);
- match = !strcmp(desc, name);
- g_free(name);
- if (match) {
- match_iter = *iter;
- found_match = &match_iter;
- }
- return match;
-}
-
-static int get_active_item(GtkComboBox *combo_box, GtkTreeIter *iter, GtkListStore *model)
-{
- const char *desc;
-
- if (gtk_combo_box_get_active_iter(combo_box, iter))
- return TRUE;
-
- desc = get_active_text(combo_box);
-
- found_match = NULL;
- gtk_tree_model_foreach(GTK_TREE_MODEL(model), match_desc, (void *)desc);
-
- if (!found_match)
- return FALSE;
-
- *iter = *found_match;
- gtk_combo_box_set_active_iter(combo_box, iter);
- return TRUE;
-}
-
-static void cylinder_cb(GtkComboBox *combo_box, gpointer data)
-{
- GtkTreeIter iter;
- GtkTreeModel *model = gtk_combo_box_get_model(combo_box);
- int ml, mbar;
- struct cylinder_widget *cylinder = data;
- struct dive *dive;
- cylinder_t *cyl;
-
- if (cylinder->w_idx == W_IDX_PRIMARY)
- dive = current_dive;
- else
- dive = &edit_dive;
- cyl = dive->cylinder + cylinder->index;
-
- /* Did the user set it to some non-standard value? */
- if (!get_active_item(combo_box, &iter, cylinder_model)) {
- cylinder->changed = 1;
- return;
- }
-
- /*
- * We get "change" signal callbacks just because we set
- * the description by hand. Whatever. So ignore them if
- * they are no-ops.
- */
- if (!cylinder->changed && cyl->type.description) {
- int same;
- const char *desc = get_active_text(combo_box);
-
- same = !strcmp(desc, cyl->type.description);
- if (same)
- return;
- }
- cylinder->changed = 1;
-
- gtk_tree_model_get(model, &iter,
- CYL_SIZE, &ml,
- CYL_WORKP, &mbar,
- -1);
-
- set_cylinder_type_spinbuttons(cylinder, ml, mbar);
-}
-
-static void weight_cb(GtkComboBox *combo_box, gpointer data)
-{
- GtkTreeIter iter;
- GtkTreeModel *model = gtk_combo_box_get_model(combo_box);
- int weight;
- struct ws_widget *ws_widget = data;
- struct dive *dive;
- weightsystem_t *ws;
- if (ws_widget->w_idx == W_IDX_PRIMARY)
- dive = current_dive;
- else
- dive = &edit_dive;
- ws = dive->weightsystem + ws_widget->index;
-
- /* Did the user set it to some non-standard value? */
- if (!get_active_item(combo_box, &iter, weightsystem_model)) {
- ws_widget->changed = 1;
- return;
- }
-
- /*
- * We get "change" signal callbacks just because we set
- * the description by hand. Whatever. So ignore them if
- * they are no-ops.
- */
- if (!ws_widget->changed && ws->description) {
- int same;
- const char *desc = get_active_text(combo_box);
-
- same = !strcmp(desc, ws->description);
- if (same)
- return;
- }
- ws_widget->changed = 1;
-
- gtk_tree_model_get(model, &iter,
- WS_WEIGHT, &weight,
- -1);
-
- set_weight_weight_spinbutton(ws_widget, weight);
-}
-
-static GtkTreeIter *add_cylinder_type(const char *desc, int ml, int mbar, GtkTreeIter *iter)
-{
- GtkTreeModel *model;
-
- /* Don't even bother adding stuff without a size */
- if (!ml)
- return NULL;
-
- found_match = NULL;
- model = GTK_TREE_MODEL(cylinder_model);
- gtk_tree_model_foreach(model, match_desc, (void *)desc);
-
- if (!found_match) {
- GtkListStore *store = GTK_LIST_STORE(model);
-
- gtk_list_store_append(store, iter);
- gtk_list_store_set(store, iter,
- 0, desc,
- 1, ml,
- 2, mbar,
- -1);
- return iter;
- }
- return found_match;
-}
-
-static GtkTreeIter *add_weightsystem_type(const char *desc, int weight, GtkTreeIter *iter)
-{
- GtkTreeModel *model;
-
- found_match = NULL;
- model = GTK_TREE_MODEL(weightsystem_model);
- gtk_tree_model_foreach(model, match_desc, (void *)desc);
-
- if (found_match) {
- gtk_list_store_set(GTK_LIST_STORE(model), found_match,
- WS_WEIGHT, weight,
- -1);
- } else if (desc && desc[0]) {
- gtk_list_store_append(GTK_LIST_STORE(model), iter);
- gtk_list_store_set(GTK_LIST_STORE(model), iter,
- WS_DESC, desc,
- WS_WEIGHT, weight,
- -1);
- return iter;
- }
- return found_match;
-}
-
-/*
- * When adding a dive, we'll add all the pre-existing cylinder
- * information from that dive to our cylinder model.
- */
-void add_cylinder_description(cylinder_type_t *type)
-{
- GtkTreeIter iter;
- const char *desc;
- unsigned int size, workp;
-
- desc = type->description;
- if (!desc)
- return;
- size = type->size.mliter;
- workp = type->workingpressure.mbar;
- add_cylinder_type(desc, size, workp, &iter);
-}
-
-static void add_cylinder(struct cylinder_widget *cylinder, const char *desc, int ml, int mbar)
-{
- GtkTreeIter iter;
-
- cylinder->name = desc;
- add_cylinder_type(desc, ml, mbar, &iter);
-}
-
-void add_weightsystem_description(weightsystem_t *weightsystem)
-{
- GtkTreeIter iter;
- const char *desc;
- unsigned int weight;
-
- desc = weightsystem->description;
- if (!desc)
- return;
- weight = weightsystem->weight.grams;
- add_weightsystem_type(desc, weight, &iter);
-}
-
-static void add_weightsystem(struct ws_widget *ws_widget, const char *desc, int weight)
-{
- GtkTreeIter iter;
-
- ws_widget->name = desc;
- add_weightsystem_type(desc, weight, &iter);
-}
-
-static void show_cylinder(cylinder_t *cyl, struct cylinder_widget *cylinder)
-{
- const char *desc;
- int ml, mbar;
- int gasmix;
- double o2, he;
-
- /* Don't show uninitialized cylinder widgets */
- if (!cylinder->description)
- return;
-
- desc = cyl->type.description;
- if (!desc)
- desc = "";
- ml = cyl->type.size.mliter;
- mbar = cyl->type.workingpressure.mbar;
- add_cylinder(cylinder, desc, ml, mbar);
-
- set_cylinder_description(cylinder, desc);
- set_cylinder_type_spinbuttons(cylinder,
- cyl->type.size.mliter, cyl->type.workingpressure.mbar);
- set_cylinder_pressure_spinbuttons(cylinder, cyl);
-
- gasmix = cyl->gasmix.o2.permille || cyl->gasmix.he.permille;
- gtk_widget_set_sensitive(cylinder->o2, gasmix);
- gtk_widget_set_sensitive(cylinder->he, gasmix);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cylinder->gasmix_button), gasmix);
-
- o2 = cyl->gasmix.o2.permille / 10.0;
- he = cyl->gasmix.he.permille / 10.0;
- if (!o2)
- o2 = O2_IN_AIR / 10.0;
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(cylinder->o2), o2);
- gtk_spin_button_set_value(GTK_SPIN_BUTTON(cylinder->he), he);
-}
-
-static void show_weightsystem(weightsystem_t *ws, struct ws_widget *weightsystem_widget)
-{
- const char *desc;
- int grams;
-
- /* Don't show uninitialized widgets */
- if (!weightsystem_widget->description)
- return;
-
- desc = ws->description;
- if (!desc)
- desc = "";
- grams = ws->weight.grams;
- add_weightsystem(weightsystem_widget, desc, grams);
-
- set_weight_description(weightsystem_widget, desc);
- set_weight_weight_spinbutton(weightsystem_widget, ws->weight.grams);
-}
-#else
/* placeholders for a few functions that we need to redesign for the Qt UI */
void add_cylinder_description(cylinder_type_t *type)
{
@@ -490,8 +47,6 @@ void add_weightsystem_description(weightsystem_t *weightsystem)
}
}
-#endif /* USE_GTK_UI */
-
bool cylinder_nodata(cylinder_t *cyl)
{
return !cyl->type.size.mliter &&
@@ -555,277 +110,6 @@ bool weightsystems_equal(weightsystem_t *ws1, weightsystem_t *ws2)
return TRUE;
}
-#if USE_GTK_UI
-static void set_one_cylinder(void *_data, GtkListStore *model, GtkTreeIter *iter)
-{
- cylinder_t *cyl = _data;
- unsigned int start, end;
-
- start = cyl->start.mbar ? : cyl->sample_start.mbar;
- end = cyl->end.mbar ? : cyl->sample_end.mbar;
- gtk_list_store_set(model, iter,
- CYL_DESC, cyl->type.description ? : "",
- CYL_SIZE, cyl->type.size.mliter,
- CYL_WORKP, cyl->type.workingpressure.mbar,
- CYL_STARTP, start,
- CYL_ENDP, end,
- CYL_O2, cyl->gasmix.o2.permille,
- CYL_HE, cyl->gasmix.he.permille,
- -1);
-}
-
-static void set_one_weightsystem(void *_data, GtkListStore *model, GtkTreeIter *iter)
-{
- weightsystem_t *ws = _data;
-
- gtk_list_store_set(model, iter,
- WS_DESC, ws->description ? : _("unspecified"),
- WS_WEIGHT, ws->weight.grams,
- -1);
-}
-
-static void *cyl_ptr(struct dive *dive, int idx)
-{
- if (idx < 0 || idx >= MAX_CYLINDERS)
- return NULL;
- return &dive->cylinder[idx];
-}
-
-static void *ws_ptr(struct dive *dive, int idx)
-{
- if (idx < 0 || idx >= MAX_WEIGHTSYSTEMS)
- return NULL;
- return &dive->weightsystem[idx];
-}
-
-static void show_equipment(struct dive *dive, int max,
- struct equipment_list *equipment_list,
- void*(*ptr_function)(struct dive*, int),
- bool(*none_function)(void *),
- void(*set_one_function)(void*, GtkListStore*, GtkTreeIter *))
-{
- int i, used;
- void *data;
- GtkTreeIter iter;
- GtkListStore *model = equipment_list->model;
-
- if (! model)
- return;
- if (! dive) {
- gtk_widget_set_sensitive(equipment_list->edit, 0);
- gtk_widget_set_sensitive(equipment_list->del, 0);
- gtk_widget_set_sensitive(equipment_list->add, 0);
- clear_equipment_widgets();
- return;
- }
- gtk_list_store_clear(model);
- used = max;
- do {
- data = ptr_function(dive, used-1);
- if (!none_function(data))
- break;
- } while (--used);
-
- equipment_list->max_index = used;
-
- gtk_widget_set_sensitive(equipment_list->edit, 0);
- gtk_widget_set_sensitive(equipment_list->del, 0);
- gtk_widget_set_sensitive(equipment_list->add, used < max);
-
- for (i = 0; i < used; i++) {
- data = ptr_function(dive, i);
- gtk_list_store_append(model, &iter);
- set_one_function(data, model, &iter);
- }
-}
-
-void show_dive_equipment(struct dive *dive, int w_idx)
-{
- show_equipment(dive, MAX_CYLINDERS, &cylinder_list[w_idx],
- &cyl_ptr, &cylinder_none, &set_one_cylinder);
- show_equipment(dive, MAX_WEIGHTSYSTEMS, &weightsystem_list[w_idx],
- &ws_ptr, &weightsystem_none, &set_one_weightsystem);
-}
-
-int select_cylinder(struct dive *dive, int when)
-{
- GtkWidget *dialog, *vbox, *label;
- GtkWidget *buttons[MAX_CYLINDERS] = { NULL, };
- GSList *group = NULL;
- int i, success, nr, selected = -1;
- char buffer[256];
-
- nr = MAX_CYLINDERS - 1;
- while (nr >= 0 && cylinder_nodata(cyl_ptr(dive, nr)))
- nr--;
-
- if (nr == -1) {
- dialog = gtk_dialog_new_with_buttons(_("Cannot add gas change"),
- GTK_WINDOW(main_window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- NULL);
- vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- label = gtk_label_new(_("No cylinders listed for this dive."));
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- gtk_widget_show_all(dialog);
- success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT;
- goto bail;
- }
- snprintf(buffer, sizeof(buffer), _("Add gaschange event at %d:%02u"), FRACTION(when, 60));
- dialog = gtk_dialog_new_with_buttons(buffer,
- GTK_WINDOW(main_window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
- NULL);
-
- vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- label = gtk_label_new(_("Available gases"));
- gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
- for (i = 0; i <= nr; i++) {
- char gas_buf[80];
- cylinder_t *cyl = cyl_ptr(dive, i);
- get_gas_string(cyl->gasmix.o2.permille, cyl->gasmix.he.permille, gas_buf, sizeof(gas_buf));
- snprintf(buffer, sizeof(buffer), "%s: %s",
- dive->cylinder[i].type.description ?: _("unknown"), gas_buf);
- buttons[i] = gtk_radio_button_new_with_label(group, buffer);
- group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(buttons[i]));
- gtk_box_pack_start(GTK_BOX(vbox), buttons[i], FALSE, FALSE, 0);
- }
- gtk_widget_show_all(dialog);
- success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT;
- if (success) {
- for (i = 0; i <= nr; i++)
- if (buttons[i] && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(buttons[i])))
- selected = i;
- }
- for (i = 0; i <= nr; i++)
- if (buttons[i])
- gtk_widget_destroy(buttons[i]);
-bail:
- gtk_widget_destroy(dialog);
-
- return selected;
-
-}
-
-static GtkWidget *create_spinbutton(GtkWidget *vbox, const char *name, double min, double max, double incr)
-{
- GtkWidget *frame, *hbox, *button;
-
- frame = gtk_frame_new(name);
- gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, FALSE, 0);
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_container_add(GTK_CONTAINER(frame), hbox);
-
- button = gtk_spin_button_new_with_range(min, max, incr);
- gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
-
- gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(button), GTK_UPDATE_IF_VALID);
-
- return button;
-}
-
-static void fill_cylinder_info(struct cylinder_widget *cylinder, cylinder_t *cyl, const char *desc,
- double volume, double pressure, double start, double end, int o2, int he)
-{
- int mbar, ml;
-
- if (prefs.units.pressure == PSI) {
- pressure = psi_to_bar(pressure);
- start = psi_to_bar(start);
- end = psi_to_bar(end);
- }
-
- mbar = pressure * 1000 + 0.5;
- if (mbar && prefs.units.volume == CUFT) {
- volume = cuft_to_l(volume);
- volume /= bar_to_atm(pressure);
- }
-
- ml = volume * 1000 + 0.5;
-
- /* Ignore obviously crazy He values */
- if (o2 + he > 1000)
- he = 0;
-
- /* We have a rule that normal air is all zeroes */
- if (!he && o2 > 208 && o2 < 211)
- o2 = 0;
-
- cyl->type.description = desc;
- cyl->type.size.mliter = ml;
- cyl->type.workingpressure.mbar = mbar;
- cyl->start.mbar = start * 1000 + 0.5;
- cyl->end.mbar = end * 1000 + 0.5;
- cyl->gasmix.o2.permille = o2;
- cyl->gasmix.he.permille = he;
-
- /*
- * Also, insert it into the model if it doesn't already exist
- */
- // WARNING: GTK-Specific Code.
- add_cylinder(cylinder, desc, ml, mbar);
-}
-
-static void record_cylinder_changes(cylinder_t *cyl, struct cylinder_widget *cylinder)
-{
- const gchar *desc;
- GtkComboBox *box;
- double volume, pressure, start, end;
- int o2, he;
-
- /* Ignore uninitialized cylinder widgets */
- box = cylinder->description;
- if (!box)
- return;
-
- desc = strdup(get_active_text(box));
- volume = gtk_spin_button_get_value(cylinder->size);
- pressure = gtk_spin_button_get_value(cylinder->pressure);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cylinder->pressure_button))) {
- start = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->start));
- end = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->end));
- } else {
- start = end = 0;
- }
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cylinder->gasmix_button))) {
- o2 = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->o2))*10 + 0.5;
- he = gtk_spin_button_get_value(GTK_SPIN_BUTTON(cylinder->he))*10 + 0.5;
- } else {
- o2 = 0;
- he = 0;
- }
- fill_cylinder_info(cylinder, cyl, desc, volume, pressure, start, end, o2, he);
-}
-
-static void record_weightsystem_changes(weightsystem_t *ws, struct ws_widget *weightsystem_widget)
-{
- const gchar *desc;
- GtkComboBox *box;
- int grams;
- double value;
- GtkTreeIter iter;
-
- /* Ignore uninitialized cylinder widgets */
- box = weightsystem_widget->description;
- if (!box)
- return;
-
- desc = strdup(get_active_text(box));
- value = gtk_spin_button_get_value(weightsystem_widget->weight);
-
- if (prefs.units.weight == LBS)
- grams = lbs_to_grams(value);
- else
- grams = value * 1000;
- ws->weight.grams = grams;
- ws->description = desc;
- add_weightsystem_type(desc, grams, &iter);
-}
-#endif /* USE_GTK_UI */
/*
* We hardcode the most common standard cylinders,
* we should pick up any other names from the dive
@@ -877,53 +161,6 @@ struct tank_info_t tank_info[100] = {
{ NULL, }
};
-#if USE_GTK_UI
-static void fill_tank_list(GtkListStore *store)
-{
- GtkTreeIter iter;
- struct tank_info *info = tank_info;
-
- for (info = tank_info ; info->name; info++) {
- int ml = info->ml;
- int cuft = info->cuft;
- int psi = info->psi;
- int mbar;
- double bar = info->bar;
-
- if (psi && bar)
- goto bad_tank_info;
- if (ml && cuft)
- goto bad_tank_info;
- if (cuft && !psi)
- goto bad_tank_info;
-
- /* Is it in cuft and psi? */
- if (psi)
- bar = psi_to_bar(psi);
-
- if (cuft) {
- double airvolume = cuft_to_l(cuft) * 1000.0;
- double atm = bar_to_atm(bar);
-
- 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);
- continue;
-
-bad_tank_info:
- fprintf(stderr, "Bad tank info for '%s'\n", info->name);
- }
-}
-#endif /* USE_GTK_UI */
-
/*
* We hardcode the most common weight system types
* This is a bit odd as the weight system types don't usually encode weight
@@ -936,351 +173,6 @@ struct ws_info_t ws_info[100] = {
{ QT_TR_NOOP("clip-on"), 0 },
};
-#if USE_GTK_UI
-static void fill_ws_list(GtkListStore *store)
-{
- GtkTreeIter iter;
- struct ws_info_t *info = ws_info;
-
- while (info->name) {
- gtk_list_store_append(store, &iter);
- gtk_list_store_set(store, &iter,
- 0, _(info->name),
- 1, info->grams,
- -1);
- info++;
- }
-}
-
-static void gasmix_cb(GtkToggleButton *button, gpointer data)
-{
- struct cylinder_widget *cylinder = data;
- int state;
-
- state = gtk_toggle_button_get_active(button);
- gtk_widget_set_sensitive(cylinder->o2, state);
- gtk_widget_set_sensitive(cylinder->he, state);
-}
-
-static void pressure_cb(GtkToggleButton *button, gpointer data)
-{
- struct cylinder_widget *cylinder = data;
- int state;
-
- state = gtk_toggle_button_get_active(button);
- gtk_widget_set_sensitive(cylinder->start, state);
- gtk_widget_set_sensitive(cylinder->end, state);
-}
-
-static void cylinder_activate_cb(GtkComboBox *combo_box, gpointer data)
-{
- struct cylinder_widget *cylinder = data;
- cylinder_cb(cylinder->description, data);
-}
-
-/* Return a frame containing a hbox inside a hbox */
-static GtkWidget *frame_box(const char *title, GtkWidget *vbox)
-{
- GtkWidget *hbox, *frame;
-
- hbox = gtk_hbox_new(FALSE, 10);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, FALSE, 0);
-
- frame = gtk_frame_new(title);
- gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, FALSE, 0);
-
- hbox = gtk_hbox_new(FALSE, 10);
- gtk_container_add(GTK_CONTAINER(frame), hbox);
-
- return hbox;
-}
-
-static GtkWidget *labeled_spinbutton(GtkWidget *box, const char *name, double min, double max, double incr)
-{
- GtkWidget *hbox, *label, *button;
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, FALSE, 0);
-
- label = gtk_label_new(name);
- gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
-
- button = gtk_spin_button_new_with_range(min, max, incr);
- gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 0);
-
- gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(button), GTK_UPDATE_IF_VALID);
-
- return button;
-}
-
-static void cylinder_widget(GtkWidget *vbox, struct cylinder_widget *cylinder, GtkListStore *model)
-{
- GtkWidget *frame, *hbox;
- GtkWidget *widget;
-
- /*
- * Cylinder type: description, size and
- * working pressure
- */
- frame = gtk_frame_new(_("Cylinder"));
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_container_add(GTK_CONTAINER(frame), hbox);
-
- widget = combo_box_with_model_and_entry(model);
- gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
-
- cylinder->description = GTK_COMBO_BOX(widget);
- g_signal_connect(widget, "changed", G_CALLBACK(cylinder_cb), cylinder);
-
- g_signal_connect(get_entry(GTK_COMBO_BOX(widget)), "activate", G_CALLBACK(cylinder_activate_cb), cylinder);
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 0);
-
- widget = create_spinbutton(hbox, _("Size"), 0, 300, 0.1);
- cylinder->size = GTK_SPIN_BUTTON(widget);
-
- widget = create_spinbutton(hbox, _("Pressure"), 0, 5000, 1);
- cylinder->pressure = GTK_SPIN_BUTTON(widget);
-
- /*
- * Cylinder start/end pressures
- */
- hbox = frame_box(_("Pressure"), vbox);
-
- widget = labeled_spinbutton(hbox, _("Start"), 0, 5000, 1);
- cylinder->start = widget;
-
- widget = labeled_spinbutton(hbox, _("End"), 0, 5000, 1);
- cylinder->end = widget;
-
- cylinder->pressure_button = gtk_check_button_new();
- gtk_box_pack_start(GTK_BOX(hbox), cylinder->pressure_button, FALSE, FALSE, 3);
- g_signal_connect(cylinder->pressure_button, "toggled", G_CALLBACK(pressure_cb), cylinder);
-
- /*
- * Cylinder gas mix: Air, Nitrox or Trimix
- */
- hbox = frame_box(_("Gasmix"), vbox);
-
- widget = labeled_spinbutton(hbox, "O"UTF8_SUBSCRIPT_2 "%", 1, 100, 0.1);
- cylinder->o2 = widget;
- widget = labeled_spinbutton(hbox, "He%", 0, 100, 0.1);
- cylinder->he = widget;
- cylinder->gasmix_button = gtk_check_button_new();
- gtk_box_pack_start(GTK_BOX(hbox), cylinder->gasmix_button, FALSE, FALSE, 3);
- g_signal_connect(cylinder->gasmix_button, "toggled", G_CALLBACK(gasmix_cb), cylinder);
-}
-
-static void weight_activate_cb(GtkComboBox *combo_box, gpointer data)
-{
- struct ws_widget *ws_widget = data;
- weight_cb(ws_widget->description, data);
-}
-
-static void ws_widget(GtkWidget *vbox, struct ws_widget *ws_widget, GtkListStore *model)
-{
- GtkWidget *frame, *hbox;
- GtkWidget *widget;
- GtkEntry *entry;
-
- /*
- * weight_system: description and weight
- */
- frame = gtk_frame_new(_("Weight"));
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_container_add(GTK_CONTAINER(frame), hbox);
-
- widget = combo_box_with_model_and_entry(model);
- gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
-
- ws_widget->description = GTK_COMBO_BOX(widget);
- g_signal_connect(widget, "changed", G_CALLBACK(weight_cb), ws_widget);
-
- entry = get_entry(GTK_COMBO_BOX(widget));
- g_signal_connect(entry, "activate", G_CALLBACK(weight_activate_cb), ws_widget);
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 0);
-
- if (prefs.units.weight == KG)
- widget = create_spinbutton(hbox, _("kg"), 0, 50, 0.5);
- else
- widget = create_spinbutton(hbox, _("lbs"), 0, 110, 1);
- ws_widget->weight = GTK_SPIN_BUTTON(widget);
-}
-
-static int edit_cylinder_dialog(GtkWidget *w, int index, cylinder_t *cyl, int w_idx)
-{
- int success;
- GtkWidget *dialog, *vbox, *parent;
- struct cylinder_widget cylinder;
- struct dive *dive;
-
- cylinder.index = index;
- cylinder.w_idx = w_idx;
- cylinder.changed = 0;
-
- if (w_idx == W_IDX_PRIMARY)
- dive = current_dive;
- else
- dive = &edit_dive;
- if (!dive)
- return 0;
- *cyl = dive->cylinder[index];
-
- dialog = gtk_dialog_new_with_buttons(_("Cylinder"),
- GTK_WINDOW(main_window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
- NULL);
-
- parent = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
- if (parent) {
- gtk_widget_set_sensitive(parent, FALSE);
- gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
- }
-
- vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- cylinder_widget(vbox, &cylinder, cylinder_model);
-
- show_cylinder(cyl, &cylinder);
-
- gtk_widget_show_all(dialog);
- success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT;
- if (success) {
- record_cylinder_changes(cyl, &cylinder);
- dive->cylinder[index] = *cyl;
- if (w_idx == W_IDX_PRIMARY) {
- mark_divelist_changed(TRUE);
- update_cylinder_related_info(dive);
- flush_divelist(dive);
- }
- }
-
- gtk_widget_destroy(dialog);
- if (parent)
- gtk_widget_set_sensitive(parent, TRUE);
- return success;
-}
-
-static int edit_weightsystem_dialog(GtkWidget *w, int index, weightsystem_t *ws, int w_idx)
-{
- int success;
- GtkWidget *dialog, *vbox, *parent;
- struct ws_widget weightsystem_widget;
- struct dive *dive;
-
- weightsystem_widget.index = index;
- weightsystem_widget.w_idx = w_idx;
- weightsystem_widget.changed = 0;
-
- if (w_idx == W_IDX_PRIMARY)
- dive = current_dive;
- else
- dive = &edit_dive;
- if (!dive)
- return 0;
- *ws = dive->weightsystem[index];
-
- dialog = gtk_dialog_new_with_buttons(_("Weight System"),
- GTK_WINDOW(main_window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
- NULL);
-
- parent = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
- if (parent) {
- gtk_widget_set_sensitive(parent, FALSE);
- gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent));
- }
-
- vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- ws_widget(vbox, &weightsystem_widget, weightsystem_model);
-
- show_weightsystem(ws, &weightsystem_widget);
-
- gtk_widget_show_all(dialog);
- success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT;
- if (success) {
- record_weightsystem_changes(ws, &weightsystem_widget);
- dive->weightsystem[index] = *ws;
- if (w_idx == W_IDX_PRIMARY) {
- mark_divelist_changed(TRUE);
- flush_divelist(dive);
- }
- }
-
- gtk_widget_destroy(dialog);
- if (parent)
- gtk_widget_set_sensitive(parent, TRUE);
- return success;
-}
-
-static int get_model_index(GtkListStore *model, GtkTreeIter *iter)
-{
- int *p, index;
- GtkTreePath *path;
-
- path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), iter);
- p = gtk_tree_path_get_indices(path);
- index = p ? *p : 0;
- gtk_tree_path_free(path);
- return index;
-}
-
-static void edit_cb(GtkWidget *w, int w_idx)
-{
- int index;
- GtkTreeIter iter;
- GtkListStore *model = cylinder_list[w_idx].model;
- GtkTreeView *tree_view = cylinder_list[w_idx].tree_view;
- GtkTreeSelection *selection;
- cylinder_t cyl;
-
- selection = gtk_tree_view_get_selection(tree_view);
-
- /* Nothing selected? This shouldn't happen, since the button should be inactive */
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
- return;
-
- index = get_model_index(model, &iter);
- if (!edit_cylinder_dialog(w, index, &cyl, w_idx))
- return;
-
- set_one_cylinder(&cyl, model, &iter);
- repaint_dive();
-}
-
-static void add_cb(GtkWidget *w, int w_idx)
-{
- int index = cylinder_list[w_idx].max_index;
- GtkTreeIter iter;
- GtkListStore *model = cylinder_list[w_idx].model;
- GtkTreeView *tree_view = cylinder_list[w_idx].tree_view;
- GtkTreeSelection *selection;
- cylinder_t cyl;
-
- if (!edit_cylinder_dialog(w, index, &cyl, w_idx))
- return;
-
- gtk_list_store_append(model, &iter);
- set_one_cylinder(&cyl, model, &iter);
-
- selection = gtk_tree_view_get_selection(tree_view);
- gtk_tree_selection_select_iter(selection, &iter);
-
- cylinder_list[w_idx].max_index++;
- gtk_widget_set_sensitive(cylinder_list[w_idx].add, cylinder_list[w_idx].max_index < MAX_CYLINDERS);
-}
-#endif /* USE_GTK_UI */
-
void remove_cylinder(struct dive *dive, int idx)
{
cylinder_t *cyl = dive->cylinder + idx;
@@ -1296,450 +188,3 @@ void remove_weightsystem(struct dive *dive, int idx)
memmove(ws, ws + 1, nr * sizeof(*ws));
memset(ws + nr, 0, sizeof(*ws));
}
-
-
-#if USE_GTK_UI
-static void del_cb(GtkButton *button, int w_idx)
-{
- int index, nr;
- GtkTreeIter iter;
- GtkListStore *model = cylinder_list[w_idx].model;
- GtkTreeView *tree_view = cylinder_list[w_idx].tree_view;
- GtkTreeSelection *selection;
- struct dive *dive;
- cylinder_t *cyl;
-
- selection = gtk_tree_view_get_selection(tree_view);
-
- /* Nothing selected? This shouldn't happen, since the button should be inactive */
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
- return;
-
- index = get_model_index(model, &iter);
-
- if (w_idx == W_IDX_PRIMARY)
- dive = current_dive;
- else
- dive = &edit_dive;
- if (!dive)
- return;
- cyl = dive->cylinder + index;
- nr = cylinder_list[w_idx].max_index - index - 1;
-
- gtk_list_store_remove(model, &iter);
-
- cylinder_list[w_idx].max_index--;
- memmove(cyl, cyl+1, nr*sizeof(*cyl));
- memset(cyl+nr, 0, sizeof(*cyl));
-
- mark_divelist_changed(TRUE);
- flush_divelist(dive);
-
- gtk_widget_set_sensitive(cylinder_list[w_idx].edit, 0);
- gtk_widget_set_sensitive(cylinder_list[w_idx].del, 0);
- gtk_widget_set_sensitive(cylinder_list[w_idx].add, 1);
-}
-
-static void ws_edit_cb(GtkWidget *w, int w_idx)
-{
- int index;
- GtkTreeIter iter;
- GtkListStore *model = weightsystem_list[w_idx].model;
- GtkTreeView *tree_view = weightsystem_list[w_idx].tree_view;
- GtkTreeSelection *selection;
- weightsystem_t ws;
-
- selection = gtk_tree_view_get_selection(tree_view);
-
- /* Nothing selected? This shouldn't happen, since the button should be inactive */
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
- return;
-
- index = get_model_index(model, &iter);
- if (!edit_weightsystem_dialog(w, index, &ws, w_idx))
- return;
-
- set_one_weightsystem(&ws, model, &iter);
- repaint_dive();
-}
-
-static void ws_add_cb(GtkWidget *w, int w_idx)
-{
- int index = weightsystem_list[w_idx].max_index;
- GtkTreeIter iter;
- GtkListStore *model = weightsystem_list[w_idx].model;
- GtkTreeView *tree_view = weightsystem_list[w_idx].tree_view;
- GtkTreeSelection *selection;
- weightsystem_t ws;
-
- if (!edit_weightsystem_dialog(w, index, &ws, w_idx))
- return;
-
- gtk_list_store_append(model, &iter);
- set_one_weightsystem(&ws, model, &iter);
-
- selection = gtk_tree_view_get_selection(tree_view);
- gtk_tree_selection_select_iter(selection, &iter);
-
- weightsystem_list[w_idx].max_index++;
- gtk_widget_set_sensitive(weightsystem_list[w_idx].add, weightsystem_list[w_idx].max_index < MAX_WEIGHTSYSTEMS);
-}
-
-static void ws_del_cb(GtkButton *button, int w_idx)
-{
- int index, nr;
- GtkTreeIter iter;
- GtkListStore *model = weightsystem_list[w_idx].model;
- GtkTreeView *tree_view = weightsystem_list[w_idx].tree_view;
- GtkTreeSelection *selection;
- struct dive *dive;
- weightsystem_t *ws;
-
- selection = gtk_tree_view_get_selection(tree_view);
-
- /* Nothing selected? This shouldn't happen, since the button should be inactive */
- if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
- return;
-
- index = get_model_index(model, &iter);
-
- if (w_idx == W_IDX_PRIMARY)
- dive = current_dive;
- else
- dive = &edit_dive;
- if (!dive)
- return;
- ws = dive->weightsystem + index;
- nr = weightsystem_list[w_idx].max_index - index - 1;
-
- gtk_list_store_remove(model, &iter);
-
- weightsystem_list[w_idx].max_index--;
- memmove(ws, ws+1, nr*sizeof(*ws));
- memset(ws+nr, 0, sizeof(*ws));
-
- mark_divelist_changed(TRUE);
- flush_divelist(dive);
-
- gtk_widget_set_sensitive(weightsystem_list[w_idx].edit, 0);
- gtk_widget_set_sensitive(weightsystem_list[w_idx].del, 0);
- gtk_widget_set_sensitive(weightsystem_list[w_idx].add, 1);
-}
-
-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;
-}
-
-static GtkListStore *create_weightsystem_model(void)
-{
- GtkListStore *model;
-
- model = gtk_list_store_new(2,
- G_TYPE_STRING, /* Weightsystem description */
- G_TYPE_INT, /* Weight in grams */
- -1);
-
- fill_ws_list(model);
- return model;
-}
-
-static void size_data_func(GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- int ml, mbar;
- double size, pressure;
- char buffer[64];
-
- gtk_tree_model_get(model, iter, CYL_SIZE, &ml, CYL_WORKP, &mbar, -1);
- convert_volume_pressure(ml, mbar, &size, &pressure);
- if (size)
- snprintf(buffer, sizeof(buffer), "%.1f", size);
- else
- strcpy(buffer, _("unkn"));
- g_object_set(renderer, "text", buffer, NULL);
-}
-
-static void weight_data_func(GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- int idx = (long)data;
- int grams, decimals;
- double value;
- char buffer[64];
-
- gtk_tree_model_get(model, iter, idx, &grams, -1);
- decimals = convert_weight(grams, &value);
- if (grams)
- snprintf(buffer, sizeof(buffer), "%.*f", decimals, value);
- else
- strcpy(buffer, _("unkn"));
- g_object_set(renderer, "text", buffer, NULL);
-}
-
-static void pressure_data_func(GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- int index = (long)data;
- int mbar, decimals;
- double pressure;
- char buffer[10];
-
- gtk_tree_model_get(model, iter, index, &mbar, -1);
- decimals = convert_pressure(mbar, &pressure);
- if (mbar)
- snprintf(buffer, sizeof(buffer), "%.*f", decimals, pressure);
- else
- *buffer = 0;
- g_object_set(renderer, "text", buffer, NULL);
-}
-
-static void percentage_data_func(GtkTreeViewColumn *col,
- GtkCellRenderer *renderer,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- gpointer data)
-{
- int index = (long)data;
- int permille;
- char buffer[10];
-
- gtk_tree_model_get(model, iter, index, &permille, -1);
- if (permille)
- snprintf(buffer, sizeof(buffer), "%.1f%%", permille / 10.0);
- else
- *buffer = 0;
- g_object_set(renderer, "text", buffer, NULL);
-}
-
-static void selection_cb(GtkTreeSelection *selection, struct equipment_list *list)
-{
- GtkTreeIter iter;
- int selected;
-
- selected = gtk_tree_selection_get_selected(selection, NULL, &iter);
- gtk_widget_set_sensitive(list->edit, selected);
- gtk_widget_set_sensitive(list->del, selected);
-}
-
-static void row_activated_cb(GtkTreeView *tree_view,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- int w_idx)
-{
- edit_cb(GTK_WIDGET(tree_view), w_idx);
-}
-
-static void ws_row_activated_cb(GtkTreeView *tree_view,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- int w_idx)
-{
- ws_edit_cb(GTK_WIDGET(tree_view), w_idx);
-}
-
-static GtkWidget *cylinder_list_widget(int w_idx)
-{
- GtkListStore *model = cylinder_list[w_idx].model;
- GtkWidget *tree_view;
- GtkTreeSelection *selection;
-
- tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
- gtk_widget_set_can_focus(tree_view, FALSE);
-
- g_signal_connect(tree_view, "row-activated", G_CALLBACK(row_activated_cb), GINT_TO_POINTER(w_idx));
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
- gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);
- g_signal_connect(selection, "changed", G_CALLBACK(selection_cb), &cylinder_list[w_idx]);
-
- g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
- "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH,
- NULL);
-
- tree_view_column(tree_view, CYL_DESC, _("Type"), NULL, ALIGN_LEFT | UNSORTABLE);
- tree_view_column(tree_view, CYL_SIZE, _("Size"), size_data_func, ALIGN_RIGHT | UNSORTABLE);
- tree_view_column(tree_view, CYL_WORKP, _("MaxPress"), pressure_data_func, ALIGN_RIGHT | UNSORTABLE);
- tree_view_column(tree_view, CYL_STARTP, _("Start"), pressure_data_func, ALIGN_RIGHT | UNSORTABLE);
- tree_view_column(tree_view, CYL_ENDP, _("End"), pressure_data_func, ALIGN_RIGHT | UNSORTABLE);
- tree_view_column(tree_view, CYL_O2, "O" UTF8_SUBSCRIPT_2 "%", percentage_data_func, ALIGN_RIGHT | UNSORTABLE);
- tree_view_column(tree_view, CYL_HE, "He%", percentage_data_func, ALIGN_RIGHT | UNSORTABLE);
- return tree_view;
-}
-
-static GtkWidget *weightsystem_list_widget(int w_idx)
-{
- GtkListStore *model = weightsystem_list[w_idx].model;
- GtkWidget *tree_view;
- GtkTreeSelection *selection;
-
- tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
- gtk_widget_set_can_focus(tree_view, FALSE);
- g_signal_connect(tree_view, "row-activated", G_CALLBACK(ws_row_activated_cb), GINT_TO_POINTER(w_idx));
-
- selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
- gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);
- g_signal_connect(selection, "changed", G_CALLBACK(selection_cb), &weightsystem_list[w_idx]);
-
- g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
- "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH,
- NULL);
-
- tree_view_column(tree_view, WS_DESC, _("Type"), NULL, ALIGN_LEFT | UNSORTABLE);
- tree_view_column(tree_view, WS_WEIGHT, _("weight"),
- weight_data_func, ALIGN_RIGHT | UNSORTABLE);
-
- return tree_view;
-}
-
-static GtkWidget *cylinder_list_create(int w_idx)
-{
- GtkListStore *model;
-
- model = gtk_list_store_new(CYL_COLUMNS,
- G_TYPE_STRING, /* CYL_DESC: utf8 */
- G_TYPE_INT, /* CYL_SIZE: mliter */
- G_TYPE_INT, /* CYL_WORKP: mbar */
- G_TYPE_INT, /* CYL_STARTP: mbar */
- G_TYPE_INT, /* CYL_ENDP: mbar */
- G_TYPE_INT, /* CYL_O2: permille */
- G_TYPE_INT /* CYL_HE: permille */
- );
- cylinder_list[w_idx].model = model;
- return cylinder_list_widget(w_idx);
-}
-
-static GtkWidget *weightsystem_list_create(int w_idx)
-{
- GtkListStore *model;
-
- model = gtk_list_store_new(WS_COLUMNS,
- G_TYPE_STRING, /* WS_DESC: utf8 */
- G_TYPE_INT /* WS_WEIGHT: grams */
- );
- weightsystem_list[w_idx].model = model;
- return weightsystem_list_widget(w_idx);
-}
-
-GtkWidget *equipment_widget(int w_idx)
-{
- GtkWidget *vbox, *hbox, *frame, *framebox, *tree_view;
- GtkWidget *add, *del, *edit;
-
- vbox = gtk_vbox_new(FALSE, 3);
-
- /*
- * We create the cylinder size (and weightsystem) models
- * at startup for the primary cylinder / weightsystem widget,
- * since we're going to share it across all cylinders and all
- * dives. So if you add a new cylinder type or weightsystem in
- * one dive, it will show up when you edit the cylinder types
- * or weightsystems for another dive.
- */
- if (w_idx == W_IDX_PRIMARY)
- cylinder_model = create_tank_size_model();
- tree_view = cylinder_list_create(w_idx);
- cylinder_list[w_idx].tree_view = GTK_TREE_VIEW(tree_view);
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
-
- frame = gtk_frame_new(_("Cylinders"));
- gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, FALSE, 3);
-
- framebox = gtk_vbox_new(FALSE, 3);
- gtk_container_add(GTK_CONTAINER(frame), framebox);
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
-
- gtk_box_pack_start(GTK_BOX(hbox), tree_view, TRUE, FALSE, 3);
-
- hbox = gtk_hbox_new(TRUE, 3);
- gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
-
- edit = gtk_button_new_from_stock(GTK_STOCK_EDIT);
- add = gtk_button_new_from_stock(GTK_STOCK_ADD);
- del = gtk_button_new_from_stock(GTK_STOCK_DELETE);
- gtk_widget_set_sensitive(edit, FALSE);
- gtk_widget_set_sensitive(add, FALSE);
- gtk_widget_set_sensitive(del, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), edit, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), add, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), del, FALSE, FALSE, 0);
-
- cylinder_list[w_idx].edit = edit;
- cylinder_list[w_idx].add = add;
- cylinder_list[w_idx].del = del;
-
- g_signal_connect(edit, "clicked", G_CALLBACK(edit_cb), GINT_TO_POINTER(w_idx));
- g_signal_connect(add, "clicked", G_CALLBACK(add_cb), GINT_TO_POINTER(w_idx));
- g_signal_connect(del, "clicked", G_CALLBACK(del_cb), GINT_TO_POINTER(w_idx));
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
-
- if (w_idx == W_IDX_PRIMARY)
- weightsystem_model = create_weightsystem_model();
- tree_view = weightsystem_list_create(w_idx);
- weightsystem_list[w_idx].tree_view = GTK_TREE_VIEW(tree_view);
-
- frame = gtk_frame_new(_("Weight"));
- gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, FALSE, 3);
-
- framebox = gtk_vbox_new(FALSE, 3);
- gtk_container_add(GTK_CONTAINER(frame), framebox);
-
- hbox = gtk_hbox_new(FALSE, 3);
- gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
-
- gtk_box_pack_start(GTK_BOX(hbox), tree_view, TRUE, FALSE, 3);
-
- hbox = gtk_hbox_new(TRUE, 3);
- gtk_box_pack_start(GTK_BOX(framebox), hbox, TRUE, FALSE, 3);
-
- edit = gtk_button_new_from_stock(GTK_STOCK_EDIT);
- add = gtk_button_new_from_stock(GTK_STOCK_ADD);
- del = gtk_button_new_from_stock(GTK_STOCK_DELETE);
- gtk_widget_set_sensitive(edit, FALSE);
- gtk_widget_set_sensitive(add, FALSE);
- gtk_widget_set_sensitive(del, FALSE);
- gtk_box_pack_start(GTK_BOX(hbox), edit, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), add, FALSE, FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), del, FALSE, FALSE, 0);
-
- weightsystem_list[w_idx].edit = edit;
- weightsystem_list[w_idx].add = add;
- weightsystem_list[w_idx].del = del;
-
- g_signal_connect(edit, "clicked", G_CALLBACK(ws_edit_cb), GINT_TO_POINTER(w_idx));
- g_signal_connect(add, "clicked", G_CALLBACK(ws_add_cb), GINT_TO_POINTER(w_idx));
- g_signal_connect(del, "clicked", G_CALLBACK(ws_del_cb), GINT_TO_POINTER(w_idx));
-
- return vbox;
-}
-
-void clear_equipment_widgets()
-{
- gtk_list_store_clear(cylinder_list[W_IDX_PRIMARY].model);
- gtk_list_store_clear(weightsystem_list[W_IDX_PRIMARY].model);
-}
-#endif /* USE_GTK_UI */