From f76f69b5cdb357c2f8e277ff1fa7219171c75f61 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 11 Jul 2023 02:24:02 +0300 Subject: [PATCH] Moved out details dots above horizontal line captions. --- .../SourceFiles/statistics/chart_widget.cpp | 25 +++++++++++++++---- .../statistics/linear_chart_view.cpp | 18 +++++-------- .../statistics/linear_chart_view.h | 2 +- .../statistics/statistics_common.h | 7 +++++- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index 4196d90bcf..2587cf0b81 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -646,6 +646,11 @@ void ChartWidget::setupChartArea() { } } + auto detailsPaintContext = DetailsPaintContext{ + .xIndex = (_details.widget && (detailsAlpha > 0.)) + ? _details.widget->xIndex() + : -1, + }; if (_chartData) { Statistic::PaintLinearChartView( p, @@ -653,16 +658,25 @@ void ChartWidget::setupChartArea() { _animationController.currentXLimits(), _animationController.currentHeightLimits(), chartRect, - { - _details.widget ? _details.widget->xIndex() : -1, - detailsAlpha, - }); + detailsPaintContext); } for (auto &horizontalLine : _horizontalLines) { PaintCaptionsToHorizontalLines(p, horizontalLine, chartRect); } + { + auto o = ScopedPainterOpacity(p, detailsAlpha); + for (const auto &dot : detailsPaintContext.dots) { + p.setBrush(st::boxBg); + p.setPen(QPen(dot.color, st::statisticsChartLineWidth)); + const auto r = st::statisticsDetailsDotRadius; + auto hq = PainterHighQualityEnabler(p); + p.drawEllipse(dot.point, r, r); + } + } + + p.setPen(st::boxTextFg); PaintBottomLine( p, _bottomLine.dates, @@ -750,6 +764,7 @@ void ChartWidget::setupFooter() { auto p = QPainter(_footer.get()); if (_chartData) { + auto detailsPaintContext = DetailsPaintContext{ .xIndex = -1 }; p.fillRect(_footer->rect(), st::boxBg); Statistic::PaintLinearChartView( p, @@ -757,7 +772,7 @@ void ChartWidget::setupFooter() { fullXLimits, _footer->fullHeightLimits(), _footer->rect(), - {}); + detailsPaintContext); } }, _footer->lifetime()); diff --git a/Telegram/SourceFiles/statistics/linear_chart_view.cpp b/Telegram/SourceFiles/statistics/linear_chart_view.cpp index 503f268a59..52ab5e7983 100644 --- a/Telegram/SourceFiles/statistics/linear_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/linear_chart_view.cpp @@ -22,7 +22,7 @@ void PaintLinearChartView( const Limits &xPercentageLimits, const Limits &heightLimits, const QRect &rect, - const DetailsPaintContext &detailsPaintContext) { + DetailsPaintContext &detailsPaintContext) { const auto currentMinHeight = rect.y(); // const auto currentMaxHeight = rect.height() + rect.y(); // @@ -36,7 +36,6 @@ void PaintLinearChartView( auto first = true; auto chartPath = QPainterPath(); - auto detailsDotPoint = QPointF(); const auto startXIndex = chartData.findStartIndex( xPercentageLimits.min); @@ -59,9 +58,11 @@ void PaintLinearChartView( const auto yPercentage = (line.y[i] - heightLimits.min) / float64(heightLimits.max - heightLimits.min); const auto yPoint = rect.y() + (1. - yPercentage) * rect.height(); - if ((i == detailsPaintContext.xIndex) - && detailsPaintContext.progress > 0.) { - detailsDotPoint = QPointF(xPoint, yPoint); + if (i == detailsPaintContext.xIndex) { + detailsPaintContext.dots.push_back({ + QPointF(xPoint, yPoint), + line.color, + }); } if (first) { first = false; @@ -72,13 +73,6 @@ void PaintLinearChartView( p.setPen(QPen(line.color, st::statisticsChartLineWidth)); p.setBrush(Qt::NoBrush); p.drawPath(chartPath); - - if (!detailsDotPoint.isNull()) { - ScopedPainterOpacity o(p, detailsPaintContext.progress); - p.setBrush(st::boxBg); - const auto r = st::statisticsDetailsDotRadius; - p.drawEllipse(detailsDotPoint, r, r); - } } p.setPen(st::boxTextFg); } diff --git a/Telegram/SourceFiles/statistics/linear_chart_view.h b/Telegram/SourceFiles/statistics/linear_chart_view.h index b08cf61f9d..5f9b849c39 100644 --- a/Telegram/SourceFiles/statistics/linear_chart_view.h +++ b/Telegram/SourceFiles/statistics/linear_chart_view.h @@ -22,6 +22,6 @@ void PaintLinearChartView( const Limits &xPercentageLimits, const Limits &heightLimits, const QRect &rect, - const DetailsPaintContext &detailsPaintContext); + DetailsPaintContext &detailsPaintContext); } // namespace Statistic diff --git a/Telegram/SourceFiles/statistics/statistics_common.h b/Telegram/SourceFiles/statistics/statistics_common.h index 9a49ca86b8..ac1d950895 100644 --- a/Telegram/SourceFiles/statistics/statistics_common.h +++ b/Telegram/SourceFiles/statistics/statistics_common.h @@ -17,7 +17,12 @@ struct Limits final { // Dot on line charts. struct DetailsPaintContext final { int xIndex = -1; - float64 progress = 0.; + + struct Dot { + QPointF point; + QColor color; + }; + std::vector dots; }; } // namespace Statistic