From 361d269bf3de158a8754935c715559928a4d8008 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 25 Aug 2023 00:08:59 +0300 Subject: [PATCH] Added support of custom header in chart widget with zoomed chart. --- Telegram/Resources/langs/lang.strings | 1 + .../SourceFiles/statistics/chart_widget.cpp | 33 +++++++++++++++---- .../SourceFiles/statistics/chart_widget.h | 2 +- .../SourceFiles/statistics/statistics.style | 6 ++++ .../SourceFiles/statistics/statistics_box.cpp | 2 +- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 619d8ed8f..6019915b4 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -4066,6 +4066,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_stories_link_invalid" = "This link is broken or has expired."; "lng_stats_title" = "Statistics"; +"lng_stats_zoom_out" = "Zoom Out"; "lng_chart_title_member_count" = "Growth"; "lng_chart_title_join" = "Followers"; diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index 13143b534..c9fc0e088 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/show_animation.h" #include "base/qt/qt_key_modifiers.h" +#include "lang/lang_keys.h" #include "statistics/chart_lines_filter_widget.h" #include "statistics/linear_chart_view.h" #include "statistics/point_details_widget.h" @@ -223,6 +224,8 @@ void ChartWidget::Header::setRightInfo(QString rightInfo) { void ChartWidget::Header::paintEvent(QPaintEvent *e) { auto p = Painter(this); + p.fillRect(rect(), st::boxBg); + p.setPen(st::boxTextFg); const auto top = (height() - st::statisticsHeaderTitleTextStyle.font->height) / 2; @@ -1317,7 +1320,9 @@ void ChartWidget::setTitle(rpl::producer &&title) { }, _header->lifetime()); } -void ChartWidget::setZoomedChartData(Data::StatisticalChart chartData) { +void ChartWidget::setZoomedChartData( + Data::StatisticalChart chartData, + float64 x) { _zoomedChartWidget = base::make_unique_q( dynamic_cast(parentWidget())); _zoomedChartWidget->setChartData(std::move(chartData)); @@ -1328,13 +1333,21 @@ void ChartWidget::setZoomedChartData(Data::StatisticalChart chartData) { _zoomedChartWidget->show(); _zoomedChartWidget->resizeToWidth(width()); + const auto customHeader = Ui::CreateChild
( + _zoomedChartWidget.get()); + const auto xIndex = std::distance( + begin(_chartData.x), + ranges::find(_chartData.x, x)); + if ((xIndex >= 0) && (xIndex < _chartData.x.size())) { + customHeader->setRightInfo(_chartData.getDayString(xIndex)); + } + const auto zoomOutButton = Ui::CreateChild( - _zoomedChartWidget.get(), - rpl::single(QString("Zoom Out")), - st::defaultActiveButton); - Ui::Animations::ShowWidgets({ _zoomedChartWidget.get(), zoomOutButton }); - Ui::Animations::HideWidgets({ this }); - zoomOutButton->moveToLeft(0, 0); + customHeader, + tr::lng_stats_zoom_out(), + st::statisticsHeaderButton); + zoomOutButton->setTextTransform( + Ui::RoundButton::TextTransform::NoTransform); zoomOutButton->setClickedCallback([=] { shownValue( ) | rpl::start_with_next([=](bool shown) { @@ -1345,6 +1358,12 @@ void ChartWidget::setZoomedChartData(Data::StatisticalChart chartData) { Ui::Animations::ShowWidgets({ this }); Ui::Animations::HideWidgets({ _zoomedChartWidget.get() }); }); + + Ui::Animations::ShowWidgets({ _zoomedChartWidget.get(), customHeader }); + Ui::Animations::HideWidgets({ this }); + + customHeader->setGeometry(0, 0, width(), st::statisticsChartHeaderHeight); + zoomOutButton->moveToLeft(0, 0); } void ChartWidget::addHorizontalLine(Limits newHeight, bool animated) { diff --git a/Telegram/SourceFiles/statistics/chart_widget.h b/Telegram/SourceFiles/statistics/chart_widget.h index f96bb865e..d07ee0b79 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.h +++ b/Telegram/SourceFiles/statistics/chart_widget.h @@ -27,7 +27,7 @@ public: void setChartData(Data::StatisticalChart chartData); void setTitle(rpl::producer &&title); - void setZoomedChartData(Data::StatisticalChart chartData); + void setZoomedChartData(Data::StatisticalChart chartData, float64 x); void addHorizontalLine(Limits newHeight, bool animated); [[nodiscard]] rpl::producer zoomRequests(); diff --git a/Telegram/SourceFiles/statistics/statistics.style b/Telegram/SourceFiles/statistics/statistics.style index 4fdd1a27d..7612043c5 100644 --- a/Telegram/SourceFiles/statistics/statistics.style +++ b/Telegram/SourceFiles/statistics/statistics.style @@ -48,3 +48,9 @@ statisticsHeaderTitleTextStyle: TextStyle(defaultTextStyle) { statisticsHeaderDatesTextStyle: TextStyle(defaultTextStyle) { font: font(11px semibold); } +statisticsHeaderButton: RoundButton(defaultLightButton) { + width: -14px; + height: statisticsChartHeaderHeight; + textTop: 2px; + font: font(11px semibold); +} diff --git a/Telegram/SourceFiles/statistics/statistics_box.cpp b/Telegram/SourceFiles/statistics/statistics_box.cpp index eac0ef6eb..9aa7c342f 100644 --- a/Telegram/SourceFiles/statistics/statistics_box.cpp +++ b/Telegram/SourceFiles/statistics/statistics_box.cpp @@ -37,7 +37,7 @@ void StatisticsBox(not_null box, not_null peer) { ) | rpl::start_with_next_error_done([=]( const Data::StatisticalGraph &graph) { if (graph.chart) { - widget->setZoomedChartData(graph.chart); + widget->setZoomedChartData(graph.chart, x); } else if (!graph.error.isEmpty()) { Ui::Toast::Show( box->uiShow()->toastParent(),