From da9720530a01272e6c7873636f748719ccea5a75 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 4 Oct 2023 05:06:58 +0300 Subject: [PATCH] Added ability to filter out lines from chart on demand from backend. --- .../SourceFiles/data/data_statistics_chart.h | 1 + .../statistics/chart_lines_filter_widget.cpp | 19 +++++++-------- .../statistics/chart_lines_filter_widget.h | 12 ++++++---- .../SourceFiles/statistics/chart_widget.cpp | 23 +++++++++++-------- .../statistics_data_deserialize.cpp | 9 ++++++++ 5 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Telegram/SourceFiles/data/data_statistics_chart.h b/Telegram/SourceFiles/data/data_statistics_chart.h index c14f8ceac..89b65e7da 100644 --- a/Telegram/SourceFiles/data/data_statistics_chart.h +++ b/Telegram/SourceFiles/data/data_statistics_chart.h @@ -41,6 +41,7 @@ struct StatisticalChart { QString colorKey; QColor color; QColor colorDark; + bool isHiddenOnStart = false; }; std::vector x; diff --git a/Telegram/SourceFiles/statistics/chart_lines_filter_widget.cpp b/Telegram/SourceFiles/statistics/chart_lines_filter_widget.cpp index 28fcddef8..c565c00de 100644 --- a/Telegram/SourceFiles/statistics/chart_lines_filter_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_lines_filter_widget.cpp @@ -200,20 +200,21 @@ void ChartLinesFilterWidget::resizeToWidth(int outerWidth) { } void ChartLinesFilterWidget::fillButtons( - const std::vector &texts, - const std::vector &colors, - const std::vector &ids) { - Expects(texts.size() == colors.size()); + const std::vector &buttonsData) { _buttons.clear(); - _buttons.reserve(texts.size()); - for (auto i = 0; i < texts.size(); i++) { + _buttons.reserve(buttonsData.size()); + for (auto i = 0; i < buttonsData.size(); i++) { + const auto &buttonData = buttonsData[i]; auto button = base::make_unique_q( this, - texts[i], - colors[i]); + buttonData.text, + buttonData.color); button->show(); - const auto id = ids[i]; + if (buttonData.disabled) { + button->setChecked(false, false); + } + const auto id = buttonData.id; button->setClickedCallback([=, raw = button.get()] { const auto checked = !raw->checked(); if (!checked) { diff --git a/Telegram/SourceFiles/statistics/chart_lines_filter_widget.h b/Telegram/SourceFiles/statistics/chart_lines_filter_widget.h index bd8994001..b27f13420 100644 --- a/Telegram/SourceFiles/statistics/chart_lines_filter_widget.h +++ b/Telegram/SourceFiles/statistics/chart_lines_filter_widget.h @@ -15,10 +15,14 @@ class ChartLinesFilterWidget final : public Ui::RpWidget { public: ChartLinesFilterWidget(not_null parent); - void fillButtons( - const std::vector &texts, - const std::vector &colors, - const std::vector &ids); + struct ButtonData final { + QString text; + QColor color; + int id = 0; + bool disabled = false; + }; + + void fillButtons(const std::vector &buttonsData); void resizeToWidth(int outerWidth); diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index 25d230524..bc402d89d 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -1390,19 +1390,22 @@ void ChartWidget::setupFilterButtons() { _filterButtons = base::make_unique_q(this); _filterButtons->show(); { - auto texts = std::vector(); - auto colors = std::vector(); - auto ids = std::vector(); - texts.reserve(_chartData.lines.size()); - colors.reserve(_chartData.lines.size()); - ids.reserve(_chartData.lines.size()); + auto data = std::vector(); + data.reserve(_chartData.lines.size()); for (const auto &line : _chartData.lines) { - texts.push_back(line.name); - colors.push_back(line.color); - ids.push_back(line.id); + data.push_back({ + line.name, + line.color, + line.id, + line.isHiddenOnStart, + }); + if (line.isHiddenOnStart) { + _linesFilterController->setEnabled(line.id, false, 1); + } } - _filterButtons->fillButtons(texts, colors, ids); + _filterButtons->fillButtons(data); + _linesFilterController->tick(1.); } _filterButtons->buttonEnabledChanges( diff --git a/Telegram/SourceFiles/statistics/statistics_data_deserialize.cpp b/Telegram/SourceFiles/statistics/statistics_data_deserialize.cpp index 78fe2ad03..6a43f4fd2 100644 --- a/Telegram/SourceFiles/statistics/statistics_data_deserialize.cpp +++ b/Telegram/SourceFiles/statistics/statistics_data_deserialize.cpp @@ -30,6 +30,14 @@ Data::StatisticalChart StatisticalChartFromJSON(const QByteArray &json) { LOG(("API Error: Empty columns list from stats graph received.")); return {}; } + + const auto hiddenLinesRaw = root.value(u"hidden"_q).toArray(); + const auto hiddenLines = ranges::views::all( + hiddenLinesRaw + ) | ranges::views::transform([](const auto &q) { + return q.toString(); + }) | ranges::to_vector; + auto result = Data::StatisticalChart(); auto columnIdCount = 0; for (const auto &column : columns) { @@ -50,6 +58,7 @@ Data::StatisticalChart StatisticalChartFromJSON(const QByteArray &json) { const auto length = array.size() - 1; line.id = (++columnIdCount); line.idString = columnId; + line.isHiddenOnStart = ranges::contains(hiddenLines, columnId); line.y.resize(length); for (auto i = 0; i < length; i++) { const auto value = array.at(i + 1).toInt();