From 99c4741508a42ba2f332bf8555ddb62ee73a315b Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Tue, 28 Sep 2021 10:32:41 +0200 Subject: [PATCH] profile: avoid double recalculation of tick positions The ticks were recalculated twice per plotDive() call: 1) When updating the position of the axes in updateChangeLine() 2) After setting the bounds in plotDive() via setBounds() Remove the first instance. updateChangeLine() is called in only one place [from plotDive()] and therefore, the recalculation is always redundant. Moreover, rename the function to setPosition(), since it doesn't do any animation at all. Signed-off-by: Berthold Stoeger --- profile-widget/divecartesianaxis.cpp | 10 ++-------- profile-widget/divecartesianaxis.h | 3 +-- profile-widget/profilescene.cpp | 14 ++++++-------- profile-widget/profilescene.h | 2 +- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/profile-widget/divecartesianaxis.cpp b/profile-widget/divecartesianaxis.cpp index d418e3ced..9b05024ac 100644 --- a/profile-widget/divecartesianaxis.cpp +++ b/profile-widget/divecartesianaxis.cpp @@ -289,13 +289,7 @@ void DiveCartesianAxis::updateTicks(int animSpeed) changed = false; } -void DiveCartesianAxis::setLine(const QLineF &line) -{ - QGraphicsLineItem::setLine(line); - changed = true; -} - -void DiveCartesianAxis::animateChangeLine(const QRectF &rectIn, int animSpeed) +void DiveCartesianAxis::setPosition(const QRectF &rectIn) { rect = rectIn; switch (position) { @@ -310,7 +304,7 @@ void DiveCartesianAxis::animateChangeLine(const QRectF &rectIn, int animSpeed) setLine(QLineF(rect.bottomLeft(), rect.bottomRight())); break; } - updateTicks(animSpeed); + changed = true; } double DiveCartesianAxis::Transform::to(double x) const diff --git a/profile-widget/divecartesianaxis.h b/profile-widget/divecartesianaxis.h index d9edd4277..1efc5b181 100644 --- a/profile-widget/divecartesianaxis.h +++ b/profile-widget/divecartesianaxis.h @@ -44,10 +44,9 @@ public: std::pair screenMinMax() const; qreal valueAt(const QPointF &p) const; qreal posAtValue(qreal value) const; - void animateChangeLine(const QRectF &rect, int animSpeed); + void setPosition(const QRectF &rect); void setTextVisible(bool arg1); void setLinesVisible(bool arg1); - void setLine(const QLineF &line); void updateTicks(int animSpeed); double width() const; // only for vertical axes double height() const; // only for horizontal axes diff --git a/profile-widget/profilescene.cpp b/profile-widget/profilescene.cpp index ad8441250..cca81637f 100644 --- a/profile-widget/profilescene.cpp +++ b/profile-widget/profilescene.cpp @@ -218,10 +218,8 @@ struct VerticalAxisLayout { bool visible; }; -void ProfileScene::updateAxes(bool instant, bool diveHasHeartBeat) +void ProfileScene::updateAxes(bool diveHasHeartBeat) { - int animSpeed = instant || printMode ? 0 : qPrefDisplay::animation_speed(); - // Calculate left and right border needed for the axes. // viz. the depth axis to the left and the partial pressure axis to the right. // Thus, calculating the "border" of the graph is trivial. @@ -248,7 +246,7 @@ void ProfileScene::updateAxes(bool instant, bool diveHasHeartBeat) } bottomBorder -= timeAxis->height(); - timeAxis->animateChangeLine(QRectF(leftBorder, topBorder, width, bottomBorder - topBorder), animSpeed); + timeAxis->setPosition(QRectF(leftBorder, topBorder, width, bottomBorder - topBorder)); if (prefs.tankbar) { bottomBorder -= tankItem->height(); @@ -290,14 +288,14 @@ void ProfileScene::updateAxes(bool instant, bool diveHasHeartBeat) if (!l.visible) continue; bottomBorder -= l.height * dpr; - l.axis->animateChangeLine(QRectF(leftBorder, bottomBorder, width, l.height * dpr), animSpeed); + l.axis->setPosition(QRectF(leftBorder, bottomBorder, width, l.height * dpr)); } height = bottomBorder - topBorder; - profileYAxis->animateChangeLine(QRectF(leftBorder, topBorder, width, height), animSpeed); + profileYAxis->setPosition(QRectF(leftBorder, topBorder, width, height)); // The cylinders are displayed in the 24-80% region of the profile - cylinderPressureAxis->animateChangeLine(QRectF(leftBorder, topBorder + 0.24 * height, width, 0.56 * height), animSpeed); + cylinderPressureAxis->setPosition(QRectF(leftBorder, topBorder + 0.24 * height, width, 0.56 * height)); // Set scale factors depending on locale. // The conversion calls, such as mm_to_feet(), will be optimized away. @@ -371,7 +369,7 @@ void ProfileScene::plotDive(const struct dive *dIn, int dcIn, DivePlannerPointsM bool hasHeartBeat = plotInfo.maxhr; updateVisibility(hasHeartBeat); - updateAxes(instant, hasHeartBeat); + updateAxes(hasHeartBeat); int newMaxtime = get_maxtime(&plotInfo); if (calcMax || newMaxtime > maxtime) diff --git a/profile-widget/profilescene.h b/profile-widget/profilescene.h index 81856a141..872a676c0 100644 --- a/profile-widget/profilescene.h +++ b/profile-widget/profilescene.h @@ -60,7 +60,7 @@ private: PartialPressureGasItem *createPPGas(int column, color_index_t color, color_index_t colorAlert, const double *thresholdSettingsMin, const double *thresholdSettingsMax); void updateVisibility(bool diveHasHeartBeat); // Update visibility of non-interactive chart features according to preferences - void updateAxes(bool instant, bool diveHasHeartBeat); // Update axes according to preferences + void updateAxes(bool diveHasHeartBeat); // Update axes according to preferences friend class ProfileWidget2; // For now, give the ProfileWidget full access to the objects on the scene double dpr; // Device Pixel Ratio. A DPR of one corresponds to a "standard" PC screen.