From 7b8eca07bbb692038afeb34cacd08121fb95c2e8 Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Sat, 5 Jan 2013 11:50:04 +0000 Subject: [PATCH] Chart Dates: Part 3d of 3 (final) Added chart date selection to the Histogram chart. This now completes the updates to enable custom date ranges to be defined in charts that support date ranges. Any further 'ideas' for setting custom ranges can be added into the DateRangeEdit widget and will be re-used across all the charts. Fixes #417 --- src/HistogramWindow.cpp | 107 +++++++++++++++++++++++++++------------- src/HistogramWindow.h | 29 +++++++++++ 2 files changed, 102 insertions(+), 34 deletions(-) diff --git a/src/HistogramWindow.cpp b/src/HistogramWindow.cpp index dd34352c1..3259f3444 100644 --- a/src/HistogramWindow.cpp +++ b/src/HistogramWindow.cpp @@ -30,12 +30,12 @@ #include "Zones.h" #include "HrZones.h" -HistogramWindow::HistogramWindow(MainWindow *mainWindow, bool rangemode) : GcWindow(mainWindow), mainWindow(mainWindow), stale(true), source(NULL), rangemode(rangemode) +HistogramWindow::HistogramWindow(MainWindow *mainWindow, bool rangemode) : GcWindow(mainWindow), mainWindow(mainWindow), stale(true), source(NULL), rangemode(rangemode), useCustom(false) { setInstanceName("Histogram Window"); QWidget *c = new QWidget; - QVBoxLayout *cl = new QVBoxLayout(c); + QFormLayout *cl = new QFormLayout(c); setControls(c); // plot @@ -50,16 +50,28 @@ HistogramWindow::HistogramWindow(MainWindow *mainWindow, bool rangemode) : GcWin searchBox = new SearchFilterBox(this, mainWindow); connect(searchBox, SIGNAL(searchClear()), this, SLOT(clearFilter())); connect(searchBox, SIGNAL(searchResults(QStringList)), this, SLOT(setFilter(QStringList))); - cl->addWidget(searchBox); + cl->addRow(new QLabel(tr("Filter")), searchBox); #endif + // spacing if we have a range + if (rangemode) cl->addWidget(new QLabel("")); + + // date selection + dateSetting = new DateSettingsEdit(this); + cl->addRow(new QLabel(tr("Date Range")), dateSetting); + + // data series + cl->addWidget(new QLabel("")); // spacing + seriesCombo = new QComboBox(); + addSeries(); + cl->addRow(new QLabel(tr("Data Series")), seriesCombo); + // bin width QHBoxLayout *binWidthLayout = new QHBoxLayout; QLabel *binWidthLabel = new QLabel(tr("Bin width"), this); binWidthLineEdit = new QLineEdit(this); binWidthLineEdit->setFixedWidth(30); - binWidthLayout->addWidget(binWidthLabel); binWidthLayout->addWidget(binWidthLineEdit); binWidthSlider = new QSlider(Qt::Horizontal); binWidthSlider->setTickPosition(QSlider::TicksBelow); @@ -67,35 +79,32 @@ HistogramWindow::HistogramWindow(MainWindow *mainWindow, bool rangemode) : GcWin binWidthSlider->setMinimum(1); binWidthSlider->setMaximum(100); binWidthLayout->addWidget(binWidthSlider); - cl->addLayout(binWidthLayout); - - showLnY = new QCheckBox; - showLnY->setText(tr("Log Y")); - cl->addWidget(showLnY); - - showZeroes = new QCheckBox; - showZeroes->setText(tr("With zeros")); - cl->addWidget(showZeroes); - - shadeZones = new QCheckBox; - shadeZones->setText(tr("Shade zones")); - shadeZones->setChecked(powerHist->shade); - cl->addWidget(shadeZones); - - showInZones = new QCheckBox; - showInZones->setText(tr("Show in zones")); - cl->addWidget(showInZones); - - seriesCombo = new QComboBox(); - addSeries(); - cl->addWidget(seriesCombo); + cl->addRow(binWidthLabel, binWidthLayout); showSumY = new QComboBox(); showSumY->addItem(tr("Absolute Time")); showSumY->addItem(tr("Percentage Time")); - cl->addWidget(showSumY); - cl->addStretch(); + cl->addWidget(new QLabel("")); // spacing + cl->addRow(new QLabel("Show"), showSumY); + + showLnY = new QCheckBox; + showLnY->setText(tr("Log Y")); + cl->addRow(new QLabel(""), showLnY); + + showZeroes = new QCheckBox; + showZeroes->setText(tr("With zeros")); + cl->addRow(new QLabel(""), showZeroes); + + shadeZones = new QCheckBox; + shadeZones->setText(tr("Shade zones")); + shadeZones->setChecked(powerHist->shade); + cl->addRow(new QLabel(""), shadeZones); + + showInZones = new QCheckBox; + showInZones->setText(tr("Show in zones")); + cl->addRow(new QLabel(""), showInZones); + // sort out default values setHistTextValidator(); @@ -113,8 +122,10 @@ HistogramWindow::HistogramWindow(MainWindow *mainWindow, bool rangemode) : GcWin connect(binWidthLineEdit, SIGNAL(editingFinished()), this, SLOT(setBinWidthFromLineEdit())); // when season changes we need to retrieve data from the cache then update the chart - if (rangemode) connect(this, SIGNAL(dateRangeChanged(DateRange)), this, SLOT(dateRangeChanged(DateRange))); - else { + if (rangemode) { + connect(this, SIGNAL(dateRangeChanged(DateRange)), this, SLOT(dateRangeChanged(DateRange))); + } else { + dateSetting->hide(); connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(mainWindow, SIGNAL(intervalSelected()), this, SLOT(intervalSelected())); } @@ -183,6 +194,32 @@ HistogramWindow::zonesChanged() powerHist->replot(); } +void +HistogramWindow::useCustomRange(DateRange range) +{ + // plot using the supplied range + useCustom = true; + custom = range; + dateRangeChanged(custom); +} + +void +HistogramWindow::useStandardRange() +{ + useCustom = false; + dateRangeChanged(myDateRange); +} + +void +HistogramWindow::useThruToday() +{ + // plot using the supplied range + useCustom = true; + custom = myDateRange; + if (custom.to > QDate::currentDate()) custom.to = QDate::currentDate(); + dateRangeChanged(custom); +} + void HistogramWindow::dateRangeChanged(DateRange dateRange) { // has it changed? @@ -270,13 +307,15 @@ HistogramWindow::updateChart() if (rangemode) { + DateRange use = useCustom ? custom : myDateRange; + #ifdef GC_HAVE_LUCENE - source = new RideFileCache(mainWindow, myDateRange.from, myDateRange.to, isFiltered, files); + source = new RideFileCache(mainWindow, use.from, use.to, isFiltered, files); #else - source = new RideFileCache(mainWindow, myDateRange.from, myDateRange.to); + source = new RideFileCache(mainWindow, use.from, use.to); #endif - cfrom = myDateRange.from; - cto = myDateRange.to; + cfrom = use.from; + cto = use.to; stale = false; if (old) delete old; // guarantee source pointer changes diff --git a/src/HistogramWindow.h b/src/HistogramWindow.h index 74d37e42a..92ff1c75e 100644 --- a/src/HistogramWindow.h +++ b/src/HistogramWindow.h @@ -49,6 +49,13 @@ class HistogramWindow : public GcWindow #ifdef GC_HAVE_LUCENE Q_PROPERTY(QString filter READ filter WRITE setFilter USER true) #endif + Q_PROPERTY(QDate fromDate READ fromDate WRITE setFromDate USER true) + Q_PROPERTY(QDate toDate READ toDate WRITE setToDate USER true) + Q_PROPERTY(QDate startDate READ startDate WRITE setStartDate USER true) + Q_PROPERTY(int lastN READ lastN WRITE setLastN USER true) + Q_PROPERTY(int lastNX READ lastNX WRITE setLastNX USER true) + Q_PROPERTY(int prevN READ prevN WRITE setPrevN USER true) + Q_PROPERTY(int useSelected READ useSelected WRITE setUseSelected USER true) // !! must be last property !! public: @@ -73,6 +80,21 @@ class HistogramWindow : public GcWindow QString filter() const { return searchBox->filter(); } void setFilter(QString x) { searchBox->setFilter(x); } #endif + // properties + int useSelected() { return dateSetting->mode(); } + void setUseSelected(int x) { dateSetting->setMode(x); } + QDate fromDate() { return dateSetting->fromDate(); } + void setFromDate(QDate date) { return dateSetting->setFromDate(date); } + QDate toDate() { return dateSetting->toDate(); } + void setToDate(QDate date) { return dateSetting->setToDate(date); } + QDate startDate() { return dateSetting->startDate(); } + void setStartDate(QDate date) { return dateSetting->setStartDate(date); } + int lastN() { return dateSetting->lastN(); } + void setLastN(int x) { dateSetting->setLastN(x); } + int lastNX() { return dateSetting->lastNX(); } + void setLastNX(int x) { dateSetting->setLastNX(x); } + int prevN() { return dateSetting->prevN(); } + void setPrevN(int x) { dateSetting->setPrevN(x); } public slots: @@ -84,6 +106,10 @@ class HistogramWindow : public GcWindow void clearFilter(); void setFilter(QStringList files); #endif + // date settings + void useCustomRange(DateRange); + void useStandardRange(); + void useThruToday(); void dateRangeChanged(DateRange); protected slots: @@ -125,6 +151,9 @@ class HistogramWindow : public GcWindow #endif bool rangemode; + DateSettingsEdit *dateSetting; + bool useCustom; + DateRange custom; }; #endif // _GC_HistogramWindow_h