diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index 84165775e..cb78a7b96 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "statistics/chart_widget.h" #include "statistics/linear_chart_view.h" +#include "ui/abstract_button.h" #include "ui/rect.h" #include "styles/style_boxes.h" @@ -68,9 +69,110 @@ void PaintCaptionsToHorizontalLines( } // namespace +class ChartWidget::Footer final : public Ui::AbstractButton { +public: + Footer(not_null parent); + +private: + not_null _left; + not_null _right; + + struct { + int x = 0; + int leftLimit = 0; + int rightLimit = 0; + } _start; + +}; + +ChartWidget::Footer::Footer(not_null parent) +: Ui::AbstractButton(parent) +, _left(Ui::CreateChild(this)) +, _right(Ui::CreateChild(this)) { + sizeValue( + ) | rpl::start_with_next([=](const QSize &s) { + _left->resize(st::colorSliderWidth, s.height()); + _right->resize(st::colorSliderWidth, s.height()); + }, _left->lifetime()); + _left->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(_left); + p.setOpacity(0.3); + p.fillRect(_left->rect(), st::boxTextFg); + }, _left->lifetime()); + _right->paintRequest( + ) | rpl::start_with_next([=] { + auto p = QPainter(_right); + p.setOpacity(0.3); + p.fillRect(_right->rect(), st::boxTextFg); + }, _right->lifetime()); + + _left->move(10, 0); + _right->move(50, 0); + + const auto handleDrag = [&]( + not_null side, + Fn leftLimit, + Fn rightLimit) { + side->events( + ) | rpl::filter([=](not_null e) { + return (e->type() == QEvent::MouseButtonPress) + || (e->type() == QEvent::MouseButtonRelease) + || ((e->type() == QEvent::MouseMove) && side->isDown()); + }) | rpl::start_with_next([=](not_null e) { + const auto pos = static_cast(e.get())->pos(); + switch (e->type()) { + case QEvent::MouseMove: { + const auto nextX = std::clamp( + side->x() + (pos.x() - _start.x), + _start.leftLimit, + _start.rightLimit); + side->move(nextX, side->y()); + } break; + case QEvent::MouseButtonPress: { + _start.x = pos.x(); + _start.leftLimit = leftLimit(); + _start.rightLimit = rightLimit(); + } break; + case QEvent::MouseButtonRelease: { + _start = {}; + } break; + } + }, side->lifetime()); + }; + handleDrag( + _left, + [=] { return 0; }, + [=] { return _right->x() - _left->width(); }); + handleDrag( + _right, + [=] { return rect::right(_left); }, + [=] { return width() - _right->width(); }); +} + ChartWidget::ChartWidget(not_null parent) -: Ui::RpWidget(parent) { - resize(width(), st::confirmMaxHeight); +: Ui::RpWidget(parent) +, _footer(std::make_unique