[PATCH] Limit to 4 the number of cylinders shown in the data frame

Salvador Cuñat salvador.cunat at gmail.com
Wed Dec 26 13:17:02 PST 2012


For dives with more than 4 cylinders, the frame got very crowded and we
needed a magnifier to see the numbers.
If we used more than four tanks, let's put the info in another frame, if not, print
the OTUs, the maxcns and the weight sytem in the new frame.
There is still room for two more short data.

There are issues with the size of some translations, and CNS hasn't been
translated (and I think it isn't worth the effort).


Signed-off-by: Salvador Cuñat <salvador.cunat at gmail.com>
---
 print.c |  350 ++++++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 259 insertions(+), 91 deletions(-)

diff --git a/print.c b/print.c
index 368ab94..d061862 100644
--- a/print.c
+++ b/print.c
@@ -168,113 +168,281 @@ static void show_dive_notes(struct dive *dive, cairo_t *cr, double w,
 
 /*
  * Show the tanks used in the dive, the mix, and the gas consumed
- * as pressures are shown in the plot
+ * as pressures are shown in the plot. And other data if we used
+ * less than four cilynders.
  */
 static void show_dive_tanks(struct dive *dive, cairo_t *cr, double w,
 	double h, PangoFontDescription *font)
 {
-	int maxwidth, maxheight, curwidth, height, decimals, n, i, z,
-	    cyl_wp, cyl_press, cyl_end;
-	double cyl_cap, cyl_cons_gas;
-	const char *unit_vol, *unit_press;
-	char buffer[80], dataheader1[3][80]= { N_("Cylinder"), N_("Gasmix"), N_("Gas Used")};
-	PangoLayout *layout;
+	int maxwidth, maxheight, height, tank_count;
+	
+	/* Print the tank data */
+	void print_tanks (int maxwidth, int maxheight, int height, int tank_count, int first_tank)
+	{
+		int curwidth, decimals, n, i, cyl_wp, cyl_press, cyl_end;
+		double cyl_cap, cyl_cons_gas;
+		const char *unit_vol, *unit_press;
+		char buffer[80], dataheader1[3][80]= { N_("Cylinder"), N_("Gasmix"), N_("Gas Used")};
+		PangoLayout *layout;
+
+		/* First create a header */
+		maxheight -= height / 6;
+		curwidth = 0;
+		for (i = 0; i < 3; i++) {
+			cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
+			layout = pango_cairo_create_layout(cr);
+			pango_layout_set_height(layout,maxheight);
+			pango_layout_set_width(layout, maxwidth / 3);
+			pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+			if (tank_count < 4) {
+				set_font(layout, font, FONT_SMALL - (0.5 * tank_count), PANGO_ALIGN_CENTER);
+			} else {
+				set_font(layout, font, FONT_SMALL - 2, PANGO_ALIGN_CENTER);
+			}
+			pango_layout_set_text(layout, _(dataheader1[i]), -1);
+			pango_layout_set_justify(layout, 0);
+			pango_cairo_show_layout(cr, layout);
+			curwidth = curwidth + maxwidth/ 3;
+		}
+		/* Then the cylinder stuff */
+		n = first_tank;
+		while ( n < tank_count && n < first_tank + 4){
+			cairo_translate (cr, 0, height / (double) PANGO_SCALE);
+			cairo_move_to(cr, 0, 0);
+			cyl_cap = get_volume_units(dive->cylinder[n].type.size.mliter, &decimals, &unit_vol);
+			cyl_wp = get_pressure_units(dive->cylinder[n].type.workingpressure.mbar, &unit_press);
+			cyl_press= get_pressure_units(dive->cylinder[n].start.mbar, &unit_press);
+			cyl_end= get_pressure_units(dive->cylinder[n].end.mbar, &unit_press);
+			cyl_cons_gas = (cyl_press - cyl_end) * cyl_cap;
+			curwidth = 0;
+			i = 0;
+			while ( i < 3 ) {
+				cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
+				switch(i) {
+					case 0 : if (prefs.output_units.volume == CUFT) {
+						cyl_cap *= cyl_wp / 14.7 ;
+						}
+						snprintf(buffer, sizeof(buffer), _("%.*f %s"),
+							decimals,
+							cyl_cap,
+							unit_vol);
+					break;
+					case 1 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
+						if (dive->cylinder[n].gasmix.o2.permille == 0){
+							snprintf(buffer, sizeof(buffer), _("air"));
+						} else {
+							snprintf(buffer, sizeof(buffer), _("%d/%d"),
+							dive->cylinder[n].gasmix.o2.permille /10,
+							dive->cylinder[n].gasmix.he.permille /10);
+						}
+					break;
+					case 2 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
+						if (prefs.output_units.volume == CUFT) {
+							cyl_cons_gas /= 14.7 ;
+						}
+						snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
+							decimals,
+							cyl_cons_gas,
+							unit_vol);
+					break;
+					default : snprintf(buffer, sizeof(buffer),"Error");
+				}
+				pango_layout_set_text(layout, buffer, -1);
+				pango_cairo_show_layout(cr, layout);
+				curwidth += (maxwidth/ 3);
+				i++;
+			}
+			maxheight -= height;
+			n++;
+		}
+		cairo_translate(cr, -0, - ((h * PANGO_SCALE * 0.9) - maxheight) / PANGO_SCALE);
+		g_object_unref (layout);
+	}
 
-	/*Create a frame to separate tank area, note the scaling*/
-	cairo_rectangle(cr, 0, 0 + h*0.05, w, h*0.9);
-	cairo_set_line_width(cr, 0.01);
-	cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
-	cairo_stroke(cr);
+	/* Calculate total weight
+	 * copy/paste from divelist.c
+	 */
+	double 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;
+	}
+	
+	/* Print weight system */
+	void print_weight_data (int maxwidth, int maxheight, int height){
+		int decimals,i;
+		double totalweight, totalweightsystem, weightsystemcounter;
+		const char *unit_weight;
+		char buffer[80];
+		PangoLayout *layout;
 
-	maxwidth = w * PANGO_SCALE;
-	maxheight = h * PANGO_SCALE * 0.9;
+		layout = pango_cairo_create_layout(cr);
+		pango_layout_set_height(layout,maxheight);
+		pango_layout_set_width(layout, maxwidth);
+		pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+		set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_CENTER);
 
-	/* We need to know how many cylinders we used*/
-	for (z = 0; z < MAX_CYLINDERS; z++ ){
-		if (dive->cylinder[z].start.mbar == 0) {
-			break;
+		/* Header for the weight system */
+		cairo_move_to(cr, 0, 0);
+		snprintf (buffer, sizeof(buffer),_("Weight System"));
+		pango_layout_set_text(layout, buffer, -1);
+		pango_cairo_show_layout(cr, layout);
+		
+		/* Detail of the weight */
+		cairo_translate (cr, 0, height / (3 * (double) PANGO_SCALE));
+		set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_LEFT);
+		weightsystemcounter = 0;
+		for (i=0; i<  MAX_WEIGHTSYSTEMS; i++){
+			totalweightsystem = get_weight_units(dive->weightsystem[i].weight.grams, &decimals, &unit_weight);
+			if (totalweightsystem == 0){
+			}else{
+				cairo_move_to(cr, 0, 0);
+				snprintf(buffer, sizeof(buffer), _("%s"),dive->weightsystem[i].description);
+				pango_layout_set_text(layout, buffer, -1);
+				pango_cairo_show_layout(cr, layout);
+				cairo_move_to(cr,(2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
+				snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
+						decimals,
+						totalweightsystem,
+						unit_weight);
+				pango_layout_set_text(layout, buffer, -1);
+				pango_cairo_show_layout(cr, layout);
+				weightsystemcounter++;
+				cairo_translate (cr, 0, height / (4 * (double) PANGO_SCALE));
+			}
 		}
+
+		/* Total weight of the system */
+		totalweight = get_weight_units(total_weight(dive), &decimals, &unit_weight);
+		cairo_translate (cr, 0, height / (4 * (double) PANGO_SCALE));
+		cairo_move_to (cr, 0, 0);
+		snprintf(buffer, sizeof(buffer), _("Total Weight:"));
+		pango_layout_set_text(layout, buffer, -1);
+		pango_cairo_show_layout(cr, layout);
+		cairo_move_to(cr,(2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
+		snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
+				decimals,
+				totalweight,
+				unit_weight);
+		pango_layout_set_text(layout, buffer, -1);
+		pango_cairo_show_layout(cr, layout);
+
+		/* undo translations */
+		cairo_translate (cr, 0, -(weightsystemcounter * height) / (4 * (double) PANGO_SCALE));
+		cairo_translate (cr, 0, -height / (3 * (double) PANGO_SCALE));
+		g_object_unref (layout);
 	}
 
-	/* to determine the distance between lines*/
-	if (z == 0){
-		height = maxheight / 1;
-	} else {
-	height = maxheight / (z + 1);
+	/* Print the dive OTUs */
+	void print_otus (int maxwidth, int maxheight){
+		char buffer[20];
+		PangoLayout *layout;
+
+		layout = pango_cairo_create_layout(cr);
+		pango_layout_set_height(layout, maxheight);
+		pango_layout_set_width(layout, maxwidth);
+		pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+		set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_LEFT);
+
+		cairo_move_to (cr,(maxwidth*0.05) / ((double) PANGO_SCALE), 0);
+		snprintf(buffer, sizeof(buffer), _("OTU"));
+		pango_layout_set_text(layout, buffer, -1);
+		pango_cairo_show_layout(cr, layout);
+		cairo_move_to (cr, (2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
+		snprintf(buffer, sizeof(buffer), "%d", dive->otu);
+		pango_layout_set_text(layout, buffer, -1);
+		pango_cairo_show_layout(cr, layout);
+		g_object_unref (layout);
 	}
 
-	/* Then create the layout.
-	 * First a header */
-	cairo_translate (cr, 0, height / (6 * (double) PANGO_SCALE));
-	maxheight -= height / 6;
-	curwidth = 0;
-	for (i = 0; i < 3; i++) {
-		cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
+	/* Print the dive maxCNS */
+	void print_cns (int maxwidth, int maxheight){
+		char buffer[20];
+		PangoLayout *layout;
+
 		layout = pango_cairo_create_layout(cr);
-		pango_layout_set_height(layout,maxheight);
-		pango_layout_set_width(layout, maxwidth / 3);
+		pango_layout_set_height(layout, maxheight);
+		pango_layout_set_width(layout, maxwidth);
 		pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
-		set_font(layout, font, FONT_SMALL * 0.10 *(11-z), PANGO_ALIGN_CENTER);
-		pango_layout_set_text(layout, _(dataheader1[i]), -1);
-		pango_layout_set_justify(layout, 0);
+		set_font(layout, font, FONT_SMALL - 3, PANGO_ALIGN_LEFT);
+
+		cairo_move_to (cr,(maxwidth*0.05) / ((double) PANGO_SCALE), 0);
+		snprintf(buffer, sizeof(buffer), _("Max. CNS"));
+		pango_layout_set_text(layout, buffer, -1);
 		pango_cairo_show_layout(cr, layout);
-		curwidth = curwidth + maxwidth/ 3;
+		cairo_move_to (cr, (2 * maxwidth) / (3 * (double) PANGO_SCALE), 0);
+		snprintf(buffer, sizeof(buffer), "%d", dive->maxcns);
+		pango_layout_set_text(layout, buffer, -1);
+		pango_cairo_show_layout(cr, layout);
+		g_object_unref (layout);
 	}
 
-	/* Now the relevant info*/
-	for (n = 0; n < z; n++) {
-		cairo_translate (cr, 0, height / (double) PANGO_SCALE);
-		cairo_move_to(cr, 0, 0);
+	/*
+	 * The real show_dive_tanks stuff
+	 */
+	maxwidth = w * PANGO_SCALE;
+	maxheight = h * PANGO_SCALE * 0.9;
 
-		cyl_cap = get_volume_units(dive->cylinder[n].type.size.mliter, &decimals, &unit_vol);
-		cyl_wp = get_pressure_units(dive->cylinder[n].type.workingpressure.mbar, &unit_press);
-		cyl_press= get_pressure_units(dive->cylinder[n].start.mbar, &unit_press);
-		cyl_end= get_pressure_units(dive->cylinder[n].end.mbar, &unit_press);
-		cyl_cons_gas = (cyl_press - cyl_end) * cyl_cap;
+	/* We need to know how many cylinders we used*/
+	for ( tank_count = 0; tank_count < MAX_CYLINDERS; tank_count++ ){
+		if (dive->cylinder[tank_count].start.mbar == 0) {
+			break;
+		}
+	}
 
-		curwidth = 0;
-		i = 0;
-		while ( i < 3 ) {
-			cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
-			switch(i) {
-				case 0 : if (prefs.output_units.volume == CUFT) {
-						 cyl_cap *= cyl_wp / 14.7 ;
-					 }
-					 snprintf(buffer, sizeof(buffer), _("%.*f %s"),
-							 decimals,
-							 cyl_cap,
-							 unit_vol);
-					 break;
-				case 1 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
-					 if (dive->cylinder[n].gasmix.o2.permille == 0){
-						 snprintf(buffer, sizeof(buffer), _("air"));
-
-					 } else {
-						 snprintf(buffer, sizeof(buffer), _("%d/%d"),
-							 dive->cylinder[n].gasmix.o2.permille /10,
-							 dive->cylinder[n].gasmix.he.permille /10);
-					 }
-					 break;
-				case 2 : cairo_move_to(cr, curwidth / (double) PANGO_SCALE, 0);
-					 if (prefs.output_units.volume == CUFT) {
-						 cyl_cons_gas /= 14.7 ;
-					 }
-					 snprintf(buffer, sizeof(buffer), _("%.*f %s\n"),
-							 decimals,
-							 cyl_cons_gas,
-							 unit_vol);
-					 break;
-				default : snprintf(buffer, sizeof(buffer),"Error");
-			}
-			pango_layout_set_text(layout, buffer, -1);
-			pango_cairo_show_layout(cr, layout);
-			curwidth += (maxwidth/ 3);
-			i += 1;
+	/* and determine the distance between lines*/
+	if (tank_count == 0) {
+		height = maxheight;
+	} else {
+		if ( tank_count<=4 ) {
+			height = maxheight / (tank_count + 1);
+		} else {
+			height = maxheight / 5;
 		}
-		maxheight -= height;
 	}
-	cairo_translate(cr,0, - ((h * PANGO_SCALE * 0.9) - maxheight) / PANGO_SCALE);
-	g_object_unref(layout);
+
+	/*Create a frame to separate tank area, note the scaling*/
+	cairo_set_line_width(cr, 0.01);
+	cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
+	cairo_rectangle(cr, 0, h*0.02, w, h*0.95);
+	cairo_stroke(cr);
+	cairo_translate (cr, 0, height / (6 * (double) PANGO_SCALE));
+	
+	print_tanks (maxwidth, maxheight, height, tank_count, 0);
+	
+	cairo_set_line_width(cr, 0.01);
+	cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
+	cairo_rectangle(cr, w, h*0.02, w, h*0.95);
+	cairo_stroke(cr);
+
+	/* If there are more than 4 tanks use the full width, else print other data*/
+	if (tank_count > 4){
+		cairo_translate (cr, w, height / (6 * (double) PANGO_SCALE));
+		print_tanks (maxwidth, maxheight, height, tank_count, 4);
+		cairo_translate (cr, -w, -height / (6 * (double) PANGO_SCALE));
+	} else {
+		/* Plot a grid for the data */
+		cairo_move_to(cr, 3*w/2, h*0.05);
+		cairo_line_to (cr, 3*w/2, h);
+		cairo_move_to (cr, w, ((h * 0.9)/4) + (h*0.05));
+		cairo_line_to (cr, 3*w/2, ((h * 0.9)/4) + (h*0.05));
+		cairo_move_to (cr, w, ((h * 0.9)*2/4) + (h*0.05));
+		cairo_line_to (cr, 3*w/2, ((h * 0.9)*2/4) + (h*0.05));
+		cairo_stroke (cr);
+		/* and print OTUs, CNS and weight */
+		cairo_translate (cr, (3.05*w/2), height / (6 * (double) PANGO_SCALE));
+		print_weight_data (maxwidth * 0.90/2 , maxheight, maxheight / 2);
+		cairo_translate (cr, -(3.05*w/2), -height / (6 * (double) PANGO_SCALE));
+		cairo_translate (cr, w, 0);
+		print_otus (maxwidth * 0.90/2, maxheight);
+		cairo_translate (cr, 0, h/4);
+		print_cns (maxwidth * 0.90/2, maxheight);
+		cairo_translate (cr, -w, -h/4);
+	}
 }
 
 static void show_table_header(cairo_t *cr, double w, double h,
@@ -453,17 +621,17 @@ static void print(int divenr, cairo_t *cr, double x, double y, double w,
 	cairo_scale(cr, 0.5, 0.5);
 
 	/* Dive plot in the upper two thirds - note the scaling */
-	show_dive_profile(dive, cr, w*2, h*1.33);
+	show_dive_profile(dive, cr, w*2, h*1.30);
 
 	/* Dive information in the lower third */
-	cairo_translate(cr, 0, h*1.33);
+	cairo_translate(cr, 0, h*1.30);
 	show_dive_header(dive, cr, w*2, h*0.15, font);
 
 	cairo_translate(cr, 0, h*0.15);
-	show_dive_tanks (dive, cr, w*1, h*0.20, font);
+	show_dive_tanks (dive, cr, w*1, h*0.25, font);
 
-	cairo_translate(cr, 0, h*0.20);
-	show_dive_notes(dive, cr, w*2, h*0.32, font);
+	cairo_translate(cr, 0, h*0.25);
+	show_dive_notes(dive, cr, w*2, h*0.30, font);
 
 	cairo_restore(cr);
 }
-- 
1.7.2.5


More information about the subsurface mailing list