From 2ddc1ee2e16cdb44d54ff6041c56ffe2755f50b8 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 28 Aug 2023 01:17:30 +0300 Subject: [PATCH] Implemented calculation of chart height in stack chart view. --- .../statistics/view/stack_chart_view.cpp | 29 ++++++++++++++++++- .../statistics/view/stack_chart_view.h | 8 +++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Telegram/SourceFiles/statistics/view/stack_chart_view.cpp b/Telegram/SourceFiles/statistics/view/stack_chart_view.cpp index cff40d41e6..93c9cbcdb3 100644 --- a/Telegram/SourceFiles/statistics/view/stack_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/view/stack_chart_view.cpp @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "statistics/view/stack_chart_view.h" +#include "data/data_statistics.h" + namespace Statistic { namespace { } // namespace @@ -52,7 +54,32 @@ float64 StackChartView::alpha(int id) const { AbstractChartView::HeightLimits StackChartView::heightLimits( Data::StatisticalChart &chartData, Limits xIndices) { - return {}; + if (_cachedHeightLimits.ySum.empty()) { + _cachedHeightLimits.ySum.reserve(chartData.x.size()); + + auto maxValueFull = 0; + for (auto i = 0; i < chartData.x.size(); i++) { + auto sum = 0; + for (const auto &line : chartData.lines) { + if (isEnabled(line.id)) { + sum += line.y[i]; + } + } + _cachedHeightLimits.ySum.push_back(sum); + maxValueFull = std::max(sum, maxValueFull); + } + + _cachedHeightLimits.ySumSegmentTree = SegmentTree( + _cachedHeightLimits.ySum); + _cachedHeightLimits.full = { 0., float64(maxValueFull) }; + } + const auto max = _cachedHeightLimits.ySumSegmentTree.rMaxQ( + xIndices.min, + xIndices.max); + return { + .full = _cachedHeightLimits.full, + .ranged = { 0., float64(max) }, + }; } void StackChartView::tick(crl::time now) { diff --git a/Telegram/SourceFiles/statistics/view/stack_chart_view.h b/Telegram/SourceFiles/statistics/view/stack_chart_view.h index 39ca1e5c75..33bd5f7a22 100644 --- a/Telegram/SourceFiles/statistics/view/stack_chart_view.h +++ b/Telegram/SourceFiles/statistics/view/stack_chart_view.h @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "statistics/segment_tree.h" #include "statistics/statistics_common.h" #include "statistics/view/abstract_chart_view.h" @@ -51,6 +52,13 @@ public: void tick(crl::time now) override; +private: + struct { + Limits full; + std::vector ySum; + SegmentTree ySumSegmentTree; + } _cachedHeightLimits; + }; } // namespace Statistic