mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
Add total weight column to divelist
This adds the total weight carried on the dive in different weight systems to the divelist. The column is by default not shown, which can be changed in the preferences. The column is sortable. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
39f606350b
commit
19621bf481
5 changed files with 74 additions and 3 deletions
|
@ -14,6 +14,7 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
gboolean cylinder;
|
gboolean cylinder;
|
||||||
gboolean temperature;
|
gboolean temperature;
|
||||||
|
gboolean totalweight;
|
||||||
gboolean nitrox;
|
gboolean nitrox;
|
||||||
gboolean sac;
|
gboolean sac;
|
||||||
gboolean otu;
|
gboolean otu;
|
||||||
|
|
22
dive.c
22
dive.c
|
@ -120,6 +120,28 @@ double get_depth_units(unsigned int mm, int *frac, const char **units)
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double get_weight_units(unsigned int grams, int *frac, const char **units)
|
||||||
|
{
|
||||||
|
int decimals;
|
||||||
|
double value;
|
||||||
|
const char* unit;
|
||||||
|
|
||||||
|
if (output_units.weight == LBS) {
|
||||||
|
value = grams_to_lbs(grams);
|
||||||
|
unit = "lbs";
|
||||||
|
decimals = 0;
|
||||||
|
} else {
|
||||||
|
value = grams / 1000.0;
|
||||||
|
unit = "kg";
|
||||||
|
decimals = 1;
|
||||||
|
}
|
||||||
|
if (frac)
|
||||||
|
*frac = decimals;
|
||||||
|
if (units)
|
||||||
|
*units = unit;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
struct dive *alloc_dive(void)
|
struct dive *alloc_dive(void)
|
||||||
{
|
{
|
||||||
const int initial_samples = 5;
|
const int initial_samples = 5;
|
||||||
|
|
5
dive.h
5
dive.h
|
@ -97,8 +97,9 @@ extern int weightsystem_none(void *_data);
|
||||||
|
|
||||||
extern int get_pressure_units(unsigned int mb, const char **units);
|
extern int get_pressure_units(unsigned int mb, const char **units);
|
||||||
extern double get_depth_units(unsigned int mm, int *frac, const char **units);
|
extern double get_depth_units(unsigned int mm, int *frac, const char **units);
|
||||||
extern double get_volume_units(unsigned int mm, int *frac, const char **units);
|
extern double get_volume_units(unsigned int ml, int *frac, const char **units);
|
||||||
extern double get_temp_units(unsigned int mm, const char **units);
|
extern double get_temp_units(unsigned int mk, const char **units);
|
||||||
|
extern double get_weight_units(unsigned int grams, int *frac, const char **units);
|
||||||
|
|
||||||
static inline double grams_to_lbs(int grams)
|
static inline double grams_to_lbs(int grams)
|
||||||
{
|
{
|
||||||
|
|
41
divelist.c
41
divelist.c
|
@ -26,7 +26,7 @@ struct DiveList {
|
||||||
GtkWidget *container_widget;
|
GtkWidget *container_widget;
|
||||||
GtkListStore *model;
|
GtkListStore *model;
|
||||||
GtkTreeViewColumn *nr, *date, *stars, *depth, *duration, *location;
|
GtkTreeViewColumn *nr, *date, *stars, *depth, *duration, *location;
|
||||||
GtkTreeViewColumn *temperature, *cylinder, *nitrox, *sac, *otu;
|
GtkTreeViewColumn *temperature, *cylinder, *totalweight, *nitrox, *sac, *otu;
|
||||||
int changed;
|
int changed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ enum {
|
||||||
DIVE_DEPTH, /* int: dive->maxdepth in mm */
|
DIVE_DEPTH, /* int: dive->maxdepth in mm */
|
||||||
DIVE_DURATION, /* int: in seconds */
|
DIVE_DURATION, /* int: in seconds */
|
||||||
DIVE_TEMPERATURE, /* int: in mkelvin */
|
DIVE_TEMPERATURE, /* int: in mkelvin */
|
||||||
|
DIVE_TOTALWEIGHT, /* int: in grams */
|
||||||
DIVE_CYLINDER,
|
DIVE_CYLINDER,
|
||||||
DIVE_NITROX, /* int: dummy */
|
DIVE_NITROX, /* int: dummy */
|
||||||
DIVE_SAC, /* int: in ml/min */
|
DIVE_SAC, /* int: in ml/min */
|
||||||
|
@ -269,6 +270,35 @@ newmax:
|
||||||
*o2low_p = mino2;
|
*o2low_p = mino2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int total_weight(struct dive *dive)
|
||||||
|
{
|
||||||
|
int i, total_grams = 0;
|
||||||
|
|
||||||
|
if (dive)
|
||||||
|
for (i=0; i< MAX_WEIGHTSYSTEMS; i++)
|
||||||
|
total_grams += dive->weightsystem[i].weight.grams;
|
||||||
|
return total_grams;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void weight_data_func(GtkTreeViewColumn *col,
|
||||||
|
GtkCellRenderer *renderer,
|
||||||
|
GtkTreeModel *model,
|
||||||
|
GtkTreeIter *iter,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
int indx, decimals;
|
||||||
|
double value;
|
||||||
|
char buffer[80];
|
||||||
|
struct dive *dive;
|
||||||
|
|
||||||
|
gtk_tree_model_get(model, iter, DIVE_INDEX, &indx, -1);
|
||||||
|
dive = get_dive(indx);
|
||||||
|
value = get_weight_units(total_weight(dive), &decimals, NULL);
|
||||||
|
snprintf(buffer, sizeof(buffer), "%.*f", decimals, value);
|
||||||
|
|
||||||
|
g_object_set(renderer, "text", buffer, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static gint nitrox_sort_func(GtkTreeModel *model,
|
static gint nitrox_sort_func(GtkTreeModel *model,
|
||||||
GtkTreeIter *iter_a,
|
GtkTreeIter *iter_a,
|
||||||
GtkTreeIter *iter_b,
|
GtkTreeIter *iter_b,
|
||||||
|
@ -521,6 +551,7 @@ static void fill_one_dive(struct dive *dive,
|
||||||
DIVE_RATING, dive->rating,
|
DIVE_RATING, dive->rating,
|
||||||
DIVE_SAC, dive->sac,
|
DIVE_SAC, dive->sac,
|
||||||
DIVE_OTU, dive->otu,
|
DIVE_OTU, dive->otu,
|
||||||
|
DIVE_TOTALWEIGHT, total_weight(dive),
|
||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -569,6 +600,9 @@ void update_dive_list_units(void)
|
||||||
(void) get_temp_units(0, &unit);
|
(void) get_temp_units(0, &unit);
|
||||||
gtk_tree_view_column_set_title(dive_list.temperature, unit);
|
gtk_tree_view_column_set_title(dive_list.temperature, unit);
|
||||||
|
|
||||||
|
(void) get_weight_units(0, NULL, &unit);
|
||||||
|
gtk_tree_view_column_set_title(dive_list.totalweight, unit);
|
||||||
|
|
||||||
gtk_tree_model_foreach(model, set_one_dive, NULL);
|
gtk_tree_model_foreach(model, set_one_dive, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,6 +610,7 @@ void update_dive_list_col_visibility(void)
|
||||||
{
|
{
|
||||||
gtk_tree_view_column_set_visible(dive_list.cylinder, visible_cols.cylinder);
|
gtk_tree_view_column_set_visible(dive_list.cylinder, visible_cols.cylinder);
|
||||||
gtk_tree_view_column_set_visible(dive_list.temperature, visible_cols.temperature);
|
gtk_tree_view_column_set_visible(dive_list.temperature, visible_cols.temperature);
|
||||||
|
gtk_tree_view_column_set_visible(dive_list.totalweight, visible_cols.totalweight);
|
||||||
gtk_tree_view_column_set_visible(dive_list.nitrox, visible_cols.nitrox);
|
gtk_tree_view_column_set_visible(dive_list.nitrox, visible_cols.nitrox);
|
||||||
gtk_tree_view_column_set_visible(dive_list.sac, visible_cols.sac);
|
gtk_tree_view_column_set_visible(dive_list.sac, visible_cols.sac);
|
||||||
gtk_tree_view_column_set_visible(dive_list.otu, visible_cols.otu);
|
gtk_tree_view_column_set_visible(dive_list.otu, visible_cols.otu);
|
||||||
|
@ -604,6 +639,7 @@ static void fill_dive_list(void)
|
||||||
DIVE_DURATION, dive->duration.seconds,
|
DIVE_DURATION, dive->duration.seconds,
|
||||||
DIVE_LOCATION, "location",
|
DIVE_LOCATION, "location",
|
||||||
DIVE_TEMPERATURE, dive->watertemp.mkelvin,
|
DIVE_TEMPERATURE, dive->watertemp.mkelvin,
|
||||||
|
DIVE_TOTALWEIGHT, 0,
|
||||||
DIVE_SAC, 0,
|
DIVE_SAC, 0,
|
||||||
-1);
|
-1);
|
||||||
}
|
}
|
||||||
|
@ -636,6 +672,7 @@ static struct divelist_column {
|
||||||
[DIVE_DEPTH] = { "ft", depth_data_func, NULL, ALIGN_RIGHT },
|
[DIVE_DEPTH] = { "ft", depth_data_func, NULL, ALIGN_RIGHT },
|
||||||
[DIVE_DURATION] = { "min", duration_data_func, NULL, ALIGN_RIGHT },
|
[DIVE_DURATION] = { "min", duration_data_func, NULL, ALIGN_RIGHT },
|
||||||
[DIVE_TEMPERATURE] = { UTF8_DEGREE "F", temperature_data_func, NULL, ALIGN_RIGHT, &visible_cols.temperature },
|
[DIVE_TEMPERATURE] = { UTF8_DEGREE "F", temperature_data_func, NULL, ALIGN_RIGHT, &visible_cols.temperature },
|
||||||
|
[DIVE_TOTALWEIGHT] = { "lbs", weight_data_func, NULL, ALIGN_RIGHT, &visible_cols.totalweight },
|
||||||
[DIVE_CYLINDER] = { "Cyl", NULL, NULL, 0, &visible_cols.cylinder },
|
[DIVE_CYLINDER] = { "Cyl", NULL, NULL, 0, &visible_cols.cylinder },
|
||||||
[DIVE_NITROX] = { "O" UTF8_SUBSCRIPT_2 "%", nitrox_data_func, nitrox_sort_func, 0, &visible_cols.nitrox },
|
[DIVE_NITROX] = { "O" UTF8_SUBSCRIPT_2 "%", nitrox_data_func, nitrox_sort_func, 0, &visible_cols.nitrox },
|
||||||
[DIVE_SAC] = { "SAC", sac_data_func, NULL, 0, &visible_cols.sac },
|
[DIVE_SAC] = { "SAC", sac_data_func, NULL, 0, &visible_cols.sac },
|
||||||
|
@ -742,6 +779,7 @@ GtkWidget *dive_list_create(void)
|
||||||
G_TYPE_INT, /* Depth */
|
G_TYPE_INT, /* Depth */
|
||||||
G_TYPE_INT, /* Duration */
|
G_TYPE_INT, /* Duration */
|
||||||
G_TYPE_INT, /* Temperature */
|
G_TYPE_INT, /* Temperature */
|
||||||
|
G_TYPE_INT, /* Total weight */
|
||||||
G_TYPE_STRING, /* Cylinder */
|
G_TYPE_STRING, /* Cylinder */
|
||||||
G_TYPE_INT, /* Nitrox */
|
G_TYPE_INT, /* Nitrox */
|
||||||
G_TYPE_INT, /* SAC */
|
G_TYPE_INT, /* SAC */
|
||||||
|
@ -762,6 +800,7 @@ GtkWidget *dive_list_create(void)
|
||||||
dive_list.depth = divelist_column(&dive_list, dl_column + DIVE_DEPTH);
|
dive_list.depth = divelist_column(&dive_list, dl_column + DIVE_DEPTH);
|
||||||
dive_list.duration = divelist_column(&dive_list, dl_column + DIVE_DURATION);
|
dive_list.duration = divelist_column(&dive_list, dl_column + DIVE_DURATION);
|
||||||
dive_list.temperature = divelist_column(&dive_list, dl_column + DIVE_TEMPERATURE);
|
dive_list.temperature = divelist_column(&dive_list, dl_column + DIVE_TEMPERATURE);
|
||||||
|
dive_list.totalweight = divelist_column(&dive_list, dl_column + DIVE_TOTALWEIGHT);
|
||||||
dive_list.cylinder = divelist_column(&dive_list, dl_column + DIVE_CYLINDER);
|
dive_list.cylinder = divelist_column(&dive_list, dl_column + DIVE_CYLINDER);
|
||||||
dive_list.nitrox = divelist_column(&dive_list, dl_column + DIVE_NITROX);
|
dive_list.nitrox = divelist_column(&dive_list, dl_column + DIVE_NITROX);
|
||||||
dive_list.sac = divelist_column(&dive_list, dl_column + DIVE_SAC);
|
dive_list.sac = divelist_column(&dive_list, dl_column + DIVE_SAC);
|
||||||
|
|
|
@ -348,6 +348,7 @@ OPTIONCALLBACK(otu_toggle, visible_cols.otu)
|
||||||
OPTIONCALLBACK(sac_toggle, visible_cols.sac)
|
OPTIONCALLBACK(sac_toggle, visible_cols.sac)
|
||||||
OPTIONCALLBACK(nitrox_toggle, visible_cols.nitrox)
|
OPTIONCALLBACK(nitrox_toggle, visible_cols.nitrox)
|
||||||
OPTIONCALLBACK(temperature_toggle, visible_cols.temperature)
|
OPTIONCALLBACK(temperature_toggle, visible_cols.temperature)
|
||||||
|
OPTIONCALLBACK(totalweight_toggle, visible_cols.totalweight)
|
||||||
OPTIONCALLBACK(cylinder_toggle, visible_cols.cylinder)
|
OPTIONCALLBACK(cylinder_toggle, visible_cols.cylinder)
|
||||||
|
|
||||||
static void event_toggle(GtkWidget *w, gpointer _data)
|
static void event_toggle(GtkWidget *w, gpointer _data)
|
||||||
|
@ -434,6 +435,11 @@ static void preferences_dialog(GtkWidget *w, gpointer data)
|
||||||
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6);
|
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6);
|
||||||
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(otu_toggle), NULL);
|
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(otu_toggle), NULL);
|
||||||
|
|
||||||
|
button = gtk_check_button_new_with_label("Show Weight");
|
||||||
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), visible_cols.totalweight);
|
||||||
|
gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 6);
|
||||||
|
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(totalweight_toggle), NULL);
|
||||||
|
|
||||||
font = gtk_font_button_new_with_font(divelist_font);
|
font = gtk_font_button_new_with_font(divelist_font);
|
||||||
gtk_box_pack_start(GTK_BOX(vbox), font, FALSE, FALSE, 5);
|
gtk_box_pack_start(GTK_BOX(vbox), font, FALSE, FALSE, 5);
|
||||||
|
|
||||||
|
@ -457,6 +463,7 @@ static void preferences_dialog(GtkWidget *w, gpointer data)
|
||||||
subsurface_set_conf("fahrenheit", PREF_BOOL, BOOL_TO_PTR(output_units.temperature == FAHRENHEIT));
|
subsurface_set_conf("fahrenheit", PREF_BOOL, BOOL_TO_PTR(output_units.temperature == FAHRENHEIT));
|
||||||
subsurface_set_conf("lbs", PREF_BOOL, BOOL_TO_PTR(output_units.weight == LBS));
|
subsurface_set_conf("lbs", PREF_BOOL, BOOL_TO_PTR(output_units.weight == LBS));
|
||||||
subsurface_set_conf("TEMPERATURE", PREF_BOOL, BOOL_TO_PTR(visible_cols.temperature));
|
subsurface_set_conf("TEMPERATURE", PREF_BOOL, BOOL_TO_PTR(visible_cols.temperature));
|
||||||
|
subsurface_set_conf("TOTALWEIGHT", PREF_BOOL, BOOL_TO_PTR(visible_cols.totalweight));
|
||||||
subsurface_set_conf("CYLINDER", PREF_BOOL, BOOL_TO_PTR(visible_cols.cylinder));
|
subsurface_set_conf("CYLINDER", PREF_BOOL, BOOL_TO_PTR(visible_cols.cylinder));
|
||||||
subsurface_set_conf("NITROX", PREF_BOOL, BOOL_TO_PTR(visible_cols.nitrox));
|
subsurface_set_conf("NITROX", PREF_BOOL, BOOL_TO_PTR(visible_cols.nitrox));
|
||||||
subsurface_set_conf("SAC", PREF_BOOL, BOOL_TO_PTR(visible_cols.sac));
|
subsurface_set_conf("SAC", PREF_BOOL, BOOL_TO_PTR(visible_cols.sac));
|
||||||
|
@ -726,6 +733,7 @@ void init_ui(int *argcp, char ***argvp)
|
||||||
/* an unset key is FALSE - all these are hidden by default */
|
/* an unset key is FALSE - all these are hidden by default */
|
||||||
visible_cols.cylinder = PTR_TO_BOOL(subsurface_get_conf("CYLINDER", PREF_BOOL));
|
visible_cols.cylinder = PTR_TO_BOOL(subsurface_get_conf("CYLINDER", PREF_BOOL));
|
||||||
visible_cols.temperature = PTR_TO_BOOL(subsurface_get_conf("TEMPERATURE", PREF_BOOL));
|
visible_cols.temperature = PTR_TO_BOOL(subsurface_get_conf("TEMPERATURE", PREF_BOOL));
|
||||||
|
visible_cols.totalweight = PTR_TO_BOOL(subsurface_get_conf("TOTALWEIGHT", PREF_BOOL));
|
||||||
visible_cols.nitrox = PTR_TO_BOOL(subsurface_get_conf("NITROX", PREF_BOOL));
|
visible_cols.nitrox = PTR_TO_BOOL(subsurface_get_conf("NITROX", PREF_BOOL));
|
||||||
visible_cols.otu = PTR_TO_BOOL(subsurface_get_conf("OTU", PREF_BOOL));
|
visible_cols.otu = PTR_TO_BOOL(subsurface_get_conf("OTU", PREF_BOOL));
|
||||||
visible_cols.sac = PTR_TO_BOOL(subsurface_get_conf("SAC", PREF_BOOL));
|
visible_cols.sac = PTR_TO_BOOL(subsurface_get_conf("SAC", PREF_BOOL));
|
||||||
|
|
Loading…
Reference in a new issue