diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index bc81da8e2..961018351 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -550,42 +550,32 @@ void ChartWidget::ChartAnimationController::setXPercentageLimits( _currentXIndices = { float64(startXIndex), float64(endXIndex) }; { - auto minValue = std::numeric_limits::max(); - auto maxValue = 0; - - auto minValueFull = std::numeric_limits::max(); - auto maxValueFull = 0; - for (auto &l : chartData.lines) { - if (!chartView->isEnabled(l.id)) { - continue; - } - const auto lineMax = l.segmentTree.rMaxQ(startXIndex, endXIndex); - const auto lineMin = l.segmentTree.rMinQ(startXIndex, endXIndex); - maxValue = std::max(lineMax, maxValue); - minValue = std::min(lineMin, minValue); - - maxValueFull = std::max(l.maxValue, maxValueFull); - minValueFull = std::min(l.minValue, minValueFull); - } - if (maxValue == minValue) { + const auto heightLimits = chartView->heightLimits( + chartData, + _currentXIndices); + if (heightLimits.ranged.min == heightLimits.ranged.max) { return; } _previousFullHeightLimits = _finalHeightLimits; - _finalHeightLimits = { float64(minValue), float64(maxValue) }; + _finalHeightLimits = heightLimits.ranged; if (!_previousFullHeightLimits.max) { _previousFullHeightLimits = _finalHeightLimits; } if (!chartView->isFinished()) { _animationValueFooterHeightMin = anim::value( _animationValueFooterHeightMin.current(), - minValueFull); + heightLimits.full.min); _animationValueFooterHeightMax = anim::value( _animationValueFooterHeightMax.current(), - maxValueFull); + heightLimits.full.max); } else if (!_animationValueFooterHeightMax.to()) { // Will be finished in setChartData. - _animationValueFooterHeightMin = anim::value(0, minValueFull); - _animationValueFooterHeightMax = anim::value(0, maxValueFull); + _animationValueFooterHeightMin = anim::value( + 0, + heightLimits.full.min); + _animationValueFooterHeightMax = anim::value( + 0, + heightLimits.full.max); } } diff --git a/Telegram/SourceFiles/statistics/view/abstract_chart_view.h b/Telegram/SourceFiles/statistics/view/abstract_chart_view.h index 669493012..bb06a19db 100644 --- a/Telegram/SourceFiles/statistics/view/abstract_chart_view.h +++ b/Telegram/SourceFiles/statistics/view/abstract_chart_view.h @@ -41,6 +41,15 @@ public: [[nodiscard]] virtual bool isFinished() const = 0; [[nodiscard]] virtual float64 alpha(int id) const = 0; + struct HeightLimits final { + Limits full; + Limits ranged; + }; + + [[nodiscard]] virtual HeightLimits heightLimits( + Data::StatisticalChart &chartData, + Limits xIndices) = 0; + virtual void tick(crl::time now) = 0; }; diff --git a/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp b/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp index 9971c0a68..4fc702231 100644 --- a/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp @@ -197,6 +197,32 @@ float64 LinearChartView::alpha(int id) const { return (it == end(_entries)) ? 1. : it->second.alpha; } +AbstractChartView::HeightLimits LinearChartView::heightLimits( + Data::StatisticalChart &chartData, + Limits xIndices) { + auto minValue = std::numeric_limits::max(); + auto maxValue = 0; + + auto minValueFull = std::numeric_limits::max(); + auto maxValueFull = 0; + for (auto &l : chartData.lines) { + if (!isEnabled(l.id)) { + continue; + } + const auto lineMax = l.segmentTree.rMaxQ(xIndices.min, xIndices.max); + const auto lineMin = l.segmentTree.rMinQ(xIndices.min, xIndices.max); + maxValue = std::max(lineMax, maxValue); + minValue = std::min(lineMin, minValue); + + maxValueFull = std::max(l.maxValue, maxValueFull); + minValueFull = std::min(l.minValue, minValueFull); + } + return { + .full = Limits{ float64(minValueFull), float64(maxValueFull) }, + .ranged = Limits{ float64(minValue), float64(maxValue) }, + }; +} + void LinearChartView::tick(crl::time now) { auto finishedCount = 0; auto idsToRemove = std::vector(); diff --git a/Telegram/SourceFiles/statistics/view/linear_chart_view.h b/Telegram/SourceFiles/statistics/view/linear_chart_view.h index de814d8f4..9ff75de2f 100644 --- a/Telegram/SourceFiles/statistics/view/linear_chart_view.h +++ b/Telegram/SourceFiles/statistics/view/linear_chart_view.h @@ -45,6 +45,10 @@ public: [[nodiscard]] bool isFinished() const override; [[nodiscard]] float64 alpha(int id) const override; + [[nodiscard]] HeightLimits heightLimits( + Data::StatisticalChart &chartData, + Limits xIndices) override; + void tick(crl::time now) override; private: