]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Merge branch 'quit-handling' of git://github.com/dirkhh/subsurface
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 21 Sep 2011 19:28:20 +0000 (12:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 21 Sep 2011 19:28:20 +0000 (12:28 -0700)
* 'quit-handling' of git://github.com/dirkhh/subsurface:
  Use the last (or only) filename on command line as default for saving
  Show the "save changes" dialog before the main window is destroyed
  Check for changes at regular 'quit' events as well
  Catch changes to the info of the current dive when quitting
  Tracking changes to tanks is trivial
  Simplistic first attempt to get changes saved when quitting subsurface

dive.c
dive.h
print.c
profile.c

diff --git a/dive.c b/dive.c
index 1b906ee43bd9a7e86db41d08cc5d3f288732a012..41bbabd698868bf43c90555acc38d13a83b41a9c 100644 (file)
--- a/dive.c
+++ b/dive.c
@@ -5,6 +5,31 @@
 
 #include "dive.h"
 
+double get_depth_units(unsigned int mm, int *frac, const char **units)
+{
+       int decimals;
+       double d;
+       const char *unit;
+
+       switch (output_units.length) {
+       case METERS:
+               d = mm / 1000.0;
+               unit = "m";
+               decimals = d < 20;
+               break;
+       case FEET:
+               d = mm_to_feet(mm);
+               unit = "ft";
+               decimals = 0;
+               break;
+       }
+       if (frac)
+               *frac = decimals;
+       if (units)
+               *units = unit;
+       return d;
+}
+
 struct dive *alloc_dive(void)
 {
        const int initial_samples = 5;
diff --git a/dive.h b/dive.h
index 9cdfd61b0b77b290d6041e1187378b1284f6f918..e1a5bc007e69fe76d032a2c81ce80dcb80897034 100644 (file)
--- a/dive.h
+++ b/dive.h
@@ -86,6 +86,8 @@ typedef struct {
        pressure_t start, end;
 } cylinder_t;
 
+extern double get_depth_units(unsigned int mm, int *frac, const char **units);
+
 static inline double mm_to_feet(int mm)
 {
        return mm * 0.00328084;
diff --git a/print.c b/print.c
index 16ac4d2bf07f547252c1caff48a9590465c32ff0..0346cca74bf48d3addb5f977d343f80970b29bd2 100644 (file)
--- a/print.c
+++ b/print.c
@@ -7,13 +7,28 @@
 #include "display.h"
 #include "display-gtk.h"
 
+#define FONT_NORMAL (12)
+#define FONT_SMALL (FONT_NORMAL / 1.2)
+#define FONT_LARGE (FONT_NORMAL * 1.2)
+
+static void set_font(PangoLayout *layout, PangoFontDescription *font, double size, int align)
+{
+       pango_font_description_set_size(font, size * PANGO_SCALE);
+       pango_layout_set_font_description(layout, font);
+       pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
+       pango_layout_set_alignment(layout, align);
+
+}
+
 /*
  * You know what? Maybe somebody can do a real Pango layout thing.
  * This is hacky.
  */
 static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, PangoFontDescription *font)
 {
-       int len, width, height, maxwidth, maxheight;
+       double depth;
+       const char *unit;
+       int len, decimals, width, height, maxwidth, maxheight;
        PangoLayout *layout;
        struct tm *tm;
        char buffer[1024], divenr[20];
@@ -22,10 +37,8 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, P
        maxheight = h * PANGO_SCALE * 0.9;
 
        layout = pango_cairo_create_layout(cr);
-       pango_layout_set_font_description(layout, font);
        pango_layout_set_width(layout, maxwidth);
        pango_layout_set_height(layout, maxheight);
-       pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
 
        *divenr = 0;
        if (dive->number)
@@ -34,20 +47,15 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, P
 
        tm = gmtime(&dive->when);
        len = snprintf(buffer, sizeof(buffer),
-               "<span size=\"large\">"
-               "%s%s, %s %d, %d   %d:%02d"
-               "</span>",
+               "%s%s, %s %d, %d   %d:%02d",
                divenr,
                weekday(tm->tm_wday),
                monthname(tm->tm_mon),
                tm->tm_mday, tm->tm_year + 1900,
                tm->tm_hour, tm->tm_min);
 
-       pango_layout_set_justify(layout, 1);
-       pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
-       pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
-
-       pango_layout_set_markup(layout, buffer, len);
+       set_font(layout, font, FONT_LARGE, PANGO_ALIGN_LEFT);
+       pango_layout_set_text(layout, buffer, len);
        pango_layout_get_size(layout, &width, &height);
 
        cairo_move_to(cr, 0, 0);
@@ -58,34 +66,61 @@ static void show_dive_text(struct dive *dive, cairo_t *cr, double w, double h, P
         * with the depth/duration information. Need to mask that or
         * create a box or something.
         */
+       depth = get_depth_units(dive->maxdepth.mm, &decimals, &unit);
        snprintf(buffer, sizeof(buffer),
-               "<span size=\"small\">"
-               "Max depth: %d ft\n"
-               "Duration: %d:%02d"
-               "</span>",
-               to_feet(dive->maxdepth),
-               dive->duration.seconds / 60,
-               dive->duration.seconds % 60);
+               "Max depth: %.*f %s\n"
+               "Duration: %d min\n"
+               "%s",
+               decimals, depth, unit,
+               (dive->duration.seconds+59) / 60,
+               dive->buddy ? :"");
 
-       pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
-       pango_layout_set_markup(layout, buffer, -1);
+       set_font(layout, font, FONT_SMALL, PANGO_ALIGN_RIGHT);
+       pango_layout_set_text(layout, buffer, -1);
 
        cairo_move_to(cr, 0, 0);
        pango_cairo_show_layout(cr, layout);
 
-       len = snprintf(buffer, sizeof(buffer), "%s\n\n%s",
-               dive->location ? : "",
-               dive->notes ? : "");
-
+       /*
+        * Show the dive location
+        *
+        * .. or at least a space to get the size.
+        *
+        * Move down by the size of the date, and limit the
+        * width to the same width as the date string.
+        */
+       cairo_translate(cr, 0, height / (double) PANGO_SCALE);
        maxheight -= height;
-       pango_layout_set_height(layout, maxheight);
-       pango_layout_set_attributes(layout, NULL);
-       pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
-       pango_layout_set_text(layout, buffer, len);
+       pango_layout_set_height(layout, 1);
+       pango_layout_set_width(layout, width);
+
+       set_font(layout, font, FONT_NORMAL, PANGO_ALIGN_LEFT);
+       pango_layout_set_text(layout, dive->location ? : " ", -1);
 
-       cairo_move_to(cr, 0, height / (double) PANGO_SCALE);
+       cairo_move_to(cr, 0, 0);
        pango_cairo_show_layout(cr, layout);
 
+       pango_layout_get_size(layout, &width, &height);
+
+       /*
+        * Show the dive notes
+        */
+       if (dive->notes) {
+               /* Move down by the size of the location (x2) */
+               height = height * 2;
+               cairo_translate(cr, 0, height / (double) PANGO_SCALE);
+               maxheight -= height;
+
+               /* Use the full width and remaining height for notes */
+               pango_layout_set_height(layout, maxheight);
+               pango_layout_set_width(layout, maxwidth);
+               pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+               pango_layout_set_justify(layout, 1);
+               pango_layout_set_text(layout, dive->notes, -1);
+
+               cairo_move_to(cr, 0, 0);
+               pango_cairo_show_layout(cr, layout);
+       }
        g_object_unref(layout);
 }
 
index 3f3dd42bc108f1c0b7e048a1521388e92e1a7c2d..1b7db1d904909bbb440dfe4e184e0579132fafa1 100644 (file)
--- a/profile.c
+++ b/profile.c
@@ -158,22 +158,12 @@ static void plot_text(struct graphics_context *gc, const text_render_options_t *
 
 static void render_depth_sample(struct graphics_context *gc, struct plot_data *entry, const text_render_options_t *tro)
 {
-       int sec = entry->sec;
-       depth_t depth = { entry->val };
-       const char *fmt;
+       int sec = entry->sec, decimals;
        double d;
 
-       switch (output_units.length) {
-       case METERS:
-               d = depth.mm / 1000.0;
-               fmt = "%.1f";
-               break;
-       case FEET:
-               d = to_feet(depth);
-               fmt = "%.0f";
-               break;
-       }
-       plot_text(gc, tro, sec, depth.mm, fmt, d);
+       d = get_depth_units(entry->val, &decimals, NULL);
+
+       plot_text(gc, tro, sec, entry->val, "%.*f", decimals, d);
 }
 
 static void plot_text_samples(struct graphics_context *gc, struct plot_info *pi)