From 1d4e93350a38f69d0fe8b3fb22dcd9b61a95d434 Mon Sep 17 00:00:00 2001 From: Ale Martinez Date: Wed, 13 Jan 2021 20:30:26 -0300 Subject: [PATCH] User PIE and BAR Charts honor x-axis Date and Time settings So labels/categories are displayed in Time/Date format in a similar way to Line and Scatter charts. --- src/Charts/UserChart.cpp | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/Charts/UserChart.cpp b/src/Charts/UserChart.cpp index cdc0bc6f4..9acbb67a6 100644 --- a/src/Charts/UserChart.cpp +++ b/src/Charts/UserChart.cpp @@ -28,6 +28,7 @@ #include "ColorButton.h" #include "MainWindow.h" #include "UserChartData.h" +#include "TimeUtils.h" #include #include @@ -170,8 +171,24 @@ UserChart::setRide(RideItem *item) // pie charts need labels if (chartinfo.type == GC_CHART_PIE) { series.labels.clear(); - for(int i=0; ix.asString().count(); i++) series.labels << ucd->x.asString()[i]; - + foreach (GenericAxisInfo axis, axisinfo) { + if (series.xname == axis.name) { + // DATERANGE values are days from 01-01-1900 + QDateTime earliest(QDate(1900,01,01), QTime(0,0,0), Qt::LocalTime); + switch (axis.type) { + case GenericAxisInfo::TIME: + for(int i=0; ix.asNumeric().count(); i++) series.labels << time_to_string(ucd->x.asNumeric()[i], true); + break; + case GenericAxisInfo::DATERANGE: + for(int i=0; ix.asNumeric().count(); i++) series.labels << earliest.addDays(ucd->x.asNumeric()[i]).toString("dd MMM yy"); + break; + default: + for(int i=0; ix.asString().count(); i++) series.labels << ucd->x.asString()[i]; + break; + } + break; + } + } series.colors.clear(); QColor min=QColor(series.color); QColor max=GCColor::invertColor(GColor(CPLOTBACKGROUND)); @@ -211,13 +228,26 @@ UserChart::setRide(RideItem *item) // find the first series for this axis and set the categories // to the x series values. if (chartinfo.type == GC_CHART_BAR && axis.orientation == Qt::Horizontal) { + // DATERANGE values are days from 01-01-1900 + QDateTime earliest(QDate(1900,01,01), QTime(0,0,0), Qt::LocalTime); + // find the first series for axis.name foreach(GenericSeriesInfo s, seriesinfo) { if (s.xname == axis.name && s.user1) { - axis.type = GenericAxisInfo::CATEGORY; axis.categories.clear(); UserChartData *ucd = static_cast(s.user1); - for(int i=0; ix.asString().count(); i++) axis.categories << ucd->x.asString()[i]; + switch (axis.type) { + case GenericAxisInfo::TIME: + for(int i=0; ix.asNumeric().count(); i++) axis.categories << time_to_string(ucd->x.asNumeric()[i], true); + break; + case GenericAxisInfo::DATERANGE: + for(int i=0; ix.asNumeric().count(); i++) axis.categories << earliest.addDays(ucd->x.asNumeric()[i]).toString("dd MMM yy"); + break; + default: + for(int i=0; ix.asString().count(); i++) axis.categories << ucd->x.asString()[i]; + break; + } + axis.type = GenericAxisInfo::CATEGORY; break; } }