From b261d23645f7dfe2862909f7a187f8558652baf3 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 26 Sep 2023 03:06:48 +0300 Subject: [PATCH] Fixed display of zoomed days in pie chart view. --- .../SourceFiles/statistics/chart_widget.cpp | 27 +++----------- .../statistics/view/stack_chart_common.cpp | 35 +++++++++++++++++++ .../statistics/view/stack_chart_common.h | 5 +++ .../view/stack_linear_chart_view.cpp | 21 ++++------- 4 files changed, 52 insertions(+), 36 deletions(-) diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index b1d4a10be..30c60d135 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "statistics/point_details_widget.h" #include "statistics/view/abstract_chart_view.h" #include "statistics/view/chart_view_factory.h" +#include "statistics/view/stack_chart_common.h" #include "ui/abstract_button.h" #include "ui/effects/animation_value_f.h" #include "ui/painter.h" @@ -1270,28 +1271,10 @@ void ChartWidget::processLocalZoom(int xIndex) { const auto finish = [=](const Limits &zoomLimitIndices) { _footer->xPercentageLimitsChange( ) | rpl::start_with_next([=](const Limits &l) { - const auto zoomLimit = Limits{ - _chartData.xPercentage[zoomLimitIndices.min], - _chartData.xPercentage[zoomLimitIndices.max], - }; - const auto offset = (zoomLimit.max == 1.) ? 0 : -1; - const auto minIt = ranges::upper_bound( - _chartData.xPercentage, - anim::interpolateF(zoomLimit.min, zoomLimit.max, l.min)); - const auto maxIt = ranges::upper_bound( - _chartData.xPercentage, - anim::interpolateF(zoomLimit.min, zoomLimit.max, l.max)); - const auto start = begin(_chartData.xPercentage); - const auto result = Limits{ - .min = std::clamp( - float64(std::distance(start, minIt) + offset), - zoomLimitIndices.min, - zoomLimitIndices.max), - .max = std::clamp( - float64(std::distance(start, maxIt) + offset), - zoomLimitIndices.min, - zoomLimitIndices.max), - }; + const auto result = FindStackXIndicesFromRawXPercentages( + _chartData, + l, + zoomLimitIndices); header->setRightInfo(HeaderRightInfo(_chartData, result)); header->update(); }, header->lifetime()); diff --git a/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp b/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp index 38e93a2b6..436ea64a3 100644 --- a/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp +++ b/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_statistics.h" #include "statistics/statistics_common.h" +#include "ui/effects/animation_value_f.h" namespace Statistic { @@ -30,4 +31,38 @@ LeftStartAndStep ComputeLeftStartAndStep( return { leftStart, w }; } +Limits FindStackXIndicesFromRawXPercentages( + const Data::StatisticalChart &chartData, + const Limits &rawXPercentageLimits, + const Limits &zoomedInLimitXIndices) { + const auto zoomLimit = Limits{ + chartData.xPercentage[zoomedInLimitXIndices.min], + chartData.xPercentage[zoomedInLimitXIndices.max], + }; + const auto offset = (zoomLimit.max == 1.) ? 0 : -1; + const auto minIt = ranges::upper_bound( + chartData.xPercentage, + anim::interpolateF( + zoomLimit.min, + zoomLimit.max, + rawXPercentageLimits.min)); + const auto maxIt = ranges::upper_bound( + chartData.xPercentage, + anim::interpolateF( + zoomLimit.min, + zoomLimit.max, + rawXPercentageLimits.max)); + const auto start = begin(chartData.xPercentage); + return { + .min = std::clamp( + float64(std::distance(start, minIt) + offset), + zoomedInLimitXIndices.min, + zoomedInLimitXIndices.max), + .max = std::clamp( + float64(std::distance(start, maxIt) + offset), + zoomedInLimitXIndices.min, + zoomedInLimitXIndices.max), + }; +} + } // namespace Statistic diff --git a/Telegram/SourceFiles/statistics/view/stack_chart_common.h b/Telegram/SourceFiles/statistics/view/stack_chart_common.h index fde77b85a..7a06c4686 100644 --- a/Telegram/SourceFiles/statistics/view/stack_chart_common.h +++ b/Telegram/SourceFiles/statistics/view/stack_chart_common.h @@ -26,4 +26,9 @@ struct LeftStartAndStep final { const QRect &rect, float64 xIndexStart); +[[nodiscard]] Limits FindStackXIndicesFromRawXPercentages( + const Data::StatisticalChart &chartData, + const Limits &rawXPercentageLimits, + const Limits &zoomedInLimitXIndices); + } // namespace Statistic diff --git a/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp b/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp index 54d8c5372..e63a8b878 100644 --- a/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp @@ -138,21 +138,14 @@ void StackLinearChartView::applyParts(const std::vector &parts) { } void StackLinearChartView::saveZoomRange(const PaintContext &c) { - const auto zoomedXPercentage = Limits{ - anim::interpolateF( - _transition.zoomedInLimit.min, - _transition.zoomedInLimit.max, - c.xPercentageLimits.min), - anim::interpolateF( - _transition.zoomedInLimit.min, - _transition.zoomedInLimit.max, - c.xPercentageLimits.max), + _transition.zoomedInRangeXIndices = FindStackXIndicesFromRawXPercentages( + c.chartData, + c.xPercentageLimits, + _transition.zoomedInLimitXIndices); + _transition.zoomedInRange = { + c.chartData.xPercentage[_transition.zoomedInRangeXIndices.min], + c.chartData.xPercentage[_transition.zoomedInRangeXIndices.max], }; - const auto zoomedXIndices = FindNearestElements( - c.chartData.xPercentage, - zoomedXPercentage); - _transition.zoomedInRangeXIndices = zoomedXIndices; - _transition.zoomedInRange = zoomedXPercentage; } void StackLinearChartView::savePieTextParts(const PaintContext &c) {