diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index 30c60d1357..261892e989 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -479,8 +479,9 @@ void ChartWidget::Footer::paintEvent(QPaintEvent *e) { } void ChartWidget::Footer::setXPercentageLimits(const Limits &xLimits) { - const auto left = xLimits.min * width(); - const auto right = xLimits.max * _width; + const auto left = xLimits.min * _widthBetweenSides; + const auto right = xLimits.max * _widthBetweenSides + + st::statisticsChartFooterSideWidth; moveSide(true, left); moveSide(false, right); fire(); diff --git a/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp b/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp index 436ea64a38..040025985a 100644 --- a/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp +++ b/Telegram/SourceFiles/statistics/view/stack_chart_common.cpp @@ -39,6 +39,10 @@ Limits FindStackXIndicesFromRawXPercentages( chartData.xPercentage[zoomedInLimitXIndices.min], chartData.xPercentage[zoomedInLimitXIndices.max], }; + // Due to a specificity of the stack chart plotting, + // the right edge has a special offset to the left. + // This reduces the number of displayed points by 1, + // but allows the last point to be displayed. const auto offset = (zoomLimit.max == 1.) ? 0 : -1; const auto minIt = ranges::upper_bound( chartData.xPercentage, diff --git a/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp b/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp index 3fd53b210b..2ed9365c90 100644 --- a/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/view/stack_linear_chart_view.cpp @@ -585,6 +585,7 @@ void StackLinearChartView::paintZoomedFooter( const auto leftStart = c.rect.x() + sideW; const auto &xPercentage = c.chartData.xPercentage; auto previousX = leftStart; + // Read FindStackXIndicesFromRawXPercentages. const auto offset = (xPercentage[zoomedEnd] == 1.) ? 0 : 1; for (auto i = zoomedStart; i <= zoomedEnd; i++) { auto sum = 0.; @@ -958,15 +959,21 @@ auto StackLinearChartView::maybeLocalZoom( xPercentage[_transition.zoomedInLimitXIndices.max], args.progress), }; + const auto oneDay = std::abs(xPercentage[localRangeIndex] + - xPercentage[localRangeIndex + ((xIndex == backIndex) ? -1 : 1)]); + // Read FindStackXIndicesFromRawXPercentages. + const auto offset = (_transition.zoomedInLimitXIndices.max == backIndex) + ? -oneDay + : 0.; const auto resultRange = Limits{ InterpolationRatio( _transition.zoomedInLimit.min, _transition.zoomedInLimit.max, - _transition.zoomedInRange.min), + _transition.zoomedInRange.min + oneDay * 0.25 + offset), InterpolationRatio( _transition.zoomedInLimit.min, _transition.zoomedInLimit.max, - _transition.zoomedInRange.max), + _transition.zoomedInRange.max + oneDay * 0.75 + offset), }; return { true, _transition.zoomedInLimitXIndices, resultRange }; }