diff --git a/Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp b/Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp index 0b0a19b19..d2c8e6bae 100644 --- a/Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "statistics/view/abstract_chart_view.h" #include "data/data_statistics_chart.h" +#include "statistics/chart_lines_filter_controller.h" namespace Statistic { @@ -65,4 +66,37 @@ auto AbstractChartView::linesFilterController() const return _linesFilterController; } +AbstractChartView::HeightLimits DefaultHeightLimits( + const DoubleLineRatios &ratios, + const std::shared_ptr &linesFilter, + 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 (!linesFilter->isEnabled(l.id)) { + continue; + } + const auto r = ratios.ratio(l.id); + const auto lineMax = l.segmentTree.rMaxQ(xIndices.min, xIndices.max); + const auto lineMin = l.segmentTree.rMinQ(xIndices.min, xIndices.max); + maxValue = std::max(int(lineMax * r), maxValue); + minValue = std::min(int(lineMin * r), minValue); + + maxValueFull = std::max(int(l.maxValue * r), maxValueFull); + minValueFull = std::min(int(l.minValue * r), minValueFull); + } + if (maxValue == minValue) { + maxValue = chartData.maxValue; + minValue = chartData.minValue; + } + return { + .full = Limits{ float64(minValueFull), float64(maxValueFull) }, + .ranged = Limits{ float64(minValue), float64(maxValue) }, + }; +} + } // namespace Statistic diff --git a/Telegram/SourceFiles/statistics/view/abstract_chart_view.h b/Telegram/SourceFiles/statistics/view/abstract_chart_view.h index 07d84fb09..32b5783ec 100644 --- a/Telegram/SourceFiles/statistics/view/abstract_chart_view.h +++ b/Telegram/SourceFiles/statistics/view/abstract_chart_view.h @@ -118,4 +118,10 @@ private: }; +AbstractChartView::HeightLimits DefaultHeightLimits( + const DoubleLineRatios &ratios, + const std::shared_ptr &linesFilter, + Data::StatisticalChart &chartData, + Limits xIndices); + } // namespace Statistic diff --git a/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp b/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp index e36ae6312..de0c882f2 100644 --- a/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp @@ -214,32 +214,11 @@ AbstractChartView::HeightLimits LinearChartView::heightLimits( _cachedLineRatios.init(chartData); } - auto minValue = std::numeric_limits::max(); - auto maxValue = 0; - - auto minValueFull = std::numeric_limits::max(); - auto maxValueFull = 0; - for (auto &l : chartData.lines) { - if (!linesFilterController()->isEnabled(l.id)) { - continue; - } - const auto r = _cachedLineRatios.ratio(l.id); - const auto lineMax = l.segmentTree.rMaxQ(xIndices.min, xIndices.max); - const auto lineMin = l.segmentTree.rMinQ(xIndices.min, xIndices.max); - maxValue = std::max(int(lineMax * r), maxValue); - minValue = std::min(int(lineMin * r), minValue); - - maxValueFull = std::max(int(l.maxValue * r), maxValueFull); - minValueFull = std::min(int(l.minValue * r), minValueFull); - } - if (maxValue == minValue) { - maxValue = chartData.maxValue; - minValue = chartData.minValue; - } - return { - .full = Limits{ float64(minValueFull), float64(maxValueFull) }, - .ranged = Limits{ float64(minValue), float64(maxValue) }, - }; + return DefaultHeightLimits( + _cachedLineRatios, + linesFilterController(), + chartData, + xIndices); } } // namespace Statistic