mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-04-15 05:32:21 +00:00
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:
@@ -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");
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
16
src/WFApi.h
16
src/WFApi.h
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user