diff --git a/Telegram/SourceFiles/data/data_statistics.h b/Telegram/SourceFiles/data/data_statistics.h index fbfe0f913..d411d8704 100644 --- a/Telegram/SourceFiles/data/data_statistics.h +++ b/Telegram/SourceFiles/data/data_statistics.h @@ -57,7 +57,8 @@ struct StatisticalChart { std::vector y; Statistic::SegmentTree segmentTree; - QString id; + int id = 0; + QString idString; QString name; int maxValue = 0; int minValue = std::numeric_limits::max(); diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index 1e8d80954..a439def59 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -528,6 +528,7 @@ ChartWidget::ChartAnimationController::ChartAnimationController( void ChartWidget::ChartAnimationController::setXPercentageLimits( Data::StatisticalChart &chartData, Limits xPercentageLimits, + std::vector &chartLinesViewContext, crl::time now) { if ((_animationValueXMin.to() == xPercentageLimits.min) && (_animationValueXMax.to() == xPercentageLimits.max)) { @@ -550,6 +551,24 @@ void ChartWidget::ChartAnimationController::setXPercentageLimits( float64(FindMaxValue(chartData, startXIndex, endXIndex)), }; + { + auto minValue = std::numeric_limits::max(); + auto maxValue = 0; + for (auto &l : chartData.lines) { + const auto it = ranges::find_if(chartLinesViewContext, [&](const auto &a) { + return a.id == l.id; + }); + if (it != end(chartLinesViewContext) && !it->enabled) { + 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); + } + _finalHeightLimits = { float64(minValue), float64(maxValue) }; + } + _animationValueHeightMin = anim::value( _animationValueHeightMin.current(), _finalHeightLimits.min); @@ -612,7 +631,8 @@ void ChartWidget::ChartAnimationController::restartBottomLineAlpha() { void ChartWidget::ChartAnimationController::tick( crl::time now, std::vector &horizontalLines, - std::vector &dateLines) { + std::vector &dateLines, + std::vector &chartLinesViewContext) { if (!_animation.animating()) { return; } @@ -669,7 +689,33 @@ void ChartWidget::ChartAnimationController::tick( const auto bottomLineAlphaFinished = isFinished( _animValueBottomLineAlpha); - if (xFinished && yFinished && alphaFinished && bottomLineAlphaFinished) { + auto chartLinesViewContextFinished = false; + { + auto finishedCount = 0; + for (auto &viewLine : chartLinesViewContext) { + if (!viewLine.startedAt) { + continue; + } + const auto progress = (now - viewLine.startedAt) + / (kXExpandingDuration * 2); + viewLine.alpha = std::clamp( + viewLine.enabled ? progress : (1. - progress), + 0., + 1.); + if (progress >= 1.) { + finishedCount++; + } + } + chartLinesViewContextFinished = + (finishedCount == chartLinesViewContext.size()); + } + + + if (xFinished + && yFinished + && alphaFinished + && bottomLineAlphaFinished + && chartLinesViewContextFinished) { const auto &lines = horizontalLines.back().lines; if ((lines.front().absoluteValue == _animationValueHeightMin.to()) && lines.back().absoluteValue == _animationValueHeightMax.to()) { @@ -794,9 +840,41 @@ ChartWidget::ChartWidget(not_null parent) , _chartArea(base::make_unique_q(this)) , _footer(std::make_unique