From 64bb818fe903539392457d5ecfcf66055f2c3019 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 14 Jul 2023 20:13:42 +0300 Subject: [PATCH] Added initial display of footer while chart lines are filtering. --- .../SourceFiles/statistics/chart_widget.cpp | 128 +++++++++--------- .../SourceFiles/statistics/chart_widget.h | 5 + 2 files changed, 66 insertions(+), 67 deletions(-) diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index e11bdbf5c9..72b22e63a4 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -33,43 +33,6 @@ inline float64 InterpolationRatio(float64 from, float64 to, float64 result) { return (result - from) / (to - from); }; -[[nodiscard]] int FindMaxValue( - Data::StatisticalChart &chartData, - int startXIndex, - int endXIndex) { - auto maxValue = 0; - for (auto &l : chartData.lines) { - const auto lineMax = l.segmentTree.rMaxQ(startXIndex, endXIndex); - maxValue = std::max(lineMax, maxValue); - } - return maxValue; -} - -[[nodiscard]] int FindMinValue( - Data::StatisticalChart &chartData, - int startXIndex, - int endXIndex) { - auto minValue = std::numeric_limits::max(); - for (auto &l : chartData.lines) { - const auto lineMin = l.segmentTree.rMinQ(startXIndex, endXIndex); - minValue = std::min(lineMin, minValue); - } - return minValue; -} - -[[nodiscard]] Limits FindHeightLimitsBetweenXLimits( - Data::StatisticalChart &chartData, - const Limits &xPercentageLimits) { - const auto startXIndex = chartData.findStartIndex(xPercentageLimits.min); - const auto endXIndex = chartData.findEndIndex( - startXIndex, - xPercentageLimits.max); - return Limits{ - float64(FindMinValue(chartData, startXIndex, endXIndex)), - float64(FindMaxValue(chartData, startXIndex, endXIndex)), - }; -} - void PaintHorizontalLines( QPainter &p, const ChartHorizontalLinesData &horizontalLine, @@ -236,9 +199,6 @@ public: [[nodiscard]] rpl::producer xPercentageLimitsChange() const; [[nodiscard]] rpl::producer<> userInteractionFinished() const; - void setFullHeightLimits(Limits limits); - [[nodiscard]] const Limits &fullHeightLimits() const; - void setPaintChartCallback(PaintCallback paintChartCallback); protected: @@ -248,8 +208,6 @@ private: rpl::event_stream _xPercentageLimitsChange; rpl::event_stream<> _userInteractionFinished; - Limits _fullHeightLimits; - void prepareCache(int height); void moveSide(bool left, float64 x); @@ -513,14 +471,6 @@ rpl::producer<> ChartWidget::Footer::userInteractionFinished() const { return _userInteractionFinished.events(); } -void ChartWidget::Footer::setFullHeightLimits(Limits limits) { - _fullHeightLimits = std::move(limits); -} - -const Limits &ChartWidget::Footer::fullHeightLimits() const { - return _fullHeightLimits; -} - ChartWidget::ChartAnimationController::ChartAnimationController( Fn &&updateCallback) : _animation(std::move(updateCallback)) { @@ -548,14 +498,12 @@ void ChartWidget::ChartAnimationController::setXPercentageLimits( _animationValueXMax.to()); _currentXIndices = { float64(startXIndex), float64(endXIndex) }; - _finalHeightLimits = Limits{ - float64(FindMinValue(chartData, startXIndex, endXIndex)), - float64(FindMaxValue(chartData, startXIndex, 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 (!chartLinesViewContext.isEnabled(l.id)) { continue; @@ -564,8 +512,23 @@ void ChartWidget::ChartAnimationController::setXPercentageLimits( 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); } _finalHeightLimits = { float64(minValue), float64(maxValue) }; + if (!chartLinesViewContext.isFinished()) { + _animationValueFooterHeightMin = anim::value( + _animationValueFooterHeightMin.current(), + minValueFull); + _animationValueFooterHeightMax = anim::value( + _animationValueFooterHeightMax.current(), + maxValueFull); + } else if (!_animationValueFooterHeightMax.to()) { + // Will be finished in setChartData. + _animationValueFooterHeightMin = anim::value(0, minValueFull); + _animationValueFooterHeightMax = anim::value(0, maxValueFull); + } } _animationValueHeightMin = anim::value( @@ -612,6 +575,8 @@ void ChartWidget::ChartAnimationController::finish() { _animationValueXMax.finish(); _animationValueHeightMin.finish(); _animationValueHeightMax.finish(); + _animationValueFooterHeightMin.finish(); + _animationValueFooterHeightMax.finish(); _animValueYAlpha.finish(); _benchmark = {}; } @@ -721,6 +686,12 @@ void ChartWidget::ChartAnimationController::tick( _animationValueHeightMin.update(_dtCurrent.min, anim::easeInCubic); _animationValueHeightMax.update(_dtCurrent.max, anim::easeInCubic); _animValueYAlpha.update(dtAlpha, anim::easeInCubic); + _animationValueFooterHeightMin.update( + _dtCurrent.min, + anim::easeInCubic); + _animationValueFooterHeightMax.update( + _dtCurrent.max, + anim::easeInCubic); for (auto &horizontalLine : horizontalLines) { horizontalLine.computeRelative( @@ -787,6 +758,14 @@ Limits ChartWidget::ChartAnimationController::currentHeightLimits() const { }; } +auto ChartWidget::ChartAnimationController::currentFooterHeightLimits() const +-> Limits { + return { + _animationValueFooterHeightMin.current(), + _animationValueFooterHeightMax.current(), + }; +} + Limits ChartWidget::ChartAnimationController::finalHeightLimits() const { return _finalHeightLimits; } @@ -809,6 +788,13 @@ bool ChartWidget::ChartAnimationController::animating() const { return _animation.animating(); } +bool ChartWidget::ChartAnimationController::footerAnimating() const { + return (_animationValueFooterHeightMin.current() + != _animationValueFooterHeightMin.to()) + || (_animationValueFooterHeightMax.current() + != _animationValueFooterHeightMax.to()); +} + bool ChartWidget::ChartAnimationController::isFPSSlow() const { return _benchmark.lastFPSSlow; } @@ -822,7 +808,13 @@ ChartWidget::ChartWidget(not_null parent) : Ui::RpWidget(parent) , _chartArea(base::make_unique_q(this)) , _footer(std::make_unique