aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tcanabrava@kde.org>2013-05-08 17:46:28 -0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-05-08 14:19:10 -0700
commitef7ace9926276f401cceb45d546a7134eeea0f00 (patch)
tree7d94c75b3b4a823989e4b77a8c9254b7abb79ccf
parentce8d30b938b80c334eb0869650c3c463084ae018 (diff)
downloadsubsurface-ef7ace9926276f401cceb45d546a7134eeea0f00.tar.gz
Plot the temperature Graph
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--profile.c79
-rw-r--r--profile.h5
-rw-r--r--qt-ui/profilegraphics.cpp45
-rw-r--r--qt-ui/profilegraphics.h1
4 files changed, 70 insertions, 60 deletions
diff --git a/profile.c b/profile.c
index 2a8d5e4ed..f68822009 100644
--- a/profile.c
+++ b/profile.c
@@ -201,6 +201,32 @@ void remember_event(const char *eventname)
evn_used++;
}
+int setup_temperature_limits(struct graphics_context *gc, struct plot_info *pi)
+{
+ int maxtime, mintemp, maxtemp, delta;
+
+ /* Get plot scaling limits */
+ maxtime = get_maxtime(pi);
+ mintemp = pi->mintemp;
+ maxtemp = pi->maxtemp;
+
+ gc->leftx = 0; gc->rightx = maxtime;
+ /* Show temperatures in roughly the lower third, but make sure the scale
+ is at least somewhat reasonable */
+ delta = maxtemp - mintemp;
+ if (delta < 3000) /* less than 3K in fluctuation */
+ delta = 3000;
+ gc->topy = maxtemp + delta*2;
+
+ if (PP_GRAPHS_ENABLED)
+ gc->bottomy = mintemp - delta * 2;
+ else
+ gc->bottomy = mintemp - delta / 3;
+
+ pi->endtempcoord = SCALEY(gc, pi->mintemp);
+ return maxtemp && maxtemp >= mintemp;
+}
+
#if 0
static void render_depth_sample(struct graphics_context *gc, struct plot_data *entry, const text_render_options_t *tro)
{
@@ -441,31 +467,7 @@ static void plot_pp_gas_profile(struct graphics_context *gc, struct plot_info *p
}
-static int setup_temperature_limits(struct graphics_context *gc, struct plot_info *pi)
-{
- int maxtime, mintemp, maxtemp, delta;
- /* Get plot scaling limits */
- maxtime = get_maxtime(pi);
- mintemp = pi->mintemp;
- maxtemp = pi->maxtemp;
-
- gc->leftx = 0; gc->rightx = maxtime;
- /* Show temperatures in roughly the lower third, but make sure the scale
- is at least somewhat reasonable */
- delta = maxtemp - mintemp;
- if (delta < 3000) /* less than 3K in fluctuation */
- delta = 3000;
- gc->topy = maxtemp + delta*2;
-
- if (PP_GRAPHS_ENABLED)
- gc->bottomy = mintemp - delta * 2;
- else
- gc->bottomy = mintemp - delta / 3;
-
- pi->endtempcoord = SCALEY(gc, pi->mintemp);
- return maxtemp && maxtemp >= mintemp;
-}
static void plot_single_temp_text(struct graphics_context *gc, int sec, int mkelvin)
{
@@ -515,35 +517,6 @@ static void plot_temperature_text(struct graphics_context *gc, struct plot_info
plot_single_temp_text(gc, sec, last_temperature);
}
-static void plot_temperature_profile(struct graphics_context *gc, struct plot_info *pi)
-{
- int i;
- cairo_t *cr = gc->cr;
- int last = 0;
-
- if (!setup_temperature_limits(gc, pi))
- return;
-
- cairo_set_line_width_scaled(gc->cr, 2);
- set_source_rgba(gc, TEMP_PLOT);
- for (i = 0; i < pi->nr; i++) {
- struct plot_data *entry = pi->entry + i;
- int mkelvin = entry->temperature;
- int sec = entry->sec;
- if (!mkelvin) {
- if (!last)
- continue;
- mkelvin = last;
- }
- if (last)
- line_to(gc, sec, mkelvin);
- else
- move_to(gc, sec, mkelvin);
- last = mkelvin;
- }
- cairo_stroke(cr);
-}
-
/* gets both the actual start and end pressure as well as the scaling factors */
static int get_cylinder_pressure_range(struct graphics_context *gc, struct plot_info *pi)
{
diff --git a/profile.h b/profile.h
index d22589c68..62affe04e 100644
--- a/profile.h
+++ b/profile.h
@@ -38,6 +38,7 @@ struct plot_data {
void calculate_max_limits(struct dive *dive, struct divecomputer *dc, struct graphics_context *gc);
struct plot_info *create_plot_info(struct dive *dive, struct divecomputer *dc, struct graphics_context *gc);
+int setup_temperature_limits(struct graphics_context *gc, struct plot_info *pi);
struct ev_select {
char *ev_name;
@@ -83,6 +84,10 @@ int get_maxdepth(struct plot_info *pi);
#define MIDDLE (0)
#define BOTTOM (-1)
+#define SCALEX(gc,x) (((x)-gc->leftx)/(gc->rightx-gc->leftx)*gc->maxx)
+#define SCALEY(gc,y) (((y)-gc->topy)/(gc->bottomy-gc->topy)*gc->maxy)
+#define SCALE(gc,x,y) SCALEX(gc,x),SCALEY(gc,y)
+
#ifdef __cplusplus
}
#endif
diff --git a/qt-ui/profilegraphics.cpp b/qt-ui/profilegraphics.cpp
index 508251232..1d1b5530c 100644
--- a/qt-ui/profilegraphics.cpp
+++ b/qt-ui/profilegraphics.cpp
@@ -26,10 +26,6 @@
#define VELOCITY_COLORS_START_IDX VELO_STABLE
#define VELOCITY_COLORS 5
-/* Scale to 0,0 -> maxx,maxy */
-#define SCALEX(gc,x) (((x)-gc->leftx)/(gc->rightx-gc->leftx)*gc->maxx)
-#define SCALEY(gc,y) (((y)-gc->topy)/(gc->bottomy-gc->topy)*gc->maxy)
-#define SCALE(gc,x,y) SCALEX(gc,x),SCALEY(gc,y)
static struct graphics_context last_gc;
static double plot_scale = SCALE_SCREEN;
@@ -246,10 +242,10 @@ void ProfileGraphicsView::plot(struct dive *dive)
plot_depth_profile(&gc, pi);
plot_events(&gc, pi, dc);
-#if 0
- /* Temperature profile */
- plot_temperature_profile(gc, pi);
+ /* Temperature profile */
+ plot_temperature_profile(&gc, pi);
+#if 0
/* Cylinder pressure plot */
plot_cylinder_pressure(gc, pi, dive, dc);
@@ -630,6 +626,41 @@ void ProfileGraphicsView::resizeEvent(QResizeEvent *event)
fitInView ( r.x() - 50, r.y() -50, r.width() + 100, r.height() + 100); // do a little bit of spacing;
}
+void ProfileGraphicsView::plot_temperature_profile(struct graphics_context *gc, struct plot_info *pi)
+{
+ int last = 0;
+
+ if (!setup_temperature_limits(gc, pi))
+ return;
+
+ QPointF from;
+ QPointF to;
+ QColor color = profile_color[TEMP_PLOT].first();
+
+ for (int i = 0; i < pi->nr; i++) {
+ struct plot_data *entry = pi->entry + i;
+ int mkelvin = entry->temperature;
+ int sec = entry->sec;
+ if (!mkelvin) {
+ if (!last)
+ continue;
+ mkelvin = last;
+ }
+ if (last){
+ to = QPointF(SCALE(gc, sec, mkelvin));
+ //qDebug() << from << to;
+ QGraphicsLineItem *item = new QGraphicsLineItem(from.x(), from.y(), to.x(), to.y());
+ item->setPen(QPen(color, 2*plot_scale));
+ scene()->addItem(item);
+ from = to;
+ }
+ else{
+ from = QPointF(SCALE(gc, sec, mkelvin));
+ }
+ last = mkelvin;
+ }
+}
+
void ToolTipItem::addToolTip(const QString& toolTip, const QIcon& icon)
{
QGraphicsPixmapItem *iconItem = 0;
diff --git a/qt-ui/profilegraphics.h b/qt-ui/profilegraphics.h
index d607e2615..becad197a 100644
--- a/qt-ui/profilegraphics.h
+++ b/qt-ui/profilegraphics.h
@@ -94,6 +94,7 @@ private:
void plot_text(struct graphics_context *gc, text_render_options_t *tro, double x, double y, const QString &text);
void plot_events(struct graphics_context *gc, struct plot_info *pi, struct divecomputer *dc);
void plot_one_event(struct graphics_context *gc, struct plot_info *pi, struct event *event);
+ void plot_temperature_profile(struct graphics_context *gc, struct plot_info *pi);
QPen defaultPen;
QBrush defaultBrush;