From 4229e89fc10590f12e969eba46d253d90db66b7d Mon Sep 17 00:00:00 2001 From: Maximilian Güntner Date: Fri, 8 Jun 2012 02:54:02 +0200 Subject: Plot shorter (apnea) dives with a reasonable scale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The time marker increments have also been changed to better values. Also, display more time information for short dives. Signed-off-by: Maximilian Güntner --- profile.c | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'profile.c') diff --git a/profile.c b/profile.c index 137ed6f88..4a505bd67 100644 --- a/profile.c +++ b/profile.c @@ -181,14 +181,22 @@ static void dump_pi (struct plot_info *pi) * current dive. However, we don't scale past less than * 30 minutes or 90 ft, just so that small dives show * up as such. + * If the dive time is shorter than 10 minutes we assume that + * this has been an apnea dive and display it accordingly. * we also need to add 180 seconds at the end so the min/max * plots correctly */ static int get_maxtime(struct plot_info *pi) { int seconds = pi->maxtime; - /* min 30 minutes, rounded up to 5 minutes, with at least 2.5 minutes to spare */ - return MAX(30*60, ROUND_UP(seconds+150, 60*5)); + if (seconds < 600) + { + /* Possible apnea dive, we scale accordingly */ + return ROUND_UP(seconds+seconds/4, 60); + } else { + /* min 30 minutes, rounded up to 5 minutes, with at least 2.5 minutes to spare */ + return MAX(30*60, ROUND_UP(seconds+150, 60*5)); + } } static int get_maxdepth(struct plot_info *pi) @@ -448,7 +456,15 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi /* Get plot scaling limits */ maxtime = get_maxtime(pi); maxdepth = get_maxdepth(pi); - + /* We check whether this has been an apnea dive and overwrite + * the increments in order to get reasonable time markers */ + if (maxtime < 600) + { + increments[0] = 10; + increments[1] = 30; + increments[2] = 60; + increments[3] = 5*60; + } /* Time markers: at most every 5 min, but no more than 12 markers * and for convenience we do 5, 10, 15 or 30 min intervals. * This allows for 6h dives - enough (I hope) for even the craziest @@ -473,11 +489,18 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi } cairo_stroke(cr); - /* now the text on every second time marker */ + /* now the text on the time markers */ text_render_options_t tro = {10, TIME_TEXT, CENTER, TOP}; - for (i = incr; i < maxtime; i += 2 * incr) - plot_text(gc, &tro, i, 1, "%d", i/60); - + if (maxtime < 600) + { + /* Be a bit more verbose with shorter (apnea) dives */ + for (i = incr; i < maxtime; i += incr) + plot_text(gc, &tro, i, 1, "%d:%d", i/60, i%60); + } else { + /* Only render the time on every second marker for normal dives */ + for (i = incr; i < maxtime; i += 2 * incr) + plot_text(gc, &tro, i, 1, "%d", i/60); + } /* Depth markers: every 30 ft or 10 m*/ gc->leftx = 0; gc->rightx = 1.0; gc->topy = 0; gc->bottomy = maxdepth; -- cgit v1.2.3-70-g09d2 From b7ae9ad5b16e680dfc4d976e877f77f6bb1a9e3a Mon Sep 17 00:00:00 2001 From: Maximilian Güntner Date: Sat, 9 Jun 2012 15:05:41 +0200 Subject: use increments that make sense for 600 seconds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 599/12 = 50, no need to use 5*60. Signed-off-by: Maximilian Güntner --- profile.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'profile.c') diff --git a/profile.c b/profile.c index 4a505bd67..728409ec2 100644 --- a/profile.c +++ b/profile.c @@ -461,9 +461,9 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi if (maxtime < 600) { increments[0] = 10; - increments[1] = 30; - increments[2] = 60; - increments[3] = 5*60; + increments[1] = 20; + increments[2] = 30; + increments[3] = 60; } /* Time markers: at most every 5 min, but no more than 12 markers * and for convenience we do 5, 10, 15 or 30 min intervals. -- cgit v1.2.3-70-g09d2 From 0a7fa8ea50ad65b350ebcc435dd47eae02d8bcbe Mon Sep 17 00:00:00 2001 From: Maximilian Güntner Date: Sat, 9 Jun 2012 22:40:12 +0200 Subject: fixed indentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maximilian Güntner --- profile.c | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) (limited to 'profile.c') diff --git a/profile.c b/profile.c index 728409ec2..5e603f898 100644 --- a/profile.c +++ b/profile.c @@ -189,14 +189,13 @@ static void dump_pi (struct plot_info *pi) static int get_maxtime(struct plot_info *pi) { int seconds = pi->maxtime; - if (seconds < 600) - { - /* Possible apnea dive, we scale accordingly */ - return ROUND_UP(seconds+seconds/4, 60); - } else { - /* min 30 minutes, rounded up to 5 minutes, with at least 2.5 minutes to spare */ - return MAX(30*60, ROUND_UP(seconds+150, 60*5)); - } + if (seconds < 600) { + /* Possible apnea dive, we scale accordingly */ + return ROUND_UP(seconds+seconds/4, 60); + } else { + /* min 30 minutes, rounded up to 5 minutes, with at least 2.5 minutes to spare */ + return MAX(30*60, ROUND_UP(seconds+150, 60*5)); + } } static int get_maxdepth(struct plot_info *pi) @@ -456,15 +455,14 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi /* Get plot scaling limits */ maxtime = get_maxtime(pi); maxdepth = get_maxdepth(pi); - /* We check whether this has been an apnea dive and overwrite - * the increments in order to get reasonable time markers */ - if (maxtime < 600) - { - increments[0] = 10; - increments[1] = 20; - increments[2] = 30; - increments[3] = 60; - } + /* We check whether this has been an apnea dive and overwrite + * the increments in order to get reasonable time markers */ + if (maxtime < 600) { + increments[0] = 10; + increments[1] = 20; + increments[2] = 30; + increments[3] = 60; + } /* Time markers: at most every 5 min, but no more than 12 markers * and for convenience we do 5, 10, 15 or 30 min intervals. * This allows for 6h dives - enough (I hope) for even the craziest @@ -491,16 +489,15 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi /* now the text on the time markers */ text_render_options_t tro = {10, TIME_TEXT, CENTER, TOP}; - if (maxtime < 600) - { - /* Be a bit more verbose with shorter (apnea) dives */ - for (i = incr; i < maxtime; i += incr) - plot_text(gc, &tro, i, 1, "%d:%d", i/60, i%60); - } else { - /* Only render the time on every second marker for normal dives */ - for (i = incr; i < maxtime; i += 2 * incr) - plot_text(gc, &tro, i, 1, "%d", i/60); - } + if (maxtime < 600) { + /* Be a bit more verbose with shorter (apnea) dives */ + for (i = incr; i < maxtime; i += incr) + plot_text(gc, &tro, i, 1, "%d:%d", i/60, i%60); + } else { + /* Only render the time on every second marker for normal dives */ + for (i = incr; i < maxtime; i += 2 * incr) + plot_text(gc, &tro, i, 1, "%d", i/60); + } /* Depth markers: every 30 ft or 10 m*/ gc->leftx = 0; gc->rightx = 1.0; gc->topy = 0; gc->bottomy = maxdepth; -- cgit v1.2.3-70-g09d2 From 7acd075bd5ad1c6d42ba77b484aebc2a0572f710 Mon Sep 17 00:00:00 2001 From: Maximilian Güntner Date: Mon, 11 Jun 2012 02:45:36 +0200 Subject: added "Zoom" button and improved scaling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It should be possible to have a certain limit where we stop zooming so that short dives are visible as such at first glance. Therefore a "Zoom" button has been added to the "Log" menu along with a shortcut (Ctrl + "0"). The user can now zoom/unzoom the plot and is still able to quickly distinguish short dives from normal ones when browsing the log. Signed-off-by: Maximilian Güntner --- gtk-gui.c | 12 +++++++++++- profile.c | 54 ++++++++++++++++++++++++++++++------------------------ 2 files changed, 41 insertions(+), 25 deletions(-) (limited to 'profile.c') diff --git a/gtk-gui.c b/gtk-gui.c index 1e053e52b..4b9f002af 100644 --- a/gtk-gui.c +++ b/gtk-gui.c @@ -22,6 +22,7 @@ GtkWidget *error_info_bar; GtkWidget *error_label; GtkWidget *vpane, *hpane; int error_count; +extern char zoomed_plot; const char *divelist_font; @@ -610,6 +611,13 @@ static void view_three(GtkWidget *w, gpointer data) gtk_paned_set_position(GTK_PANED(vpane), 200); } +static void toggle_zoom(GtkWidget *w, gpointer data) +{ + zoomed_plot = (zoomed_plot)?0 : 1; + /*Update dive*/ + repaint_dive(); +} + static GtkActionEntry menu_items[] = { { "FileMenuAction", GTK_STOCK_FILE, "File", NULL, NULL, NULL}, { "LogMenuAction", GTK_STOCK_FILE, "Log", NULL, NULL, NULL}, @@ -628,7 +636,8 @@ static GtkActionEntry menu_items[] = { { "ViewList", NULL, "List", CTRLCHAR "1", NULL, G_CALLBACK(view_list) }, { "ViewProfile", NULL, "Profile", CTRLCHAR "2", NULL, G_CALLBACK(view_profile) }, { "ViewInfo", NULL, "Info", CTRLCHAR "3", NULL, G_CALLBACK(view_info) }, - { "ViewThree", NULL, "Three", CTRLCHAR "4", NULL, G_CALLBACK(view_three) }, + { "ViewThree", NULL, "Three", CTRLCHAR "4", NULL, G_CALLBACK(view_three) }, + { "ToggleZoom", NULL, "Toggle Zoom", CTRLCHAR "0", NULL, G_CALLBACK(toggle_zoom) }, }; static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); @@ -648,6 +657,7 @@ static const gchar* ui_string = " \ \ \ \ + \ \ \ \ diff --git a/profile.c b/profile.c index 5e603f898..5ec4998d2 100644 --- a/profile.c +++ b/profile.c @@ -14,6 +14,7 @@ #include "color.h" int selected_dive = 0; +char zoomed_plot = 0; typedef enum { STABLE, SLOW, MODERATE, FAST, CRAZY } velocity_t; @@ -180,18 +181,24 @@ static void dump_pi (struct plot_info *pi) * When showing dive profiles, we scale things to the * current dive. However, we don't scale past less than * 30 minutes or 90 ft, just so that small dives show - * up as such. - * If the dive time is shorter than 10 minutes we assume that - * this has been an apnea dive and display it accordingly. - * we also need to add 180 seconds at the end so the min/max + * up as such unless zoom is enabled. + * We also need to add 180 seconds at the end so the min/max * plots correctly */ static int get_maxtime(struct plot_info *pi) { int seconds = pi->maxtime; - if (seconds < 600) { - /* Possible apnea dive, we scale accordingly */ - return ROUND_UP(seconds+seconds/4, 60); + if (zoomed_plot) { + /* Rounded up to one minute, with at least 2.5 minutes to + * spare. + * For dive times shorter than 10 minutes, we use seconds/4 to + * calculate the space dynamically. + * This is seamless since 600/4 = 150. + */ + if ( seconds < 600 ) + return ROUND_UP(seconds+seconds/4, 60); + else + return ROUND_UP(seconds+150, 60); } else { /* min 30 minutes, rounded up to 5 minutes, with at least 2.5 minutes to spare */ return MAX(30*60, ROUND_UP(seconds+150, 60*5)); @@ -201,8 +208,13 @@ static int get_maxtime(struct plot_info *pi) static int get_maxdepth(struct plot_info *pi) { unsigned mm = pi->maxdepth; - /* Minimum 30m, rounded up to 10m, with at least 3m to spare */ - return MAX(30000, ROUND_UP(mm+3000, 10000)); + if (zoomed_plot) { + /* Rounded up to 10m, with at least 3m to spare */ + return ROUND_UP(mm+3000, 10000); + } else { + /* Minimum 30m, rounded up to 10m, with at least 3m to spare */ + return MAX(30000, ROUND_UP(mm+3000, 10000)); + } } typedef struct { @@ -450,27 +462,21 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi int sec, depth; struct plot_data *entry; int maxtime, maxdepth, marker; - int increments[4] = { 5*60, 10*60, 15*60, 30*60 }; + int increments[8] = { 10, 20, 30, 60, 5*60, 10*60, 15*60, 30*60 }; /* Get plot scaling limits */ maxtime = get_maxtime(pi); maxdepth = get_maxdepth(pi); - /* We check whether this has been an apnea dive and overwrite - * the increments in order to get reasonable time markers */ - if (maxtime < 600) { - increments[0] = 10; - increments[1] = 20; - increments[2] = 30; - increments[3] = 60; - } - /* Time markers: at most every 5 min, but no more than 12 markers - * and for convenience we do 5, 10, 15 or 30 min intervals. + + /* Time markers: at most every 5 min, but no more than 12 markers. + * We start out with 10 seconds and increment up to 30 minutes, + * depending on the dive time. * This allows for 6h dives - enough (I hope) for even the craziest * divers - but just in case, for those 8h depth-record-breaking dives, * we double the interval if this still doesn't get us to 12 or fewer * time markers */ i = 0; - while (maxtime / increments[i] > 12 && i < 4) + while (maxtime / increments[i] > 12 && i < 8) i++; incr = increments[i]; while (maxtime / incr > 12) @@ -490,13 +496,13 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi /* now the text on the time markers */ text_render_options_t tro = {10, TIME_TEXT, CENTER, TOP}; if (maxtime < 600) { - /* Be a bit more verbose with shorter (apnea) dives */ + /* Be a bit more verbose with shorter dives */ for (i = incr; i < maxtime; i += incr) - plot_text(gc, &tro, i, 1, "%d:%d", i/60, i%60); + plot_text(gc, &tro, i, 1, "%d:%d", i/60, i%60); } else { /* Only render the time on every second marker for normal dives */ for (i = incr; i < maxtime; i += 2 * incr) - plot_text(gc, &tro, i, 1, "%d", i/60); + plot_text(gc, &tro, i, 1, "%d", i/60); } /* Depth markers: every 30 ft or 10 m*/ gc->leftx = 0; gc->rightx = 1.0; -- cgit v1.2.3-70-g09d2 From 2cada118eb515e369ba23b85c8f3fb8c4d100aaa Mon Sep 17 00:00:00 2001 From: Maximilian Güntner Date: Mon, 11 Jun 2012 03:11:13 +0200 Subject: updated/corrected comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maximilian Güntner --- profile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'profile.c') diff --git a/profile.c b/profile.c index 5ec4998d2..fedc700b4 100644 --- a/profile.c +++ b/profile.c @@ -468,7 +468,7 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi maxtime = get_maxtime(pi); maxdepth = get_maxdepth(pi); - /* Time markers: at most every 5 min, but no more than 12 markers. + /* Time markers: at most every 10 seconds, but no more than 12 markers. * We start out with 10 seconds and increment up to 30 minutes, * depending on the dive time. * This allows for 6h dives - enough (I hope) for even the craziest -- cgit v1.2.3-70-g09d2 From 1c1ad77f836b58244b3160b9bd13cad2012abdab Mon Sep 17 00:00:00 2001 From: Maximilian Güntner Date: Wed, 22 Aug 2012 01:23:54 +0200 Subject: plot the time with a fixed padding (leading zero) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maximilian Güntner --- profile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'profile.c') diff --git a/profile.c b/profile.c index 97ea9077d..3ad11c0d0 100644 --- a/profile.c +++ b/profile.c @@ -498,7 +498,7 @@ static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi if (maxtime < 600) { /* Be a bit more verbose with shorter dives */ for (i = incr; i < maxtime; i += incr) - plot_text(gc, &tro, i, 1, "%d:%d", i/60, i%60); + plot_text(gc, &tro, i, 1, "%02d:%02d", i/60, i%60); } else { /* Only render the time on every second marker for normal dives */ for (i = incr; i < maxtime; i += 2 * incr) -- cgit v1.2.3-70-g09d2