diff --git a/src/GUI/cadencegraph.cpp b/src/GUI/cadencegraph.cpp index fe589fa0..7b1d69ed 100644 --- a/src/GUI/cadencegraph.cpp +++ b/src/GUI/cadencegraph.cpp @@ -14,6 +14,11 @@ CadenceGraph::CadenceGraph(QWidget *parent) : GraphTab(parent) setSliderPrecision(1); } +CadenceGraph::~CadenceGraph() +{ + qDeleteAll(_tracks); +} + void CadenceGraph::setInfo() { if (_showTracks) { @@ -36,23 +41,28 @@ QList CadenceGraph::loadData(const Data &data) const Graph &graph = track.cadence(); if (!graph.isValid()) { - skipColor(); + _palette.nextColor(); graphs.append(0); } else { - CadenceGraphItem *gi = new CadenceGraphItem(graph, _graphType); - GraphView::addGraph(gi); + CadenceGraphItem *gi = new CadenceGraphItem(graph, _graphType, + _width, _palette.nextColor()); + + _tracks.append(gi); + if (_showTracks) + addGraph(gi); + _avg.append(QPointF(track.distance(), gi->avg())); graphs.append(gi); } } for (int i = 0; i < data.routes().count(); i++) { - skipColor(); + _palette.nextColor(); graphs.append(0); } for (int i = 0; i < data.areas().count(); i++) - skipColor(); + _palette.nextColor(); setInfo(); redraw(); @@ -75,6 +85,9 @@ qreal CadenceGraph::avg() const void CadenceGraph::clear() { + qDeleteAll(_tracks); + _tracks.clear(); + _avg.clear(); GraphTab::clear(); @@ -84,7 +97,13 @@ void CadenceGraph::showTracks(bool show) { _showTracks = show; - showGraph(show); + for (int i = 0; i < _tracks.size(); i++) { + if (show) + addGraph(_tracks.at(i)); + else + removeGraph(_tracks.at(i)); + } + setInfo(); redraw(); diff --git a/src/GUI/cadencegraph.h b/src/GUI/cadencegraph.h index 4ffa7649..5a1b9854 100644 --- a/src/GUI/cadencegraph.h +++ b/src/GUI/cadencegraph.h @@ -3,18 +3,20 @@ #include "graphtab.h" +class CadenceGraphItem; + class CadenceGraph : public GraphTab { Q_OBJECT public: CadenceGraph(QWidget *parent = 0); + ~CadenceGraph(); QString label() const {return tr("Cadence");} QList loadData(const Data &data); void clear(); void showTracks(bool show); - void showRoutes(bool show) {Q_UNUSED(show);} private: qreal avg() const; @@ -24,6 +26,7 @@ private: QVector _avg; bool _showTracks; + QList _tracks; }; #endif // CADENCEGRAPH_H diff --git a/src/GUI/cadencegraphitem.cpp b/src/GUI/cadencegraphitem.cpp index 690cc8fe..335972dc 100644 --- a/src/GUI/cadencegraphitem.cpp +++ b/src/GUI/cadencegraphitem.cpp @@ -4,7 +4,8 @@ CadenceGraphItem::CadenceGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent) : GraphItem(graph, type, parent) + int width, const QColor &color, QGraphicsItem *parent) + : GraphItem(graph, type, width, color, parent) { setToolTip(toolTip()); } diff --git a/src/GUI/cadencegraphitem.h b/src/GUI/cadencegraphitem.h index f84689a9..c39b80ff 100644 --- a/src/GUI/cadencegraphitem.h +++ b/src/GUI/cadencegraphitem.h @@ -8,8 +8,8 @@ class CadenceGraphItem : public GraphItem Q_OBJECT public: - CadenceGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent = 0); + CadenceGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent = 0); private: QString toolTip() const; diff --git a/src/GUI/elevationgraph.cpp b/src/GUI/elevationgraph.cpp index 6d460366..53562716 100644 --- a/src/GUI/elevationgraph.cpp +++ b/src/GUI/elevationgraph.cpp @@ -8,26 +8,18 @@ static qreal nMin(qreal a, qreal b) { - if (!std::isnan(a) && !std::isnan(b)) - return qMin(a, b); - else if (!std::isnan(a)) - return a; - else if (!std::isnan(b)) - return b; + if (std::isnan(a)) + return std::isnan(b) ? NAN : b; else - return NAN; + return std::isnan(b) ? a : qMin(a, b); } static qreal nMax(qreal a, qreal b) { - if (!std::isnan(a) && !std::isnan(b)) - return qMax(a, b); - else if (!std::isnan(a)) - return a; - else if (!std::isnan(b)) - return b; + if (std::isnan(a)) + return std::isnan(b) ? NAN : b; else - return NAN; + return std::isnan(b) ? a : qMax(a, b); } ElevationGraph::ElevationGraph(QWidget *parent) : GraphTab(parent) @@ -49,6 +41,12 @@ ElevationGraph::ElevationGraph(QWidget *parent) : GraphTab(parent) setMinYRange(50.0); } +ElevationGraph::~ElevationGraph() +{ + qDeleteAll(_tracks); + qDeleteAll(_routes); +} + void ElevationGraph::setInfo() { if (std::isnan(max()) || std::isnan(min())) @@ -70,19 +68,28 @@ void ElevationGraph::setInfo() GraphItem *ElevationGraph::loadGraph(const Graph &graph, Type type) { if (!graph.isValid()) { - skipColor(); + _palette.nextColor(); return 0; } - ElevationGraphItem *gi = new ElevationGraphItem(graph, _graphType); - GraphView::addGraph(gi, type); + ElevationGraphItem *gi = new ElevationGraphItem(graph, _graphType, _width, + _palette.nextColor()); + gi->setUnits(_units); if (type == Track) { + _tracks.append(gi); + if (_showTracks) + addGraph(gi); + _trackAscent += gi->ascent(); _trackDescent += gi->descent(); _trackMax = nMax(_trackMax, gi->max()); _trackMin = nMin(_trackMin, gi->min()); } else { + _routes.append(gi); + if (_showRoutes) + addGraph(gi); + _routeAscent += gi->ascent(); _routeDescent += gi->descent(); _routeMax = nMax(_routeMax, gi->max()); @@ -101,7 +108,7 @@ QList ElevationGraph::loadData(const Data &data) for (int i = 0; i < data.routes().count(); i++) graphs.append(loadGraph(data.routes().at(i).elevation(), Route)); for (int i = 0; i < data.areas().count(); i++) - skipColor(); + _palette.nextColor(); setInfo(); redraw(); @@ -111,6 +118,11 @@ QList ElevationGraph::loadData(const Data &data) void ElevationGraph::clear() { + qDeleteAll(_tracks); + _tracks.clear(); + qDeleteAll(_routes); + _routes.clear(); + _trackAscent = 0; _routeAscent = 0; _trackDescent = 0; @@ -142,12 +154,23 @@ void ElevationGraph::setUnits(Units units) GraphView::setUnits(units); } +void ElevationGraph::showItems(const QList &list, + bool show) +{ + for (int i = 0; i < list.size(); i++) { + if (show) + addGraph(list.at(i)); + else + removeGraph(list.at(i)); + } +} + void ElevationGraph::showTracks(bool show) { _showTracks = show; + showItems(_tracks, show); setInfo(); - showGraph(show, Track); redraw(); } @@ -156,7 +179,7 @@ void ElevationGraph::showRoutes(bool show) { _showRoutes = show; - showGraph(show, Route); + showItems(_routes, show); setInfo(); redraw(); diff --git a/src/GUI/elevationgraph.h b/src/GUI/elevationgraph.h index d4902030..c0b552be 100644 --- a/src/GUI/elevationgraph.h +++ b/src/GUI/elevationgraph.h @@ -3,12 +3,15 @@ #include "graphtab.h" +class ElevationGraphItem; + class ElevationGraph : public GraphTab { Q_OBJECT public: ElevationGraph(QWidget *parent = 0); + ~ElevationGraph(); QString label() const {return tr("Elevation");} QList loadData(const Data &data); @@ -29,6 +32,7 @@ private: void setInfo(); GraphItem *loadGraph(const Graph &graph, Type type); + void showItems(const QList &list, bool show); qreal _trackAscent, _trackDescent; qreal _routeAscent, _routeDescent; @@ -36,6 +40,7 @@ private: qreal _trackMin, _routeMin; bool _showTracks, _showRoutes; + QList _tracks, _routes; }; #endif // ELEVATIONGRAPH_H diff --git a/src/GUI/elevationgraphitem.cpp b/src/GUI/elevationgraphitem.cpp index 44f74d36..09ca7c65 100644 --- a/src/GUI/elevationgraphitem.cpp +++ b/src/GUI/elevationgraphitem.cpp @@ -4,7 +4,8 @@ ElevationGraphItem::ElevationGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent) : GraphItem(graph, type, parent) + int width, const QColor &color, QGraphicsItem *parent) + : GraphItem(graph, type, width, color, parent) { _min = GraphItem::min(); _max = GraphItem::max(); diff --git a/src/GUI/elevationgraphitem.h b/src/GUI/elevationgraphitem.h index 5eecc792..40294269 100644 --- a/src/GUI/elevationgraphitem.h +++ b/src/GUI/elevationgraphitem.h @@ -8,8 +8,8 @@ class ElevationGraphItem : public GraphItem Q_OBJECT public: - ElevationGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent = 0); + ElevationGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent = 0); qreal ascent() const {return _ascent;} qreal descent() const {return _descent;} diff --git a/src/GUI/gearratiograph.cpp b/src/GUI/gearratiograph.cpp index 6d07ff8c..040c5788 100644 --- a/src/GUI/gearratiograph.cpp +++ b/src/GUI/gearratiograph.cpp @@ -14,6 +14,11 @@ GearRatioGraph::GearRatioGraph(QWidget *parent) : GraphTab(parent) setSliderPrecision(2); } +GearRatioGraph::~GearRatioGraph() +{ + qDeleteAll(_tracks); +} + void GearRatioGraph::setInfo() { if (_showTracks) { @@ -37,11 +42,15 @@ QList GearRatioGraph::loadData(const Data &data) const Graph &graph = data.tracks().at(i).ratio(); if (!graph.isValid()) { - skipColor(); + _palette.nextColor(); graphs.append(0); } else { - GearRatioGraphItem *gi = new GearRatioGraphItem(graph, _graphType); - GraphView::addGraph(gi); + GearRatioGraphItem *gi = new GearRatioGraphItem(graph, _graphType, + _width, _palette.nextColor()); + + _tracks.append(gi); + if (_showTracks) + addGraph(gi); for (QMap::const_iterator it = gi->map().constBegin(); it != gi->map().constEnd(); ++it) @@ -51,12 +60,12 @@ QList GearRatioGraph::loadData(const Data &data) } for (int i = 0; i < data.routes().count(); i++) { - skipColor(); + _palette.nextColor(); graphs.append(0); } for (int i = 0; i < data.areas().count(); i++) - skipColor(); + _palette.nextColor(); setInfo(); redraw(); @@ -70,10 +79,7 @@ qreal GearRatioGraph::top() const for (QMap::const_iterator it = _map.constBegin(); it != _map.constEnd(); ++it) { - if (it == _map.constBegin()) { - val = it.value(); - key = it.key(); - } else if (it.value() > val) { + if (std::isnan(val) || it.value() > val) { val = it.value(); key = it.key(); } @@ -84,6 +90,9 @@ qreal GearRatioGraph::top() const void GearRatioGraph::clear() { + qDeleteAll(_tracks); + _tracks.clear(); + _map.clear(); GraphTab::clear(); @@ -93,7 +102,13 @@ void GearRatioGraph::showTracks(bool show) { _showTracks = show; - showGraph(show); + for (int i = 0; i < _tracks.size(); i++) { + if (show) + addGraph(_tracks.at(i)); + else + removeGraph(_tracks.at(i)); + } + setInfo(); redraw(); diff --git a/src/GUI/gearratiograph.h b/src/GUI/gearratiograph.h index 4cd38833..94ac340e 100644 --- a/src/GUI/gearratiograph.h +++ b/src/GUI/gearratiograph.h @@ -4,12 +4,15 @@ #include #include "graphtab.h" +class GearRatioGraphItem; + class GearRatioGraph : public GraphTab { Q_OBJECT public: GearRatioGraph(QWidget *parent = 0); + ~GearRatioGraph(); QString label() const {return tr("Gear ratio");} QList loadData(const Data &data); @@ -25,6 +28,7 @@ private: QMap _map; bool _showTracks; + QList _tracks; }; #endif // GEARRATIOGRAPH_H diff --git a/src/GUI/gearratiographitem.cpp b/src/GUI/gearratiographitem.cpp index 5c128466..e9f61688 100644 --- a/src/GUI/gearratiographitem.cpp +++ b/src/GUI/gearratiographitem.cpp @@ -5,7 +5,8 @@ GearRatioGraphItem::GearRatioGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent) : GraphItem(graph, type, parent), _top(NAN) + int width, const QColor &color, QGraphicsItem *parent) + : GraphItem(graph, type, width, color, parent) { for (int i = 0; i < graph.size(); i++) { const GraphSegment &segment = graph.at(i); @@ -15,6 +16,16 @@ GearRatioGraphItem::GearRatioGraphItem(const Graph &graph, GraphType type, } } + qreal key = NAN, val = NAN; + for (QMap::const_iterator it = _map.constBegin(); + it != _map.constEnd(); ++it) { + if (std::isnan(val) || it.value() > val) { + val = it.value(); + key = it.key(); + } + } + _top = key; + setToolTip(toolTip()); } diff --git a/src/GUI/gearratiographitem.h b/src/GUI/gearratiographitem.h index 18f53f6b..f13eb859 100644 --- a/src/GUI/gearratiographitem.h +++ b/src/GUI/gearratiographitem.h @@ -9,8 +9,8 @@ class GearRatioGraphItem : public GraphItem Q_OBJECT public: - GearRatioGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent = 0); + GearRatioGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent = 0); qreal top() const {return _top;} diff --git a/src/GUI/graphitem.cpp b/src/GUI/graphitem.cpp index a654463d..bebaa1ed 100644 --- a/src/GUI/graphitem.cpp +++ b/src/GUI/graphitem.cpp @@ -2,30 +2,25 @@ #include "graphitem.h" -GraphItem::GraphItem(const Graph &graph, GraphType type, QGraphicsItem *parent) +GraphItem::GraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent) : QGraphicsObject(parent), _graph(graph), _type(type) { Q_ASSERT(_graph.isValid()); - _id = 0; - _width = 1; - _pen = QPen(Qt::black, _width); - _sx = 1.0; _sy = 1.0; + _pen = QPen(color, width); + _sx = 0; _sy = 0; _time = _graph.hasTime(); - setZValue(2.0); - - updatePath(); - updateShape(); - updateBounds(); - setAcceptHoverEvents(true); + + updateBounds(); } void GraphItem::updateShape() { QPainterPathStroker s; - s.setWidth(_width + 1); + s.setWidth(_pen.width() + 1); _shape = s.createStroke(_path); } @@ -54,7 +49,6 @@ void GraphItem::setGraphType(GraphType type) _type = type; updatePath(); - updateShape(); updateBounds(); } @@ -69,12 +63,11 @@ void GraphItem::setColor(const QColor &color) void GraphItem::setWidth(int width) { - if (width == _width) + if (width == _pen.width()) return; prepareGeometryChange(); - _width = width; _pen.setWidth(width); updateShape(); @@ -170,10 +163,10 @@ void GraphItem::emitSliderPositionChanged(qreal pos) void GraphItem::hover(bool hover) { if (hover) { - _pen.setWidth(_width + 1); + _pen.setWidth(_pen.width() + 1); setZValue(zValue() + 1.0); } else { - _pen.setWidth(_width); + _pen.setWidth(_pen.width() - 1); setZValue(zValue() - 1.0); } @@ -189,23 +182,30 @@ void GraphItem::setScale(qreal sx, qreal sy) _sx = sx; _sy = sy; updatePath(); - updateShape(); } void GraphItem::updatePath() { - _path = QPainterPath(); - - if (_type == Time && !_time) + if (_sx == 0 && _sy == 0) return; - for (int i = 0; i < _graph.size(); i++) { - const GraphSegment &segment = _graph.at(i); + prepareGeometryChange(); - _path.moveTo(segment.first().x(_type) * _sx, -segment.first().y() * _sy); - for (int i = 1; i < segment.size(); i++) - _path.lineTo(segment.at(i).x(_type) * _sx, -segment.at(i).y() * _sy); + _path = QPainterPath(); + + if (!(_type == Time && !_time)) { + for (int i = 0; i < _graph.size(); i++) { + const GraphSegment &segment = _graph.at(i); + + _path.moveTo(segment.first().x(_type) * _sx, -segment.first().y() + * _sy); + for (int i = 1; i < segment.size(); i++) + _path.lineTo(segment.at(i).x(_type) * _sx, -segment.at(i).y() + * _sy); + } } + + updateShape(); } void GraphItem::updateBounds() @@ -286,7 +286,7 @@ void GraphItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); - _pen.setWidthF(_width + 1); + _pen.setWidth(_pen.width() + 1); setZValue(zValue() + 1.0); update(); @@ -297,7 +297,7 @@ void GraphItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); - _pen.setWidthF(_width); + _pen.setWidth(_pen.width() - 1); setZValue(zValue() - 1.0); update(); diff --git a/src/GUI/graphitem.h b/src/GUI/graphitem.h index faf6d601..cce77bfb 100644 --- a/src/GUI/graphitem.h +++ b/src/GUI/graphitem.h @@ -11,7 +11,8 @@ class GraphItem : public QGraphicsObject Q_OBJECT public: - GraphItem(const Graph &graph, GraphType type, QGraphicsItem *parent = 0); + GraphItem(const Graph &graph, GraphType type, int width, const QColor &color, + QGraphicsItem *parent = 0); virtual ~GraphItem() {} QPainterPath shape() const {return _shape;} @@ -27,8 +28,6 @@ public: void setScale(qreal sx, qreal sy); void setGraphType(GraphType type); - int id() const {return _id;} - void setId(int id) {_id = id;} void setColor(const QColor &color); void setWidth(int width); virtual void setUnits(Units units) {Q_UNUSED(units);} @@ -55,17 +54,13 @@ private: void updateShape(); void updateBounds(); - int _id; - QPen _pen; - int _width; - Graph _graph; GraphType _type; - QPainterPath _path; QPainterPath _shape; QRectF _bounds; qreal _sx, _sy; + QPen _pen; bool _time; }; diff --git a/src/GUI/graphview.cpp b/src/GUI/graphview.cpp index e4cb061a..bb12b5eb 100644 --- a/src/GUI/graphview.cpp +++ b/src/GUI/graphview.cpp @@ -74,8 +74,6 @@ GraphView::~GraphView() delete _info; delete _grid; delete _message; - - qDeleteAll(_graphs); } void GraphView::createXLabel() @@ -166,14 +164,7 @@ void GraphView::setGraphType(GraphType type) for (int i = 0; i < _graphs.count(); i++) { GraphItem *gi = _graphs.at(i); gi->setGraphType(type); - if (!_hide.contains(gi->id())) { - if (gi->bounds().width() > 0) - addItem(gi); - else - removeItem(gi); - } - if (gi->scene() == _scene) - _bounds |= gi->bounds(); + _bounds |= gi->bounds(); } if (type == Distance) @@ -195,29 +186,31 @@ void GraphView::showSliderInfo(bool show) _sliderInfo->setVisible(show); } -void GraphView::addGraph(GraphItem *graph, int id) +void GraphView::addGraph(GraphItem *graph) { - QColor color(_palette.nextColor()); - color.setAlpha(255); - - graph->setUnits(_units); - graph->setId(id); - graph->setColor(color); - graph->setWidth(_width); - connect(this, SIGNAL(sliderPositionChanged(qreal)), graph, SLOT(emitSliderPositionChanged(qreal))); _graphs.append(graph); + _scene->addItem(graph); + _bounds |= graph->bounds(); - if (!_hide.contains(id)) { - _visible.append(graph); - if (graph->bounds().width() > 0) { - _scene->addItem(graph); - _bounds |= graph->bounds(); - } - setXUnits(); - } + setXUnits(); +} + +void GraphView::removeGraph(GraphItem *graph) +{ + disconnect(this, SIGNAL(sliderPositionChanged(qreal)), graph, + SLOT(emitSliderPositionChanged(qreal))); + + _graphs.removeOne(graph); + _scene->removeItem(graph); + + _bounds = QRectF(); + for (int i = 0; i < _graphs.count(); i++) + _bounds |= _graphs.at(i)->bounds(); + + setXUnits(); } void GraphView::removeItem(QGraphicsItem *item) @@ -232,29 +225,6 @@ void GraphView::addItem(QGraphicsItem *item) _scene->addItem(item); } -void GraphView::showGraph(bool show, int id) -{ - if (show) - _hide.remove(id); - else - _hide.insert(id); - - _visible.clear(); - _bounds = QRectF(); - for (int i = 0; i < _graphs.count(); i++) { - GraphItem *gi = _graphs.at(i); - if (_hide.contains(gi->id())) - removeItem(gi); - else { - _visible.append(gi); - if (gi->bounds().width() > 0) { - addItem(gi); - _bounds |= gi->bounds(); - } - } - } -} - QRectF GraphView::bounds() const { QRectF br(_bounds); @@ -314,8 +284,8 @@ void GraphView::redraw(const QSizeF &size) sy = (size.height() - (mx.height() + my.height()) - _info->boundingRect().height()) / r.height(); - for (int i = 0; i < _visible.size(); i++) - _visible.at(i)->setScale(sx, sy); + for (int i = 0; i < _graphs.size(); i++) + _graphs.at(i)->setScale(sx, sy); QPointF p(r.left() * sx, r.top() * sy); QSizeF s(r.width() * sx, r.height() * sy); @@ -376,12 +346,11 @@ void GraphView::plot(QPainter *painter, const QRectF &target, qreal scale) void GraphView::clear() { + _graphs.clear(); + _slider->clear(); _info->clear(); - qDeleteAll(_graphs); - _graphs.clear(); - _visible.clear(); _palette.reset(); _bounds = QRectF(); @@ -392,38 +361,29 @@ void GraphView::clear() void GraphView::updateSliderPosition() { - if (bounds().width() <= 0) - return; - if (_sliderPos <= bounds().right() && _sliderPos >= bounds().left()) { _slider->setPos((_sliderPos / bounds().width()) * _slider->area().width(), _slider->area().bottom()); - _slider->setVisible(!_visible.isEmpty()); + _slider->setVisible(true); + updateSliderInfo(); } else { _slider->setPos(_slider->area().left(), _slider->area().bottom()); _slider->setVisible(false); } - - if (_slider->isVisible()) - updateSliderInfo(); } void GraphView::updateSliderInfo() { QLocale l(QLocale::system()); - qreal r, y; + qreal r = 0, y = 0; - - if (_visible.count() > 1) { - r = 0; - y = 0; - } else { - QRectF br(_visible.first()->bounds()); + if (_graphs.count() == 1) { + QRectF br(_graphs.first()->bounds()); if (br.height() < _minYRange) br.adjust(0, -(_minYRange/2 - br.height()/2), 0, _minYRange/2 - br.height()/2); - y = _visible.first()->yAtX(_sliderPos); + y = _graphs.first()->yAtX(_sliderPos); r = (y - br.bottom()) / br.height(); } @@ -435,7 +395,7 @@ void GraphView::updateSliderInfo() _sliderInfo->setPos(QPointF(0, _slider->boundingRect().height() * r)); _sliderInfo->setText(_graphType == Time ? Format::timeSpan(_sliderPos, bounds().width() > 3600) : l.toString(_sliderPos * _xScale, 'f', 1) - + UNIT_SPACE + _xUnits, (_visible.count() > 1) ? QString() + + UNIT_SPACE + _xUnits, (_graphs.count() > 1) ? QString() : l.toString(-y * _yScale + _yOffset, 'f', _precision) + UNIT_SPACE + _yUnits); } @@ -455,7 +415,7 @@ void GraphView::emitSliderPositionChanged(const QPointF &pos) void GraphView::setSliderPosition(qreal pos) { - if (_visible.isEmpty()) + if (_graphs.isEmpty()) return; _sliderPos = pos; @@ -483,11 +443,8 @@ void GraphView::setPalette(const Palette &palette) _palette = palette; _palette.reset(); - for (int i = 0; i < _graphs.count(); i++) { - QColor color(_palette.nextColor()); - color.setAlpha(255); - _graphs.at(i)->setColor(color); - } + for (int i = 0; i < _graphs.count(); i++) + _graphs.at(i)->setColor(_palette.nextColor()); } void GraphView::setGraphWidth(int width) diff --git a/src/GUI/graphview.h b/src/GUI/graphview.h index fb9876a4..d6156447 100644 --- a/src/GUI/graphview.h +++ b/src/GUI/graphview.h @@ -46,9 +46,9 @@ signals: void sliderPositionChanged(qreal); protected: - void addGraph(GraphItem *graph, int id = 0); + void addGraph(GraphItem *graph); + void removeGraph(GraphItem *graph); - void showGraph(bool show, int id = 0); void setGraphType(GraphType type); void setUnits(Units units); @@ -68,12 +68,13 @@ protected: void redraw(); void addInfo(const QString &key, const QString &value); void clearInfo(); - void skipColor() {_palette.nextColor();} void changeEvent(QEvent *e); - QList _graphs; GraphType _graphType; + Units _units; + Palette _palette; + int _width; private slots: void emitSliderPositionChanged(const QPointF &pos); @@ -92,15 +93,6 @@ private: void resizeEvent(QResizeEvent *e); void mousePressEvent(QMouseEvent *e); - Units _units; - qreal _xScale, _yScale; - qreal _yOffset; - QString _xUnits, _yUnits; - QString _xLabel, _yLabel; - int _precision; - qreal _minYRange; - qreal _sliderPos; - QGraphicsScene *_scene; AxisItem *_xAxis, *_yAxis; @@ -109,12 +101,17 @@ private: InfoItem *_info; GridItem *_grid; QGraphicsSimpleTextItem *_message; + QList _graphs; - QList _visible; - QSet _hide; QRectF _bounds; - Palette _palette; - int _width; + qreal _sliderPos; + + qreal _xScale, _yScale; + qreal _yOffset; + QString _xUnits, _yUnits; + QString _xLabel, _yLabel; + int _precision; + qreal _minYRange; }; #endif // GRAPHVIEW_H diff --git a/src/GUI/gui.cpp b/src/GUI/gui.cpp index aa2f3d4d..aba5095e 100644 --- a/src/GUI/gui.cpp +++ b/src/GUI/gui.cpp @@ -739,6 +739,7 @@ void GUI::paths() msgBox.exec(); } +#include void GUI::openFile() { QStringList files = QFileDialog::getOpenFileNames(this, tr("Open file"), diff --git a/src/GUI/heartrategraph.cpp b/src/GUI/heartrategraph.cpp index c7e431c9..b9983c2d 100644 --- a/src/GUI/heartrategraph.cpp +++ b/src/GUI/heartrategraph.cpp @@ -14,6 +14,11 @@ HeartRateGraph::HeartRateGraph(QWidget *parent) : GraphTab(parent) setSliderPrecision(0); } +HeartRateGraph::~HeartRateGraph() +{ + qDeleteAll(_tracks); +} + void HeartRateGraph::setInfo() { if (_showTracks) { @@ -36,23 +41,28 @@ QList HeartRateGraph::loadData(const Data &data) const Graph &graph = track.heartRate(); if (!graph.isValid()) { - skipColor(); + _palette.nextColor(); graphs.append(0); } else { - HeartRateGraphItem *gi = new HeartRateGraphItem(graph, _graphType); - GraphView::addGraph(gi); + HeartRateGraphItem *gi = new HeartRateGraphItem(graph, _graphType, + _width, _palette.nextColor()); + + _tracks.append(gi); + if (_showTracks) + addGraph(gi); + _avg.append(QPointF(track.distance(), gi->avg())); graphs.append(gi); } } for (int i = 0; i < data.routes().count(); i++) { - skipColor(); + _palette.nextColor(); graphs.append(0); } for (int i = 0; i < data.areas().count(); i++) - skipColor(); + _palette.nextColor(); setInfo(); redraw(); @@ -75,6 +85,9 @@ qreal HeartRateGraph::avg() const void HeartRateGraph::clear() { + qDeleteAll(_tracks); + _tracks.clear(); + _avg.clear(); GraphTab::clear(); @@ -84,7 +97,13 @@ void HeartRateGraph::showTracks(bool show) { _showTracks = show; - showGraph(show); + for (int i = 0; i < _tracks.size(); i++) { + if (show) + addGraph(_tracks.at(i)); + else + removeGraph(_tracks.at(i)); + } + setInfo(); redraw(); diff --git a/src/GUI/heartrategraph.h b/src/GUI/heartrategraph.h index cf633c44..d0b6c0f3 100644 --- a/src/GUI/heartrategraph.h +++ b/src/GUI/heartrategraph.h @@ -3,12 +3,15 @@ #include "graphtab.h" +class HeartRateGraphItem; + class HeartRateGraph : public GraphTab { Q_OBJECT public: HeartRateGraph(QWidget *parent = 0); + ~HeartRateGraph(); QString label() const {return tr("Heart rate");} QList loadData(const Data &data); @@ -23,6 +26,7 @@ private: QVector _avg; bool _showTracks; + QList _tracks; }; #endif // HEARTRATEGRAPH_H diff --git a/src/GUI/heartrategraphitem.cpp b/src/GUI/heartrategraphitem.cpp index 8e7a089f..ff383ca2 100644 --- a/src/GUI/heartrategraphitem.cpp +++ b/src/GUI/heartrategraphitem.cpp @@ -4,7 +4,8 @@ HeartRateGraphItem::HeartRateGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent) : GraphItem(graph, type, parent) + int width, const QColor &color, QGraphicsItem *parent) + : GraphItem(graph, type, width, color, parent) { setToolTip(toolTip()); } diff --git a/src/GUI/heartrategraphitem.h b/src/GUI/heartrategraphitem.h index 2e737a40..4ab97607 100644 --- a/src/GUI/heartrategraphitem.h +++ b/src/GUI/heartrategraphitem.h @@ -8,8 +8,8 @@ class HeartRateGraphItem : public GraphItem Q_OBJECT public: - HeartRateGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent = 0); + HeartRateGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent = 0); private: QString toolTip() const; diff --git a/src/GUI/powergraph.cpp b/src/GUI/powergraph.cpp index d0926a4c..21456eb2 100644 --- a/src/GUI/powergraph.cpp +++ b/src/GUI/powergraph.cpp @@ -14,6 +14,11 @@ PowerGraph::PowerGraph(QWidget *parent) : GraphTab(parent) setSliderPrecision(1); } +PowerGraph::~PowerGraph() +{ + qDeleteAll(_tracks); +} + void PowerGraph::setInfo() { if (_showTracks) { @@ -36,23 +41,27 @@ QList PowerGraph::loadData(const Data &data) const Graph &graph = track.power(); if (!graph.isValid()) { - skipColor(); + _palette.nextColor(); graphs.append(0); } else { - PowerGraphItem *gi = new PowerGraphItem(graph, _graphType); - GraphView::addGraph(gi); + PowerGraphItem *gi = new PowerGraphItem(graph, _graphType, _width, + _palette.nextColor()); + + _tracks.append(gi); + if (_showTracks) + addGraph(gi); _avg.append(QPointF(track.distance(), gi->avg())); graphs.append(gi); } } for (int i = 0; i < data.routes().count(); i++) { - skipColor(); + _palette.nextColor(); graphs.append(0); } for (int i = 0; i < data.areas().count(); i++) - skipColor(); + _palette.nextColor(); setInfo(); redraw(); @@ -75,6 +84,9 @@ qreal PowerGraph::avg() const void PowerGraph::clear() { + qDeleteAll(_tracks); + _tracks.clear(); + _avg.clear(); GraphTab::clear(); @@ -84,7 +96,13 @@ void PowerGraph::showTracks(bool show) { _showTracks = show; - showGraph(show); + for (int i = 0; i < _tracks.size(); i++) { + if (show) + addGraph(_tracks.at(i)); + else + removeGraph(_tracks.at(i)); + } + setInfo(); redraw(); diff --git a/src/GUI/powergraph.h b/src/GUI/powergraph.h index 03165fec..89476685 100644 --- a/src/GUI/powergraph.h +++ b/src/GUI/powergraph.h @@ -3,12 +3,15 @@ #include "graphtab.h" +class PowerGraphItem; + class PowerGraph : public GraphTab { Q_OBJECT public: PowerGraph(QWidget *parent = 0); + ~PowerGraph(); QString label() const {return tr("Power");} QList loadData(const Data &data); @@ -23,6 +26,7 @@ private: QVector _avg; bool _showTracks; + QList _tracks; }; #endif // POWERGRAPH_H diff --git a/src/GUI/powergraphitem.cpp b/src/GUI/powergraphitem.cpp index 13ae8885..20d6b4b8 100644 --- a/src/GUI/powergraphitem.cpp +++ b/src/GUI/powergraphitem.cpp @@ -3,8 +3,9 @@ #include "powergraphitem.h" -PowerGraphItem::PowerGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent) : GraphItem(graph, type, parent) +PowerGraphItem::PowerGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent) + : GraphItem(graph, type, width, color, parent) { setToolTip(toolTip()); } diff --git a/src/GUI/powergraphitem.h b/src/GUI/powergraphitem.h index fe0f6f90..ba2c7fc4 100644 --- a/src/GUI/powergraphitem.h +++ b/src/GUI/powergraphitem.h @@ -8,8 +8,8 @@ class PowerGraphItem : public GraphItem Q_OBJECT public: - PowerGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent = 0); + PowerGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent = 0); private: QString toolTip() const; diff --git a/src/GUI/speedgraph.cpp b/src/GUI/speedgraph.cpp index 48d10fa5..e85f70b4 100644 --- a/src/GUI/speedgraph.cpp +++ b/src/GUI/speedgraph.cpp @@ -18,6 +18,11 @@ SpeedGraph::SpeedGraph(QWidget *parent) : GraphTab(parent) setSliderPrecision(1); } +SpeedGraph::~SpeedGraph() +{ + qDeleteAll(_tracks); +} + void SpeedGraph::setInfo() { if (_showTracks) { @@ -44,13 +49,18 @@ QList SpeedGraph::loadData(const Data &data) const Graph &graph = track.speed(); if (!graph.isValid()) { - skipColor(); + _palette.nextColor(); graphs.append(0); } else { - SpeedGraphItem *gi = new SpeedGraphItem(graph, _graphType, - track.movingTime()); + SpeedGraphItem *gi = new SpeedGraphItem(graph, _graphType, _width, + _palette.nextColor(), track.movingTime()); gi->setTimeType(_timeType); - GraphView::addGraph(gi); + gi->setUnits(_units); + + _tracks.append(gi); + if (_showTracks) + addGraph(gi); + _avg.append(QPointF(track.distance(), gi->avg())); _mavg.append(QPointF(track.distance(), gi->mavg())); graphs.append(gi); @@ -58,12 +68,12 @@ QList SpeedGraph::loadData(const Data &data) } for (int i = 0; i < data.routes().count(); i++) { - skipColor(); + _palette.nextColor(); graphs.append(0); } for (int i = 0; i < data.areas().count(); i++) - skipColor(); + _palette.nextColor(); setInfo(); redraw(); @@ -87,6 +97,9 @@ qreal SpeedGraph::avg() const void SpeedGraph::clear() { + qDeleteAll(_tracks); + _tracks.clear(); + _avg.clear(); _mavg.clear(); @@ -121,8 +134,8 @@ void SpeedGraph::setTimeType(enum TimeType type) { _timeType = type; - for (int i = 0; i < _graphs.size(); i++) - static_cast(_graphs.at(i))->setTimeType(type); + for (int i = 0; i < _tracks.size(); i++) + _tracks.at(i)->setTimeType(type); setInfo(); redraw(); @@ -132,7 +145,13 @@ void SpeedGraph::showTracks(bool show) { _showTracks = show; - showGraph(show); + for (int i = 0; i < _tracks.size(); i++) { + if (show) + addGraph(_tracks.at(i)); + else + removeGraph(_tracks.at(i)); + } + setInfo(); redraw(); diff --git a/src/GUI/speedgraph.h b/src/GUI/speedgraph.h index 420539f4..ca06d6c6 100644 --- a/src/GUI/speedgraph.h +++ b/src/GUI/speedgraph.h @@ -4,12 +4,15 @@ #include #include "graphtab.h" +class SpeedGraphItem; + class SpeedGraph : public GraphTab { Q_OBJECT public: SpeedGraph(QWidget *parent = 0); + ~SpeedGraph(); QString label() const {return tr("Speed");} QList loadData(const Data &data); @@ -29,7 +32,9 @@ private: Units _units; TimeType _timeType; + bool _showTracks; + QList _tracks; }; #endif // SPEEDGRAPH_H diff --git a/src/GUI/speedgraphitem.cpp b/src/GUI/speedgraphitem.cpp index 1ba775c3..85d1343e 100644 --- a/src/GUI/speedgraphitem.cpp +++ b/src/GUI/speedgraphitem.cpp @@ -4,8 +4,9 @@ #include "speedgraphitem.h" -SpeedGraphItem::SpeedGraphItem(const Graph &graph, GraphType type, - qreal movingTime, QGraphicsItem *parent) : GraphItem(graph, type, parent) +SpeedGraphItem::SpeedGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, qreal movingTime, QGraphicsItem *parent) + : GraphItem(graph, type, width, color, parent) { _units = Metric; _timeType = Total; diff --git a/src/GUI/speedgraphitem.h b/src/GUI/speedgraphitem.h index af650ca0..c39048be 100644 --- a/src/GUI/speedgraphitem.h +++ b/src/GUI/speedgraphitem.h @@ -9,8 +9,8 @@ class SpeedGraphItem : public GraphItem Q_OBJECT public: - SpeedGraphItem(const Graph &graph, GraphType type, qreal movingTime, - QGraphicsItem *parent = 0); + SpeedGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, qreal movingTime, QGraphicsItem *parent = 0); qreal avg() const {return _avg;} qreal mavg() const {return _mavg;} @@ -23,9 +23,8 @@ private: QString toolTip() const; qreal _avg, _mavg, _max; - - Units _units; TimeType _timeType; + Units _units; }; #endif // SPEEDGRAPHITEM_H diff --git a/src/GUI/temperaturegraph.cpp b/src/GUI/temperaturegraph.cpp index 0f7a4573..e6b2e076 100644 --- a/src/GUI/temperaturegraph.cpp +++ b/src/GUI/temperaturegraph.cpp @@ -14,6 +14,11 @@ TemperatureGraph::TemperatureGraph(QWidget *parent) : GraphTab(parent) setSliderPrecision(1); } +TemperatureGraph::~TemperatureGraph() +{ + qDeleteAll(_tracks); +} + void TemperatureGraph::setInfo() { if (_showTracks) { @@ -38,24 +43,29 @@ QList TemperatureGraph::loadData(const Data &data) const Graph &graph = track.temperature(); if (!graph.isValid()) { - skipColor(); + _palette.nextColor(); graphs.append(0); } else { TemperatureGraphItem *gi = new TemperatureGraphItem(graph, - _graphType); - GraphView::addGraph(gi); + _graphType, _width, _palette.nextColor()); + gi->setUnits(_units); + + _tracks.append(gi); + if (_showTracks) + addGraph(gi); + _avg.append(QPointF(track.distance(), gi->avg())); graphs.append(gi); } } for (int i = 0; i < data.routes().count(); i++) { - skipColor(); + _palette.nextColor(); graphs.append(0); } for (int i = 0; i < data.areas().count(); i++) - skipColor(); + _palette.nextColor(); setInfo(); redraw(); @@ -78,6 +88,9 @@ qreal TemperatureGraph::avg() const void TemperatureGraph::clear() { + qDeleteAll(_tracks); + _tracks.clear(); + _avg.clear(); GraphTab::clear(); @@ -108,7 +121,13 @@ void TemperatureGraph::showTracks(bool show) { _showTracks = show; - showGraph(show); + for (int i = 0; i < _tracks.size(); i++) { + if (show) + addGraph(_tracks.at(i)); + else + removeGraph(_tracks.at(i)); + } + setInfo(); redraw(); diff --git a/src/GUI/temperaturegraph.h b/src/GUI/temperaturegraph.h index 1b35f4fb..f93eed79 100644 --- a/src/GUI/temperaturegraph.h +++ b/src/GUI/temperaturegraph.h @@ -3,12 +3,15 @@ #include "graphtab.h" +class TemperatureGraphItem; + class TemperatureGraph : public GraphTab { Q_OBJECT public: TemperatureGraph(QWidget *parent = 0); + ~TemperatureGraph(); QString label() const {return tr("Temperature");} QList loadData(const Data &data); @@ -26,6 +29,7 @@ private: QVector _avg; bool _showTracks; + QList _tracks; }; #endif // TEMPERATUREGRAPH_H diff --git a/src/GUI/temperaturegraphitem.cpp b/src/GUI/temperaturegraphitem.cpp index 42a79620..10b20ae5 100644 --- a/src/GUI/temperaturegraphitem.cpp +++ b/src/GUI/temperaturegraphitem.cpp @@ -4,7 +4,8 @@ TemperatureGraphItem::TemperatureGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent) : GraphItem(graph, type, parent) + int width, const QColor &color, QGraphicsItem *parent) + : GraphItem(graph, type, width, color, parent) { _min = GraphItem::min(); _max = GraphItem::max(); diff --git a/src/GUI/temperaturegraphitem.h b/src/GUI/temperaturegraphitem.h index 903eab6b..11931c62 100644 --- a/src/GUI/temperaturegraphitem.h +++ b/src/GUI/temperaturegraphitem.h @@ -8,8 +8,8 @@ class TemperatureGraphItem : public GraphItem Q_OBJECT public: - TemperatureGraphItem(const Graph &graph, GraphType type, - QGraphicsItem *parent = 0); + TemperatureGraphItem(const Graph &graph, GraphType type, int width, + const QColor &color, QGraphicsItem *parent = 0); qreal max() const {return _max;} qreal min() const {return _min;}