diff options
author | Tomaz Canabrava <tcanabrava@kde.org> | 2013-05-04 17:24:23 -0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-05-04 19:51:33 -0700 |
commit | fa82ba60798be8b5e20277527053199916888b16 (patch) | |
tree | 7cc67c1bcad3ba1f1612bc5bf52d4c33c223cb7d /qt-ui | |
parent | ec4d4566adc59d5fa2642c5f4ca12653b3f384a3 (diff) | |
download | subsurface-fa82ba60798be8b5e20277527053199916888b16.tar.gz |
Moved the plot from the cairo version to the Qt version
Started working on the Qt version of the Plot, initially
nothing is printed - but this is not a bad thing,
the program doesn't explodes too. :)
some work had to be done about the 'bool/gboolean' stuff
so I removed all gbooleans in the code that I'v encountered.
A new file was created ( profile.h ) so I could put the
signatures of helper methods that cairo used to call.
till now the code computes the max limits.
Next patch the first drawing will be made.
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Diffstat (limited to 'qt-ui')
-rw-r--r-- | qt-ui/profilegraphics.cpp | 140 |
1 files changed, 138 insertions, 2 deletions
diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp index a878c1363..e500432fc 100644 --- a/qt-ui/profilegraphics.cpp +++ b/qt-ui/profilegraphics.cpp @@ -6,12 +6,17 @@ #include <QDebug> #include "../color.h" +#include "../display.h" +#include "../dive.h" +#include "../profile.h" #define SAC_COLORS_START_IDX SAC_1 #define SAC_COLORS 9 #define VELOCITY_COLORS_START_IDX VELO_STABLE #define VELOCITY_COLORS 5 +static double plot_scale = SCALE_SCREEN; + typedef enum { /* SAC colors. Order is important, the SAC_COLORS_START_IDX define above. */ SAC_1, SAC_2, SAC_3, SAC_4, SAC_5, SAC_6, SAC_7, SAC_8, SAC_9, @@ -92,9 +97,140 @@ ProfileGraphicsView::ProfileGraphicsView(QWidget* parent) : QGraphicsView(parent fill_profile_color(); } -void ProfileGraphicsView::plot(struct dive *d) +static void plot_set_scale(scale_mode_t scale) +{ + switch (scale) { + default: + case SC_SCREEN: + plot_scale = SCALE_SCREEN; + break; + case SC_PRINT: + plot_scale = SCALE_PRINT; + break; + } +} + +void ProfileGraphicsView::plot(struct dive *dive) { - qDebug() << "Start the plotting of the dive here."; + struct plot_info *pi; + struct divecomputer *dc = &dive->dc; + + // This was passed around in the Cairo version / needed? + graphics_context gc; + const char *nickname; + + // Fix this for printing / screen later. + // plot_set_scale( scale_mode_t); + + if (!dc->samples) { + static struct sample fake[4]; + static struct divecomputer fakedc; + fakedc = dive->dc; + fakedc.sample = fake; + fakedc.samples = 4; + + /* The dive has no samples, so create a few fake ones. This assumes an + ascent/descent rate of 9 m/min, which is just below the limit for FAST. */ + int duration = dive->dc.duration.seconds; + int maxdepth = dive->dc.maxdepth.mm; + int asc_desc_time = dive->dc.maxdepth.mm*60/9000; + if (asc_desc_time * 2 >= duration) + asc_desc_time = duration / 2; + fake[1].time.seconds = asc_desc_time; + fake[1].depth.mm = maxdepth; + fake[2].time.seconds = duration - asc_desc_time; + fake[2].depth.mm = maxdepth; + fake[3].time.seconds = duration * 1.00; + fakedc.events = dc->events; + dc = &fakedc; + } + + /* + * Set up limits that are independent of + * the dive computer + */ + calculate_max_limits(dive, dc, &gc); + +#if 0 + /* shift the drawing area so we have a nice margin around it */ + cairo_translate(gc->cr, drawing_area->x, drawing_area->y); + cairo_set_line_width_scaled(gc->cr, 1); + cairo_set_line_cap(gc->cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join(gc->cr, CAIRO_LINE_JOIN_ROUND); + + /* + * We don't use "cairo_translate()" because that doesn't + * scale line width etc. But the actual scaling we need + * do set up ourselves.. + * + * Snif. What a pity. + */ + gc->maxx = (drawing_area->width - 2*drawing_area->x); + gc->maxy = (drawing_area->height - 2*drawing_area->y); + + dc = select_dc(dc); + + /* This is per-dive-computer. Right now we just do the first one */ + pi = create_plot_info(dive, dc, gc); + + /* Depth profile */ + plot_depth_profile(gc, pi); + plot_events(gc, pi, dc); + + /* Temperature profile */ + plot_temperature_profile(gc, pi); + + /* Cylinder pressure plot */ + plot_cylinder_pressure(gc, pi, dive, dc); + + /* Text on top of all graphs.. */ + plot_temperature_text(gc, pi); + plot_depth_text(gc, pi); + plot_cylinder_pressure_text(gc, pi); + plot_deco_text(gc, pi); + + /* Bounding box last */ + gc->leftx = 0; gc->rightx = 1.0; + gc->topy = 0; gc->bottomy = 1.0; + + set_source_rgba(gc, BOUNDING_BOX); + cairo_set_line_width_scaled(gc->cr, 1); + move_to(gc, 0, 0); + line_to(gc, 0, 1); + line_to(gc, 1, 1); + line_to(gc, 1, 0); + cairo_close_path(gc->cr); + cairo_stroke(gc->cr); + + /* Put the dive computer name in the lower left corner */ + nickname = get_dc_nickname(dc->model, dc->deviceid); + if (!nickname || *nickname == '\0') + nickname = dc->model; + if (nickname) { + static const text_render_options_t computer = {DC_TEXT_SIZE, TIME_TEXT, LEFT, MIDDLE}; + plot_text(gc, &computer, 0, 1, "%s", nickname); + } + + if (PP_GRAPHS_ENABLED) { + plot_pp_gas_profile(gc, pi); + plot_pp_text(gc, pi); + } + + /* now shift the translation back by half the margin; + * this way we can draw the vertical scales on both sides */ + cairo_translate(gc->cr, -drawing_area->x / 2.0, 0); + gc->maxx += drawing_area->x; + gc->leftx = -(drawing_area->x / drawing_area->width) / 2.0; + gc->rightx = 1.0 - gc->leftx; + + plot_depth_scale(gc, pi); + + if (gc->printer) { + free(pi->entry); + last_pi_entry = pi->entry = NULL; + pi->nr = 0; + } +#endif } void ProfileGraphicsView::resizeEvent(QResizeEvent *event) |