From 40ab042fb56115fd9ea7903074e39c6851ee3472 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 11 Jul 2023 03:58:46 +0300 Subject: [PATCH] Added support of very large values in PointDetailsWidget. --- .../SourceFiles/statistics/chart_widget.cpp | 18 +++++++-- .../statistics/point_details_widget.cpp | 39 +++++++++++++++++-- .../statistics/point_details_widget.h | 3 +- .../SourceFiles/statistics/statistics.style | 1 - 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index 60eaee8e2..1d2e83b32 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -823,7 +823,13 @@ void ChartWidget::setupDetails() { } _details.widget = base::make_unique_q( this, - _chartData); + _chartData, + FindHeightLimitsBetweenXLimits( + _chartData, + { + _chartData.xPercentage.front(), + _chartData.xPercentage.back(), + }).max); _chartArea->mouseStateChanged( ) | rpl::start_with_next([=](const RpMouseWidget::State &state) { @@ -856,9 +862,13 @@ void ChartWidget::setupDetails() { *nearestXPercentageIt); const auto xLeft = _details.currentX - _details.widget->width(); - const auto x = (xLeft < 0) - ? (_details.currentX) - : xLeft; + const auto x = (xLeft >= 0) + ? xLeft + : ((_details.currentX + + _details.widget->width() + - _chartArea->width()) > 0) + ? 0 + : _details.currentX; _details.widget->moveToLeft(x, _chartArea->y()); _details.widget->setXIndex(nearestXIndex); _details.widget->show(); diff --git a/Telegram/SourceFiles/statistics/point_details_widget.cpp b/Telegram/SourceFiles/statistics/point_details_widget.cpp index 2d1bc123c..82c5eedcd 100644 --- a/Telegram/SourceFiles/statistics/point_details_widget.cpp +++ b/Telegram/SourceFiles/statistics/point_details_widget.cpp @@ -17,22 +17,53 @@ namespace Statistic { PointDetailsWidget::PointDetailsWidget( not_null parent, - const Data::StatisticalChart &chartData) + const Data::StatisticalChart &chartData, + float64 maxAbsoluteValue) : Ui::RpWidget(parent) , _chartData(chartData) , _textStyle(st::statisticsDetailsPopupStyle) , _headerStyle(st::semiboldTextStyle) { + const auto calculatedWidth = [&]{ + const auto maxValueText = Ui::Text::String( + _textStyle, + QString("%L1").arg(maxAbsoluteValue)); + const auto maxValueTextWidth = maxValueText.maxWidth(); + + auto maxNameTextWidth = 0; + for (const auto &dataLine : _chartData.lines) { + const auto maxNameText = Ui::Text::String( + _textStyle, + dataLine.name); + maxNameTextWidth = std::max( + maxNameText.maxWidth(), + maxNameTextWidth); + } + { + const auto maxHeaderText = Ui::Text::String( + _headerStyle, + _chartData.getDayString(0)); + maxNameTextWidth = std::max( + maxHeaderText.maxWidth() + + st::statisticsDetailsPopupPadding.left(), + maxNameTextWidth); + } + return maxValueTextWidth + + rect::m::sum::h(st::statisticsDetailsPopupMargins) + + rect::m::sum::h(st::statisticsDetailsPopupPadding) + + st::statisticsDetailsPopupPadding.left() // Between strings. + + maxNameTextWidth; + }(); sizeValue( ) | rpl::start_with_next([=](const QSize &s) { const auto fullRect = s.isNull() - ? Rect(Size(st::statisticsDetailsPopupWidth)) + ? Rect(Size(calculatedWidth)) : Rect(s); _innerRect = fullRect - st::statisticsDetailsPopupPadding; _textRect = _innerRect - st::statisticsDetailsPopupMargins; }, lifetime()); resize( - st::statisticsDetailsPopupWidth, + calculatedWidth, lineYAt(chartData.lines.size()) + st::statisticsDetailsPopupMargins.bottom()); } @@ -55,7 +86,7 @@ void PointDetailsWidget::setXIndex(int xIndex) { textLine.name.setText(_textStyle, dataLine.name); textLine.value.setText( _textStyle, - QString::number(dataLine.y[xIndex])); + QString("%L1").arg(dataLine.y[xIndex])); textLine.valueColor = QColor(dataLine.color); _lines.push_back(std::move(textLine)); } diff --git a/Telegram/SourceFiles/statistics/point_details_widget.h b/Telegram/SourceFiles/statistics/point_details_widget.h index 64eb14e75..d31062522 100644 --- a/Telegram/SourceFiles/statistics/point_details_widget.h +++ b/Telegram/SourceFiles/statistics/point_details_widget.h @@ -16,7 +16,8 @@ class PointDetailsWidget : public Ui::RpWidget { public: PointDetailsWidget( not_null parent, - const Data::StatisticalChart &chartData); + const Data::StatisticalChart &chartData, + float64 maxAbsoluteValue); [[nodiscard]] int xIndex() const; void setXIndex(int xIndex); diff --git a/Telegram/SourceFiles/statistics/statistics.style b/Telegram/SourceFiles/statistics/statistics.style index 19c5bc181..887cccf73 100644 --- a/Telegram/SourceFiles/statistics/statistics.style +++ b/Telegram/SourceFiles/statistics/statistics.style @@ -10,7 +10,6 @@ using "ui/basic.style"; using "window/window.style"; using "ui/widgets/widgets.style"; -statisticsDetailsPopupWidth: 135px; statisticsDetailsPopupMargins: margins(8px, 8px, 8px, 8px); statisticsDetailsPopupPadding: margins(6px, 6px, 6px, 6px); statisticsDetailsPopupMidLineSpace: 8px;