UI Nits: LTMSidebar performance

Don't refresh CP, LTM or Histogram plots when dateRange property
is set, if the dateRange was previously plotted anyway. Will set
to stale if a ride is added or deleted too.

This means the replot of tabs is not performed when simply switching
between tabs. But will if the date range does change or a ride is
added or deleted meaning the aggregate needs to be re-calculated.

There is still one more performance improvement required;

1. get RideFileCache to have a cache of recent aggregations.
   Since (a) the same ranges will be called over and over by
   different charts when a season is selected and (b) there
   are only likely to be 20-30 seasons defined in total, so
   lets cache them instead of recalculating every time.
This commit is contained in:
Mark Liversedge
2012-11-27 13:41:36 +00:00
parent aedc39e423
commit 15f44becd5
5 changed files with 27 additions and 11 deletions

View File

@@ -34,7 +34,7 @@
#include <QXmlSimpleReader>
CriticalPowerWindow::CriticalPowerWindow(const QDir &home, MainWindow *parent, bool rangemode) :
GcWindow(parent), _dateRange("{00000000-0000-0000-0000-000000000001}"), home(home), mainWindow(parent), currentRide(NULL), rangemode(rangemode)
GcWindow(parent), _dateRange("{00000000-0000-0000-0000-000000000001}"), home(home), mainWindow(parent), currentRide(NULL), rangemode(rangemode), stale(true)
{
setInstanceName("Critical Power Window");
@@ -136,6 +136,9 @@ CriticalPowerWindow::CriticalPowerWindow(const QDir &home, MainWindow *parent, b
void
CriticalPowerWindow::newRideAdded(RideItem *here)
{
// any plots we already have are now stale
stale = true;
// mine just got Zapped, a new rideitem would not be my current item
if (here == currentRide) currentRide = NULL;
@@ -375,8 +378,14 @@ CriticalPowerWindow::dateRangeChanged(DateRange dateRange)
{
if (!amVisible()) return;
if (dateRange.from == cfrom && dateRange.to == cto && !stale) return;
cpintPlot->changeSeason(dateRange.from, dateRange.to);
cpintPlot->calculate(currentRide);
cfrom = dateRange.from;
cto = dateRange.to;
stale = false;
}
void CriticalPowerWindow::seasonSelected(int iSeason)

View File

@@ -118,6 +118,8 @@ class CriticalPowerWindow : public GcWindow
#endif
bool rangemode;
QDate cfrom, cto;
bool stale;
};
#endif // _GC_CriticalPowerWindow_h

View File

@@ -156,10 +156,7 @@ HistogramWindow::rideSelected()
void
HistogramWindow::rideAddorRemove(RideItem *)
{
if (rangemode) {
stale = true;
updateChart();
}
stale = true;
}
void
@@ -186,11 +183,14 @@ HistogramWindow::zonesChanged()
powerHist->replot();
}
void HistogramWindow::dateRangeChanged(DateRange)
void HistogramWindow::dateRangeChanged(DateRange dateRange)
{
if (!amVisible()) return;
// has it changed?
if (dateRange.from != cfrom || dateRange.to != cto)
stale = true;
if (!amVisible() && !stale) return;
stale = true;
updateChart();
}
@@ -275,7 +275,8 @@ HistogramWindow::updateChart()
#else
source = new RideFileCache(mainWindow, myDateRange.from, myDateRange.to);
#endif
cfrom = myDateRange.from;
cto = myDateRange.to;
stale = false;
if (old) delete old; // guarantee source pointer changes

View File

@@ -115,6 +115,7 @@ class HistogramWindow : public GcWindow
int powerRange, hrRange;
bool stale;
QDate cfrom, cto;
RideFileCache *source;
bool interval;
#ifdef GC_HAVE_LUCENE

View File

@@ -193,7 +193,10 @@ LTMWindow::rideSelected()
void
LTMWindow::refreshPlot()
{
if (amVisible() == true) ltmPlot->setData(&settings);
if (amVisible() == true) {
ltmPlot->setData(&settings);
dirty = false;
}
}
// total redraw, reread data etc
@@ -234,7 +237,7 @@ LTMWindow::metricSelected()
void
LTMWindow::dateRangeChanged(DateRange range)
{
if (!amVisible()) return;
if (!amVisible() && !dirty) return;
settings.data = &results;
settings.measures = &measures;