Add reveal controls to LTM chart

Allows user to quickly change the settings for
- group by (week, month, year etc)
- shading (power / hr zones)
- show events (chart markers)
This commit is contained in:
Mark Liversedge
2013-02-05 13:23:23 +00:00
parent 8cee30f9f7
commit 791f84d51f
5 changed files with 91 additions and 17 deletions

View File

@@ -42,7 +42,7 @@
static int supported_axes[] = { QwtPlot::yLeft, QwtPlot::yRight, QwtPlot::yLeft1, QwtPlot::yRight1, QwtPlot::yLeft2, QwtPlot::yRight2, QwtPlot::yLeft3, QwtPlot::yRight3 };
LTMPlot::LTMPlot(LTMPlotContainer *parent, MainWindow *main, QDir home) : bg(NULL), parent(parent), main(main),
LTMPlot::LTMPlot(LTMWindow *parent, MainWindow *main, QDir home) : bg(NULL), parent(parent), main(main),
home(home), highlighter(NULL)
{
setInstanceName("Metric Plot");

View File

@@ -34,8 +34,8 @@
#include "MainWindow.h"
class LTMPlotBackground;
class LTMWindow;
class LTMPlotZoneLabel;
class LTMPlotContainer;
class LTMScaleDraw;
class LTMPlot : public QwtPlot
@@ -45,7 +45,7 @@ class LTMPlot : public QwtPlot
public:
LTMPlot(LTMPlotContainer *, MainWindow *main, QDir home);
LTMPlot(LTMWindow *, MainWindow *main, QDir home);
~LTMPlot();
void setData(LTMSettings *);
void setAxisTitle(int axis, QString label);
@@ -65,7 +65,7 @@ class LTMPlot : public QwtPlot
LTMPlotBackground *bg;
QList <LTMPlotZoneLabel *> zoneLabels;
LTMPlotContainer *parent;
LTMWindow *parent;
double minY[10], maxY[10], maxX; // for all possible 10 curves
private:

View File

@@ -35,7 +35,7 @@
#include <qwt_plot_marker.h>
LTMWindow::LTMWindow(MainWindow *parent, bool useMetricUnits, const QDir &home) :
LTMPlotContainer(parent), home(home),
GcChartWindow(parent), home(home),
useMetricUnits(useMetricUnits), dirty(true)
{
main = parent;
@@ -47,7 +47,35 @@ LTMWindow::LTMWindow(MainWindow *parent, bool useMetricUnits, const QDir &home)
QVBoxLayout *mainLayout = new QVBoxLayout;
ltmPlot = new LTMPlot(this, main, home);
mainLayout->addWidget(ltmPlot);
setLayout(mainLayout);
setChartLayout(mainLayout);
// reveal controls
QHBoxLayout *revealLayout = new QHBoxLayout;
revealLayout->setContentsMargins(0,0,0,0);
revealLayout->addStretch();
revealLayout->addWidget(new QLabel(tr("Group by"),this));
rGroupBy = new QxtStringSpinBox(this);
QStringList strings;
strings << "Days"
<< "Weeks"
<< "Months"
<< "Years"
<< "Time Of Day";
rGroupBy->setStrings(strings);
rGroupBy->setValue(0);
revealLayout->addWidget(rGroupBy);
rShade = new QCheckBox(tr("Shade zones"), this);
rEvents = new QCheckBox(tr("Show events"), this);
QVBoxLayout *checks = new QVBoxLayout;
checks->setSpacing(2);
checks->setContentsMargins(0,0,0,0);
checks->addWidget(rShade);
checks->addWidget(rEvents);
revealLayout->addLayout(checks);
revealLayout->addStretch();
setRevealLayout(revealLayout);
// the controls
QWidget *c = new QWidget;
@@ -101,18 +129,23 @@ LTMWindow::LTMWindow(MainWindow *parent, bool useMetricUnits, const QDir &home)
settings.legend = ltmTool->showLegend->isChecked();
settings.events = ltmTool->showEvents->isChecked();
settings.shadeZones = ltmTool->shadeZones->isChecked();
rShade->setChecked(ltmTool->shadeZones->isChecked());
rEvents->setChecked(ltmTool->showEvents->isChecked());
cl->addWidget(ltmTool);
connect(this, SIGNAL(dateRangeChanged(DateRange)), this, SLOT(dateRangeChanged(DateRange)));
connect(ltmTool, SIGNAL(filterChanged()), this, SLOT(filterChanged()));
connect(ltmTool, SIGNAL(metricSelected()), this, SLOT(metricSelected()));
connect(ltmTool->groupBy, SIGNAL(currentIndexChanged(int)), this, SLOT(groupBySelected(int)));
connect(rGroupBy, SIGNAL(valueChanged(int)), this, SLOT(rGroupBySelected(int)));
connect(ltmTool->saveButton, SIGNAL(clicked(bool)), this, SLOT(saveClicked(void)));
connect(ltmTool->manageButton, SIGNAL(clicked(bool)), this, SLOT(manageClicked(void)));
connect(ltmTool->presetPicker, SIGNAL(currentIndexChanged(int)), this, SLOT(chartSelected(int)));
connect(ltmTool->shadeZones, SIGNAL(stateChanged(int)), this, SLOT(shadeZonesClicked(int)));
connect(rShade, SIGNAL(stateChanged(int)), this, SLOT(shadeZonesClicked(int)));
connect(ltmTool->showLegend, SIGNAL(stateChanged(int)), this, SLOT(showLegendClicked(int)));
connect(ltmTool->showEvents, SIGNAL(stateChanged(int)), this, SLOT(showEventsClicked(int)));
connect(rEvents, SIGNAL(stateChanged(int)), this, SLOT(showEventsClicked(int)));
connect(ltmTool, SIGNAL(useCustomRange(DateRange)), this, SLOT(useCustomRange(DateRange)));
connect(ltmTool, SIGNAL(useThruToday()), this, SLOT(useThruToday()));
connect(ltmTool, SIGNAL(useStandardRange()), this, SLOT(useStandardRange()));
@@ -306,11 +339,21 @@ LTMWindow::filterChanged()
refreshPlot();
}
void
LTMWindow::rGroupBySelected(int selected)
{
if (selected >= 0) {
settings.groupBy = selected;
ltmTool->groupBy->setCurrentIndex(selected);
}
}
void
LTMWindow::groupBySelected(int selected)
{
if (selected >= 0) {
settings.groupBy = ltmTool->groupBy->itemData(selected).toInt();
rGroupBy->setValue(selected);
refreshPlot();
}
}
@@ -318,6 +361,11 @@ LTMWindow::groupBySelected(int selected)
void
LTMWindow::shadeZonesClicked(int state)
{
bool checked = state;
// only change if changed, to avoid endless looping
if (ltmTool->shadeZones->isChecked() != checked) ltmTool->shadeZones->setChecked(checked);
if (rShade->isChecked() != checked) rShade->setChecked(checked);
settings.shadeZones = state;
refreshPlot();
}
@@ -332,6 +380,11 @@ LTMWindow::showLegendClicked(int state)
void
LTMWindow::showEventsClicked(int state)
{
bool checked = state;
// only change if changed, to avoid endless looping
if (ltmTool->showEvents->isChecked() != checked) ltmTool->showEvents->setChecked(checked);
if (rEvents->isChecked() != checked) rEvents->setChecked(checked);
settings.events = state;
refreshPlot();
}

View File

@@ -43,6 +43,8 @@ class QwtPlotZoomer;
#include <qwt_picker_machine.h>
#include <qwt_compat.h>
#include "qxtstringspinbox.h" // for reveal control groupby selection
// track the cursor and display the value for the chosen axis
class LTMToolTip : public QwtPlotPicker
{
@@ -75,16 +77,7 @@ class LTMToolTip : public QwtPlotPicker
QString tip;
};
class LTMPlotContainer : public GcWindow
{
public:
LTMPlotContainer(QWidget *parent) : GcWindow(parent) {}
virtual LTMToolTip *toolTip() = 0;
virtual void pointClicked(QwtPlotCurve *, int) = 0;
MainWindow *main;
};
class LTMWindow : public LTMPlotContainer
class LTMWindow : public GcChartWindow
{
Q_OBJECT
G_OBJECT
@@ -112,11 +105,17 @@ class LTMWindow : public LTMPlotContainer
~LTMWindow();
LTMToolTip *toolTip() { return picker; }
// reveal
bool hasReveal() { return true; }
// used by children
MainWindow *main;
// get/set properties
int chart() const { return ltmTool->presetPicker->currentIndex(); }
void setChart(int x) { ltmTool->presetPicker->setCurrentIndex(x); }
int bin() const { return ltmTool->groupBy->currentIndex(); }
void setBin(int x) { ltmTool->groupBy->setCurrentIndex(x); }
void setBin(int x) { rGroupBy->setValue(x); ltmTool->groupBy->setCurrentIndex(x); }
bool shade() const { return ltmTool->shadeZones->isChecked(); }
void setShade(bool x) { ltmTool->shadeZones->setChecked(x); }
bool legend() const { return ltmTool->showLegend->isChecked(); }
@@ -157,6 +156,7 @@ class LTMWindow : public LTMPlotContainer
void filterChanged();
void metricSelected();
void groupBySelected(int);
void rGroupBySelected(int);
void shadeZonesClicked(int);
void showEventsClicked(int);
void showLegendClicked(int);
@@ -200,6 +200,11 @@ class LTMWindow : public LTMPlotContainer
LTMPlot *ltmPlot;
QwtPlotZoomer *ltmZoomer;
LTMTool *ltmTool;
// reveal controls
QxtStringSpinBox *rGroupBy;
QCheckBox *rShade,
*rEvents;
};
#endif // _GC_LTMWindow_h

View File

@@ -109,6 +109,22 @@ public:
WF_SENSORTYPE_GLUCOSE = 0x00020000,
WF_SENSORTYPE_DISPLAY = 0x00800000 };
const QString sensorDescription(int id) const {
QString returning(tr("Unknown"));
switch (id) {
case 0x0 : returning = tr("None"); break;
case 0x1 : returning = tr("Power Meter"); break;
case 0x2 : returning = tr("Bike Speed"); break;
case 0x4 : returning = tr("Bike Cadence"); break;
case 0x8 : returning = tr("Speed and Cadence"); break;
case 0x10 : returning = tr("FootPod"); break;
case 0x20 : returning = tr("Heart Rate"); break;
case 0x800000 : returning = tr("RFKLT Display"); break;
}
return returning;
}
// subtypes -- esp. power
enum {
WF_SENSOR_SUBTYPE_UNSPECIFIED = 0,