diff --git a/src/CriticalPowerWindow.cpp b/src/CriticalPowerWindow.cpp index 49df2e43c..58c41ede8 100644 --- a/src/CriticalPowerWindow.cpp +++ b/src/CriticalPowerWindow.cpp @@ -192,6 +192,7 @@ CriticalPowerWindow::CriticalPowerWindow(const QDir &home, MainWindow *parent, b connect(mainWindow, SIGNAL(configChanged()), cpintPlot, SLOT(configChanged())); // redraw on config change -- this seems the simplest approach + connect(mainWindow, SIGNAL(filterChanged(QStringList&)), this, SLOT(forceReplot())); connect(mainWindow, SIGNAL(configChanged()), this, SLOT(rideSelected())); connect(mainWindow->metricDB, SIGNAL(dataChanged()), this, SLOT(refreshRideSaved())); connect(mainWindow, SIGNAL(rideAdded(RideItem*)), this, SLOT(newRideAdded(RideItem*))); @@ -220,27 +221,19 @@ CriticalPowerWindow::refreshRideSaved() } void -CriticalPowerWindow::newRideAdded(RideItem *here) +CriticalPowerWindow::forceReplot() { - // 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; - + stale = true; // we must become stale if (rangemode) { // force replot... - stale = true; dateRangeChanged(myDateRange); } else { Season season = seasons->seasons.at(cComboSeason->currentIndex()); - // Refresh global curve if a ride is added during those dates - if ((here->dateTime.date() >= season.getStart() || season.getStart() == QDate()) - && (here->dateTime.date() <= season.getEnd() || season.getEnd() == QDate())) - cpintPlot->changeSeason(season.getStart(), season.getEnd()); + // Refresh aggregated curve (ride added/filter changed) + cpintPlot->changeSeason(season.getStart(), season.getEnd()); // if visible make the changes visible // rideSelected is easiest way @@ -248,6 +241,23 @@ CriticalPowerWindow::newRideAdded(RideItem *here) } } +void +CriticalPowerWindow::newRideAdded(RideItem *here) +{ + // any plots we already have are now stale + Season season = seasons->seasons.at(cComboSeason->currentIndex()); + stale = true; + + // mine just got Zapped, a new rideitem would not be my current item + if (here == currentRide) currentRide = NULL; + + if ((here->dateTime.date() >= season.getStart() || season.getStart() == QDate()) + && (here->dateTime.date() <= season.getEnd() || season.getEnd() == QDate())) { + // replot + forceReplot(); + } +} + void CriticalPowerWindow::rideSelected() { diff --git a/src/CriticalPowerWindow.h b/src/CriticalPowerWindow.h index 048811ada..5d7ed0377 100644 --- a/src/CriticalPowerWindow.h +++ b/src/CriticalPowerWindow.h @@ -112,6 +112,7 @@ class CriticalPowerWindow : public GcChartWindow void setShading(int x) { return shadeCombo->setCurrentIndex(x); } protected slots: + void forceReplot(); void newRideAdded(RideItem*); void cpintTimeValueEntered(); void cpintSetCPButtonClicked(); diff --git a/src/DiaryWindow.cpp b/src/DiaryWindow.cpp index 8bb23aa49..891c60430 100644 --- a/src/DiaryWindow.cpp +++ b/src/DiaryWindow.cpp @@ -81,6 +81,7 @@ DiaryWindow::DiaryWindow(MainWindow *mainWindow) : //connect(viewMode, SIGNAL(currentIndexChanged(int)), this, SLOT(setDefaultView(int))); //connect(viewMode, SIGNAL(currentIndexChanged(int)), this, SLOT(rideSelected())); connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); + connect(mainWindow, SIGNAL(filterChanged(QStringList&)), this, SLOT(rideSelected())); //connect(mainWindow, SIGNAL(rideSelected()), this, SLOT(rideSelected())); connect(mainWindow, SIGNAL(configChanged()), this, SLOT(configChanged())); connect(next, SIGNAL(clicked()), this, SLOT(nextClicked())); @@ -119,6 +120,7 @@ DiaryWindow::rideSelected() int year = when.year(); // monthly view updates + calendarModel->setStale(); calendarModel->setMonth(when.month(), when.year()); when = when.addDays(Qt::Monday - when.dayOfWeek()); @@ -187,6 +189,7 @@ DiaryWindow::eventFilter(QObject *object, QEvent *e) } // force a repaint + calendarModel->setStale(); calendarModel->setMonth(calendarModel->getMonth(), calendarModel->getYear()); return true; } diff --git a/src/GcCalendar.cpp b/src/GcCalendar.cpp index d39b9864f..d4804bf62 100644 --- a/src/GcCalendar.cpp +++ b/src/GcCalendar.cpp @@ -334,7 +334,7 @@ GcCalendar::setSummary() const RideMetric *metric = RideMetricFactory::instance().rideMetric(metricname); QStringList empty; // usually for filters, but we don't do that - QString value = SummaryMetrics::getAggregated(metricname, results, empty, false, useMetricUnits); + QString value = SummaryMetrics::getAggregated(main, metricname, results, empty, false, useMetricUnits); // Maximum Max and Average Average looks nasty, remove from name for display diff --git a/src/GcCalendarModel.h b/src/GcCalendarModel.h index c8ba4876a..6bcce4f4d 100644 --- a/src/GcCalendarModel.h +++ b/src/GcCalendarModel.h @@ -70,6 +70,7 @@ private: public slots: + void setStale() { stale = true; } void rideChange(RideItem *rideItem) { if (rideItem) { QDate date = rideItem->dateTime.date(); @@ -141,9 +142,10 @@ public: QDate today = QDateTime::currentDateTime().date(); setMonth(today.month(), today.year()); - // invalidate model if rides added or deleted + // invalidate model if rides added or deleted or filter applier connect(main, SIGNAL(rideAdded(RideItem*)), this, SLOT(rideChange(RideItem*))); connect(main, SIGNAL(rideDeleted(RideItem*)), this, SLOT(rideChange(RideItem*))); + connect(main, SIGNAL(filterChanged(QStringList&)), this, SLOT(setStale())); } ~GcCalendarModel() {} @@ -254,9 +256,28 @@ public: } break; - case Qt::ForegroundRole: // XXX Should return a list for each ride - // XXX within the cell - return Qt::black; + case Qt::ForegroundRole: + { + QList colors; + QVector *arr = dateToRows.value(date(proxyIndex), NULL); + if (arr) { + foreach (int i, *arr) { + QString filename = sourceModel()->data(index(i, filenameIndex, QModelIndex())).toString(); + if (mainWindow->isfiltered && mainWindow->filters.contains(filename)) + colors << QColor(0.4*255,0.6*255,0.7*255,255); + else + colors << QColor(Qt::black); + } + } + +#ifdef GC_HAVE_ICAL + // added planned workouts + for (int k= mainWindow->rideCalendar->data(date(proxyIndex), EventCountRole).toInt(); k>0; k--) + colors.append(Qt::black); +#endif + + return QVariant::fromValue >(colors); + } break; case Qt::FontRole: // XXX Should return a list for each ride @@ -430,6 +451,8 @@ class GcCalendarDelegate : public QItemDelegate void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { + painter->save(); + // font QVariant vfont = index.data(Qt::FontRole); painter->setFont(vfont.value()); @@ -455,12 +478,13 @@ class GcCalendarDelegate : public QItemDelegate // text QStringList texts = index.data(Qt::DisplayRole).toStringList(); QList colors = index.data(Qt::BackgroundRole).value >(); + QList pens = index.data(Qt::ForegroundRole).value >(); if (texts.count()) { - int height = (option.rect.height()-21) / texts.count(); - int y = option.rect.y()+17; - int i=0; - foreach (QString text, texts) { + int height = (option.rect.height()-21) / texts.count(); + int y = option.rect.y()+17; + int i=0; + foreach (QString text, texts) { QRect bd(option.rect.x()+2, y, option.rect.width()-4, height); y += height+2; @@ -469,18 +493,24 @@ class GcCalendarDelegate : public QItemDelegate createPainterPath(cachePath, bd, 4, 4); QPen pen; - pen.setColor(Qt::black); - painter->setPen(Qt::NoPen); + QColor color = pens[i]; + pen.setColor(color); + + // if not black use it for border + if (color != QColor(Qt::black)) painter->setPen(pen); + else painter->setPen(Qt::NoPen); QColor fillColor = colors[i++]; fillColor.setAlpha(200); painter->setBrush(fillColor); painter->setRenderHint(QPainter::Antialiasing); painter->drawPath(cachePath); + + // text always needs a pen painter->setPen(pen); painter->drawText(bd, text); } } - + painter->restore(); } }; diff --git a/src/HistogramWindow.cpp b/src/HistogramWindow.cpp index 6b94c5c00..54ad8bc27 100644 --- a/src/HistogramWindow.cpp +++ b/src/HistogramWindow.cpp @@ -188,6 +188,7 @@ HistogramWindow::HistogramWindow(MainWindow *mainWindow, bool rangemode) : GcCha connect(mainWindow, SIGNAL(rideAdded(RideItem*)), this, SLOT(rideAddorRemove(RideItem*))); connect(mainWindow, SIGNAL(rideDeleted(RideItem*)), this, SLOT(rideAddorRemove(RideItem*))); + connect(mainWindow, SIGNAL(filterChanged(QStringList&)), this, SLOT(forceReplot())); } void @@ -389,6 +390,13 @@ HistogramWindow::setShade(int x) shadeZones->setCheckState((Qt::CheckState)x); } +void +HistogramWindow::forceReplot() +{ + stale = true; + if (amVisible()) updateChart(); +} + void HistogramWindow::updateChart() { diff --git a/src/HistogramWindow.h b/src/HistogramWindow.h index 1de819767..a2122f021 100644 --- a/src/HistogramWindow.h +++ b/src/HistogramWindow.h @@ -124,6 +124,7 @@ class HistogramWindow : public GcChartWindow void setrBinWidthFromLineEdit(); void setBinWidthFromSlider(); void setBinWidthFromLineEdit(); + void forceReplot(); void updateChart(); private: diff --git a/src/LTMPlot.cpp b/src/LTMPlot.cpp index ce7e7d3cb..64224587e 100644 --- a/src/LTMPlot.cpp +++ b/src/LTMPlot.cpp @@ -784,6 +784,9 @@ LTMPlot::createTODCurveData(LTMSettings *settings, MetricDetail metricDetail, QV foreach (SummaryMetrics rideMetrics, *(settings->data)) { + // filter out unwanted rides + if (main->isfiltered && !main->filters.contains(rideMetrics.getFileName())) continue; + double value = rideMetrics.getForSymbol(metricDetail.symbol); // check values are bounded to stop QWT going berserk @@ -856,6 +859,11 @@ LTMPlot::createCurveData(LTMSettings *settings, MetricDetail metricDetail, QVect bool wantZero = (metricDetail.curveStyle == QwtPlotCurve::Steps); foreach (SummaryMetrics rideMetrics, *data) { + // filter out unwanted rides but not for PMC type metrics + // because that needs to be done in the stress calculator + if (metricDetail.type != METRIC_PM && main->isfiltered && + !main->filters.contains(rideMetrics.getFileName())) continue; + // day we are on int currentDay = groupForDate(rideMetrics.getRideDate().date(), settings->groupBy); diff --git a/src/LTMSidebar.cpp b/src/LTMSidebar.cpp index 0075c8497..61c2d5d3b 100644 --- a/src/LTMSidebar.cpp +++ b/src/LTMSidebar.cpp @@ -681,7 +681,7 @@ LTMSidebar::setSummary(DateRange dateRange) const RideMetric *metric = RideMetricFactory::instance().rideMetric(metricname); QStringList empty; // filter list not used at present - QString value = SummaryMetrics::getAggregated(metricname, results, empty, false, main->useMetricUnits); + QString value = SummaryMetrics::getAggregated(main, metricname, results, empty, false, main->useMetricUnits); // Maximum Max and Average Average looks nasty, remove from name for display QString s = metric ? metric->name().replace(QRegExp(tr("^(Average|Max) ")), "") : "unknown"; diff --git a/src/LTMWindow.cpp b/src/LTMWindow.cpp index f49c3e6c5..3354bf280 100644 --- a/src/LTMWindow.cpp +++ b/src/LTMWindow.cpp @@ -149,6 +149,7 @@ LTMWindow::LTMWindow(MainWindow *parent, bool useMetricUnits, const QDir &home) connect(ltmTool, SIGNAL(useCustomRange(DateRange)), this, SLOT(useCustomRange(DateRange))); connect(ltmTool, SIGNAL(useThruToday()), this, SLOT(useThruToday())); connect(ltmTool, SIGNAL(useStandardRange()), this, SLOT(useStandardRange())); + connect(main, SIGNAL(filterChanged(QStringList&)), this, SLOT(refresh())); // connect pickers to ltmPlot connect(_canvasPicker, SIGNAL(pointHover(QwtPlotCurve*, int)), ltmPlot, SLOT(pointHover(QwtPlotCurve*, int))); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index e2e639e51..fe61b3c39 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -145,7 +145,7 @@ QList mainwindows; // keep track of all the MainWindows we have op QDesktopWidget *desktop = NULL; MainWindow::MainWindow(const QDir &home) : - home(home), session(0), isclean(false), ismultisave(false), + home(home), session(0), isclean(false), ismultisave(false), isfiltered(false), zones_(new Zones), hrzones_(new HrZones), ride(NULL), workout(NULL), groupByMapper(NULL) { @@ -576,12 +576,18 @@ MainWindow::MainWindow(const QDir &home) : // we need to connect the search box on Linux/Windows #if !defined (Q_OS_MAC) && defined (GC_HAVE_LUCENE) + + // link to the sidebars connect(searchBox, SIGNAL(searchResults(QStringList)), listView, SLOT(searchStrings(QStringList))); connect(searchBox, SIGNAL(searchResults(QStringList)), gcCalendar, SLOT(setFilter(QStringList))); connect(searchBox, SIGNAL(searchResults(QStringList)), gcMultiCalendar, SLOT(setFilter(QStringList))); connect(searchBox, SIGNAL(searchClear()), listView, SLOT(clearSearch())); connect(searchBox, SIGNAL(searchClear()), gcCalendar, SLOT(clearFilter())); connect(searchBox, SIGNAL(searchClear()), gcMultiCalendar, SLOT(clearFilter())); + + // and global for charts AFTER sidebars + connect(searchBox, SIGNAL(searchResults(QStringList)), this, SLOT(searchResults(QStringList))); + connect(searchBox, SIGNAL(searchClear()), this, SLOT(searchClear())); #endif // retrieve settings (properties are saved when we close the window) if (appsettings->cvalue(cyclist, GC_NAVHEADINGS, "").toString() != "") { @@ -1498,6 +1504,23 @@ MainWindow::closeEvent(QCloseEvent* event) } } +// global search/data filter +void +MainWindow::searchResults(QStringList f) +{ + filters = f; + isfiltered = true; + emit filterChanged(filters); +} + +void +MainWindow::searchClear() +{ + filters.clear(); + isfiltered = false; + emit filterChanged(filters); +} + void MainWindow::closeAll() { diff --git a/src/MainWindow.h b/src/MainWindow.h index 5c5712cd7..d3ef4c437 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -177,6 +177,10 @@ class MainWindow : public QMainWindow bool isclean; bool ismultisave; + // global filters + bool isfiltered; + QStringList filters; + void setBubble(QString text, QPoint pos = QPoint(), Qt::Orientation o = Qt::Horizontal); #ifdef GC_HAVE_LUCENE @@ -241,6 +245,7 @@ class MainWindow : public QMainWindow void notifyPause() { emit pause(); } void notifyStop() { emit stop(); } void notifySeek(long x) { emit seek(x); } + void notifyFilter(QStringList f) { filters = f; emit filterChanged(f); } protected: @@ -280,6 +285,8 @@ class MainWindow : public QMainWindow void pause(); void stop(); + void filterChanged(QStringList&); + public slots: void checkCPX(RideItem*); void showTreeContextMenuPopup(const QPoint &); @@ -403,6 +410,10 @@ class MainWindow : public QMainWindow void dateRangeChangedDiary(DateRange); void dateRangeChangedLTM(DateRange); + // from global search + void searchResults(QStringList); + void searchClear(); + protected: private: diff --git a/src/RideFileCache.cpp b/src/RideFileCache.cpp index 997a80c46..4464198d5 100644 --- a/src/RideFileCache.cpp +++ b/src/RideFileCache.cpp @@ -892,11 +892,13 @@ RideFileCache::RideFileCache(MainWindow *main, QDate start, QDate end, bool filt : start(start), end(end), main(main), rideFileName(""), ride(0) { - // Oh lets get from the cache if we can - foreach(RideFileCache *p, main->cpxCache) { - if (p->start == start && p->end == end) { - *this = *p; - return; + // Oh lets get from the cache if we can -- but not if filtered + if (!filter && !main->isfiltered) { + foreach(RideFileCache *p, main->cpxCache) { + if (p->start == start && p->end == end) { + *this = *p; + return; + } } } @@ -936,6 +938,9 @@ RideFileCache::RideFileCache(MainWindow *main, QDate start, QDate end, bool filt if (((filter == true && files.contains(rideFileName)) || filter == false) && rideDate >= start && rideDate <= end) { + // skip globally filtered values + if (main->isfiltered && !main->filters.contains(rideFileName)) continue; + // get its cached values (will refresh if needed...) RideFileCache rideCache(main, main->home.absolutePath() + "/" + rideFileName); @@ -970,12 +975,14 @@ RideFileCache::RideFileCache(MainWindow *main, QDate start, QDate end, bool filt // set the cursor back to normal main->setCursor(Qt::ArrowCursor); - // lets add to the cache for others to re-use - if (main->cpxCache.count() > maxcache) { - delete(main->cpxCache.at(0)); - main->cpxCache.removeAt(0); + // lets add to the cache for others to re-use -- but not if filtered + if (!main->isfiltered && !filter) { + if (main->cpxCache.count() > maxcache) { + delete(main->cpxCache.at(0)); + main->cpxCache.removeAt(0); + } + main->cpxCache.append(new RideFileCache(this)); } - main->cpxCache.append(new RideFileCache(this)); } diff --git a/src/RideSummaryWindow.cpp b/src/RideSummaryWindow.cpp index d70ed43c3..d18aefed9 100644 --- a/src/RideSummaryWindow.cpp +++ b/src/RideSummaryWindow.cpp @@ -92,6 +92,7 @@ RideSummaryWindow::RideSummaryWindow(MainWindow *mainWindow, bool ridesummary) : connect(this, SIGNAL(dateRangeChanged(DateRange)), this, SLOT(dateRangeChanged(DateRange))); connect(mainWindow, SIGNAL(rideAdded(RideItem*)), this, SLOT(refresh())); connect(mainWindow, SIGNAL(rideDeleted(RideItem*)), this, SLOT(refresh())); + connect(mainWindow, SIGNAL(filterChanged(QStringList&)), this, SLOT(refresh())); // date settings connect(dateSetting, SIGNAL(useCustomRange(DateRange)), this, SLOT(useCustomRange(DateRange))); @@ -342,7 +343,7 @@ RideSummaryWindow::htmlSummary() const // get the value - from metrics or from data array if (ridesummary) s = s.arg(time_to_string(metrics.getForSymbol(symbol))); - else s = s.arg(SummaryMetrics::getAggregated(symbol, data, filters, filtered, useMetricUnits)); + else s = s.arg(SummaryMetrics::getAggregated(mainWindow, symbol, data, filters, filtered, useMetricUnits)); } else { if (m->units(useMetricUnits) != "") s = s.arg(" (" + m->units(useMetricUnits) + ")"); @@ -358,7 +359,7 @@ RideSummaryWindow::htmlSummary() const double pace; if (ridesummary) pace = metrics.getForSymbol(symbol) * (useMetricUnits ? 1 : m->conversion()) + (useMetricUnits ? 0 : m->conversionSum()); - else pace = SummaryMetrics::getAggregated(symbol, data, filters, filtered, useMetricUnits).toDouble(); + else pace = SummaryMetrics::getAggregated(mainWindow, symbol, data, filters, filtered, useMetricUnits).toDouble(); s = s.arg(QTime(0,0,0,0).addSecs(pace*60).toString("mm:ss")); @@ -367,7 +368,7 @@ RideSummaryWindow::htmlSummary() const // get the value - from metrics or from data array if (ridesummary) s = s.arg(metrics.getForSymbol(symbol) * (useMetricUnits ? 1 : m->conversion()) + (useMetricUnits ? 0 : m->conversionSum()), 0, 'f', m->precision()); - else s = s.arg(SummaryMetrics::getAggregated(symbol, data, filters, filtered, useMetricUnits)); + else s = s.arg(SummaryMetrics::getAggregated(mainWindow, symbol, data, filters, filtered, useMetricUnits)); } } @@ -386,7 +387,7 @@ RideSummaryWindow::htmlSummary() const // if using metrics or data if (ridesummary) time_in_zone[i] = metrics.getForSymbol(timeInZones[i]); - else time_in_zone[i] = SummaryMetrics::getAggregated(timeInZones[i], data, filters, filtered, useMetricUnits, true).toDouble(); + else time_in_zone[i] = SummaryMetrics::getAggregated(mainWindow, timeInZones[i], data, filters, filtered, useMetricUnits, true).toDouble(); } summary += tr("

Power Zones

"); summary += mainWindow->zones()->summarize(rideItem->zoneRange(), time_in_zone); //aggregating @@ -401,7 +402,7 @@ RideSummaryWindow::htmlSummary() const // if using metrics or data if (ridesummary) time_in_zone[i] = metrics.getForSymbol(timeInZonesHR[i]); - else time_in_zone[i] = SummaryMetrics::getAggregated(timeInZonesHR[i], data, filters, filtered, useMetricUnits, true).toDouble(); + else time_in_zone[i] = SummaryMetrics::getAggregated(mainWindow, timeInZonesHR[i], data, filters, filtered, useMetricUnits, true).toDouble(); } summary += tr("

Heart Rate Zones

"); @@ -494,10 +495,11 @@ RideSummaryWindow::htmlSummary() const // we have after filtering has been applied, otherwise it is just // the number of entries int activities = 0; - if (filtered) { + if (mainWindow->isfiltered || filtered) { foreach (SummaryMetrics activity, data) { - if (!filters.contains(activity.getFileName())) continue; + if (filtered && !filters.contains(activity.getFileName())) continue; + if (mainWindow->isfiltered && !mainWindow->filters.contains(activity.getFileName())) continue; activities++; } @@ -512,7 +514,7 @@ RideSummaryWindow::htmlSummary() const else totalCols = rtotalColumn.count(); int metricCols = metricColumn.count() > 7 ? 7 : metricColumn.count(); - if (filtered) { + if (mainWindow->isfiltered || filtered) { // "n of x activities" shown in header of list when filtered summary += ("

" + @@ -574,6 +576,7 @@ RideSummaryWindow::htmlSummary() const // apply the filter if there is one active if (filtered && !filters.contains(rideMetrics.getFileName())) continue; + if (mainWindow->isfiltered && !mainWindow->filters.contains(rideMetrics.getFileName())) continue; if (even) summary += ""; else { diff --git a/src/SearchBox.cpp b/src/SearchBox.cpp index dbb69c470..bef568c4f 100644 --- a/src/SearchBox.cpp +++ b/src/SearchBox.cpp @@ -136,7 +136,8 @@ void SearchBox::updateCloseButton(const QString& text) if (clearButton->isVisible() && text.isEmpty()) mode == Search ? clearQuery() : clearFilter(); clearButton->setVisible(!text.isEmpty()); - if (mode == Search) searchSubmit(); // only do search as you type in search mode + //REMOVED SINCE TOO HEAVY NOW AFFECTS CHARTS TOO + //if (mode == Search) searchSubmit(); // only do search as you type in search mode setGood(); // if user changing then don't stay red - wait till resubmitted checkMenu(); diff --git a/src/StressCalculator.cpp b/src/StressCalculator.cpp index b318d349e..5cda9d645 100644 --- a/src/StressCalculator.cpp +++ b/src/StressCalculator.cpp @@ -83,6 +83,17 @@ void StressCalculator::calculateStress(MainWindow *main, QString, const QString results = filteredresults; } + // and honour the global one too! + if (main->isfiltered) { + // remove any we don't have filtered + QList filteredresults; + foreach (SummaryMetrics x, results) { + if (main->filters.contains(x.getFileName())) + filteredresults << x; + } + results = filteredresults; + } + if (results.count() == 0) return; // no ride files found // set start and enddate to maximum maximum required date range diff --git a/src/SummaryMetrics.cpp b/src/SummaryMetrics.cpp index 45f50dca7..9853fa19a 100644 --- a/src/SummaryMetrics.cpp +++ b/src/SummaryMetrics.cpp @@ -17,6 +17,7 @@ */ #include "SummaryMetrics.h" +#include "MainWindow.h" #include "RideMetric.h" #include #include @@ -100,7 +101,7 @@ SummaryMetrics::getUnitsForSymbol(QString symbol, bool UseMetric) const else return QString("units"); } -QString SummaryMetrics::getAggregated(QString name, const QList &results, const QStringList &filters, +QString SummaryMetrics::getAggregated(MainWindow *main, QString name, const QList &results, const QStringList &filters, bool filtered, bool useMetricUnits, bool nofmt) { // get the metric details, so we can convert etc @@ -116,6 +117,7 @@ QString SummaryMetrics::getAggregated(QString name, const QList // skip filtered rides if (filtered && !filters.contains(rideMetrics.getFileName())) continue; + if (main->isfiltered && !main->filters.contains(rideMetrics.getFileName())) continue; // get this value double value = rideMetrics.getForSymbol(name); diff --git a/src/SummaryMetrics.h b/src/SummaryMetrics.h index 0e5334dc7..07d3bc1d2 100644 --- a/src/SummaryMetrics.h +++ b/src/SummaryMetrics.h @@ -24,7 +24,7 @@ #include #include #include - +class MainWindow; class SummaryMetrics { Q_DECLARE_TR_FUNCTIONS(SummaryMetrics) @@ -64,7 +64,9 @@ class SummaryMetrics QString getUnitsForSymbol(QString symbol, bool UseMetric) const; // when passed a list of summary metrics and a name return aggregated value as a string - static QString getAggregated(QString name, const QList &results, const QStringList &filters, bool filtered, + static QString getAggregated(MainWindow *main, QString name, + const QList &results, + const QStringList &filters, bool filtered, bool useMetricUnits, bool nofmt = false); QMap &values() { return value; } diff --git a/src/TreeMapPlot.cpp b/src/TreeMapPlot.cpp index fd08dd696..25e903d9a 100644 --- a/src/TreeMapPlot.cpp +++ b/src/TreeMapPlot.cpp @@ -73,6 +73,10 @@ TreeMapPlot::setData(TMSettings *settings) root->clear(); foreach (SummaryMetrics rideMetrics, *(settings->data)) { + + // don't plot if filtered + if (main->isfiltered && !main->filters.contains(rideMetrics.getFileName())) continue; + double value = rideMetrics.getForSymbol(settings->symbol); QString text1 = rideMetrics.getText(settings->field1, "(unknown)"); QString text2 = rideMetrics.getText(settings->field2, "(unknown)"); diff --git a/src/TreeMapWindow.cpp b/src/TreeMapWindow.cpp index cd3a08f89..6f05d329f 100644 --- a/src/TreeMapWindow.cpp +++ b/src/TreeMapWindow.cpp @@ -136,6 +136,8 @@ TreeMapWindow::TreeMapWindow(MainWindow *parent, bool useMetricUnits, const QDir connect(this, SIGNAL(rideItemChanged(RideItem*)), this, SLOT(rideSelected())); connect(main, SIGNAL(rideAdded(RideItem*)), this, SLOT(refresh(void))); connect(main, SIGNAL(rideDeleted(RideItem*)), this, SLOT(refresh(void))); + connect(main, SIGNAL(filterChanged(QStringList&)), this, SLOT(refresh(void))); + connect(main, SIGNAL(configChanged()), this, SLOT(refresh())); // user clicked on a cell in the plot