mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 05:00:20 +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 {
|
||||
gboolean cylinder;
|
||||
gboolean temperature;
|
||||
gboolean totalweight;
|
||||
gboolean nitrox;
|
||||
gboolean sac;
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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 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_temp_units(unsigned int mm, const char **units);
|
||||
extern double get_volume_units(unsigned int ml, int *frac, 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)
|
||||
{
|
||||
|
|
41
divelist.c
41
divelist.c
|
@ -26,7 +26,7 @@ struct DiveList {
|
|||
GtkWidget *container_widget;
|
||||
GtkListStore *model;
|
||||
GtkTreeViewColumn *nr, *date, *stars, *depth, *duration, *location;
|
||||
GtkTreeViewColumn *temperature, *cylinder, *nitrox, *sac, *otu;
|
||||
GtkTreeViewColumn *temperature, *cylinder, *totalweight, *nitrox, *sac, *otu;
|
||||
int changed;
|
||||
};
|
||||
|
||||
|
@ -44,6 +44,7 @@ enum {
|
|||
DIVE_DEPTH, /* int: dive->maxdepth in mm */
|
||||
DIVE_DURATION, /* int: in seconds */
|
||||
DIVE_TEMPERATURE, /* int: in mkelvin */
|
||||
DIVE_TOTALWEIGHT, /* int: in grams */
|
||||
DIVE_CYLINDER,
|
||||
DIVE_NITROX, /* int: dummy */
|
||||
DIVE_SAC, /* int: in ml/min */
|
||||
|
@ -269,6 +270,35 @@ newmax:
|
|||
*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,
|
||||
GtkTreeIter *iter_a,
|
||||
GtkTreeIter *iter_b,
|
||||
|
@ -521,6 +551,7 @@ static void fill_one_dive(struct dive *dive,
|
|||
DIVE_RATING, dive->rating,
|
||||
DIVE_SAC, dive->sac,
|
||||
DIVE_OTU, dive->otu,
|
||||
DIVE_TOTALWEIGHT, total_weight(dive),
|
||||
-1);
|
||||
}
|
||||
|
||||
|
@ -569,6 +600,9 @@ void update_dive_list_units(void)
|
|||
(void) get_temp_units(0, &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);
|
||||
}
|
||||
|
||||
|
@ -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.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.sac, visible_cols.sac);
|
||||
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_LOCATION, "location",
|
||||
DIVE_TEMPERATURE, dive->watertemp.mkelvin,
|
||||
DIVE_TOTALWEIGHT, 0,
|
||||
DIVE_SAC, 0,
|
||||
-1);
|
||||
}
|
||||
|
@ -636,6 +672,7 @@ static struct divelist_column {
|
|||
[DIVE_DEPTH] = { "ft", depth_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_TOTALWEIGHT] = { "lbs", weight_data_func, NULL, ALIGN_RIGHT, &visible_cols.totalweight },
|
||||
[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_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, /* Duration */
|
||||
G_TYPE_INT, /* Temperature */
|
||||
G_TYPE_INT, /* Total weight */
|
||||
G_TYPE_STRING, /* Cylinder */
|
||||
G_TYPE_INT, /* Nitrox */
|
||||
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.duration = divelist_column(&dive_list, dl_column + DIVE_DURATION);
|
||||
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.nitrox = divelist_column(&dive_list, dl_column + DIVE_NITROX);
|
||||
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(nitrox_toggle, visible_cols.nitrox)
|
||||
OPTIONCALLBACK(temperature_toggle, visible_cols.temperature)
|
||||
OPTIONCALLBACK(totalweight_toggle, visible_cols.totalweight)
|
||||
OPTIONCALLBACK(cylinder_toggle, visible_cols.cylinder)
|
||||
|
||||
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);
|
||||
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);
|
||||
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("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("TOTALWEIGHT", PREF_BOOL, BOOL_TO_PTR(visible_cols.totalweight));
|
||||
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("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 */
|
||||
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.totalweight = PTR_TO_BOOL(subsurface_get_conf("TOTALWEIGHT", 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.sac = PTR_TO_BOOL(subsurface_get_conf("SAC", PREF_BOOL));
|
||||
|
|
Loading…
Reference in a new issue