From 5ea066e6a7e21b3b947f1957e16d9256647e569b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 17 Nov 2023 03:15:30 +0300 Subject: [PATCH] Moved class of line ratio for double linear chart from private space. --- .../statistics/view/abstract_chart_view.cpp | 68 +++++++++++++++++++ .../statistics/view/abstract_chart_view.h | 12 ++++ .../statistics/view/linear_chart_view.cpp | 34 ++-------- .../statistics/view/linear_chart_view.h | 4 +- 4 files changed, 88 insertions(+), 30 deletions(-) create mode 100644 Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp diff --git a/Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp b/Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp new file mode 100644 index 000000000..0b0a19b19 --- /dev/null +++ b/Telegram/SourceFiles/statistics/view/abstract_chart_view.cpp @@ -0,0 +1,68 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "statistics/statistics_common.h" +#include "statistics/view/abstract_chart_view.h" + +#include "data/data_statistics_chart.h" + +namespace Statistic { + +bool CachedSelectedPoints::isSame(int x, const PaintContext &c) const { + return (lastXIndex == x) + && (lastHeightLimits.min == c.heightLimits.min) + && (lastHeightLimits.max == c.heightLimits.max) + && (lastXLimits.min == c.xPercentageLimits.min) + && (lastXLimits.max == c.xPercentageLimits.max); +} + +DoubleLineRatios::DoubleLineRatios(bool isDouble) { + first = second = (isDouble ? 0 : 1); +} + +void DoubleLineRatios::init(const Data::StatisticalChart &chartData) { + if (chartData.lines.size() != 2) { + first = 1.; + second = 1.; + } else { + const auto firstMax = chartData.lines.front().maxValue; + const auto secondMax = chartData.lines.back().maxValue; + if (firstMax > secondMax) { + first = 1.; + second = firstMax / float64(secondMax); + } else { + first = secondMax / float64(firstMax); + second = 1.; + } + } +} + +float64 DoubleLineRatios::ratio(int lineId) const { + return (lineId == 1) ? first : second; +} + +void AbstractChartView::setUpdateCallback(Fn callback) { + _updateCallback = std::move(callback); +} + +void AbstractChartView::update() { + if (_updateCallback) { + _updateCallback(); + } +} + +void AbstractChartView::setLinesFilterController( + std::shared_ptr c) { + _linesFilterController = std::move(c); +} + +auto AbstractChartView::linesFilterController() const +-> std::shared_ptr { + return _linesFilterController; +} + +} // namespace Statistic diff --git a/Telegram/SourceFiles/statistics/view/abstract_chart_view.h b/Telegram/SourceFiles/statistics/view/abstract_chart_view.h index 3c6f7ce6f..07d84fb09 100644 --- a/Telegram/SourceFiles/statistics/view/abstract_chart_view.h +++ b/Telegram/SourceFiles/statistics/view/abstract_chart_view.h @@ -34,6 +34,18 @@ struct CachedSelectedPoints final { base::flat_map points; }; +class DoubleLineRatios final : std::pair { +public: + DoubleLineRatios(bool isDouble); + + operator bool() const { + return first > 0; + } + + void init(const Data::StatisticalChart &chartData); + [[nodiscard]] float64 ratio(int lineId) const; +}; + class AbstractChartView { public: virtual ~AbstractChartView() = default; diff --git a/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp b/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp index 50af763a8..e36ae6312 100644 --- a/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/view/linear_chart_view.cpp @@ -18,17 +18,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Statistic { namespace { -[[nodiscard]] float64 Ratio( - const LinearChartView::CachedLineRatios &ratios, - int id) { - return (id == 1) ? ratios.first : ratios.second; -} - void PaintChartLine( QPainter &p, int lineIndex, const PaintContext &c, - const LinearChartView::CachedLineRatios &ratios) { + const DoubleLineRatios &ratios) { const auto &line = c.chartData.lines[lineIndex]; auto chartPoints = QPolygonF(); @@ -39,7 +33,7 @@ void PaintChartLine( float64(c.chartData.xPercentage.size() - 1), c.xIndices.max + kOffset)); - const auto ratio = Ratio(ratios, line.id); + const auto ratio = ratios.ratio(line.id); for (auto i = localStart; i <= localEnd; i++) { if (line.y[i] < 0) { @@ -63,7 +57,7 @@ void PaintChartLine( } // namespace LinearChartView::LinearChartView(bool isDouble) -: _cachedLineRatios(CachedLineRatios{ isDouble ? 0 : 1, isDouble ? 0 : 1 }) { +: _cachedLineRatios(isDouble) { } LinearChartView::~LinearChartView() = default; @@ -148,7 +142,7 @@ void LinearChartView::paintSelectedXIndex( || (lineAlpha < 1. && !linesFilter->isEnabled(line.id)); if (!useCache) { // Calculate. - const auto r = Ratio(_cachedLineRatios, line.id); + const auto r = _cachedLineRatios.ratio(line.id); const auto xPoint = c.rect.width() * ((c.chartData.xPercentage[i] - c.xPercentageLimits.min) / (c.xPercentageLimits.max - c.xPercentageLimits.min)); @@ -216,22 +210,8 @@ int LinearChartView::findXIndexByPosition( AbstractChartView::HeightLimits LinearChartView::heightLimits( Data::StatisticalChart &chartData, Limits xIndices) { - if (!_cachedLineRatios.first) { - // Double Linear calculation. - if (chartData.lines.size() != 2) { - _cachedLineRatios.first = 1.; - _cachedLineRatios.second = 1.; - } else { - const auto firstMax = chartData.lines.front().maxValue; - const auto secondMax = chartData.lines.back().maxValue; - if (firstMax > secondMax) { - _cachedLineRatios.first = 1.; - _cachedLineRatios.second = firstMax / float64(secondMax); - } else { - _cachedLineRatios.first = secondMax / float64(firstMax); - _cachedLineRatios.second = 1.; - } - } + if (!_cachedLineRatios) { + _cachedLineRatios.init(chartData); } auto minValue = std::numeric_limits::max(); @@ -243,7 +223,7 @@ AbstractChartView::HeightLimits LinearChartView::heightLimits( if (!linesFilterController()->isEnabled(l.id)) { continue; } - const auto r = Ratio(_cachedLineRatios, l.id); + const auto r = _cachedLineRatios.ratio(l.id); const auto lineMax = l.segmentTree.rMaxQ(xIndices.min, xIndices.max); const auto lineMin = l.segmentTree.rMinQ(xIndices.min, xIndices.max); maxValue = std::max(int(lineMax * r), maxValue); diff --git a/Telegram/SourceFiles/statistics/view/linear_chart_view.h b/Telegram/SourceFiles/statistics/view/linear_chart_view.h index f7e127125..8a7ff89ce 100644 --- a/Telegram/SourceFiles/statistics/view/linear_chart_view.h +++ b/Telegram/SourceFiles/statistics/view/linear_chart_view.h @@ -20,8 +20,6 @@ struct Limits; class LinearChartView final : public AbstractChartView { public: - using CachedLineRatios = std::pair; - LinearChartView(bool isDouble); ~LinearChartView() override final; @@ -44,7 +42,7 @@ public: Limits xIndices) override; private: - CachedLineRatios _cachedLineRatios; + DoubleLineRatios _cachedLineRatios; [[nodiscard]] float64 lineRatio() const;